[html]
<link id="btb-template-style" rel="stylesheet" type="text/css" href="https://forumstatic.ru/files/001c/8a/8a/76663.css">
<div class="btb-app">
<div class="app-main-title">NPC-персонажи</div>
<div class="app-main-subtitle">
сокращённая анкета для второстепенных и эпизодических персонажей
</div>
<div class="app-main-line"></div>
<div class="app-note">
<div class="app-note-row">
Анкета NPC создаётся <b>в этой же теме отдельным сообщением</b>.
</div>
<div class="app-note-row">
Полную биографию расписывать необязательно —
достаточно основных фактов, характера и роли персонажа в игре.
</div>
<div class="app-note-row">
Для гоблинов, домовых эльфов и других персонажей
можно использовать <b>ИИ-сгенерированные изображения</b>.
</div>
<div class="app-note-row">
Если поле к персонажу не относится, поставьте прочерк.
</div>
</div>
<div class="app-images">
<div class="app-image">
<img src="https://placehold.co/800x500/10232e/87969a?text=NPC+01" alt="">
</div>
<div class="app-image">
<img src="https://placehold.co/800x500/10232e/87969a?text=NPC+02" alt="">
</div>
</div>
<div class="app-appearance">
внешность / образ:
<b>Actor Name / AI-generated</b>
</div>
<div class="app-namebox">
<div class="app-name-en">Name Surname</div>
<div class="app-name-ru">Имя Фамилия</div>
</div>
<div class="app-info">
<div class="app-info-row">
<span class="app-label">Возраст:</span>
<span class="app-value">—</span>
</div>
<div class="app-info-row">
<span class="app-label">Раса / статус крови:</span>
<span class="app-value">—</span>
</div>
<div class="app-info-row">
<span class="app-label">Образование:</span>
<span class="app-value">—</span>
</div>
<div class="app-info-row">
<span class="app-label">Лояльность:</span>
<span class="app-value">нейтралитет</span>
</div>
<div class="app-info-row app-info-wide">
<span class="app-label">Род деятельности:</span>
<span class="app-value">
должность / профессия • место работы / организация
</span>
</div>
</div>
<div class="app-section">
<div class="app-section-title">
✦ Кратко о персонаже ✦
</div>
<div class="app-section-body">
Кратко опишите происхождение, важные события,
настоящее, характер, манеру общения
и роль NPC в текущей игре.
</div>
</div>
<div class="app-section">
<div class="app-section-title">
✦ Дополнительно ✦
</div>
<div class="app-section-body">
<div class="app-info">
<div class="app-info-row">
<b>Особые способности:</b><br>
прочерк или краткое описание
</div>
<div class="app-info-row">
<b>Артефакты:</b><br>
прочерк или перечисление
</div>
</div>
</div>
</div>
<div class="app-form-divider">
✦ Заполнение шаблона ✦
</div>
<div class="app-form">
<div class="app-form-grid">
<div class="app-form-section">
— оформление —
</div>
<div class="app-field">
<div class="app-field-label">
Ссылка на картинку №1
</div>
<input
id="npc-img-1"
class="app-input"
type="text"
placeholder="https://..."
autocomplete="off"
>
</div>
<div class="app-field">
<div class="app-field-label">
Ссылка на картинку №2
<span>• необязательно</span>
</div>
<input
id="npc-img-2"
class="app-input"
type="text"
placeholder="https://..."
autocomplete="off"
>
</div>
<div class="app-field app-field-wide">
<div class="app-field-label">
Внешность / образ
<span>• актёр / модель на английском или AI-generated</span>
</div>
<input
id="npc-face"
class="app-input"
type="text"
placeholder="Actor Name / AI-generated"
autocomplete="off"
>
</div>
<div class="app-form-section">
— основные данные —
</div>
<div class="app-field">
<div class="app-field-label">
Имя и фамилия на английском
</div>
<input
id="npc-name-en"
class="app-input"
type="text"
placeholder="Name Surname"
autocomplete="off"
>
</div>
<div class="app-field">
<div class="app-field-label">
Имя и фамилия на русском
</div>
<input
id="npc-name-ru"
class="app-input"
type="text"
placeholder="Имя Фамилия"
autocomplete="off"
>
</div>
<div class="app-field">
<div class="app-field-label">
Возраст
</div>
<input
id="npc-age"
class="app-input"
type="text"
placeholder="35 лет / неизвестен"
autocomplete="off"
>
</div>
<div class="app-field">
<div class="app-field-label">
Раса / статус крови
</div>
<select
id="npc-blood"
class="app-select"
>
<option value="">выберите вариант</option>
<option>чистокровный волшебник</option>
<option>полукровный волшебник</option>
<option>магглорожденный волшебник</option>
<option>сквиб</option>
<option>полувампир</option>
<option>полувейла</option>
<option>полувеликан</option>
<option>вампир</option>
<option>вейла</option>
<option>великан</option>
<option>гоблин</option>
<option>домовой эльф</option>
<option>кентавр</option>
<option>оборотень</option>
<option>другое</option>
</select>
</div>
<div class="app-field">
<div class="app-field-label">
Образование
<span>• факультет / школа / прочерк</span>
</div>
<input
id="npc-house"
class="app-input"
type="text"
placeholder="Хогвартс, Слизерин / прочерк"
autocomplete="off"
>
</div>
<div class="app-field">
<div class="app-field-label">
Лояльность
</div>
<select
id="npc-loyalty"
class="app-select"
>
<option>нейтралитет</option>
<option>Лига равных прав</option>
<option>Общество охотников на монстров</option>
</select>
</div>
<div class="app-field app-field-wide">
<div class="app-field-label">
Род деятельности
<span>• должность / профессия • место работы / организация</span>
</div>
<input
id="npc-job"
class="app-input"
type="text"
placeholder="аврор в Министерстве / преподаватель Хогвартса / частная практика..."
autocomplete="off"
>
</div>
<div class="app-form-section">
— кратко о персонаже —
</div>
<div class="app-field app-field-wide">
<div class="app-field-label">
Кратко о персонаже
<span>• происхождение, важные события, настоящее, характер и роль в игре</span>
</div>
<textarea
id="npc-description"
class="app-textarea app-textarea-short"
placeholder="Кратко расскажите о персонаже..."
></textarea>
</div>
<div class="app-form-section">
— дополнительно —
</div>
<div class="app-field">
<div class="app-field-label">
Особые способности
</div>
<input
id="npc-special"
class="app-input"
type="text"
placeholder="прочерк или краткое описание"
autocomplete="off"
>
</div>
<div class="app-field">
<div class="app-field-label">
Артефакты
</div>
<input
id="npc-artifacts"
class="app-input"
type="text"
placeholder="прочерк или перечисление"
autocomplete="off"
>
</div>
</div>
<div class="app-copy-wrap">
<button
type="button"
class="btb-copy-button"
onclick="copyBtbNpc(this); return false;"
>
✦ Скопировать заполненную анкету ✦
</button>
<div class="app-copy-caption">
вставьте скопированную анкету новым сообщением в этой теме
</div>
</div>
</div>
<div class="app-footer">
NPC можно использовать для эпизодов, сюжетных линий,
семейных связей, работников учреждений и других второстепенных ролей.
</div>
</div>
<script>
(function () {
"use strict";
function raw(id) {
var el = document.getElementById(id);
return el ? String(el.value || "").trim() : "";
}
function text(id, fallback) {
var value = raw(id);
return value || fallback;
}
function longText(id, fallback) {
var value = raw(id);
if (!value) return fallback;
return value
.replace(/<br\s*\/?>/gi, "\n")
.replace(/\r\n?/g, "\n");
}
function image(id) {
return raw(id)
.replace(/[\r\n]/g, "")
.replace(/\[/g, "%5B")
.replace(/\]/g, "%5D");
}
function bbOpen(tag) {
return "[" + tag + "]";
}
function bbClose(tag) {
return "[/" + tag + "]";
}
function blockOpen(name) {
return "[" + "block=" + name + "]";
}
function blockClose() {
return "[/" + "block]";
}
function buildNpc() {
var img1 = image("npc-img-1");
var img2 = image("npc-img-2");
var face = text("npc-face", "Actor Name / AI-generated");
var nameEn = text("npc-name-en", "Name Surname");
var nameRu = text("npc-name-ru", "Имя Фамилия");
var age = text("npc-age", "—");
var blood = text("npc-blood", "—");
var house = text("npc-house", "—");
var loyalty = text("npc-loyalty", "нейтралитет");
var job = text("npc-job", "—");
var description = longText(
"npc-description",
"Краткое описание персонажа."
);
var special = text("npc-special", "—");
var artifacts = text("npc-artifacts", "—");
var b = bbOpen("b");
var eb = bbClose("b");
var im = bbOpen("img");
var eim = bbClose("img");
var lines = [];
lines.push(blockOpen("btb-character-card"));
if (img1 || img2) {
lines.push(blockOpen("app-images"));
if (img1) {
lines.push(
blockOpen("app-image") +
im + img1 + eim +
blockClose()
);
}
if (img2) {
lines.push(
blockOpen("app-image") +
im + img2 + eim +
blockClose()
);
}
lines.push(blockClose());
}
lines.push(
blockOpen("app-appearance") +
"внешность / образ: " +
b + face + eb +
blockClose()
);
lines.push(blockOpen("app-namebox"));
lines.push(
blockOpen("app-name-en") +
nameEn +
blockClose()
);
lines.push(
blockOpen("app-name-ru") +
nameRu +
blockClose()
);
lines.push(blockClose());
lines.push(blockOpen("app-info"));
lines.push(
blockOpen("app-info-row") +
b + "Возраст:" + eb + " " +
age +
blockClose()
);
lines.push(
blockOpen("app-info-row") +
b + "Раса / статус крови:" + eb + " " +
blood +
blockClose()
);
lines.push(
blockOpen("app-info-row") +
b + "Образование:" + eb + " " +
house +
blockClose()
);
lines.push(
blockOpen("app-info-row") +
b + "Лояльность:" + eb + " " +
loyalty +
blockClose()
);
lines.push(
blockOpen("app-info-wide") +
b + "Род деятельности:" + eb + " " +
job +
blockClose()
);
lines.push(blockClose());
lines.push(blockOpen("app-section"));
lines.push(
blockOpen("app-section-title") +
"✦ Кратко о персонаже ✦" +
blockClose()
);
lines.push(blockOpen("app-section-body"));
lines.push(description);
lines.push(blockClose());
lines.push(blockClose());
lines.push(blockOpen("app-section"));
lines.push(
blockOpen("app-section-title") +
"✦ Дополнительно ✦" +
blockClose()
);
lines.push(blockOpen("app-section-body"));
lines.push(blockOpen("app-info"));
lines.push(
blockOpen("app-info-row") +
b + "Особые способности:" + eb + " " +
special +
blockClose()
);
lines.push(
blockOpen("app-info-row") +
b + "Артефакты:" + eb + " " +
artifacts +
blockClose()
);
lines.push(blockClose());
lines.push(blockClose());
lines.push(blockClose());
lines.push(blockClose());
return lines.join("\n");
}
function showSuccess(button) {
var original = button.innerHTML;
button.innerHTML = "✓ Анкета скопирована";
button.classList.add("app-copy-success");
window.setTimeout(function () {
button.innerHTML = original;
button.classList.remove("app-copy-success");
}, 2200);
}
function fallbackCopy(value, button) {
var x = window.pageXOffset || 0;
var y = window.pageYOffset || 0;
var area = document.createElement("textarea");
area.value = value;
area.setAttribute("readonly", "readonly");
area.style.position = "fixed";
area.style.left = "50%";
area.style.top = "50%";
area.style.width = "1px";
area.style.height = "1px";
area.style.opacity = "0";
area.style.pointerEvents = "none";
document.body.appendChild(area);
try {
area.focus({ preventScroll: true });
} catch (error) {
area.focus();
}
area.select();
area.setSelectionRange(0, area.value.length);
var copied = false;
try {
copied = document.execCommand("copy");
} catch (error) {
copied = false;
}
document.body.removeChild(area);
window.scrollTo(x, y);
if (copied) {
showSuccess(button);
} else {
window.prompt(
"Нажмите Ctrl+C:",
value
);
}
}
window.copyBtbNpc = function (button) {
var value = buildNpc();
if (navigator.clipboard && window.isSecureContext) {
navigator.clipboard.writeText(value)
.then(function () {
showSuccess(button);
})
.catch(function () {
fallbackCopy(value, button);
});
} else {
fallbackCopy(value, button);
}
};
/* Размер шрифта из общего ползунка форума. */
var root = document.querySelector(".btb-app");
function ownText(el) {
var tag = (el.tagName || "").toLowerCase();
if (/^(input|textarea|select|option|button)$/.test(tag)) {
return true;
}
for (var i = 0; i < el.childNodes.length; i++) {
var node = el.childNodes[i];
if (
node.nodeType === 3 &&
/\S/.test(node.nodeValue || "")
) {
return true;
}
}
return false;
}
function rememberSizes() {
if (!root) return;
var elements = root.querySelectorAll("*");
for (var i = 0; i < elements.length; i++) {
var el = elements[i];
if (!ownText(el)) continue;
if (el.dataset.btbBaseFont) continue;
var size = parseFloat(
window.getComputedStyle(el).fontSize
);
if (!isNaN(size) && size > 0) {
el.dataset.btbBaseFont = String(size);
}
}
}
function applyScale(scale) {
if (!root) return;
scale = parseFloat(scale);
if (isNaN(scale)) scale = 1;
rememberSizes();
var elements = root.querySelectorAll("*");
for (var i = 0; i < elements.length; i++) {
var el = elements[i];
var base = parseFloat(
el.dataset.btbBaseFont
);
if (isNaN(base)) continue;
el.style.setProperty(
"font-size",
(base * scale).toFixed(2) + "px",
"important"
);
}
}
window.addEventListener(
"message",
function (event) {
if (
!event.data ||
event.data.type !== "BTB_FONT_SCALE"
) {
return;
}
applyScale(event.data.scale);
}
);
function requestFontScale() {
try {
parent.postMessage(
{
type: "BTB_FONT_REQUEST"
},
"*"
);
} catch (error) {}
}
/*
* Внешний 76663.css должен сначала полностью загрузиться.
* Иначе скрипт может запомнить браузерный размер шрифта
* раньше наших стилей и визуально NPC получится крупнее/мельче.
*/
if (document.readyState === "complete") {
requestFontScale();
} else {
window.addEventListener("load", function () {
requestFontScale();
});
}
})();
</script>
[/html]

Имя или кто
Текст заявки бла бла бла текст заявки бла бла бла текст заявки бла бла бла текст заявки бла бла бла текст заявки бла бла бла текст заявки бла бла бла текст заявки бла бла бла текст заявки бла бла бла текст заявки бла бла бла текст заявки бла бла бла текст заявки бла бла бла текст заявки бла бла бла текст заявки бла бла бла текст заявки бла бла бла текст заявки бла бла бла 