先按自己的理解来做+c

This commit is contained in:
枫谷剑仙 2021-08-13 06:17:15 +08:00
parent 0a53535981
commit 42e88a7a9c
4 changed files with 139 additions and 29 deletions

View File

@ -33,7 +33,7 @@
delay: tp`${'icon'}延迟敌人的攻击`, //icon delay: tp`${'icon'}延迟敌人的攻击`, //icon
mass_attack: tp`所有攻击变为${'icon'}全体攻击`, mass_attack: tp`所有攻击变为${'icon'}全体攻击`,
leader_change: tp`${'icon'}${'target'}换为队长,再次使用则换回来`, leader_change: tp`${'icon'}${'target'}换为队长,再次使用则换回来`,
no_skyfall: tp`${'icon'}天降的宝珠不会消除`, no_skyfall: tp`${'icon'}天降的宝珠不会消除`,
self_harm: tp`${'icon'}${'stats'}减少${'value'}`, self_harm: tp`${'icon'}${'stats'}减少${'value'}`,
heal: tp`${'icon'}回复 ${'value'}${'stats'}`, heal: tp`${'icon'}回复 ${'value'}${'stats'}`,
unbind_normal: tp`${'icon'}封锁状态减少${'turns'}`, unbind_normal: tp`${'icon'}封锁状态减少${'turns'}`,
@ -43,6 +43,7 @@
poison: tp`${'icon'}使${'target'}全体中毒,每回合损失${'belong_to'} ${'value'}${'stats'}`, poison: tp`${'icon'}使${'target'}全体中毒,每回合损失${'belong_to'} ${'value'}${'stats'}`,
time_extend: tp`${'icon'}宝珠移动时间 ${'value'}`, time_extend: tp`${'icon'}宝珠移动时间 ${'value'}`,
follow_attack: tp`${'icon'}消除宝珠的回合,以${'belong_to'}${'value'}的伤害追打${'target'}(计算防御力)`, follow_attack: tp`${'icon'}消除宝珠的回合,以${'belong_to'}${'value'}的伤害追打${'target'}(计算防御力)`,
follow_attack_fixed: tp`追加${'target'}${'icon'}固定伤害`,
auto_heal_buff: tp`行动结束后${'icon'}回复${'value'}${'stats'}`, auto_heal_buff: tp`行动结束后${'icon'}回复${'value'}${'stats'}`,
auto_heal: tp`${'icon'}消除宝珠的回合,回复${'belong_to'}${'value'}${'stats'}`, auto_heal: tp`${'icon'}消除宝珠的回合,回复${'belong_to'}${'value'}${'stats'}`,
ctw: tp`${'icon'}${'value'}内时间停止,可以任意移动宝珠`, ctw: tp`${'icon'}${'value'}内时间停止,可以任意移动宝珠`,
@ -50,7 +51,7 @@
resolve: tp`${'icon'}${'stats'}${'value'},受到单一次致命攻击时,${'prob'}将会以1点 HP 生还`, resolve: tp`${'icon'}${'stats'}${'value'},受到单一次致命攻击时,${'prob'}将会以1点 HP 生还`,
board_change: tp`全画面的宝珠变为${'orbs'}`, board_change: tp`全画面的宝珠变为${'orbs'}`,
skill_boost: tp`自身以外成员的技能冷却储备${'icon'}${'turns'}`, skill_boost: tp`自身以外成员的技能冷却储备${'icon'}${'turns'}`,
add_combo: tp`结算时连击数增加${'value'}c${'icon'}`, add_combo: tp`结算时连击数增加${'value'}${'icon'}`,
fixed_time: tp`${'icon'}操作时间固定${'value'}`, fixed_time: tp`${'icon'}操作时间固定${'value'}`,
min_match_length: tp`【限定≥${'value'}珠才能消除】`, min_match_length: tp`【限定≥${'value'}珠才能消除】`,
drop_refresh: tp`全板刷新`, drop_refresh: tp`全板刷新`,
@ -76,7 +77,18 @@
rate_multiply_coin: tp`${'icon'}金币掉落率`, rate_multiply_coin: tp`${'icon'}金币掉落率`,
rate_multiply_exp: tp`${'icon'}等级经验倍率`, rate_multiply_exp: tp`${'icon'}等级经验倍率`,
reduce_damage: tp`${'condition'}受到的${'attrs'}伤害${'icon'}减少${'value'}`, reduce_damage: tp`${'condition'}受到的${'attrs'}伤害${'icon'}减少${'value'}`,
power_up: tp`${'condition'}${'targets'}${'value'}${'reduceDamage'}`, power_up: tp`${'condition'}${'targets'}${'value'}${'reduceDamage'}${'addCombo'}${'followAttack'}`,
},
power: {
unknown: tp`[ 未知能力提升: ${'type'} ]`,
scale_attributes: tp`${'attrs'}${'min'}种属性同时攻击时${'stats'}${'bonus'}`,
scale_attributes_bonus: tp`每多1种${'bonus'},最大${'max'}种时${'stats_max'}`,
scale_combos: tp`${'min'}连击时,${'stats'}${'bonus'}`,
scale_combos_bonus: tp`每多1连击${'bonus'},最大${'max'}连击时${'stats_max'}`,
scale_match_attrs: tp`${'matches'}${'min'}串匹配时,${'stats'}${'bonus'}`,
scale_match_attrs_bonus: tp`每多1串${'bonus'},最大${'max'}串时${'stats_max'}`,
scale_match_length: tp`相连消除${'min'}${'attrs'}${'stats'}${'bonus'}`,
scale_match_length_bonus: tp`每多1个${'bonus'},最大${'max'}个时${'stats_max'}`,
}, },
cond: { cond: {
unknown: tp`[ 未知条件 ]`, unknown: tp`[ 未知条件 ]`,
@ -95,9 +107,6 @@
compo_type_series: tp`队员组成全为 ${'ids'} 系列时`, compo_type_series: tp`队员组成全为 ${'ids'} 系列时`,
compo_type_evolution: tp`队员组成全为 ${'ids'} 进化时`, compo_type_evolution: tp`队员组成全为 ${'ids'} 进化时`,
}, },
power: {
unknown: tp`[ 未知能力提升: ${'type'} ]`,
},
position: { position: {
top: tp`上方第${'pos'}横行`, top: tp`上方第${'pos'}横行`,
bottom: tp`下方第${'pos'}横行`, bottom: tp`下方第${'pos'}横行`,
@ -190,6 +199,8 @@
[7]: tp`${'icon'}`, [7]: tp`${'icon'}`,
[8]: tp`${'icon'}剧毒`, [8]: tp`${'icon'}剧毒`,
[9]: tp`${'icon'}炸弹`, [9]: tp`${'icon'}炸弹`,
_5color: tp`${'icon'}5色`,
_6color: tp`${'_5color'}+${'orb_rcv'}`,
all: tp`所有`, all: tp`所有`,
any: tp`任何`, any: tp`任何`,
}, },
@ -1662,7 +1673,7 @@ function parseSkillDescription(skill) {
case 219: //192同时消除多色中所有色,219任意消除多色中1色 case 219: //192同时消除多色中所有色,219任意消除多色中1色
str = `相连消除${sk[1]}个或以上的${getOrbsAttrString(sk[0], true)}宝珠时,结算时连击数+${sk[2]}`; str = `相连消除${sk[1]}个或以上的${getOrbsAttrString(sk[0], true)}宝珠时,结算时连击数+${sk[2]}`;
break; break;
case 220: //192同时消除多色中所有色,219任意消除多色中1色 case 220:
str = `以L字形消除5个${getOrbsAttrString(sk[0], true)}宝珠时,结算时连击数+${sk[1]}`; str = `以L字形消除5个${getOrbsAttrString(sk[0], true)}宝珠时,结算时连击数+${sk[1]}`;
break; break;
case 223: case 223:

View File

@ -65,6 +65,16 @@ Attributes.all = function () {
this.Dark this.Dark
]; ];
} }
Attributes._6color = function () {
return [
this.Fire,
this.Water,
this.Wood,
this.Light,
this.Dark,
this.Heart
];
}
Attributes.orbs = function () { Attributes.orbs = function () {
return [ return [
this.Fire, this.Fire,
@ -530,8 +540,8 @@ const p = {
scaleCombos: function (min, max, baseMul, bonusMul) { scaleCombos: function (min, max, baseMul, bonusMul) {
return { kind: SkillPowerUpKind.ScaleCombos ,...this.scale(min, max, baseMul, bonusMul) }; return { kind: SkillPowerUpKind.ScaleCombos ,...this.scale(min, max, baseMul, bonusMul) };
}, },
scaleMatchLength: function (attrs, min, max, baseMul, bonusMul) { scaleMatchLength: function (attrs, min, max, baseMul, bonusMul, matchAll = false) {
return { kind: SkillPowerUpKind.ScaleMatchLength, attrs: attrs ,...this.scale(min, max, baseMul, bonusMul) }; return { kind: SkillPowerUpKind.ScaleMatchLength, attrs: attrs, matchAll ,...this.scale(min, max, baseMul, bonusMul) };
}, },
scaleMatchAttrs: function (matches, min, max, baseMul, bonusMul) { scaleMatchAttrs: function (matches, min, max, baseMul, bonusMul) {
return { kind: SkillPowerUpKind.ScaleMatchAttrs, matches: matches ,...this.scale(min, max, baseMul, bonusMul) }; return { kind: SkillPowerUpKind.ScaleMatchAttrs, matches: matches ,...this.scale(min, max, baseMul, bonusMul) };
@ -577,13 +587,13 @@ function generateOrbs(orbs, exclude, count) {
function fixedOrbs() { function fixedOrbs() {
return { kind: SkillKinds.FixedOrbs, generates: Array.from(arguments) }; return { kind: SkillKinds.FixedOrbs, generates: Array.from(arguments) };
} }
function powerUp(attrs, types, value, condition, reduceDamageValue) { function powerUp(attrs, types, value, condition, reduceDamageValue, addCombo, followAttack) {
if (value.kind === SkillPowerUpKind.Multiplier) { if (value.kind === SkillPowerUpKind.Multiplier) {
let hp = value.hp, atk = value.atk, rcv = value.rcv; let hp = value.hp, atk = value.atk, rcv = value.rcv;
if (hp === 1 && atk === 1 && rcv === 1 && !reduceDamage) if (hp === 1 && atk === 1 && rcv === 1 && !reduceDamage)
return null; return null;
} }
return { kind: SkillKinds.PowerUp, attrs: attrs, types: types, condition: condition, value: value, reduceDamage: reduceDamageValue }; return { kind: SkillKinds.PowerUp, attrs: attrs, types: types, condition: condition, value: value, reduceDamage: reduceDamageValue, addCombo: addCombo, followAttack: followAttack };
} }
function counterAttack(attr, prob, value) { function counterAttack(attr, prob, value) {
return { kind: SkillKinds.CounterAttack, attr: attr, prob: prob, value: value }; return { kind: SkillKinds.CounterAttack, attr: attr, prob: prob, value: value };
@ -981,6 +991,9 @@ const parsers = {
[191](turns) { [191](turns) {
return activeTurns(turns, voidEnemyBuff(['damage-void'])); return activeTurns(turns, voidEnemyBuff(['damage-void']));
}, },
[192](attrs, len, mul, combo) {
return powerUp(null, null, p.scaleMatchLength(flags(attrs), len, len, [mul, 100], [0, 0], true), null, null, combo);
},
[195](percent) { [195](percent) {
return selfHarm(percent ? v.xHP(percent) : v.constantTo(1)); return selfHarm(percent ? v.xHP(percent) : v.constantTo(1));
}, },
@ -1510,7 +1523,7 @@ function renderSkill(skill, option = {})
break; break;
} }
case SkillKinds.PowerUp: { case SkillKinds.PowerUp: {
let attrs = skill.attrs, types = skill.types, condition = skill.condition, value = skill.value, reduceDamage = skill.reduceDamage; let attrs = skill.attrs, types = skill.types, condition = skill.condition, value = skill.value, reduceDamage = skill.reduceDamage, addCombo = skill.addCombo, followAttack = skill.followAttack;
let targets = []; let targets = [];
if (attrs?.length && !isEqual(attrs, Attributes.all())) targets.push(renderAttrs(attrs || [], {affix: true})); if (attrs?.length && !isEqual(attrs, Attributes.all())) targets.push(renderAttrs(attrs || [], {affix: true}));
if (types?.length) targets.push(renderTypes(types || [], {affix: true})); if (types?.length) targets.push(renderTypes(types || [], {affix: true}));
@ -1527,6 +1540,15 @@ function renderSkill(skill, option = {})
icon: createIcon("reduce-damage"), icon: createIcon("reduce-damage"),
})); }));
} }
if (addCombo) {
dict.addCombo = tsp.word.comma().ap(renderSkill({kind: SkillKinds.AddCombo, value: addCombo}));
}
if (followAttack) {
dict.followAttack = tsp.word.comma().ap(tsp.skill.follow_attack_fixed({
value: renderValue(v.constant(followAttack)),
icon: createIcon("follow-attack"),
}));
}
frg.ap(tsp.skill.power_up(dict)); frg.ap(tsp.skill.power_up(dict));
break; break;
} }
@ -1591,6 +1613,17 @@ function renderOrbs(attrs, option = {}) {
{ {
contentFrg = option.any ? tsp.orbs.any() : tsp.orbs.all(); contentFrg = option.any ? tsp.orbs.any() : tsp.orbs.all();
} }
else if (isEqual(attrs, Attributes.all()))
{
contentFrg = renderOrbs('_5color');
}
else if (isEqual(attrs, Attributes._6color()))
{
contentFrg = tsp.orbs._6color({
_5color: renderOrbs('_5color'),
orb_rcv: renderOrbs(5),
});
}
else else
{ {
contentFrg = attrs.map(attr => { contentFrg = attrs.map(attr => {
@ -1724,29 +1757,89 @@ function renderPowerUp(powerUp) {
frg.ap(renderStats(hp, atk, rcv)); frg.ap(renderStats(hp, atk, rcv));
break; break;
} }
/*case SkillPowerUpKind.ScaleAttributes: { case SkillPowerUpKind.ScaleAttributes: {
let attrs = powerUp.attrs, min = powerUp.min, max = powerUp.max, baseAtk = powerUp.baseAtk, baseRcv = powerUp.baseRcv, bonusAtk = powerUp.bonusAtk, bonusRcv = powerUp.bonusRcv; let attrs = powerUp.attrs, min = powerUp.min, max = powerUp.max, baseAtk = powerUp.baseAtk, baseRcv = powerUp.baseRcv, bonusAtk = powerUp.bonusAtk, bonusRcv = powerUp.bonusRcv;
return <>
&ge; {min} of [{renderAttrs(attrs)}] &rArr; {renderStats(1, baseAtk, baseRcv)} let dict = {
{max !== min && <> for each &le; {max} attributes: {renderStats(0, bonusAtk, bonusRcv, false)}</>} attrs: renderOrbs(attrs, {affix: true}),
</>; min: min,
stats: renderStats(1, baseAtk, baseRcv),
}
if (max !== min)
{
let _dict = {
max: max,
bonus: renderStats(0, bonusAtk, bonusRcv, false),
stats_max: renderStats(1, baseAtk + bonusAtk * (max-min), baseRcv + bonusRcv * (max-min)),
}
dict.bonus = frg.ap(tsp.power.scale_attributes_bonus(_dict));
}
frg.ap(tsp.power.scale_attributes(dict));
break;
} }
case SkillPowerUpKind.ScaleCombos: { case SkillPowerUpKind.ScaleCombos: {
const { min, max, baseAtk, baseRcv, bonusAtk, bonusRcv } = powerUp as SkillPowerUp.Scale; let min = powerUp.min, max = powerUp.max, baseAtk = powerUp.baseAtk, baseRcv = powerUp.baseRcv, bonusAtk = powerUp.bonusAtk, bonusRcv = powerUp.bonusRcv;
return <> let dict = {
&ge; {min} combos &rArr; {renderStats(1, baseAtk, baseRcv)} min: min,
{max !== min && <> for each &le; {max} combos: {renderStats(0, bonusAtk, bonusRcv, false)}</>} stats: renderStats(1, baseAtk, baseRcv),
</>; }
if (max !== min)
{
let _dict = {
max: max,
bonus: renderStats(0, bonusAtk, bonusRcv, false),
stats_max: renderStats(1, baseAtk + bonusAtk * (max-min), baseRcv + bonusRcv * (max-min)),
}
dict.bonus = frg.ap(tsp.power.scale_combos_bonus(_dict));
}
frg.ap(tsp.power.scale_combos(dict));
break;
} }
case SkillPowerUpKind.ScaleMatchAttrs: { case SkillPowerUpKind.ScaleMatchAttrs: {
const { matches, min, max, baseAtk, baseRcv, bonusAtk, bonusRcv } = powerUp as SkillPowerUp.ScaleMultiAttrs; let matches = powerUp.matches, min = powerUp.min, max = powerUp.max, baseAtk = powerUp.baseAtk, baseRcv = powerUp.baseRcv, bonusAtk = powerUp.bonusAtk, bonusRcv = powerUp.bonusRcv;
return <> let dict = {
&ge; {min} matches of [{matches.map((attrs, i) => matches: matches.map(orbs=>renderOrbs(orbs)).nodeJoin(tsp.word.slight_pause()),
<React.Fragment key={i}>{i !== 0 && ', '}{renderAttrs(attrs)}</React.Fragment> min: min,
)}] &rArr; {renderStats(1, baseAtk, baseRcv)} stats: renderStats(1, baseAtk, baseRcv),
{max !== min && <> for each &le; {max} matches: {renderStats(0, bonusAtk, bonusRcv, false)}</>} }
</>; if (max !== min)
{
let _dict = {
max: max,
bonus: renderStats(0, bonusAtk, bonusRcv, false),
stats_max: renderStats(1, baseAtk + bonusAtk * (max-min), baseRcv + bonusRcv * (max-min)),
}
dict.bonus = frg.ap(tsp.power.scale_match_attrs_bonus(_dict));
}
frg.ap(tsp.power.scale_match_attrs(dict));
break;
} }
case SkillPowerUpKind.ScaleMatchLength: {
let attrs = powerUp.attrs, min = powerUp.min, max = powerUp.max, baseAtk = powerUp.baseAtk, baseRcv = powerUp.baseRcv, bonusAtk = powerUp.bonusAtk, bonusRcv = powerUp.bonusRcv;
let dict = {
attrs: renderOrbs(attrs, {affix: true}),
min: min,
stats: renderStats(1, baseAtk, baseRcv),
}
if (max !== min)
{
let _dict = {
max: max,
bonus: renderStats(0, bonusAtk, bonusRcv, false),
stats_max: renderStats(1, baseAtk + bonusAtk * (max-min), baseRcv + bonusRcv * (max-min)),
}
dict.bonus = frg.ap(tsp.power.scale_match_length_bonus(_dict));
}
frg.ap(tsp.power.scale_match_length(dict));
break;
}
/*
case SkillPowerUpKind.ScaleMatchLength: { case SkillPowerUpKind.ScaleMatchLength: {
const { attrs, min, max, baseAtk, baseRcv, bonusAtk, bonusRcv } = powerUp as SkillPowerUp.ScaleAttrs; const { attrs, min, max, baseAtk, baseRcv, bonusAtk, bonusRcv } = powerUp as SkillPowerUp.ScaleAttrs;
return <> return <>

View File

@ -1079,6 +1079,11 @@ icon.type
animation: hidden-visible-animate 0.8s infinite ease-out alternate; animation: hidden-visible-animate 0.8s infinite ease-out alternate;
} }
.orb[data-orb-icon='_5color']
{
background-image: url(images/icon-skills.fw.png);
background-position-y:calc(-36px * 24);
}
.orb[data-orb-icon='-1'] .orb[data-orb-icon='-1']
{ {
width: auto; width: auto;

View File

@ -3171,6 +3171,7 @@ table .orb-icon
.icon-skill::after, .icon-skill::after,
.icon-skill::before .icon-skill::before
{ {
font-weight: normal;
display: inline-block; display: inline-block;
width: 36px; width: 36px;
height: 36px; height: 36px;