[html]
<link id="btb-template-style" rel="stylesheet" type="text/css" href="https://forumstatic.ru/files/001c/c9/97/43351.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>
<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="return btbCopyNpc(this);"
>
✦ Скопировать заполненную анкету ✦
</button>
<div class="app-copy-caption">
вставьте скопированную анкету новым сообщением в этой теме
</div>
</div>
</div>
<div class="app-footer">
NPC можно использовать для эпизодов, сюжетных линий,
семейных связей, работников учреждений и других второстепенных ролей.
</div>
</div>
<script>
function btbCopyNpc(button) {
var root = button.closest(".btb-app");
if (!root) return false;
function val(id, fallback) {
var el = root.querySelector("#" + id);
var v = el ? String(el.value || "").trim() : "";
return v || fallback;
}
function imgVal(id) {
var el = root.querySelector("#" + id);
var v = el ? String(el.value || "").trim() : "";
return v
.replace(/[\r\n]/g, "")
.replace(/\[/g, "%5B")
.replace(/\]/g, "%5D");
}
function B(tag) {
return "[" + tag + "]";
}
function E(tag) {
return "[/" + tag + "]";
}
function BO(cls) {
return "[block=" + cls + "]";
}
function BC() {
return "[/block]";
}
var lines = [];
var img1 = imgVal("npc-img-1");
var img2 = imgVal("npc-img-2");
lines.push(BO("btb-character-card"));
if (img1 || img2) {
lines.push(BO("app-images"));
if (img1) {
lines.push(
BO("app-image") +
B("img") + img1 + E("img") +
BC()
);
}
if (img2) {
lines.push(
BO("app-image") +
B("img") + img2 + E("img") +
BC()
);
}
lines.push(BC());
}
lines.push(
BO("app-appearance") +
"внешность / образ: " +
B("b") + val("npc-face", "Actor Name / AI-generated") + E("b") +
BC()
);
lines.push(BO("app-namebox"));
lines.push(
BO("app-name-en") +
val("npc-name-en", "Name Surname") +
BC()
);
lines.push(
BO("app-name-ru") +
val("npc-name-ru", "Имя Фамилия") +
BC()
);
lines.push(BC());
lines.push(BO("app-info"));
lines.push(
BO("app-info-row") +
B("b") + "Возраст:" + E("b") + " " +
val("npc-age", "—") +
BC()
);
lines.push(
BO("app-info-row") +
B("b") + "Раса / статус крови:" + E("b") + " " +
val("npc-blood", "—") +
BC()
);
lines.push(
BO("app-info-row") +
B("b") + "Образование:" + E("b") + " " +
val("npc-house", "—") +
BC()
);
lines.push(
BO("app-info-row") +
B("b") + "Лояльность:" + E("b") + " " +
val("npc-loyalty", "нейтралитет") +
BC()
);
lines.push(
BO("app-info-wide") +
B("b") + "Род деятельности:" + E("b") + " " +
val("npc-job", "—") +
BC()
);
lines.push(BC());
lines.push(BO("app-section"));
lines.push(
BO("app-section-title") +
"✦ Кратко о персонаже ✦" +
BC()
);
lines.push(BO("app-section-body"));
lines.push(
val(
"npc-description",
"Краткое описание персонажа."
)
);
lines.push(BC());
lines.push(BC());
lines.push(BO("app-section"));
lines.push(
BO("app-section-title") +
"✦ Дополнительно ✦" +
BC()
);
lines.push(BO("app-section-body"));
lines.push(BO("app-info"));
lines.push(
BO("app-info-row") +
B("b") + "Особые способности:" + E("b") + " " +
val("npc-special", "—") +
BC()
);
lines.push(
BO("app-info-row") +
B("b") + "Артефакты:" + E("b") + " " +
val("npc-artifacts", "—") +
BC()
);
lines.push(BC());
lines.push(BC());
lines.push(BC());
lines.push(BC());
var text = lines.join("\n");
var ta = document.createElement("textarea");
ta.value = text;
ta.setAttribute("readonly", "readonly");
ta.style.position = "fixed";
ta.style.left = "-9999px";
ta.style.top = "0";
document.body.appendChild(ta);
ta.focus();
ta.select();
ta.setSelectionRange(0, ta.value.length);
var ok = false;
try {
ok = document.execCommand("copy");
} catch (e) {}
document.body.removeChild(ta);
if (ok) {
var oldText = button.innerHTML;
button.innerHTML = "✓ Анкета скопирована";
setTimeout(function () {
button.innerHTML = oldText;
}, 1600);
} else {
window.prompt(
"Скопируйте анкету:",
text
);
}
return false;
}
</script>
<script>
(function () {
"use strict";
var root = document.querySelector(".btb-app");
if (!root) return;
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() {
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) {
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) {}
}
if (document.readyState === "complete") {
requestFontScale();
} else {
window.addEventListener("load", requestFontScale);
}
})();
</script>
[/html]

Мисс Забини, 26
Активистка Лиги Равных Прав и старшая сестра
Господин Мор, 30
Человек, готовый на всё ради своих амбиций (и рода)
Гойл, 21
Требуется "сильный" в нашу компанию
