新的虽然很好用,但是好难改

This commit is contained in:
枫谷剑仙 2021-01-06 20:53:39 +08:00
parent 0d5a26465b
commit 355614e0b9
3 changed files with 163 additions and 49 deletions

View File

@ -2,8 +2,8 @@
const localTranslating = {
skill_parse: {
skill: {
unknown: ()=>`未知的技能类型`,
active_turns: (turns, activeElement)=>[`${turns}回合内,`, activeElement],
unknown: tp`未知的技能类型`,
active_turns: tp`${'turns'}回合内,${'active'}`,
random_skills: (skillList)=>[`随机执行以下技能:`, skillList],
delay: ()=> `将敌人的攻击延迟`,
mass_attack: ()=> `所有攻击变为全体攻击`,
@ -16,30 +16,33 @@ const localTranslating = {
follow_attack: (valueElement)=> [`消除宝珠的回合,以`, valueElement, `的伤害追打敌人`],
auto_heal: (valueElement)=> [`消除宝珠的回合,回复`, valueElement, `的 HP`],
ctw: (valueElement)=> [valueElement, `内时间停止,可以任意移动宝珠`],
gravity: (valueElement)=> [`造成敌方`, valueElement, `的伤害`],
gravity: tp`造成${'target'}${'value'}的伤害`,//(valueElement)=> [`造成敌方`, valueElement, `的伤害`],
resolve: (stats, valueElement, probability)=> [probability ? `${(probability* 100).keepCounts()}%的几率`:'',`如当前`,valueElement,`受到单一次致命攻击时将会以1点 HP 生还`],
resolve: (stats, valueElement, probability)=> [``, stats, `` , valueElement, probability<100 ? `,有${probability}%的几率`:'',`受到单一次致命攻击时将会以1点 HP 生还`],
},
value: {
unknown: (type)=>`[ 未知数值: ${type}]`,
mul: (value, showPercent) => showPercent ? `${(value * 100).keepCounts()}%` : `×${value.keepCounts()}`,
const: (value, unit)=> `${value}${unit ? ` ${unit}` : ''}`,
mul_maxhp: (value, stats, showPercent) => showPercent ? [stats, `${(value * 100).keepCounts()}%`] : [stats,`×${value.keepCounts()}`],
mul_hp: (value, stats, showPercent) => showPercent ? [stats, `${(value * 100).keepCounts()}%`] : [stats,`×${value.keepCounts()}`],
mul_atk: (value, stats, showPercent) => showPercent ? [stats, `${(value * 100).keepCounts()}%`] : [stats,`×${value.keepCounts()}`],
mul_rcv: (value, stats, showPercent) => showPercent ? [stats, `${(value * 100).keepCounts()}%`] : [stats,`×${value.keepCounts()}`],
},
unknown: tp`[ 未知数值: ${'type'}]`,
const: tp`${'value'}${'unit'}`, // (value, unit)=> `${value}${unit ? ` ${unit}` : ''}`,
mul_percent: tp`${'value'}%`,
mul_times: tp`×${'value'}`,
mul_of_percent: tp`${'stats'}${'value'}%`,
mul_of_times: tp`${'stats'}×${'value'}`,
},
target: {
self: tp`自身`,
enemy: tp`敌人`,
},
stats: {
unknown: (type)=>`[ 未知状态: ${type}]`,
maxhp: ()=>`最大HP`,
hp: (enemy)=>`${enemy?`当前`:`自身`}HP`,
atk: (enemy)=>`${enemy?`当前`:`自身`}攻击力`,
rcv: (enemy)=>`${enemy?`当前`:`自身`}回复力`,
teamatk: ()=>`队伍攻击力`,
teamrcv: ()=>`队伍回复力`,
unknown: tp`[ 未知状态: ${'type'}]`,
maxhp: tp`最大HP`,
hp: tp`HP`,
atk: tp`攻击力`,
rcv: tp`回复力`,
teamatk: tp`队伍攻击力`,
teamrcv: tp`队伍回复力`,
},
unit: {
seconds : ``,
seconds : tp``,
},
},
}

View File

@ -1,3 +1,30 @@
//带标签的模板字符串
function tp(strings, ...keys) {
return (function(...values) {
let dict = values[values.length - 1] || {};
let fragment = document.createDocumentFragment();
fragment.appendChild(document.createTextNode(strings[0]));
let result = [strings[0]];
keys.forEach(function(key, i) {
let value = Number.isInteger(key) ? values[key] : dict[key];
if (typeof value == "string" || typeof value == "number")
{
value = document.createTextNode(value);
}
try{
console.log(value);
fragment.appendChild(value);
}catch(e)
{
console.log(value, e);
console.log(keys, values);
}
fragment.appendChild(document.createTextNode(strings[i + 1]));
});
return fragment;
});
}
const Attributes = {
/*0: "Fire",
1: "Water",
@ -681,15 +708,20 @@ function renderSkill(skill, option = {})
}
const fragment = document.createDocumentFragment();
if (typeof localTranslating == "undefined") return fragment;
const tsp = localTranslating.skill_parse;
const tsps = localTranslating.skill_parse.skill;
const tspu = localTranslating.skill_parse.unit;
const tspt = localTranslating.skill_parse.stats;
switch (skill.kind) {
case SkillKinds.Unknown: {
appendToFragment(tsps.unknown());
break;
}
case SkillKinds.ActiveTurns: { //有回合的行动
appendToFragment(tsps.active_turns(skill.turns, renderSkill(skill.skill, { forTurns: true })));
appendToFragment(tsps.active_turns({
turns: skill.turns,
active: renderSkill(skill.skill, { forTurns: true }),
}));
break;
}
case SkillKinds.RandomSkills: { //随机技能
@ -742,7 +774,7 @@ function renderSkill(skill, option = {})
}
case SkillKinds.TimeExtend: { //时间变化buff
appendToFragment(createIcon("status-time", SkillValue.isLess(skill.value) ? "time-decr" : "time-incr"));
appendToFragment(tsps.time_extend(renderValue(skill.value, tspu.seconds, { showsPlusSign:true, showPercent:true })));
appendToFragment(tsps.time_extend(renderValue(skill.value, { unit: tspu.seconds, showsPlusSign:true, showPercent:true })));
break;
}
case SkillKinds.FollowAttack: { //队长技追打
@ -756,16 +788,21 @@ function renderSkill(skill, option = {})
}
case SkillKinds.CTW: { //时间暂停
appendToFragment(createIcon("ctw"));
appendToFragment(tsps.ctw(renderValue(skill.value, tspu.seconds)));
appendToFragment(tsps.ctw(renderValue(skill.value, { unit: tspu.seconds })));
break;
}
case SkillKinds.Gravity: { //重力
appendToFragment(tsps.gravity(renderValue(skill.value, null, { showPercent:true, enemy: true })));
console.log(skill.value)
appendToFragment(tsps.gravity({
icon: createIcon("gravity"),
target: tsp.target.enemy(),
value: renderValue(skill.value, { showPercent:true }),
}));
break;
}
case SkillKinds.Resolve: { //根性
appendToFragment(createIcon("resolve"));
appendToFragment(tsps.resolve(renderStat('hp', true), renderValue(skill.min, null, { showPercent:true }), skill.condition.probability));
appendToFragment(tsps.resolve(renderStat('hp'), renderValue(skill.min, { showPercent:true }), skill.condition.probability));
break;
}
/*
@ -1065,32 +1102,27 @@ function renderSkill(skill, option = {})
}
*/
default: {
console.log(skill.kind, skill);
console.log("未处理的技能类型",skill.kind, skill);
appendToFragment(skill.kind);
}
}
return fragment;
};
function renderStat(stat, enemy) {
function renderStat(stat) {
function appendToFragment(arg){
return _appendToFragment(fragment, arg);
}
function newSpan(str , type)
{
const span = document.createElement("span");
span.className = "cardskill-stats";
span.setAttribute("data-cardskill-stats", type);
span.textContent = str;
return span;
}
const fragment = document.createDocumentFragment();
if (typeof localTranslating == "undefined") return fragment;
const tsps = localTranslating.skill_parse.stats;
if (tsps[stat])
appendToFragment(newSpan(tsps[stat](enemy), stat));
const tspt = localTranslating.skill_parse.stats;
if (tspt[stat])
appendToFragment(tspt[stat]());
else
appendToFragment(tsps.unknown(stat));
{
console.log("未知状态类型",stat);
appendToFragment(tspt.unknown({ type: stat }));
}
return fragment;
}
/*
@ -1226,36 +1258,115 @@ function renderPowerUp(powerUp: SkillPowerUp) {
}
}
*/
function renderValue(_value, unit, option = {}) {
function renderValue(_value, option = {}) {
function appendToFragment(arg){
return _appendToFragment(fragment, arg);
}
const fragment = document.createDocumentFragment();
if (typeof localTranslating == "undefined") return fragment;
const tspv = localTranslating.skill_parse.value;
const od = option.decimalDigits, os = option.showsPlusSign;
switch (_value.kind) {
case SkillValueKind.Percent: {
appendToFragment(tspv.mul(_value.value, option.showPercent));
appendToFragment(
option.showPercent ?
tspv.mul_percent({value: (_value.value * 100).keepCounts(od,os)}) :
tspv.mul_times({value: _value.value.keepCounts(od,os)})
);
break;
}
case SkillValueKind.Constant: {
appendToFragment(tspv.const((option.showsPlusSign && _value.value >= 0 ? "+" : "") + _value.value.keepCounts(), unit));
appendToFragment(
tspv.const({
value: _value.value.keepCounts(od,os),
unit: option.unit ? option.unit() : undefined,
})
);
break;
}
case SkillValueKind.xMaxHP: {
appendToFragment(tspv.mul_maxhp(_value.value, renderStat('maxhp'), option.showPercent));
console.log(renderStat('maxhp'))
appendToFragment(
option.showPercent ?
tspv.mul_of_percent({
value: (_value.value * 100).keepCounts(od,os),
stats: renderStat('maxhp'),
}) :
tspv.mul_of_times({
value: _value.value.keepCounts(od,os),
stats: renderStat('maxhp'),
})
);
break;
}
case SkillValueKind.xHP: {
appendToFragment(tspv.mul_hp(_value.value, renderStat('hp', option.enemy), option.showPercent));
appendToFragment(
option.showPercent ?
tspv.mul_of_percent({
value: (_value.value * 100).keepCounts(od,os),
stats: renderStat('hp'),
}) :
tspv.mul_of_times({
value: _value.value.keepCounts(od,os),
stats: renderStat('hp'),
})
);
break;
}
case SkillValueKind.xATK: {
appendToFragment(tspv.mul_atk(_value.value, renderStat('atk', option.enemy), option.showPercent));
appendToFragment(
option.showPercent ?
tspv.mul_of_percent({
value: (_value.value * 100).keepCounts(od,os),
stats: renderStat('atk'),
}) :
tspv.mul_of_times({
value: _value.value.keepCounts(od,os),
stats: renderStat('atk'),
})
);
break;
}
case SkillValueKind.xRCV: {
appendToFragment(tspv.mul_rcv(_value.value, renderStat('rcv', option.enemy), option.showPercent));
appendToFragment(
option.showPercent ?
tspv.mul_of_percent({
value: (_value.value * 100).keepCounts(od,os),
stats: renderStat('rcv'),
}) :
tspv.mul_of_times({
value: _value.value.keepCounts(od,os),
stats: renderStat('rcv'),
})
);
break;
}
case SkillValueKind.xTeamRCV: {
appendToFragment(
option.showPercent ?
tspv.mul_of_percent({
value: (_value.value * 100).keepCounts(od,os),
stats: renderStat('teamrcv'),
}) :
tspv.mul_of_times({
value: _value.value.keepCounts(od,os),
stats: renderStat('teamrcv'),
})
);
break;
}
case SkillValueKind.xTeamATK: {
appendToFragment(
option.showPercent ?
tspv.mul_of_percent({
value: (_value.value * 100).keepCounts(od,os),
stats: renderStat('teamatk'),
}) :
tspv.mul_of_times({
value: _value.value.keepCounts(od,os),
stats: renderStat('teamatk'),
})
);
break;
}
/*
@ -1311,8 +1422,8 @@ function renderValue(_value, unit, option = {}) {
}
*/
default: {
console.log(_value.kind, _value);
appendToFragment(tspv.unknown(_value.kind));
console.log("未知数值类型",_value.kind, _value);
appendToFragment(tspv.unknown({ type: _value.kind }));
}
}
return fragment;

View File

@ -59,9 +59,9 @@ Number.prototype.prefixInteger = function(length, useGrouping = false)
});
}
//最多保留N位小数不留0
Number.prototype.keepCounts = function(n = 2)
Number.prototype.keepCounts = function(decimalDigits = 2, plusSign = false)
{
return Number(this.toFixed(n)).toString();
return (plusSign && this > 0 ? '+' : '') + Number(this.toFixed(decimalDigits)).toString();
}
//大数字缩短长度,默认返回本地定义字符串
Number.prototype.bigNumberToString = function()