Mediawiki:scmcchemistry.js
| Строка 38: | Строка 38: | ||
Toxin: 'токсического урона' | Toxin: 'токсического урона' | ||
}; | }; | ||
/* | |||
* Смысловые фрагменты в описаниях эффектов. Цвет не заменяет текст: | |||
* он лишь помогает быстро отличить лечение, вред и конкретный тип урона. | |||
*/ | |||
var EFFECT_TOKEN_RE = /(урона от кислородного голодания|урона от кровопотери|полностью лечит|дополнительно наносит|восстанавливает жизнеспособность|создаёт иммунитет|восстанавливает|возвращает|омолаживает|сокращает|удаляет|лечит|наносит|вызывает|заражает|поджигает|уничтожает|расходует|замедляет|снижает|повышает|механического(?: урона)?|тупого(?: урона)?|колотого(?: урона)?|режущего(?: урона)?|термического(?: урона)?|ожогового(?: урона)?|холодового(?: урона)?|токсического(?: урона)?|кислотного(?: урона)?|генетического(?: урона)?|клеточного(?: урона)?|радиационного(?: урона)?)/gi; | |||
var EFFECT_ACTION_CLASSES = { | |||
'полностью лечит': 'beneficial', | |||
'лечит': 'beneficial', | |||
'восстанавливает': 'beneficial', | |||
'восстанавливает жизнеспособность': 'beneficial', | |||
'возвращает': 'beneficial', | |||
'омолаживает': 'beneficial', | |||
'сокращает': 'beneficial', | |||
'удаляет': 'beneficial', | |||
'создаёт иммунитет': 'beneficial', | |||
'наносит': 'harmful', | |||
'дополнительно наносит': 'harmful', | |||
'вызывает': 'harmful', | |||
'заражает': 'harmful', | |||
'поджигает': 'harmful', | |||
'уничтожает': 'harmful', | |||
'расходует': 'warning', | |||
'замедляет': 'warning', | |||
'снижает': 'utility', | |||
'повышает': 'utility' | |||
}; | |||
var DAMAGE_TOKEN_CLASSES = [ | |||
{ pattern: /кислородного голодания|кровопотери/, className: 'oxygen' }, | |||
{ pattern: /механического|тупого|колотого|режущего/, className: 'physical' }, | |||
{ pattern: /термического|ожогового/, className: 'burn' }, | |||
{ pattern: /холодового/, className: 'cold' }, | |||
{ pattern: /токсического/, className: 'toxin' }, | |||
{ pattern: /кислотного/, className: 'acid' }, | |||
{ pattern: /генетического/, className: 'genetic' }, | |||
{ pattern: /клеточного/, className: 'cellular' }, | |||
{ pattern: /радиационного/, className: 'radiation' } | |||
]; | |||
var STATUS_LABELS = { | var STATUS_LABELS = { | ||
| Строка 605: | Строка 645: | ||
return [doseDescription(tier, withChance(text, probability))]; | return [doseDescription(tier, withChance(text, probability))]; | ||
} | |||
function semanticTokenClass(token) { | |||
var normalized = String(token || '').toLocaleLowerCase('ru-RU'); | |||
var actionClass = EFFECT_ACTION_CLASSES[normalized]; | |||
if (actionClass) { | |||
return 'scmc-chem__effect-action scmc-chem__effect-action--' + actionClass; | |||
} | |||
for (var index = 0; index < DAMAGE_TOKEN_CLASSES.length; index += 1) { | |||
if (DAMAGE_TOKEN_CLASSES[index].pattern.test(normalized)) { | |||
return 'scmc-chem__damage-type scmc-chem__damage-type--' + DAMAGE_TOKEN_CLASSES[index].className; | |||
} | |||
} | |||
return ''; | |||
} | |||
function effectTone(text) { | |||
var value = String(text || '').toLocaleLowerCase('ru-RU'); | |||
var beneficial = value.search(/полностью лечит|лечит|восстанавливает|возвращает|омолаживает|сокращает|удаляет|создаёт иммунитет/); | |||
var harmful = value.search(/наносит|вызывает|заражает|поджигает|уничтожает/); | |||
var warning = value.search(/расходует|замедляет/); | |||
var candidates = []; | |||
if (beneficial !== -1) { | |||
candidates.push({ index: beneficial, tone: 'beneficial' }); | |||
} | |||
if (harmful !== -1) { | |||
candidates.push({ index: harmful, tone: 'harmful' }); | |||
} | |||
if (warning !== -1) { | |||
candidates.push({ index: warning, tone: 'warning' }); | |||
} | |||
candidates.sort(function (left, right) { | |||
return left.index - right.index; | |||
}); | |||
return candidates.length ? candidates[0].tone : 'utility'; | |||
} | |||
function appendSemanticEffectText(parent, text) { | |||
var value = finishSentence(text); | |||
var lastIndex = 0; | |||
var match; | |||
EFFECT_TOKEN_RE.lastIndex = 0; | |||
while ((match = EFFECT_TOKEN_RE.exec(value)) !== null) { | |||
if (match.index > lastIndex) { | |||
parent.appendChild(document.createTextNode(value.slice(lastIndex, match.index))); | |||
} | |||
var className = semanticTokenClass(match[0]); | |||
parent.appendChild(className | |||
? element('span', className, match[0]) | |||
: document.createTextNode(match[0])); | |||
lastIndex = EFFECT_TOKEN_RE.lastIndex; | |||
} | |||
if (lastIndex < value.length) { | |||
parent.appendChild(document.createTextNode(value.slice(lastIndex))); | |||
} | |||
} | } | ||
function renderEffectText(text) { | function renderEffectText(text) { | ||
var item = element('li', 'scmc-chem__effect'); | var tone = effectTone(text); | ||
var item = element('li', 'scmc-chem__effect scmc-chem__effect--' + tone); | |||
var content = element('span', 'scmc-chem__effect-name'); | |||
appendSemanticEffectText(content, text); | |||
item.appendChild(content); | |||
return item; | return item; | ||
} | } | ||