feat: gacha

This commit is contained in:
bietiaop 2024-07-09 16:30:45 +08:00
parent e28fbd8472
commit af3b551a6a
33 changed files with 579 additions and 15 deletions

View file

@ -1,12 +1,12 @@
import settings from '../settings.js';
import PartnerId2SpriteId from '../../resources/map/PartnerId2SpriteId.json';
import PartnerId2SpriteId from '../../resources/map/PartnerId2SpriteId.json?json';
/**
*
* @param {string} id
* @param {boolean} full 显示全称
* @param {boolean} en 是否为英文
* @returns string
* @returns string | null
*/
export const IDToCharName = (id, full = true, en = false) => {
const data = PartnerId2SpriteId?.[id];
@ -19,7 +19,7 @@ export const IDToCharName = (id, full = true, en = false) => {
/**
*
* @param {string} id
* @returns string
* @returns string | null
*/
export const IDToCharSprite = id => {
const data = PartnerId2SpriteId?.[id];
@ -29,7 +29,7 @@ export const IDToCharSprite = id => {
/**
* @param {string} name
* @returns string
* @returns string | null
*/
export const charNameToID = name => {
for (const [id, data] of Object.entries(PartnerId2SpriteId)) {
@ -40,7 +40,7 @@ export const charNameToID = name => {
/**
* @param {string} name
* @returns string
* @returns string | null
*/
export const charNameToSprite = name => {
for (const [_id, data] of Object.entries(PartnerId2SpriteId)) {
@ -51,19 +51,20 @@ export const charNameToSprite = name => {
/**
* @param {string} atlas
* @returns string
* @returns string | null
*/
export const atlasToName = atlas => {
export const atlasToName = _atlas => {
const atlas = settings.getConfig('atlas');
for (const [id, data] of Object.entries(atlas)) {
if (data.includes(atlas)) return id;
if (id === _atlas) return id;
if (data.includes(_atlas)) return id;
}
return null;
};
/**
* @param {string} atlas
* @returns string
* @returns string | null
*/
export const atlasToSprite = atlas => {
const atlas = settings.getConfig('atlas');
@ -75,7 +76,7 @@ export const atlasToSprite = atlas => {
/**
* @param {string} name
* @returns string
* @returns string | null
*/
export const atlasToID = name => {
const atlas = settings.getConfig('atlas');

View file

@ -1,4 +1,4 @@
import WeaponId2Sprite from '../../resources/map/WeaponId2Sprite.json';
import WeaponId2Sprite from '../../resources/map/WeaponId2Sprite.json?json';
/**
* @param {string} id

View file

@ -127,3 +127,104 @@ export async function updateGachaLog(authKey, uid) {
saveGachaLog(uid, previousLog);
return previousLog;
}
const RANK_MAP = {
4: 'S',
3: 'A',
2: 'B',
};
const HOMO_TAG = ['非到极致', '运气不好', '平稳保底', '小欧一把', '欧狗在此'];
const NORMAL_LIST = [
'「11号」',
'猫又',
'莱卡恩',
'丽娜',
'格莉丝',
'珂蕾妲',
'拘缚者',
'燃狱齿轮',
'嵌合编译器',
'钢铁肉垫',
'硫磺石',
'啜泣摇篮',
];
export async function anaylizeGachaLog(uid) {
const savedData = getGachaLog(uid);
if (!savedData) {
return null;
}
const result = [];
for (const name in savedData) {
const data = savedData[name].map(
item =>
new SingleGachaLog(
item.uid,
item.gacha_id,
item.gacha_type,
item.item_id,
item.count,
item.time,
item.name,
item.lang,
item.item_type,
item.rank_type,
item.id
)
);
const earliest = data[data.length - 1];
const latest = data[0];
const list = [];
let lastFive = `${data.length}`;
let preIndex = 0;
let luck = 0;
data.forEach((item, i) => {
let isUp = true;
if (item.rank_type === '4') {
if (NORMAL_LIST.includes(item.name)) {
isUp = false;
}
if (lastFive === `${data.length}`) {
lastFive = `${i + 1}`;
}
list.push({
...item,
rank_type_label: RANK_MAP[item.rank_type],
isUp: isUp,
});
if (list.length > 0) {
list[list.length - 1]['totalCount'] = i - preIndex;
}
preIndex = i;
}
if (i === data.length - 1 && list.length > 0) {
list[list.length - 1]['totalCount'] = i - preIndex;
}
});
const upCount = list.length;
const totalCount = data.length;
const fiveStars = list.length;
logger.mark('fiveStars', fiveStars);
logger.mark('totalCount', totalCount);
let timeRange = '还没有抽卡';
let avgFive = '-';
let avgUp = '-';
if (data.length > 0) {
timeRange = `${latest.time} ${earliest.time}`;
if (fiveStars > 0) avgFive = (totalCount / fiveStars).toFixed(1);
if (upCount > 0) avgUp = (totalCount / upCount).toFixed(1);
}
result.push({
name,
timeRange,
list,
lastFive,
fiveStars,
upCount,
totalCount,
avgFive,
avgUp,
});
}
return result;
}