``` ~/go/bin/sourcemapper -output ddb -jsurl https://media.dndbeyond.com/character-app/static/js/main.90aa78c5.js ```
167 lines
7.6 KiB
JavaScript
167 lines
7.6 KiB
JavaScript
import { DiceRenderers } from '../Dice';
|
|
import { FormatUtils } from '../Format';
|
|
import { RuleDataUtils } from '../RuleData';
|
|
import { getAlignmentId, getArmorClass, getArmorClassDescription, getChallengeInfo, getDefinitionName, getHideCr, getHitPointDice, getHitPointInfo, getInitiative, getLairChallengeInfo, getLanguageNote, getLanguages, getLevel, getMovements, getName, getPassivePerception, getSavingThrows, getSenses, getSizeId, getSkills, getStatBlockType, getSubTypes, getTypeId, } from './accessors';
|
|
import { StatBlockTypeEnum } from './constants';
|
|
import { getTypeName } from './utils';
|
|
//Render a formatted meta text string for a given Creature
|
|
export function renderMetaText(creature, ruleData, useBaseMonsterType) {
|
|
var _a, _b;
|
|
//CreatureLevel
|
|
const creatureLevel = getLevel(creature);
|
|
const level = creatureLevel !== null ? `${FormatUtils.ordinalize(creatureLevel)}-level` : '';
|
|
//CreatureSize
|
|
const sizeInfo = RuleDataUtils.getCreatureSizeInfo(getSizeId(creature), ruleData);
|
|
const size = (_a = sizeInfo === null || sizeInfo === void 0 ? void 0 : sizeInfo.name) !== null && _a !== void 0 ? _a : '';
|
|
//CreatureType
|
|
let type = '';
|
|
if (useBaseMonsterType) {
|
|
const typeInfo = RuleDataUtils.getMonsterTypeInfo(getTypeId(creature), ruleData);
|
|
if (typeInfo === null || typeInfo === void 0 ? void 0 : typeInfo.name) {
|
|
type = typeInfo.name;
|
|
}
|
|
}
|
|
else {
|
|
type = getTypeName(creature, ruleData);
|
|
}
|
|
//CreatureAlignment
|
|
const alignmentInfo = RuleDataUtils.getAlignmentInfo(getAlignmentId(creature), ruleData);
|
|
const alignment = (_b = alignmentInfo === null || alignmentInfo === void 0 ? void 0 : alignmentInfo.name) !== null && _b !== void 0 ? _b : '';
|
|
//Extra Text
|
|
let extraTextChunks = [];
|
|
//If the creature has a customized name that is differenct than the definition name, add the definition name
|
|
if (getName(creature) !== getDefinitionName(creature)) {
|
|
extraTextChunks.push(getDefinitionName(creature));
|
|
}
|
|
//Add any subtypes
|
|
const subTypes = getSubTypes(creature);
|
|
if (subTypes.length) {
|
|
subTypes.forEach((monsterInfo) => {
|
|
if (monsterInfo.name !== null) {
|
|
extraTextChunks.push(monsterInfo.name);
|
|
}
|
|
});
|
|
}
|
|
const extraText = extraTextChunks.join(', ');
|
|
return `${level} ${size} ${type}${extraText ? ` (${extraText})` : ''}${alignment ? `, ${alignment}` : ''}`.trim();
|
|
}
|
|
//Render a Creature's Armor Class with any additional description added
|
|
export function renderArmorClass(creature) {
|
|
return `${getArmorClass(creature)} ${getArmorClassDescription(creature)}`.trim();
|
|
}
|
|
//Render a Creature's initative info: bonus (score)
|
|
export function renderInitiativeInfo(creature) {
|
|
const initiativeInfo = getInitiative(creature);
|
|
if (initiativeInfo === null || initiativeInfo === void 0 ? void 0 : initiativeInfo.bonus) {
|
|
const { bonus, score } = initiativeInfo;
|
|
return `${FormatUtils.renderSignedNumber(bonus)} ${score ? `(${initiativeInfo.score})` : ''}`.trim();
|
|
}
|
|
return null;
|
|
}
|
|
//Render a Creature's total Hit Points and Hit Point Dice
|
|
export function renderHitPointInfo(creature) {
|
|
const totalHp = getHitPointInfo(creature).totalHp;
|
|
const hitPointDice = getHitPointDice(creature);
|
|
const hpDiceText = hitPointDice ? ` (${DiceRenderers.renderDice(getHitPointDice(creature))})` : '';
|
|
return `${totalHp}${hpDiceText}`;
|
|
}
|
|
//Render a Creature's Speed info
|
|
export function renderSpeedInfo(creature, ruleData) {
|
|
const movements = getMovements(creature);
|
|
if (movements.length) {
|
|
const movementDisplays = movements.map((movement, idx) => {
|
|
let label = '';
|
|
if (idx !== 0) {
|
|
label = RuleDataUtils.getMovementName(movement.movementId, ruleData);
|
|
}
|
|
return `${label} ${FormatUtils.renderDistance(movement.speed)} ${movement.notes ? movement.notes : ''}`.trim();
|
|
});
|
|
return movementDisplays.join(', ');
|
|
}
|
|
return '--';
|
|
}
|
|
//Render a Creature's Saving Throws info
|
|
export function renderSavingThrows(creature) {
|
|
const savingThrows = getSavingThrows(creature);
|
|
if (!savingThrows.length) {
|
|
return null;
|
|
}
|
|
const savingThrowDisplays = savingThrows.map((savingThrow) => {
|
|
return `${savingThrow.statKey} ${FormatUtils.renderSignedNumber(savingThrow.modifier)}`;
|
|
});
|
|
return savingThrowDisplays.join(', ');
|
|
}
|
|
//Render a Creature's Skills info
|
|
export function renderSkills(creature, ruleData) {
|
|
const skills = getSkills(creature);
|
|
if (!skills.length) {
|
|
return null;
|
|
}
|
|
const skillDisplays = skills.map((skill) => {
|
|
const skillInfo = RuleDataUtils.getSkillInfo(skill.id, ruleData);
|
|
const name = (skillInfo === null || skillInfo === void 0 ? void 0 : skillInfo.name) ? skillInfo.name : '';
|
|
const modifier = skill.modifier;
|
|
return `${name} ${FormatUtils.renderSignedNumber(modifier)}`;
|
|
});
|
|
return skillDisplays.join(', ');
|
|
}
|
|
//Render a Creature's Senses info
|
|
export function renderSensesInfo(creature, ruleData) {
|
|
const senses = getSenses(creature);
|
|
const senseDisplays = senses.map((sense) => {
|
|
const senseInfo = RuleDataUtils.getSenseInfo(sense.senseId, ruleData);
|
|
const senseName = senseInfo ? senseInfo.name : '';
|
|
return `${senseName} ${sense.notes}`;
|
|
});
|
|
const senseDisplay = senseDisplays.length ? `${senseDisplays.join(', ')}, ` : '';
|
|
const passivePerception = getPassivePerception(creature);
|
|
return `${senseDisplay}Passive Perception ${passivePerception}`;
|
|
}
|
|
//Render a Creature's Languages info
|
|
export function renderLanguages(creature, ruleData) {
|
|
const languages = getLanguages(creature);
|
|
const languageNote = getLanguageNote(creature);
|
|
let languageText = '';
|
|
if (languages.length || languageNote) {
|
|
let languageDisplays = languages.map((language) => {
|
|
const name = RuleDataUtils.getLanguageName(language.languageId, ruleData);
|
|
return `${name} ${language.notes}`.trim();
|
|
});
|
|
if (languageNote) {
|
|
languageDisplays.push(languageNote);
|
|
}
|
|
languageText = languageDisplays.join(', ');
|
|
}
|
|
else {
|
|
languageText = '--';
|
|
}
|
|
return languageText;
|
|
}
|
|
//Render a Creature's Challenge Rating info, adjusted for 2014 vs 2024 version
|
|
export function renderChallengeRatingInfo(creature) {
|
|
const challengeInfo = getChallengeInfo(creature);
|
|
const hideCr = getHideCr(creature);
|
|
const statBlockType = getStatBlockType(creature);
|
|
if (!challengeInfo || hideCr) {
|
|
return null;
|
|
}
|
|
if (statBlockType === StatBlockTypeEnum.CORE_RULES_2024) {
|
|
const PBtext = `; PB ${FormatUtils.renderSignedNumber(challengeInfo.proficiencyBonus)}`;
|
|
const lairChallengeInfo = getLairChallengeInfo(creature);
|
|
const lairCRText = (lairChallengeInfo === null || lairChallengeInfo === void 0 ? void 0 : lairChallengeInfo.xp)
|
|
? `, or ${FormatUtils.renderLocaleNumber(lairChallengeInfo.xp)} in lair`
|
|
: '';
|
|
return `${FormatUtils.renderChallengeRating(challengeInfo.value)} (XP ${FormatUtils.renderLocaleNumber(challengeInfo.xp)}${lairCRText}${PBtext})`;
|
|
}
|
|
return `${FormatUtils.renderChallengeRating(challengeInfo.value)} (${FormatUtils.renderLocaleNumber(challengeInfo.xp)} XP)`;
|
|
}
|
|
//render a Creature's Proficiency Bonus
|
|
export function renderProficiencyBonus(creature) {
|
|
const challengeInfo = getChallengeInfo(creature);
|
|
const hideCr = getHideCr(creature);
|
|
if (!challengeInfo || hideCr) {
|
|
return null;
|
|
}
|
|
return FormatUtils.renderSignedNumber(challengeInfo.proficiencyBonus);
|
|
}
|