kt-template-online-api/src/qqbot/plugins/bangDream/tsugu/render-blocks/list-band-detail.ts

187 lines
5.9 KiB
TypeScript

import { Player } from '@/qqbot/plugins/bangDream/tsugu/models/player';
import { Canvas, Image } from 'skia-canvas';
import { drawList } from './list-frame';
import { resizeImage } from '@/qqbot/plugins/bangDream/tsugu/render-blocks/image-stack';
import { Band } from '@/qqbot/plugins/bangDream/tsugu/models/band';
import { drawTextWithImages } from '@/qqbot/plugins/bangDream/tsugu/canvas/text';
import { starList } from './list-rarity';
import mainAPI from '@/qqbot/plugins/bangDream/tsugu/models/main-data-store';
import { bestdoriUrl } from '@/qqbot/plugins/bangDream/tsugu/runtime/config';
import { assetsRootPath } from '@/qqbot/plugins/bangDream/tsugu/runtime/config';
import * as path from 'path';
import { loadImageFromPath } from '@/qqbot/plugins/bangDream/tsugu/canvas/image-utils';
import {
BANGDREAM_DECK_TOTAL_RATING_ID,
BANGDREAM_STAGE_CHALLENGE_BAND_ID,
} from '@/qqbot/plugins/bangDream/tsugu/models/bangdream-constants';
interface drawBandDetailsInListOptions {
[bandId: number]: Array<Canvas | Image | string>;
}
//画乐队详情
/**
* 在图片布局层中绘制乐队详情列表In列表。
*
* @param BandDetailsInListOptions - 乐队详情列表In列表Options参数。
* @param key - 当前字段键名,未传入时使用默认值。
*/
async function drawBandDetailsInList(
BandDetailsInListOptions: drawBandDetailsInListOptions,
key?: string,
) {
const bandAndContentList: Array<Canvas> = [];
for (const i in BandDetailsInListOptions) {
const tempBand = new Band(parseInt(i));
const content = BandDetailsInListOptions[i];
const maxWidth = 152;
const logoWidth = 110;
const tempBandIcon = resizeImage({
image: await tempBand.getLogo(),
widthMax: logoWidth,
});
const canvas = new Canvas(maxWidth, 100);
const ctx = canvas.getContext('2d');
ctx.drawImage(tempBandIcon, (maxWidth - logoWidth) / 2, 0);
const tempBandRankText = drawTextWithImages({
content,
maxWidth: maxWidth,
lineHeight: 40,
});
ctx.drawImage(
tempBandRankText,
maxWidth / 2 - tempBandRankText.width / 2,
50,
);
bandAndContentList.push(canvas);
}
const bandAndContentListImage = drawList({
key,
content: bandAndContentList,
spacing: 0,
lineHeight: bandAndContentList?.[0].height,
textSize: bandAndContentList?.[0].height,
});
return bandAndContentListImage;
}
//画玩家信息内乐队等级
/**
* 在图片布局层中绘制玩家乐队RankIn列表。
*
* @param player - 玩家参数。
* @param key - 当前字段键名,未传入时使用默认值。
* @returns 异步处理结果。
*/
export async function drawPlayerBandRankInList(
player: Player,
key?: string,
): Promise<Canvas> {
const bandRankMap = player.profile.bandRankMap?.entries;
const BandDetails = {};
for (const i in mainAPI['bands']) {
if (bandRankMap[i] != undefined) {
BandDetails[i] = [bandRankMap[i].toString()];
} else {
BandDetails[i] = ['?'];
}
}
return drawBandDetailsInList(BandDetails, key);
}
//画玩家信息内stage challenge等级
/**
* 在图片布局层中绘制玩家试炼ChallengeRankIn列表。
*
* @param player - 玩家参数。
* @param key - 当前字段键名,未传入时使用默认值。
* @returns 异步处理结果。
*/
export async function drawPlayerStageChallengeRankInList(
player: Player,
key?: string,
): Promise<Canvas> {
const stageChallengeAchievementConditionsMap =
player.profile.stageChallengeAchievementConditionsMap.entries;
const BandDetails = {};
for (const band in mainAPI['bands']) {
const level =
stageChallengeAchievementConditionsMap?.[
BANGDREAM_STAGE_CHALLENGE_BAND_ID[band]
] || 0;
BandDetails[band] = [starList.normal, level.toString()];
}
return drawBandDetailsInList(BandDetails, key);
}
//画玩家信息内乐队卡组最高等级
const rankImage: { [rankImageName: string]: Image } = {};
/**
* 在图片布局层中加载Rank图片。
*
* @param rankImageName - rank图片名称参数。
* @returns 异步处理结果。
*/
async function loadRankImage(rankImageName: string): Promise<Image> {
if (rankImage[rankImageName] == undefined) {
try {
rankImage[rankImageName] = await loadImageFromPath(
path.join(assetsRootPath, `/Rank/${rankImageName}.png`),
);
} catch {
rankImage[rankImageName] = await loadImageFromPath(
`${bestdoriUrl}/res/icon/${rankImageName}.png`,
);
}
}
return rankImage[rankImageName];
}
/**
* 在图片布局层中绘制玩家DeckTotalRatingIn列表。
*
* @param player - 玩家参数。
* @param key - 当前字段键名,未传入时使用默认值。
*/
export async function drawPlayerDeckTotalRatingInList(
player: Player,
key?: string,
) {
const userDeckTotalRatingMap = player.profile.userDeckTotalRatingMap.entries;
const BandDetails = {};
for (const i in mainAPI['bands']) {
if (userDeckTotalRatingMap[i] != undefined) {
const rankName = userDeckTotalRatingMap[i].rank;
let rankId = BANGDREAM_DECK_TOTAL_RATING_ID[rankName];
const rankImage = await loadRankImage(`rank_${rankId}`);
const widthMax = 150,
heightMax = 100;
const canvas = new Canvas(widthMax, heightMax);
const ctx = canvas.getContext('2d');
ctx.drawImage(rankImage, (widthMax - rankImage.width) / 2, 0);
if (userDeckTotalRatingMap[i].level != 0) {
//ss与s字体相同
if (rankId > 4) {
rankId = 4;
}
const rankLevelImage = resizeImage({
image: await loadRankImage(
`rank_${rankId}_${userDeckTotalRatingMap[i].level}`,
),
heightMax: 50,
});
ctx.drawImage(
rankLevelImage,
(widthMax + rankImage.width) / 2 + 2 - rankLevelImage.width,
45,
);
}
BandDetails[i] = [canvas];
} else {
BandDetails[i] = ['?'];
}
}
return drawBandDetailsInList(BandDetails, key);
}