diff --git a/.gitignore b/.gitignore index eedd0e63..a941cddd 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ *.psd -.idea \ No newline at end of file +.idea +/components/cfg.json diff --git a/apps/admin.js b/apps/admin.js index a4da3a63..896f6f14 100644 --- a/apps/admin.js +++ b/apps/admin.js @@ -1,28 +1,108 @@ import { segment } from "oicq"; import fs from "fs"; -import { Character } from "../components/models.js"; import lodash from "lodash"; - import { createRequire } from "module"; import { exec } from "child_process"; +import { Cfg } from "../components/index.js"; const require = createRequire(import.meta.url); - -//import {wikiCharacter} from "../modules/wiki.js"; - +let cfgMap = { + "角色": "char.char", + "老婆": "char.wife", + "查他人": "char.queryOther", + "天赋": "wiki.talent", + "命座": "wiki.cons", + "图片": "wiki.pic", + "深渊": "wiki.abyss", + "渲染": "sys.scale", +}; +let sysCfgReg = `^#喵喵设置\s*(${lodash.keys(cfgMap).join("|")})?\s*(.*)$`; export const rule = { updateRes: { - reg: "#喵喵更新素材", - describe: "【#老婆,#老公,#女儿】角色详情", + reg: "^#喵喵更新图像$", + describe: "【#管理】更新素材", + }, + sysCfg: { + reg: sysCfgReg, + describe: "【#管理】系统设置" } }; + const _path = process.cwd(); const resPath = `${_path}/plugins/miao-plugin/resources/`; +const plusPath = `${resPath}/miao-res-plus/`; + +const checkAuth = async function (e) { + return await e.checkAuth({ + auth: "master", + replyMsg: `只有主人才能命令喵喵哦~ + (*/ω\*)` + }); +} + +export async function sysCfg(e, { render }) { + if (!await checkAuth(e)) { + return true; + } + + let cfgReg = new RegExp(sysCfgReg); + let regRet = cfgReg.exec(e.msg); + + if (!regRet) { + return true; + } + + if (regRet[1]) { + // 设置模式 + let val = regRet[2] || ""; + + let cfgKey = cfgMap[regRet[1]]; + if (cfgKey === "sys.scale") { + val = Math.min(200, Math.max(50, val * 1 || 100)); + } else { + val = !/关闭/.test(val); + } + + if (cfgKey) { + Cfg.set(cfgKey, val); + } + } + + let cfg = { + chars: getStatus("char.char"), + wife: getStatus("char.wife"), + other: getStatus("char.queryOther"), + talent: getStatus("wiki.talent"), + cons: getStatus("wiki.cons"), + pic: getStatus("wiki.pic"), + abyss: getStatus("wiki.hutao"), + imgPlus: fs.existsSync(plusPath), + scale: Cfg.get("sys.scale", 100) + } + + let base64 = await render("admin", "index", { + ...cfg, + cfgScale: Cfg.scale(1.2) + }, "png"); + if (base64) { + e.reply(segment.image(`base64://${base64}`)); + } + return true; +} + +const getStatus = function (rote) { + if (Cfg.get(rote, true)) { + return `
已开启
`; + } else { + return `
已关闭
`; + } + +} export async function updateRes(e) { - if (!e.checkAuth({ auth: "master" })) { + if (!await checkAuth(e)) { return true; } @@ -31,22 +111,23 @@ export async function updateRes(e) { command = `git -C ${resPath}/miao-res-plus pull`; exec(command, function (error, stdout, stderr) { console.log(stdout); - if (stdout === "Already up to date.") { + if (/Already up to date/.test(stdout)) { e.reply("素材已经是最新了~"); + return true; } if (error) { - e.reply("素材初始化失败!\nError code: " + error.code + "\n" + error.stack + "\n出错了,可以重试一下。"); + e.reply("更新失败!\nError code: " + error.code + "\n" + error.stack + "\n 请稍后重试。"); } else { - e.reply("额外素材初始化成功"); + e.reply("角色图像加量包更新成功~"); } }); } else { command = `git clone https://gitee.com/yoimiya-kokomi/miao-res-plus.git ${resPath}/miao-res-plus/`; exec(command, function (error, stdout, stderr) { if (error) { - e.reply("素材初始化失败!\nError code: " + error.code + "\n" + error.stack + "\n出错了,可以重试一下。"); + e.reply("角色图像加量包安装失败!\nError code: " + error.code + "\n" + error.stack + "\n 请稍后重试。"); } else { - e.reply("额外素材初始化成功"); + e.reply("角色图像加量包安装成功!您后续也可以通过 #喵喵更新图像 命令来更新图像"); } }); } diff --git a/apps/character.js b/apps/character.js index 10ea3c8c..da010f5a 100644 --- a/apps/character.js +++ b/apps/character.js @@ -1,6 +1,7 @@ import { segment } from "oicq"; import lodash from "lodash"; import { Character } from "../components/models.js" +import { Cfg } from "../components/index.js"; import fs from "fs"; import sizeOf from "image-size"; @@ -52,6 +53,10 @@ export async function character(e, { render, User }) { if (!e.msg) { return; } + if (Cfg.isDisable(e, "char.char")) { + return; + } + let name = e.msg.replace(/#|老婆|老公|[1|2|5][0-9]{8}/g, "").trim(); let char = Character.get(name); @@ -69,8 +74,11 @@ export async function wife(e, { render, User }) { msg = msg.replace(/#|\w/g, ""); if (!msg) return false; - let msgRet = (new RegExp(wifeReg)).exec(msg); + if (Cfg.isDisable(e, "char.wife")) { + return; + } + let msgRet = (new RegExp(wifeReg)).exec(msg); if (!msgRet) return false; let target = msgRet[1], @@ -87,12 +95,18 @@ export async function wife(e, { render, User }) { let MysApi = await e.getMysApi({ auth: "all", - target: "self", + targetType: Cfg.get("char.queryOther", true) ? "all" : "self", cookieType: "all", actionName: "查询信息" }); let selfUser = MysApi.selfUser; + let selfMysUser = await MysApi.selfUser.getMysUser(); + let isSelf = true; + if (!selfMysUser || selfMysUser.uid !== MysApi.targetUser.uid) { + isSelf = false; + } + switch (action) { case "卡片": case "照片": @@ -105,7 +119,7 @@ export async function wife(e, { render, User }) { wifeList = await selfUser.getCfg(`wife.${targetCfg.key}`, []); let renderType = action === "卡片" ? "card" : "photo"; // 存在设置 - if (wifeList && wifeList.length > 0) { + if (wifeList && wifeList.length > 0 && isSelf) { if (wifeList[0] === "随机") { // 如果选择为全部,则从列表中随机选择一个 avatarList = await getAvatarList(e, targetCfg.type, MysApi); @@ -131,8 +145,7 @@ export async function wife(e, { render, User }) { case "选择": case "挑选": case "指定": - let selfMysUser = await MysApi.selfUser.getMysUser(); - if (!selfMysUser || selfMysUser.uid !== MysApi.targetUser.uid) { + if (!isSelf) { e.reply("只能指定自己的哦~"); return true; } @@ -170,6 +183,12 @@ export async function wife(e, { render, User }) { case "是": case "是谁": // 查看当前选择老婆 + + if (!isSelf) { + e.reply("只能查看自己的哦~"); + return true; + } + wifeList = await selfUser.getCfg(`wife.${targetCfg.key}`, []); if (wifeList && wifeList.length > 0) { e.reply(`你的${targetCfg.keyword[0]}是:${wifeList.join(",")}`); @@ -220,7 +239,7 @@ async function renderAvatar(e, avatar, render, renderType = "card") { let roleId = char.id; let MysApi = await e.getMysApi({ auth: "all", - target: "all", + targetType: Cfg.get("char.queryOther", true) ? "all" : "self", cookieType: "all", actionName: "查询信息" }); @@ -286,6 +305,7 @@ async function renderCard(e, avatar, render, renderType = "card") { bg: getCharacterImg(avatar.name), ...getCharacterData(avatar), ds: char.getData("name,id,title,desc"), + cfgScale: Cfg.scale(1.25) }, "png"); if (base64) { e.reply(segment.image(`base64://${base64}`)); @@ -300,7 +320,7 @@ async function getTalent(e, avatars) { let MysApi = await e.getMysApi({ auth: "all", - target: "all", + targetType: Cfg.get("char.queryOther", true) ? "all" : "self", cookieType: "all", actionName: "查询信息" }); diff --git a/apps/stat.js b/apps/stat.js index b8e0dc6f..93845f09 100644 --- a/apps/stat.js +++ b/apps/stat.js @@ -3,10 +3,14 @@ * * */ import { HutaoApi, Character } from "../components/models.js"; +import { Cfg } from "../components/index.js"; import lodash from "lodash"; import { segment } from "oicq"; export async function consStat(e, { render }) { + if (Cfg.isDisable(e, "wiki.abyss")) { + return; + } let consData = await HutaoApi.getCons(); if (!consData) { @@ -14,6 +18,8 @@ export async function consStat(e, { render }) { return true; } + + let msg = e.msg; let mode = /持有/.test(msg) ? "char" : "cons"; @@ -71,7 +77,8 @@ export async function consStat(e, { render }) { lastUpdate: consData.lastUpdate, pct: function (num) { return (num * 100).toFixed(2); - } + }, + cfgScale: Cfg.scale(1.4) }, "png"); if (base64) { e.reply(segment.image(`base64://${base64}`)); @@ -80,6 +87,11 @@ export async function consStat(e, { render }) { } export async function abyssPct(e, { render }) { + + if (Cfg.isDisable(e, "wiki.abyss")) { + return; + } + let abyssData = await HutaoApi.getAbyssPct(); if (!abyssData) { e.reply("暂时无法查询"); @@ -119,7 +131,7 @@ export async function abyssPct(e, { render }) { avatars.push({ name: char.name, star: char.star, - value: ds.value + value: ds.value * 8 }) } }) @@ -143,7 +155,8 @@ export async function abyssPct(e, { render }) { lastUpdate: abyssData.lastUpdate, pct: function (num) { return (num * 100).toFixed(2); - } + }, + cfgScale: Cfg.scale(1.4) }, "png"); if (base64) { e.reply(segment.image(`base64://${base64}`)); diff --git a/apps/wiki.js b/apps/wiki.js index 89f49005..3f5d2e39 100644 --- a/apps/wiki.js +++ b/apps/wiki.js @@ -2,6 +2,7 @@ import { segment } from "oicq"; import fs from "fs"; import { Character } from "../components/models.js"; import lodash from "lodash"; +import { Cfg } from "../components/index.js"; //import {wikiCharacter} from "../modules/wiki.js"; @@ -32,6 +33,10 @@ export async function wiki(e, { render }) { mode = "pic"; } + if (Cfg.isDisable(e, `wiki.${mode}`)) { + return; + } + let char = Character.get(ret[1]); @@ -50,7 +55,8 @@ export async function wiki(e, { render }) { ...char, mode, line: getLineData(char), - _char: `/meta/character/${char.name}/` + _char: `/meta/character/${char.name}/`, + cfgScale: Cfg.scale(1) }); if (base64) { diff --git a/apps/word-cloud.js b/apps/word-cloud.js new file mode 100644 index 00000000..88edab5f --- /dev/null +++ b/apps/word-cloud.js @@ -0,0 +1,195 @@ +//技能列表,配置了cookie能查 +import fs from "fs"; +import lodash from "lodash"; +import common from "../../../lib/common.js"; + +import { segment } from "oicq"; + +export async function talentList(e, { render }) { + //缓存时间,单位小时 + let cacheCd = 6; + + let msg = e.msg.replace("#", "").trim(); + if (msg === "角色统计" || msg === "武器统计") { + //暂时避让一下抽卡分析的关键词 + return false; + } + + let MysApi = await getMysApi(e); + if (!MysApi) return true; + let uid = MysApi.targetUid; + + //禁止重复获取 + if (skillLoading[e.user_id]) { + e.reply("角色数据获取中,请耐心等待..."); + setTimeout(() => { + if (skillLoading[e.user_id]) delete skillLoading[e.user_id]; + }, 60000); + return; + } + + const displayMode = /(角色|武器|练度)/.test(e.msg) ? "weapon" : "talent"; + + //四星五星 + let star = 0; + if (/(四|4)/.test(msg)) star = 4; + if (/(五|5)/.test(msg)) star = 5; + + // 技能查询缓存 + let cachePath = `./data/cache/`; + if (!fs.existsSync(cachePath)) { + fs.mkdirSync(cachePath); + } + cachePath += "talentList/"; + if (!fs.existsSync(cachePath)) { + fs.mkdirSync(cachePath); + } + + let avatarRet = []; + + let hasCache = await redis.get(`cache:uid-talent-new:${uid}`); // 由于数据结构改变,临时修改一下键值,防止命中历史缓存导致展示错误 + if (hasCache && !/force/.test(e.msg)) { + // 有缓存优先使用缓存 + let jsonRet = fs.readFileSync(cachePath + `${uid}.json`, "utf8"); + avatarRet = JSON.parse(jsonRet); + } else { + + skillLoading[e.user_id] = true; + let resIndex = await MysApi.getCharacter(); + if (!resIndex) { + delete skillLoading[e.user_id]; + return true; + } + + let avatarData = resIndex && resIndex.avatars || []; + + // let skillRet = [], skill = []; + //配置了cookie的才去获取技能 + // if (NoteCookie[e.user_id]) { + + let skillRet = [], skill = []; + //配置了完整cookie的才去获取技能 + if (NoteCookie[e.user_id] && NoteCookie[e.user_id].cookie.includes("cookie_token")) { + e.reply("角色数据获取中,请耐心等待..."); + //批量获取技能数据,分组10个id一次,延迟100ms + let num = 10, ms = 100; + let avatarArr = lodash.chunk(avatarData, num); + for (let val of avatarArr) { + for (let avatar of val) { + skillRet.push(getSkill(e, uid, avatar, MysApi)); + } + skillRet = await Promise.all(skillRet); + //过滤没有获取成功的 + skillRet.filter(item => item.a); + skillRet = skillRet.filter(item => item.a); + + await common.sleep(ms); + } + skill = lodash.keyBy(skillRet, "id"); + } + + // 天赋等级背景 + const talentLvMap = '0,1,1,1,2,2,3,3,3,4,5'.split(',') + + // 根据每日素材构建 角色->素材的映射关系 + let charTalentMap = {}; + daily.forEach((weekCfg, week) => { + lodash.forIn(weekCfg[0], (talentCfg, talentName) => { + talentCfg[1].forEach((charName) => { + charTalentMap[charName] = { name: talentName, week: [3, 1, 2][week] }; + }) + }) + }); + + for (let idx in avatarData) { + let curr = avatarData[idx]; + let avatar = lodash.pick(curr, "id,name,rarity,level,rarity,fetter".split(",")); + // 埃洛伊rarity是105... + avatar.rarity = avatar.rarity > 5 ? 5 : avatar.rarity; + let weapon = curr.weapon || {}; + "name,level,rarity,affix_level".split(",").forEach((idx) => { + avatar[`weapon_${idx}`] = curr.weapon[idx]; + }); + avatar.cons = curr.actived_constellation_num; + if (avatar.id == 10000007) { + avatar.name = "荧"; + } else if (avatar.id == 10000005) { + avatar.name = "空"; + } else { + let talent = charTalentMap[avatar.name] || {}; + avatar.talent = talent.name; + avatar.talentWeek = talent.week; //`${talent.week}${talent.week + 3}`; + } + + let skillRet = skill[avatar.id] || {}; + const talentConsCfg = { a: 0, e: 3, q: 5 }; + + lodash.forIn(talentConsCfg, (consLevel, key) => { + let talent = skillRet[key] || {}; + // 天赋等级 + avatar[key] = talent.level_current || '-'; + // 是否有命座加成 + avatar[`${key}_plus`] = talent.level_current > talent.level_original; + // 天赋书星级 + avatar[`${key}_lvl`] = talentLvMap[talent.level_original * 1]; + avatar[`${key}_original`] = talent.level_original * 1; + }) + avatar.aeq = avatar.a * 1 + avatar.e + avatar.q; + avatarRet.push(avatar); + } + + fs.writeFileSync(cachePath + `${uid}.json`, JSON.stringify(avatarRet)); + //缓存 + await redis.set(`cache:uid-talent-new:${uid}`, uid, { EX: 3600 * cacheCd }); + delete skillLoading[e.user_id]; + // } + + } + //超过八个角色才分类四星五星 + if (star >= 4 && avatarRet.length > 8) { + avatarRet = avatarRet.filter(item => item.rarity == star); + } + + let sortKey = ({ + talent: "aeq,rarity,level,star,fetter,talentWeek", + weapon: "level,rarity,aeq,cons,weapon_level,weapon_rarity,weapon_affix_level,fetter" + })[displayMode].split(","); + + avatarRet = lodash.orderBy(avatarRet, sortKey, lodash.repeat("desc,", sortKey.length).split(",")); + + let noTalent = avatarRet.length == 0 || /^\-+$/.test(avatarRet.map((d) => d.a).join("")); + + let talentNotice = `技能列表每${cacheCd}小时更新一次`; + if (noTalent) { + talentNotice = "未绑定体力Cookie,无法获取天赋列表。请回复 #体力 获取配置教程"; + } + + let week = new Date().getDay(); + if (new Date().getHours() < 4) { + week--; + } + + let base64 = await render("genshin", "talentList", { + save_id: uid, + uid: uid, + avatars: avatarRet, + bgType: Math.ceil(Math.random() * 3), + abbr: genshin.abbr, + displayMode, + isSelf: e.isSelf, + week: [3, 1, 2][week % 3], + talentNotice + + }); + + if (base64) { + let msg = []; + if (e.isGroup) { + let name = lodash.truncate(e.sender.card, { length: 8 }); + msg.push(segment.at(e.user_id, name)); + } + msg.push(segment.image(`base64://${base64}`)); + e.reply(msg); + } + return true; //事件结束不再往下 +} \ No newline at end of file diff --git a/components/Cfg.js b/components/Cfg.js new file mode 100644 index 00000000..e43e06b2 --- /dev/null +++ b/components/Cfg.js @@ -0,0 +1,45 @@ +import fs from "fs"; +import lodash from "lodash"; + +const _path = process.cwd(); +const _cfgPath = `${_path}/plugins/miao-plugin/components/`; +let cfg = {}; + +if (!fs.existsSync(_cfgPath)) { + fs.mkdirSync(_cfgPath); +} + +try { + if (fs.existsSync(_cfgPath + "cfg.json")) { + cfg = JSON.parse(fs.readFileSync(_cfgPath + "miao-plugin.json", "utf8")) || {}; + } +} catch (e) { + // do nth +} + +let Cfg = { + get(rote, def = '') { + return lodash.get(cfg, rote, def); + }, + set(rote, val) { + lodash.set(cfg, rote, val); + fs.writeFileSync(_cfgPath + "cfg.json", JSON.stringify(cfg, null, "\t")); + }, + scale(pct = 1) { + let scale = Cfg.get("sys.scale", 100); + scale = Math.min(2, Math.max(0.5, scale / 100)); + pct = pct * scale; + return `style=transform:scale(${pct})`; + }, + isDisable(e, rote) { + if (Cfg.get(rote, true)) { + return false; + } + if (/^#*喵喵/.test(e.msg || "")) { + return false; + } + return true; + } +}; + +export default Cfg; \ No newline at end of file diff --git a/components/index.js b/components/index.js index 2f13c943..ddb92f48 100644 --- a/components/index.js +++ b/components/index.js @@ -1,3 +1,4 @@ import Data from "./Data.js"; +import Cfg from "./Cfg.js"; -export { Data } \ No newline at end of file +export { Data, Cfg } \ No newline at end of file diff --git a/index.js b/index.js index 2ddbe489..8fa28bdf 100644 --- a/index.js +++ b/index.js @@ -3,9 +3,9 @@ import { consStat, abyssPct } from "./apps/stat.js"; import { wiki } from "./apps/wiki.js"; import lodash from "lodash"; -import { rule as adminRule, updateRes } from "./apps/admin.js"; +import { rule as adminRule, updateRes, sysCfg } from "./apps/admin.js"; -export { character, wife, consStat, abyssPct, wiki, updateRes }; +export { character, wife, consStat, abyssPct, wiki, updateRes, sysCfg }; let rule = { diff --git a/resources/admin/bg.png b/resources/admin/bg.png new file mode 100644 index 00000000..db03ee1d Binary files /dev/null and b/resources/admin/bg.png differ diff --git a/resources/admin/cfg-right.jpg b/resources/admin/cfg-right.jpg new file mode 100644 index 00000000..5bf552ad Binary files /dev/null and b/resources/admin/cfg-right.jpg differ diff --git a/resources/admin/cfg-right.png b/resources/admin/cfg-right.png new file mode 100644 index 00000000..fcee3675 Binary files /dev/null and b/resources/admin/cfg-right.png differ diff --git a/resources/admin/index.css b/resources/admin/index.css new file mode 100644 index 00000000..ac991580 --- /dev/null +++ b/resources/admin/index.css @@ -0,0 +1,90 @@ +body { + transform: scale(1); + width: 520px; +} + +.container { + background: url("bg.png") #000144 left top no-repeat; + background-size: 520px auto; + width:520px; +} + +.head-box { + margin: 0 0 80px 0; +} + +.cfg-box { + border-radius: 15px; + margin-top: 20px; + margin-bottom: 20px; + padding: 5px 15px; + overflow: hidden; + background: #f5f5f5; + box-shadow: 0 5px 10px 0 rgb(0 0 0 / 15%); + position: relative; + background: rgba(35, 38, 57, .8); +} + + +.cfg-group { + color: #ceb78b; + font-size: 18px; + font-weight: bold; + padding: 10px 20px; +} + +.cfg-ul { + +} + +.cfg-li { + border-radius: 18px; + min-height: 36px; + position: relative; + overflow: hidden; + margin-bottom: 10px; + background: rgba(203, 196, 190, 0); +} + +.cfg-line { + color: #4e5769; + line-height: 36px; + padding-left: 20px; + font-weight: bold; + border-radius: 16px; + box-shadow: 0 0 2px rgba(0, 0, 0, 0.5); + background: url("./cfg-right.jpg") right top #cbc4be no-repeat; + background-size: auto 36px; +} + +.cfg-hint { + font-size: 12px; + font-weight: normal; + margin-top: 3px; + margin-bottom: -3px; +} + +.cfg-status { + position: absolute; + top: 0; + right: 0; + height: 36px; + width: 160px; + text-align: center; + line-height: 36px; + font-size: 16px; + color: #495366; + font-weight: bold; + border-radius: 0 16px 16px 0; + font-family: Number, "微软雅黑", sans-serif; +} + +.cfg-status.status-off { + color: #a95151; +} + +.cfg-desc { + font-size: 12px; + color: #cbc4be; + margin: 5px 0 5px 20px; +} \ No newline at end of file diff --git a/resources/admin/index.html b/resources/admin/index.html new file mode 100644 index 00000000..0d9fa200 --- /dev/null +++ b/resources/admin/index.html @@ -0,0 +1,114 @@ + + + + + + + + + +
+
+
+
#喵喵设置
+
喵喵管理面板
+
+
+
+
玩家&老婆卡片展示
+ +
+
+
角色资料与信息查询
+ +
+
+
系统设置
+ + +
+ +
+ + \ No newline at end of file diff --git a/resources/character/card.css b/resources/character/card.css index 8d5b0e82..5b63b32d 100644 --- a/resources/character/card.css +++ b/resources/character/card.css @@ -1,20 +1,20 @@ @font-face { font-family: "HWZhongSong"; - src: url("../font/华文中宋.TTF"); + src: url("../common/font/华文中宋.TTF"); font-weight: normal; font-style: normal; } @font-face { font-family: "tttgbnumber"; - src: url("../font/tttgbnumber.ttf"); + src: url("../common/font/tttgbnumber.ttf"); font-weight: normal; font-style: normal; } @font-face { font-family: "NZBZ"; - src: url("../font/NZBZ.ttf"); + src: url("../common/font/NZBZ.ttf"); font-weight: normal; font-style: normal; } diff --git a/resources/character/card.html b/resources/character/card.html index 1c816600..14b799c0 100644 --- a/resources/character/card.html +++ b/resources/character/card.html @@ -5,7 +5,7 @@ - +
ID:{{uid}}
diff --git a/resources/common/common.css b/resources/common/common.css new file mode 100644 index 00000000..95ed53ec --- /dev/null +++ b/resources/common/common.css @@ -0,0 +1,100 @@ +@font-face { + font-family: "HWZS"; + src: url("../common/font/华文中宋.TTF"); + font-weight: normal; + font-style: normal; +} + +@font-face { + font-family: "Number"; + src: url("../common/font/tttgbnumber.ttf"); + font-weight: normal; + font-style: normal; +} + +@font-face { + font-family: "NZBZ"; + src: url("../common/font/NZBZ.ttf"); + font-weight: normal; + font-style: normal; +} + +* { + margin: 0; + padding: 0; + box-sizing: border-box; + user-select: none; +} + +body { + font-size: 18px; + color: #1e1f20; + font-family: PingFangSC-Medium, PingFang SC, sans-serif; + transform: scale(1.4); + transform-origin: 0 0; + background: url("./bg1.png") top left no-repeat #2a3860; + background-size: contain; + width: 600px; +} + +.container { + width: 600px; + padding: 20px 15px 10px 15px; + + background-size: contain; +} + + +.head-box { + border-radius: 15px; + padding: 10px 20px; + position: relative; + color: #fff; + margin-top: 30px; + +} + +.head-box .title { + font-size: 36px; + font-family: NZBZ, sans-serif; + text-shadow: 0 0 1px #000, 1px 1px 3px rgba(0,0,0,.9); +} + + +.head-box .genshin_logo { + position: absolute; + top: 1px; + right: 15px; + width: 97px; +} + +.head-box .label { + font-size: 16px; + text-shadow: 0 0 1px #000, 1px 1px 3px rgba(0,0,0,.9); +} + + +.notice { + color: #888; + font-size: 12px; + text-align: right; + padding: 12px 5px 5px; +} + +.notice-center { + color: #fff; + text-align: center; + margin-bottom: 10px; + text-shadow: 1px 1px 1px #333; +} + +.copyright { + font-size: 16px; + font-family: Number, sans-serif; + text-align: center; + color: #fff; + position: relative; + padding-left: 10px; + text-shadow: 1px 1px 1px #000; + margin-bottom: 10px; +} diff --git a/resources/font/HYWenHei-55W.ttf b/resources/common/font/HYWenHei-55W.ttf similarity index 100% rename from resources/font/HYWenHei-55W.ttf rename to resources/common/font/HYWenHei-55W.ttf diff --git a/resources/font/NZBZ.ttf b/resources/common/font/NZBZ.ttf similarity index 100% rename from resources/font/NZBZ.ttf rename to resources/common/font/NZBZ.ttf diff --git a/resources/font/tttgbnumber.ttf b/resources/common/font/tttgbnumber.ttf similarity index 100% rename from resources/font/tttgbnumber.ttf rename to resources/common/font/tttgbnumber.ttf diff --git a/resources/font/华文中宋.TTF b/resources/common/font/华文中宋.TTF similarity index 100% rename from resources/font/华文中宋.TTF rename to resources/common/font/华文中宋.TTF diff --git a/resources/miao-res-plus b/resources/miao-res-plus new file mode 160000 index 00000000..6b582ed7 --- /dev/null +++ b/resources/miao-res-plus @@ -0,0 +1 @@ +Subproject commit 6b582ed7f308ce1db3ccf0ab7ed9b01d0f77b7fd diff --git a/resources/stat/abyss-pct.html b/resources/stat/abyss-pct.html index 5fc0689c..6eba7ef1 100644 --- a/resources/stat/abyss-pct.html +++ b/resources/stat/abyss-pct.html @@ -7,7 +7,7 @@ - +
diff --git a/resources/stat/character.html b/resources/stat/character.html index 74a91a60..fc4d50f5 100644 --- a/resources/stat/character.html +++ b/resources/stat/character.html @@ -7,7 +7,7 @@ - +
diff --git a/resources/stat/common.css b/resources/stat/common.css index a14699cb..8e34c68d 100644 --- a/resources/stat/common.css +++ b/resources/stat/common.css @@ -1,18 +1,18 @@ @font-face { font-family: "tttgbnumber"; - src: url("../../font/tttgbnumber.ttf"); + src: url("../common/font/tttgbnumber.ttf"); font-weight: normal; font-style: normal; } @font-face { font-family: HYWenHei-55W; - src: url('../../font/HYWenHei-55W.ttf'); + src: url('../common/font/HYWenHei-55W.ttf'); } @font-face { font-family: "NZBZ"; - src: url("../font/NZBZ.ttf"); + src: url("../common/font/NZBZ.ttf"); font-weight: normal; font-style: normal; } diff --git a/resources/wiki/character.css b/resources/wiki/character.css index 5b577d93..dc91b399 100644 --- a/resources/wiki/character.css +++ b/resources/wiki/character.css @@ -1,6 +1,6 @@ @font-face { font-family: "tttgbnumber"; - src: url("../font/tttgbnumber.ttf"); + src: url("../common/font/tttgbnumber.ttf"); font-weight: normal; font-style: normal; } diff --git a/tools/test.txt b/tools/test.txt new file mode 100644 index 00000000..a328f06d --- /dev/null +++ b/tools/test.txt @@ -0,0 +1,35 @@ + 夜兰 | Honey Impact - Genshin Impact DB and Tools

Return to char

Character #54

LiveBeta
Title兰生幽谷
Allegiance岩上茶室
Rarity
Weapon TypeBow
Element
Birthday20 April
Astrolabe Name幽客座
Chinese Seiyuu???
Japanese Seiyuu???
English Seiyuu???
Korean Seiyuu???
In-game Description测试角色
Table of Contents
Stats
Stats
Attack Talents
Talents Material
Passive Talents
Constellations
Ascension Rewards
NameCard
Card Item
Specific Food
Gallery
Combat Sounds
Quotes
Stories
Comments
Stat Progression
Lv基础生命值基础攻击力基础防御力暴击率暴击伤害AscensionTotal
1112519435%50%
202918491115%50%
20+3883661475%50%
405810982205%50%
40+64951102469.8%50%
5074721262839.8%50%
50+838614231814.6%50%
60937415835514.6%50%
60+1005917038114.6%50%
701105618741914.6%50%
70+1174119844519.4%50%
801274921548319.4%50%
80+1343422750924.2%50%
901445024454824.2%50%
Attack Talents
普通攻击·潜形隐曜弓
普通攻击
进行至多四段的连续弓箭射击。
重击
进行伤害更高、更为精准的瞄准射击。
瞄准时,流水会在箭矢上持续积聚。聚满了激流的箭矢会造成水元素伤害。
破局
脱离战斗状态5秒后,夜兰将获得「破局」状态,使下一次满蓄力瞄准射击所需的蓄力时间减少80%,并将在满蓄力时转为发射「破局矢」。破局矢将基于夜兰的生命值上限造成水元素范围伤害。
下落攻击
从空中射出箭雨,并迅速下坠冲击地面,在落地时造成范围伤害。
Lv1Lv2Lv3Lv4Lv5Lv6Lv7Lv8Lv9Lv10Lv11Lv12Lv13Lv14Lv15
一段伤害 40.68% 43.99% 47.3% 52.03% 55.34% 59.13% 64.33% 69.53% 74.73% 80.41% 86.09% 91.76% 97.44% 103.11% 108.79%
二段伤害 39.04% 42.22% 45.4% 49.94% 53.12% 56.75% 61.74% 66.74% 71.73% 77.18% 82.63% 88.08% 93.52% 98.97% 104.42%
三段伤害 51.6% 55.8% 60% 66% 70.2% 75% 81.6% 88.2% 94.8% 102% 109.2% 116.4% 123.6% 130.8% 138%
四段伤害 21.67% *3 23.44% *3 25.2% *3 27.72% *3 29.48% *3 31.5% *3 34.27% *3 37.04% *3 39.82% *3 42.84% *3 45.86% *3 48.89% *3 51.91% *3 54.94% *3 57.96% *3
瞄准射击 43.86% 47.43% 51% 56.1% 59.67% 63.75% 69.36% 74.97% 80.58% 86.7% 92.82% 98.94% 105.06% 111.18% 117.3%
满蓄力瞄准射击 124% 133.3% 142.6% 155% 164.3% 173.6% 186% 198.4% 210.8% 223.2% 235.6% 248% 263.5% 279% 294.5%
破局矢伤害 11.58% 生命值上限 12.44% 生命值上限 13.31% 生命值上限 14.47% 生命值上限 15.34% 生命值上限 16.21% 生命值上限 17.36% 生命值上限 18.52% 生命值上限 19.68% 生命值上限 20.84% 生命值上限 21.99% 生命值上限 23.15% 生命值上限 24.6% 生命值上限 26.05% 生命值上限 27.49% 生命值上限
下坠期间伤害 56.83% 61.45% 66.08% 72.69% 77.31% 82.6% 89.87% 97.14% 104.41% 112.34% 120.27% 128.2% 136.12% 144.05% 151.98%
低空/高空坠地冲击伤害 113.63% / 141.93% 122.88% / 153.49% 132.13% / 165.04% 145.35% / 181.54% 154.59% / 193.1% 165.17% / 206.3% 179.7% / 224.45% 194.23% / 242.61% 208.77% / 260.76% 224.62% / 280.57% 240.48% / 300.37% 256.34% / 320.18% 272.19% / 339.98% 288.05% / 359.79% 303.9% / 379.59%
萦络纵命索
牵引「络命丝」疾走,缠络标记途径的敌人。
疾走结束时,「络命丝」将会爆发,基于夜兰的生命值上限,对标记的敌人造成水元素伤害。
点按
快速向前疾走一段距离。
长按
持续疾走。
期间,夜兰可以控制冲刺的方向,并能通过再次施放技能,提前结束疾走状态。
此外,「络命丝」爆发时,依照标记敌人的数量,夜兰将有概率获得「破局」状态:每个标记的敌人能使概率提升34%。
直到她钩指扯线,恶党贼寇之辈、阴谋诡计之徒才会发现,自己已是在劫难逃。
Lv1Lv2Lv3Lv4Lv5Lv6Lv7Lv8Lv9Lv10Lv11Lv12Lv13Lv14Lv15
技能伤害 22.61% 生命值上限 24.31% 生命值上限 26.01% 生命值上限 28.27% 生命值上限 29.96% 生命值上限 31.66% 生命值上限 33.92% 生命值上限 36.18% 生命值上限 38.44% 生命值上限 40.7% 生命值上限 42.97% 生命值上限 45.23% 生命值上限 48.05% 生命值上限 50.88% 生命值上限 53.71% 生命值上限
长按最大持续时间 3 秒 3 秒 3 秒 3 秒 3 秒 3 秒 3 秒 3 秒 3 秒 3 秒 3 秒 3 秒 3 秒 3 秒 3 秒
冷却时间 10 秒 10 秒 10 秒 10 秒 10 秒 10 秒 10 秒 10 秒 10 秒 10 秒 10 秒 10 秒 10 秒 10 秒 10 秒
渊图玲珑骰
造成水元素范围伤害,并凝聚出「玄掷玲珑」,协助进行战斗。
玄掷玲珑
将跟随角色,并在以下情况下,进行协同攻击,基于夜兰的生命值上限造成水元素伤害:
• 队伍中自己的当前场上角色进行普通攻击时,每1秒至多触发一次;
• 夜兰自己的「络命丝」爆发并命中敌人时,将进行一次协同攻击。
「嗜赌可不行哦。作为大庄家,我拿比大小来比喻一下吧。你用一个骰子,怎么赢得过我的七个骰子呢?」
Lv1Lv2Lv3Lv4Lv5Lv6Lv7Lv8Lv9Lv10Lv11Lv12Lv13Lv14Lv15
技能伤害 7.31% 生命值上限 7.86% 生命值上限 8.4% 生命值上限 9.14% 生命值上限 9.68% 生命值上限 10.23% 生命值上限 10.96% 生命值上限 11.69% 生命值上限 12.42% 生命值上限 13.15% 生命值上限 13.89% 生命值上限 14.62% 生命值上限 15.53% 生命值上限 16.44% 生命值上限 17.36% 生命值上限
玄掷玲珑伤害 4.87% 生命值上限*3 5.24% 生命值上限*3 5.6% 生命值上限*3 6.09% 生命值上限*3 6.46% 生命值上限*3 6.82% 生命值上限*3 7.31% 生命值上限*3 7.8% 生命值上限*3 8.28% 生命值上限*3 8.77% 生命值上限*3 9.26% 生命值上限*3 9.74% 生命值上限*3 10.35% 生命值上限*3 10.96% 生命值上限*3 11.57% 生命值上限*3
持续时间 15 秒 15 秒 15 秒 15 秒 15 秒 15 秒 15 秒 15 秒 15 秒 15 秒 15 秒 15 秒 15 秒 15 秒 15 秒
冷却时间 18 秒 18 秒 18 秒 18 秒 18 秒 18 秒 18 秒 18 秒 18 秒 18 秒 18 秒 18 秒 18 秒 18 秒 18 秒
元素能量 70 70 70 70 70 70 70 70 70 70 70 70 70 70 70
Talent Ascension Materials (Single Talent)Talent Ascension Materials (All 3 Talents lvl 10)
Passive Talents
长考一着
在璃月执行时长为20小时的探索派遣任务时,获得的奖励增加25%。
猜先有方
队伍存在1/2/3/4种元素类型的角色时,夜兰的生命值上限提升6%/12%/18%/30%。
妙转随心
「玄掷玲珑」存在期间,能使队伍中自己的当前场上角色造成的伤害提高1%,并且每1秒进一步提高3.5%,至多使角色造成的伤害提高50%。
Constellations
与谋者,以局入局
萦络纵命索的可使用次数增加1次。
入彀者,多多益善
「玄掷玲珑」协同攻击时,会发射一枚额外的水箭,造成相当于夜兰生命值上限20%的水元素伤害。
该效果每2.8秒至多触发一次。
坐庄者,三仙戏法
萦络纵命索的技能等级提高3级。
至多提升至15级。
诓惑者,接树移花
依照「络命丝」标记敌人的数量,每次标记将在爆发时使队伍中所有角色的生命值上限提升10%,持续25秒。通过这种方式,生命值上限至多获得40%提升。
晃盅者,琼畟药骰
渊图玲珑骰的技能等级提高3级。
至多提升至15级。
取胜者,大小通吃
施放渊图玲珑骰后,夜兰将进入「运筹帷幄」状态:
夜兰的普通攻击将转为发射较强的「破局矢」。这种箭矢具有「破局矢」原本的特性,造成的伤害视为重击伤害,能造成原本130%伤害。
「运筹帷幄」状态至多持续20秒,将在夜兰发射6枚箭矢后移除。
Ascension Rewards
AscensionReward
1
3
5
NameCard
夜兰·一掷
TypeNamecard Style
Rarity
In-game Slang
In-game Description
名片纹饰。
「做骰子本来就难得公平。做工糙一点的骰子,不同点数掏空的重量肯定会不一样。」
Card Item
夜兰
Rarity
In-game Slang角色解锁
In-game Description
夜兰个人描述
Specific Food
沾露虾仁
TypeSpecial Dish
Original Food清炒虾仁
Rarity
Effect队伍中所有角色护盾强效提升35%,持续300秒。多人游戏时,仅对自己的角色生效。
In-game Slang食物
In-game Description
夜兰的特色料理。食材选用的是由翘英庄送到茶室的新茶沾露,配合现捕的河虾快速炒制。观之,色泽雅丽;闻之,茶香幽远;尝之,软嫩弹牙…等等,她怎么又端了个辣椒碟上来?
Obtained from recipe
夜兰
+
虾仁
x 4+
面粉
x 3+
金鱼草
x 3
Character Gallery
Quotes
???
???
Audio LanguageEnglishJapaneseChineseKorean
Audio Response
???
???
Audio LanguageEnglishJapaneseChineseKorean
Audio Response
???
???
Audio LanguageEnglishJapaneseChineseKorean
Audio Response
???
???
Audio LanguageEnglishJapaneseChineseKorean
Audio Response
???
???
Audio LanguageEnglishJapaneseChineseKorean
Audio Response
???
???
Audio LanguageEnglishJapaneseChineseKorean
Audio Response
???
???
Audio LanguageEnglishJapaneseChineseKorean
Audio Response
???
???
Audio LanguageEnglishJapaneseChineseKorean
Audio Response
???
???
Audio LanguageEnglishJapaneseChineseKorean
Audio Response
???
???
Audio LanguageEnglishJapaneseChineseKorean
Audio Response
???
???
Audio LanguageEnglishJapaneseChineseKorean
Audio Response
???
???
Audio LanguageEnglishJapaneseChineseKorean
Audio Response
???
???
Audio LanguageEnglishJapaneseChineseKorean
Audio Response
???
???
Audio LanguageEnglishJapaneseChineseKorean
Audio Response
???
???
Audio LanguageEnglishJapaneseChineseKorean
Audio Response
???
???
Audio LanguageEnglishJapaneseChineseKorean
Audio Response
???
???
Audio LanguageEnglishJapaneseChineseKorean
Audio Response
???
???
Audio LanguageEnglishJapaneseChineseKorean
Audio Response
???
???
Audio LanguageEnglishJapaneseChineseKorean
Audio Response
???
???
Audio LanguageEnglishJapaneseChineseKorean
Audio Response
???
???
Audio LanguageEnglishJapaneseChineseKorean
Audio Response
???
???
Audio LanguageEnglishJapaneseChineseKorean
Audio Response
???
???
Audio LanguageEnglishJapaneseChineseKorean
Audio Response
???
???
Audio LanguageEnglishJapaneseChineseKorean
Audio Response
???
???
Audio LanguageEnglishJapaneseChineseKorean
Audio Response
???
???
Audio LanguageEnglishJapaneseChineseKorean
Audio Response
???
???
Audio LanguageEnglishJapaneseChineseKorean
Audio Response
???
???
Audio LanguageEnglishJapaneseChineseKorean
Audio Response
???
???
Audio LanguageEnglishJapaneseChineseKorean
Audio Response
???
???
Audio LanguageEnglishJapaneseChineseKorean
Audio Response
???
???
Audio LanguageEnglishJapaneseChineseKorean
Audio Response
???
???
Audio LanguageEnglishJapaneseChineseKorean
Audio Response
???
???
Audio LanguageEnglishJapaneseChineseKorean
Audio Response
???
???
Audio LanguageEnglishJapaneseChineseKorean
Audio Response
???
???
Audio LanguageEnglishJapaneseChineseKorean
Audio Response
???
???
Audio LanguageEnglishJapaneseChineseKorean
Audio Response
???
???
Audio LanguageEnglishJapaneseChineseKorean
Audio Response
???
???
Audio LanguageEnglishJapaneseChineseKorean
Audio Response
???
???
Audio LanguageEnglishJapaneseChineseKorean
Audio Response
???
???
Audio LanguageEnglishJapaneseChineseKorean
Audio Response
???
???
Audio LanguageEnglishJapaneseChineseKorean
Audio Response
???
???
Audio LanguageEnglishJapaneseChineseKorean
Audio Response
???
???
Audio LanguageEnglishJapaneseChineseKorean
Audio Response
???
???
Audio LanguageEnglishJapaneseChineseKorean
Audio Response
???
???
Audio LanguageEnglishJapaneseChineseKorean
Audio Response
???
???
Audio LanguageEnglishJapaneseChineseKorean
Audio Response
???
???
Audio LanguageEnglishJapaneseChineseKorean
Audio Response
???
???
Audio LanguageEnglishJapaneseChineseKorean
Audio Response
???
???
Audio LanguageEnglishJapaneseChineseKorean
Audio Response
???
???
Audio LanguageEnglishJapaneseChineseKorean
Audio Response
???
???
Audio LanguageEnglishJapaneseChineseKorean
Audio Response
???
???
Audio LanguageEnglishJapaneseChineseKorean
Audio Response
???
???
Audio LanguageEnglishJapaneseChineseKorean
Audio Response
???
???
Audio LanguageEnglishJapaneseChineseKorean
Audio Response
???
???
Audio LanguageEnglishJapaneseChineseKorean
Audio Response
???
???
Audio LanguageEnglishJapaneseChineseKorean
Audio Response
???
???
Audio LanguageEnglishJapaneseChineseKorean
Audio Response
???
???
Audio LanguageEnglishJapaneseChineseKorean
Audio Response
???
???
Audio LanguageEnglishJapaneseChineseKorean
Audio Response
???
???
Audio LanguageEnglishJapaneseChineseKorean
Audio Response
???
???
Audio LanguageEnglishJapaneseChineseKorean
Audio Response
???
???
Audio LanguageEnglishJapaneseChineseKorean
Audio Response
???
???
Audio LanguageEnglishJapaneseChineseKorean
Audio Response
???
???
Audio LanguageEnglishJapaneseChineseKorean
Audio Response
???
???
Audio LanguageEnglishJapaneseChineseKorean
Audio Response
???
???
Audio LanguageEnglishJapaneseChineseKorean
Audio Response
Stories
???
???
???
???
???
???
???
???

1,220 comments

Skip to comment form

    • Lortite on 7 April 2022 at 3:28 pm
    • Reply

    Yelan is already 2x better than Xingqiu reasons:

    Yelan: passive dmg, self buff, 50% dmg buff, main while dps is on cd, crit ascension.

    Xingqiu: passive dmg, great er, atk ascension, heal.

    (aa goodluck yelan wanters

    • yerboy on 7 April 2022 at 2:22 pm
    • Reply

    im gonna play tartaglia, xingqiu, yelan, shinobu and I DONT CARE IM GONNA HAVE FUN

    • Minty Fair on 7 April 2022 at 12:39 pm
    • Reply

    Omg, they buff Yelan and now she gets 4 particles on her e everytime unlike before where there is a chance that it will be either 3-4 particles. Yelan wanters unite 😀

    • Nerf Bennet please on 7 April 2022 at 12:28 pm
    • Reply

    Yelan is much better than Xinqiu C6? What? Do not agree? I have C6 Xinqiu, dmg is suck, only become hydro applier, his Artifacts and sword are so busy looking for ER. Which is Yelan using her HP as her dmg and bow can do buff to party, cost just 70, with short CD. 😛

    • Thank me later on 7 April 2022 at 12:03 pm
    • Reply

    If you care so much about what TC says, then uninstall Genshin Impact and play the game on your goddamn Microsoft Excel. Lol

    • Pray for yelan on 7 April 2022 at 11:12 am
    • Reply

    People seems to be confused with why xinqiu’s hydro application is miles ahead of yelan even though both have the same ICD limitation, so let me explain using hutao case.

    Xinqiu’s rainsword goes from 2 rainswords to 3 rainswords to 5 rainswords. So, following the standard ICD of 3 hits/2.5s, that’s: (I = hydro application, O = no application)
    1st NA: IO + orbital (NA+CA vape)
    2nd NA: OIO (CA vape)
    3rd NA: OIOOI (CA vape + blossom vape)
    4th NA: IO + orbital <= 2.5s refresh (NA+CA vape)
    5th NA: OIO (CA vape)
    6th NA: OIOOI (CA vape)

    With yelan (taken from beta test result) it usually goes like this:
    1st NA: IOO (NA+CA vape)
    2nd NA: IOO (CA vape)
    3rd NA: IOO (CA vape, blossom apply pyro aura)
    4th NA: IOO (yelan forward vape, hutao perform 3NA, 1st NA apply pyro aura)
    5th NA: IOO (yelan forward vape)
    6th NA: IOO (yelan apply hydro, hutao CA vape)

    Legends: NA = normal attack, CA = charged attack
    3NA = 3 normal attack strings

    See the main difference? With xinqiu, hutao can infinitely perform 1NA-CA-jump/dash cancel combo and will reverse vape all of her CA. With yelan, hutao need to do 3x 1NA-CA followed by 3NA-CA then repeat to allow her to reverse vape all of her CA. Doable, but a huge pain in the arse. Do keep in mind that the 3NA-CA hutao does must be delayed to accommodate for yelan’s proc CD, which is another layer of pain.
    With zhongli in the team, you’ll need to run away before creating any pillar. With albedo in the team, good luck.
    So, demand buff, don’t overhype. We want yelan strong, not clunky. Thank you for your attention.

    • yelan mommy on 7 April 2022 at 10:39 am
    • Reply

    yelan is perfect for a yoimiya with yunjin because she can increase yunjin’s NA buff’s as well with her 2nd passive! yoimiya’s burst doesn’t snapshot means yelan’s 2nd passive can gradually increase yoimiya’s burst dmg. hutao is also a good partner for yelan because of her high atk stat even though yelan might not be as strong of a hydro applicator as c6 xinqui for hutao vape!
    sadly xiangling can’t utilize this 2nd passive in the national team because of snapshotting problem : (

    • Yelan wanter on 7 April 2022 at 10:39 am
    • Reply

    Here’s my list of recommend stuff for Yelan:

    Weapons:
    3* Slingshot – 31.2% CRT.R | | 60% stronger CA in a close distance (pretty ez to obtain in all banners)
    3* Recurve Bow – 46.9% HP | | 8%~16% HP restoration upon defeating an enemy (chests in Mondstat or Nakano, located in Ritou, Inazuma)
    The Stringless – 165 EM | | 24-48% dmg increase to E’s and Q’s damage (standart banner)
    Favonius Warbow – 61.3% ER | | 3 extra particles every 12s~6s (everyone has it lol)
    Sarcificial Bow – 30.6% ER | | 40%~80% E’s cooldown reset every 32s~16s !!!very refiment hungry!!! (standart banner)
    Fading Twilight – 30.6% ER | | 12%/20%/28% more damage dealt (F2P bow from Chasm event ig)
    Elegy for the End – 55.1% ER + 60~120 EM | | 100~200 EM + 20%~40% ATK team buff for 12s every 20s (limited banner)
    Aqua Simulacra – 88.2% CRT.D + 16%~32% HP | | 20%~40% more dmg dealt in close range, even when off-field (limited banner)

    Artifacts:
    Noblesse Oblige – Q’s dmg increase | | team’s ATK buff, might be good in teams without Bennet
    2 Piece: Elemental Burst DMG +20%
    4 Piece: Using an Elemental Burst increases all party members’ ATK by 20% for 12s.
    Heart od Depth – hydro dmg bonus | | CA buff (better to use at C1/C6)
    2 Piece: Hydro DMG Bonus +15%
    4 Piece: After using Elemental Skill, increases Normal Attack and Charged Attack DMG by 30% for 15s
    Emblem of Severed Fate – ER bonus | | Q’s damage increase
    2 Piece: Energy Recharge +20%
    4 Piece: Increases Elemental Burst DMG by 25% of Energy Recharge. A maximum of 75% bonus DMG can be obtained in this way.
    Tenacity of the Millelith – core stat bonus
    2 Piece: HP increased by 20%

    In terms of stats we need 50:100 CRITs in circlet, ER sands (around 200% for smooth rorations) and hydro or HP% goblet

    Teammates:
    ||Other cases||
    Ayato×
    Kokomi×
    Hu Tao×
    Yoimiya
    Yanfei
    Diluc
    Bennet×
    Thoma×
    Raiden
    Keqing (×Primodal Jade Cutter)
    Beidou (×C1 or/and The Bell)
    Ayaka (×Primodal Jade Cutter)
    Aloy
    Diona×
    Zhongli×
    || × – recommended with C4||

    Well, this list might be not viable due to changes in beta, but i really wanted to share my opinion ~_~

    • Cannon on 7 April 2022 at 8:54 am
    • Reply

    “shes dps loss if you put her on Rational because of her short duration of burst compare to Xingqui” Huh? Her burst lasts 15sec just like Xingqui, only hers hits every second.

    • Jhacks on 7 April 2022 at 8:33 am
    • Reply

    Finally, I can bench water boi for my abyss team forever.

    • giga on 7 April 2022 at 8:22 am
    • Reply

    she seriously need a buff to her dmg bonus passive because it literally instead of giving you full buff right away it just avg the buff of on 30% so instead of 3.5% increase a 8.5% increase would be better so when she is in the middle of her ult the buff is full

    • .. on 7 April 2022 at 7:10 am
    • Reply

    I have but 1 question

    I know of Rational, or Raiden National. But do people actually call it “Baalcional”? It’s such a shit name tbh

    • weed cringe on 7 April 2022 at 7:09 am
    • Reply

    Her bday is 4/20.

    Instapull.

    • Andybersal on 7 April 2022 at 4:31 am
    • Reply

    I like Hoyoverse is releasing new characters that need old weekly boss materials and one of their actual nation on top of that. That also makes me wonder, Why does Hoyoverse even bother making new weekly bosses if only 4-5 characters are going to need their materials anyways?

    • Artifacts suck on 7 April 2022 at 4:24 am
    • Reply

    I hate farming Dmg% goblet. So damn rare and when I get one, it’s either shit or off set (still shit) that requires me to switch my good same-set artifact pieces.

    • Lmao on 7 April 2022 at 4:15 am
    • Reply

    Genshin’s hardest content nowaday is easy af for 1 year old/midbie player, I don’t even care about new characters’ power level, Hoyoverse will make sure of it for us. What players nowadays truly pay attention to is whether the character is FUN and suit their taste or not, next is the ability to coordinate new teams. Every character will have a gameplay issue and experienced players will know right away what to do to fix it, simple as that. For new players, Just enjoy the content learn gradually about game machinist, consider and choose for yourself whatever character you want to pull, don’t let one-sided judgments from anonymous theorycrafters influence your pulling decision. Nothing can go wrong matter what

      • Aish on 7 April 2022 at 8:39 am
      • Reply

      I totally agree.

      Unfortunately, there are still some people who dont understand this.

      • nosetplayer on 7 April 2022 at 9:53 am
      • Reply

      And here I am, who had been playing since two weeks after the game launched, and could only get 33 stars at the best

      • ofc on 7 April 2022 at 12:40 pm
      • Reply

      THIS

    • Angry C3 Xingqiu on 7 April 2022 at 3:46 am
    • Reply

    People here comparing Xingqiu C6 to Yelan C0. Yes it is good to compare but don’t say it like it is easy to get C6 Xingqiu than Yelan because here I am with my Xingqiu C3. It took me two years to play the game to get Xingqiu to C4 and those are because of the two Liyue events where you can get a free 4 star character in Liyue and the upcoming Inazuma event that can get my Xingqiu to C4. If you want to complain at least help us get our Xingqiu to C6 first and no I am not F2P I am a dolphin that is hoping to get Xingqiu to C6 but cannot because everytime I try to pull on Xingqiu on his banners I always get the other two characters >:( at least Yelan is guaranteed at 160 pulls and I am gonna pull for her since it will take me a long time to get Xingqiu to C6 and at least I can always use the Sacrificial bow on her like Xingqiu and build ER% on her. A

      • Not the first time on 7 April 2022 at 8:41 am
      • Reply

      I understand your point.
      Its the same that they did for Yae Miko by comparing her to c6 fishcl. Apparently they think its easy to c6 a 4 star, which isnt true.

      • MHY WHY on 7 April 2022 at 1:47 pm
      • Reply

      got c6 XQ in early 2021 (Klee+Ganyu banners + Paimon shop + CN NY free 4-star)
      stopped used him, as he is just too OP to my tastes
      I dont mind characters with OP damage output, but C6 XQ entire kit is OP
      Constellations are better then good half of limited 5-stars constellations…
      all those “LeVel 70 oNly 4-sTaRs” poser showcases were carried by him (and Benny in other half)

      • Genshin moment on 7 April 2022 at 1:52 pm
      • Reply

      People are already comparing her c2 with Xingqiu c6.

    • Hmmm on 7 April 2022 at 3:08 am
    • Reply

    Does she only have 1 idle animation? Based on leaks we’ve seen she only does that 1 animation where her dices randomly changes its number. I hope she has 2 different idles like every other chars

      • someone on 7 April 2022 at 11:26 am
      • Reply

      she has another one where she looks at her bracelet and touches it

      • pudding on 7 April 2022 at 12:45 pm
      • Reply

      no, she also adjusts her bracelet in one of her idles :p

      • the guy who smocking some crack on 7 April 2022 at 1:11 pm
      • Reply

      no she also checks her bracelet thing

      • Koltreit on 7 April 2022 at 1:31 pm
      • Reply

      They usually make two for new characters but some just had one at first and then got another one in the next version. That may happen to her, I don’t think a 5star will end up with only one animation.

      • .. on 7 April 2022 at 1:40 pm
      • Reply

      She has another one where she takes off her bracelet and puts it on again

      • yourlocalbennymain on 7 April 2022 at 3:35 pm
      • Reply

      She does! Her animation where she rolls the dice is the same it’s just the dice that changes. I kinda hoped that she would have a different reaction for the numbers she got. Like if she got a 1 she would be disappointed. Her other idle i’m pretty sure is her checking out her bracelet.

    • helloworld on 7 April 2022 at 2:32 am
    • Reply

    I wonder how the damage buff would be calculated with c6 Raiden -5s burst.

    • Idk on 7 April 2022 at 1:20 am
    • Reply

    is she even worth making a SUB/DPS at c0?

    • Reverse powecreep is worse as powercreep!!! wtf Hoyoverse? on 7 April 2022 at 12:29 am
    • Reply

    WTF hoyoverse so scared of powercreeping a 4 star. Jeez just powercreep Xingqui already, im tired of using his ugly ass. TC says shes dps loss if you put her on Rational because of her short duration of burst compare to Xingqui that his burst tha last until last rotation. Also,Yelan cant compete on Xingqui c6 hydro application on Hutao. She cant vaporize Hutao’s charged attack as often as c6 Xingqui.

      • talkingtoamoron on 7 April 2022 at 9:31 am
      • Reply

      dude… you are either troll or dumb. She is a powercreep to xingiu, she does hydro application the same, she is stronger support for hu tao. Also she has longer duration and shorter colldown than xingiu, the f*** are you talking about??

      • xinqui best boy on 7 April 2022 at 10:18 am
      • Reply

      yeah kinda sad i guess yelan will be more suitable for yoimiya at c0.

      • Hmmm on 7 April 2022 at 12:32 pm
      • Reply

      Yeah, I think so. I mean based of rarity, 5* should be stronger than 4*, but yeah this is my reason why I’m never excited for new character because I’m meta slave

    • KK310 on 6 April 2022 at 11:38 pm
    • Reply

    Would Yanfei be the biggest benefactor aside from Hutao? She doesn’t snapshot so can also benefit from the YL’s 50% DMG passive buff
    Since Yanfei’s pyro application is too fast for XQ alone, go double hydro with YF – XQ – YL – Bennett.
    Either this will end up with YF being the driver and reverse vaping for XQ and YL; or the two hydros will provide YF with 100% vape coverage and provide insane sub-DPS. Either way I expect this team to reach Rational/Hutao level of DPS.

    Happy to hear other thoughts

      • yep on 7 April 2022 at 12:46 pm
      • Reply

      You’re right with the Yanfei point

      Besides, I don’t think she improves Hutao as much as many think. xiao/diluc/klee or ayaka can take advantage of that buff dmg more efficiently than hutao imo, since they can be onfield the 15 s, instead of the Hutao’s 9 secs

      • Ayoooyo on 7 April 2022 at 1:43 pm
      • Reply

      >Since Yanfei’s pyro application is too fast for XQ alone
      Do you actually even play the game?

Leave a Reply

Your e-mail address will not be published.

\ No newline at end of file