星铁面板天赋展示更新,支持展示行迹信息

This commit is contained in:
Kokomi 2023-09-24 03:55:58 +08:00
parent 27ab6c1943
commit 3ab9eb7c35
9 changed files with 505 additions and 231 deletions

View File

@ -1,15 +1,8 @@
# 2.4.5 # 2.4.6
* 增加原神4.0、星铁1.3的角色数据与资源 * 星铁面板天赋展示更新,支持展示行迹信息
* 增加林尼、卡夫卡、银狼的伤害计算**@Aluxes**
* 增加原神4.0相关的武器计算 **@SmallK111407**
# 2.4.4 # 2.4.1 ~ 2.4.5
* 增加`#星铁日历`功能 **@Aluxes**
* 更新卡芙卡、卢卡的角色数据与资源
# 2.4.1 ~ 2.4.3
* 初步支持星铁面板数据获取与展示 * 初步支持星铁面板数据获取与展示
* 可使用`#星铁更新面板`来获取面板信息,通过`#希儿面板`来进行查看 * 可使用`#星铁更新面板`来获取面板信息,通过`#希儿面板`来进行查看
@ -18,8 +11,15 @@
* 请配合使用Miao-Yunzai 3.1.0可达到最佳效果 * 请配合使用Miao-Yunzai 3.1.0可达到最佳效果
* Miao-Yunzai可使用`*`来代填`#星铁`前缀能区分游戏使用不同UID * Miao-Yunzai可使用`*`来代填`#星铁`前缀能区分游戏使用不同UID
* 其他Yunzai版本出现原神与星铁UID混淆情况为正常情况请手动切换UID或命令后附加UID查询 * 其他Yunzai版本出现原神与星铁UID混淆情况为正常情况请手动切换UID或命令后附加UID查询
* 增加林尼、琳妮特、菲米尼的角色信息,可通过`#林尼天赋`、`#林尼图鉴`查看 * 角色数据及资源更新
* 增加林尼、琳妮特、菲米尼的角色信息,可通过`#林尼天赋`、`#林尼图鉴`查看
* 更新卡芙卡、卢卡的角色数据与资源
* 增加原神4.0、星铁1.3的角色数据与资源
* 伤害计算更新
* 增加林尼、卡夫卡、银狼的伤害计算**@Aluxes**
* 增加原神4.0相关的武器计算 **@SmallK111407**
* 增加`#喵喵api`命令用于查看喵ApiToken的有效期 * 增加`#喵喵api`命令用于查看喵ApiToken的有效期
* 增加`#星铁日历`功能 **@Aluxes**
* 停用旧面板格式数据非AttrIDs格式的数据不会展示部分角色面板数据不展示是正常情况重新更新面板数据即可 * 停用旧面板格式数据非AttrIDs格式的数据不会展示部分角色面板数据不展示是正常情况重新更新面板数据即可
* 一些已知问题修复 * 一些已知问题修复

View File

@ -141,6 +141,7 @@ let ProfileDetail = {
let attr = {} let attr = {}
let game = char.game let game = char.game
let isGs = game === 'gs' let isGs = game === 'gs'
let isSr = !isGs
lodash.forEach((isGs ? 'hp,def,atk,mastery' : 'hp,def,atk,speed').split(','), (key) => { lodash.forEach((isGs ? 'hp,def,atk,mastery' : 'hp,def,atk,speed').split(','), (key) => {
let fn = (n) => Format.comma(n, key === 'hp' ? 0 : 1) let fn = (n) => Format.comma(n, key === 'hp' ? 0 : 1)
@ -183,6 +184,36 @@ let ProfileDetail = {
let artisDetail = profile.getArtisMark() let artisDetail = profile.getArtisMark()
let artisKeyTitle = ProfileArtis.getArtisKeyTitle(game) let artisKeyTitle = ProfileArtis.getArtisKeyTitle(game)
let data = profile.getData('name,abbr,cons,level,talent,dataSource,updateTime,imgs,costumeSplash') let data = profile.getData('name,abbr,cons,level,talent,dataSource,updateTime,imgs,costumeSplash')
if (isSr) {
let treeData = []
let treeMap = {}
// 属性
lodash.forEach('0113355778'.split(''), (pos, idx) => {
treeData[pos] = treeData[pos] || []
let tmp = { type: 'tree', img: `/meta-sr/public/icons/tree-cpct.webp` }
treeData[pos].push(tmp)
treeMap[idx + 201 + ''] = tmp
})
// 能力
lodash.forEach([2, 4, 6], (pos, idx) => {
let tmp = { type: 'talent', img: data.imgs[`tree${idx + 1}`] }
treeData[pos] = tmp
treeMap[idx + 101 + ''] = tmp
})
lodash.forEach(profile.trees, (id) => {
let ret = /([12][01][0-9])$/.exec(id + '')
if (ret && ret[1]) {
let treeId = ret[1]
if (treeMap?.[treeId]) {
treeMap[treeId].value = 1
}
if (treeId[0] === '2') {
treeMap[treeId].img = `/meta-sr/public/icons/tree-${char.detail?.tree?.[id]?.key}.webp`
}
}
})
data.treeData = treeData
}
data.weapon = profile.getWeaponDetail() data.weapon = profile.getWeaponDetail()
let renderData = { let renderData = {
save_id: uid, save_id: uid,

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

After

Width:  |  Height:  |  Size: 11 KiB

View File

@ -178,6 +178,9 @@ body {
.i-effPct { .i-effPct {
background-position: -176px 0; background-position: -176px 0;
} }
.i-effDef {
background-position: -192px 0;
}
.detail.attr li:nth-child(even) { .detail.attr li:nth-child(even) {
background: rgba(0, 0, 0, 0.4); background: rgba(0, 0, 0, 0.4);
} }
@ -224,7 +227,7 @@ body {
background-repeat: no-repeat; background-repeat: no-repeat;
background-position: center; background-position: center;
} }
.talent-icon span { .talent-icon strong {
background: #fff; background: #fff;
width: 34px; width: 34px;
height: 26px; height: 26px;
@ -239,7 +242,7 @@ body {
color: #000; color: #000;
box-shadow: 0 0 5px 0 #000; box-shadow: 0 0 5px 0 #000;
} }
.talent-icon.talent-plus span { .talent-icon.talent-plus strong {
background: #2e353e; background: #2e353e;
color: #ffdfa0; color: #ffdfa0;
font-weight: bold; font-weight: bold;
@ -833,17 +836,12 @@ body {
line-height: 20px; line-height: 20px;
color: #bbb; color: #bbb;
} }
.game-sr .char-talents {
transform: scale(0.8);
transform-origin: top left;
margin: -8px 0 -14px;
}
.game-sr .char-talents .talent-item {
margin: 0 -3px;
}
.game-sr .artis-weapon { .game-sr .artis-weapon {
display: none; display: none;
} }
.game-sr .char-lv {
margin-bottom: 25px;
}
.game-sr .char-attr .icon i { .game-sr .char-attr .icon i {
background-image: url('./imgs/icon-sr.png'); background-image: url('./imgs/icon-sr.png');
} }
@ -945,6 +943,97 @@ body {
padding: 0 3px; padding: 0 3px;
margin: 0 2px; margin: 0 2px;
} }
.sr-talent {
margin: 0 15px 10px 10px;
border-radius: 10px;
background: url("../common/cont/card-bg.png") top left repeat-x;
background-size: auto 150%;
position: relative;
box-shadow: 0 0 1px 0 #ccc, 2px 2px 4px 0 rgba(50, 50, 50, 0.8);
overflow: hidden;
display: flex;
color: #fff;
height: 72px;
width: calc(100% - 25px);
padding: 8px 10px;
}
.sr-talent .char-talents {
transform-origin: center left;
margin: 0;
width: 260px;
}
.sr-talent .char-talents .talent-item {
margin: 0 -3px;
}
.sr-talent .char-talents .talent-icon {
width: 60px;
height: 60px;
}
.sr-talent .char-talents .talent-icon strong {
font-size: 13px;
width: 22px;
height: 20px;
line-height: 20px;
margin-left: -11px;
border-radius: 4px;
}
.sr-talent .char-talents .talent-icon span {
position: absolute;
top: -3px;
font-size: 12px;
left: 0;
right: 0;
text-align: center;
color: #fff;
text-shadow: 0 0 3px #000, 1px 1px 1px #000;
}
.sr-talent .char-talents .talent-icon.talent-crown:after {
width: 22px;
height: 22px;
margin: 2px 0 0 5px;
background-image: url('../character/imgs/crown-sr.webp');
display: none;
}
.sr-talent .char-trees {
width: 290px;
padding-left: 10px;
position: relative;
}
.sr-talent .char-trees .talent-icon {
margin: 0 -5px;
}
.sr-talent .char-trees .talent-icon.off {
filter: grayscale(100%);
opacity: 0.4;
}
.sr-talent .char-trees:before {
content: "";
display: block;
width: 1px;
height: 30px;
background: rgba(255, 255, 255, 0.8);
position: absolute;
left: 0;
top: 15px;
}
.sr-talent .char-trees .talent-item {
width: 40px;
}
.sr-talent .char-trees .talent-item .talent-icon {
margin: 0;
}
.sr-talent .char-trees .tree-item {
width: 20px;
height: 100%;
display: flex;
flex-direction: column;
justify-content: center;
}
.sr-talent .char-trees .tree-item .talent-icon {
width: 30px;
height: 30px;
margin: 0 -5px;
}
.copyright.ad { .copyright.ad {
font-size: 12px; font-size: 12px;
} }

View File

@ -23,6 +23,7 @@
<span class="cons cons-{{data.cons}}">{{data.cons}}命</span></div> <span class="cons cons-{{data.cons}}">{{data.cons}}命</span></div>
<div> <div>
{{if mode !== 'weapon'}} {{if mode !== 'weapon'}}
{{if game === 'gs'}}
<div class="char-talents"> <div class="char-talents">
{{each talentMap tName key}} {{each talentMap tName key}}
{{set talent = data.talent[key] || {} }} {{set talent = data.talent[key] || {} }}
@ -32,14 +33,16 @@
{{talent.original >= 10 ? `talent-crown`:``}}"> {{talent.original >= 10 ? `talent-crown`:``}}">
<div class="talent-icon-img" <div class="talent-icon-img"
style="background-image:url({{_res_path}}{{imgs[key]}})"></div> style="background-image:url({{_res_path}}{{imgs[key]}})"></div>
<span>{{talent.level}}</span> <strong>{{talent.level}}</strong>
</div> </div>
</div> </div>
{{/each}} {{/each}}
</div> </div>
{{/if}}
<ul class="char-attr"> <ul class="char-attr">
{{set attrMap = game === 'sr' ? { {{set attrMap = game === 'sr' ? {
hp:'生命值',atk:'攻击力',def:'防御力',speed:'速度',cpct:'暴击率',cdmg:'暴击伤害',dmg:'伤害加成',stance:'击破特攻',effPct:'效果命中' hp:'生命值',atk:'攻击力',def:'防御力',speed:'速度',cpct:'暴击率',cdmg:'暴击伤害',dmg:'伤害加成',stance:'击破特攻',effPct:'效果命中',effDef:'效果抵抗',
heal:'治疗加成'
}:{ }:{
hp:'生命值',atk:'攻击力',def:'防御力',mastery:'元素精通',cpct:'暴击率',cdmg:'暴击伤害',recharge:'元素充能',dmg:'伤害加成' hp:'生命值',atk:'攻击力',def:'防御力',mastery:'元素精通',cpct:'暴击率',cdmg:'暴击伤害',recharge:'元素充能',dmg:'伤害加成'
} }} } }}
@ -84,8 +87,7 @@
{{each cons idx}} {{each cons idx}}
<div class="cons-item"> <div class="cons-item">
<div class="talent-icon {{idx * 1 > data.cons * 1 ? 'off' : '' }}"> <div class="talent-icon {{idx * 1 > data.cons * 1 ? 'off' : '' }}">
<div class="talent-icon-img" <div class="talent-icon-img" style="background-image:url({{_res_path}}{{imgs[`cons${idx}`]}})"></div>
style="background-image:url({{_res_path}}{{imgs[`cons${idx}`]}})"></div>
</div> </div>
</div> </div>
{{/each}} {{/each}}
@ -112,6 +114,46 @@
<!-- 【 武器+圣遗物列表】 --> <!-- 【 武器+圣遗物列表】 -->
<div> <div>
{{if game === 'sr'}} {{if game === 'sr'}}
<div class="sr-talent">
<div class="char-talents">
{{each talentMap tName key}}
{{set talent = data.talent[key] || {} }}
<div class="talent-item">
<div class="talent-icon
{{talent.level > talent.original ? `talent-plus`:``}}
{{talent.original >= 10 ? `talent-crown`:``}}">
<div class="talent-icon-img"
style="background-image:url({{_res_path}}{{imgs[key]}})"></div>
<strong>{{talent.level}}</strong>
<span>{{tName}}</span>
</div>
</div>
{{/each}}
</div>
<div class="char-talents char-trees">
{{each data.treeData tCfg}}
{{if tCfg?.type === 'talent' }}
<div class="talent-item">
<div class="talent-icon {{tCfg.value ? '':'off'}}">
<div class="talent-icon-img" style="background-image:url({{_res_path}}{{tCfg.img}})"></div>
</div>
</div>
{{else}}
<div class="tree-item">
{{each tCfg tIdx}}
<div class="talent-icon {{tIdx.value ? '':'off'}}">
<div class="talent-icon-img" style="background-image:url({{_res_path}}{{tIdx.img}})"></div>
</div>
{{/each}}
</div>
{{/if}}
{{/each}}
</div>
</div>
{{if weapon && weapon.name}} {{if weapon && weapon.name}}
<div class="sr-weapon"> <div class="sr-weapon">
<div class="weapon-img" style="background-image:url({{_res_path}}{{weapon.splash}})"></div> <div class="weapon-img" style="background-image:url({{_res_path}}{{weapon.splash}})"></div>
@ -175,7 +217,6 @@
<span class="title">{{if attr.eff}}<i class="eff">{{attr.eff || ''}}</i>{{/if}}{{if attr.upNum}}<i <span class="title">{{if attr.eff}}<i class="eff">{{attr.eff || ''}}</i>{{/if}}{{if attr.upNum}}<i
class="up-num up-{{attr.upNum}}"></i>{{/if}}{{artisKeyTitle[attr.key] || attr.key}}</span> class="up-num up-{{attr.upNum}}"></i>{{/if}}{{artisKeyTitle[attr.key] || attr.key}}</span>
<span class="val">+{{attr.value}}</span> <span class="val">+{{attr.value}}</span>
</li> </li>
{{/if}} {{/if}}
{{/each}} {{/each}}
@ -283,7 +324,9 @@
</div> </div>
<div class="cont-footer dmg-desc"> <div class="cont-footer dmg-desc">
<ul> <ul>
<li>大数字的含义为圣遗物副词条置换后<strong>平均伤害</strong>的变化,下方的详情数字为<strong>平均伤害</strong>/<strong>暴击伤害</strong></li> <li>
大数字的含义为圣遗物副词条置换后<strong>平均伤害</strong>的变化,下方的详情数字为<strong>平均伤害</strong>/<strong>暴击伤害</strong>
</li>
<li>关于<strong>平均伤害</strong>:是将暴击率计算在内的伤害期望,能反映综合的输出能力,不等于实际伤害数字。</li> <li>关于<strong>平均伤害</strong>:是将暴击率计算在内的伤害期望,能反映综合的输出能力,不等于实际伤害数字。</li>
<li>可用于评估当前面板下圣遗物副词条的侧重方向。实际游戏情况更加复杂,结果供参考~</li> <li>可用于评估当前面板下圣遗物副词条的侧重方向。实际游戏情况更加复杂,结果供参考~</li>
<li>如需更换计算的伤害类型,可使用命令 <strong>{{gameHash}}{{data.abbr}}伤害+序号</strong>来切换,序号参见伤害计算板块</li> <li>如需更换计算的伤害类型,可使用命令 <strong>{{gameHash}}{{data.abbr}}伤害+序号</strong>来切换,序号参见伤害计算板块</li>

View File

@ -216,6 +216,10 @@ body {
background-position: @i*-11 0; background-position: @i*-11 0;
} }
.i-effDef {
background-position: @i*-12 0;
}
.detail.attr { .detail.attr {
li { li {
&:nth-child(even) { &:nth-child(even) {
@ -271,7 +275,7 @@ body {
background-position: center; background-position: center;
} }
span { strong {
background: #fff; background: #fff;
width: 34px; width: 34px;
height: 26px; height: 26px;
@ -287,7 +291,7 @@ body {
box-shadow: 0 0 5px 0 #000; box-shadow: 0 0 5px 0 #000;
} }
&.talent-plus span { &.talent-plus strong {
background: #2e353e; background: #2e353e;
color: #ffdfa0; color: #ffdfa0;
font-weight: bold; font-weight: bold;
@ -1049,21 +1053,15 @@ body {
} }
.game-sr { .game-sr {
.char-talents {
transform: scale(.8);
transform-origin: top left;
margin: -8px 0 -14px;
.talent-item {
margin: 0 -3px;
}
}
.artis-weapon { .artis-weapon {
display: none; display: none;
} }
.char-lv {
margin-bottom: 25px;
}
.char-attr { .char-attr {
.icon i { .icon i {
background-image: url('./imgs/icon-sr.png'); background-image: url('./imgs/icon-sr.png');
@ -1189,6 +1187,119 @@ body {
} }
} }
.sr-talent {
margin: 0 15px 10px 10px;
border-radius: 10px;
background: url("../common/cont/card-bg.png") top left repeat-x;
background-size: auto 150%;
position: relative;
box-shadow: 0 0 1px 0 #ccc, 2px 2px 4px 0 rgba(50, 50, 50, .8);
overflow: hidden;
display: flex;
color: #fff;
height: 72px;
width: calc(100% - 25px);
padding: 8px 10px;
.char-talents {
transform-origin: center left;
margin: 0;
width: 260px;
.talent-item {
margin: 0 -3px;
}
.talent-icon {
width: 60px;
height: 60px;
strong {
font-size: 13px;
width: 22px;
height: 20px;
line-height: 20px;
margin-left: -11px;
border-radius: 4px;
}
span {
position: absolute;
top: -3px;
font-size: 12px;
left: 0;
right: 0;
text-align: center;
color: #fff;
text-shadow: 0 0 3px #000, 1px 1px 1px #000;
}
&.talent-crown:after {
width: 22px;
height: 22px;
margin: 2px 0 0 5px;
background-image: url('../character/imgs/crown-sr.webp');
display: none;
}
}
}
.char-trees {
width: 290px;
padding-left: 10px;
position: relative;
.talent-icon {
margin: 0 -5px;
&.off {
filter: grayscale(100%);
opacity: .4;
}
}
&:before {
content: "";
display: block;
width: 1px;
height: 30px;
background: rgba(255, 255, 255, .8);
position: absolute;
left: 0;
top: 15px;
}
.talent-item {
width: 40px;
.talent-icon {
margin: 0;
}
}
.tree-item {
width: 20px;
height: 100%;
display: flex;
flex-direction: column;
justify-content: center;
.talent-icon {
width: 30px;
height: 30px;
margin: 0 -5px;
}
.talent-icon-img {
}
}
}
}
.copyright.ad { .copyright.ad {
font-size: 12px; font-size: 12px;
} }

Binary file not shown.

Before

Width:  |  Height:  |  Size: 968 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 KiB