UPDATE: New monster data
All checks were successful
Gitea Auto Deploy / Deploy-Container (push) Successful in 1m20s
All checks were successful
Gitea Auto Deploy / Deploy-Container (push) Successful in 1m20s
This commit is contained in:
@@ -1,5 +1,5 @@
|
||||
import { mappingStats, ratioStats } from "@/constant/constant"
|
||||
import { AffixDetail } from "@/types"
|
||||
import { EliteData, HardLevelData, MainAffixData, MonsterDetail, SubAffixData} from "@/types"
|
||||
|
||||
export function calcPromotion(level: number) {
|
||||
if (level < 20) {
|
||||
@@ -37,29 +37,29 @@ export function calcRarity(rarity: string) {
|
||||
return 1
|
||||
}
|
||||
|
||||
export function calcMainAffixBonus(affix?: AffixDetail, level?: number) {
|
||||
export function calcMainAffixBonus(affix?: MainAffixData, level?: number) {
|
||||
if (!affix || typeof level !== "number") return "0"
|
||||
const value = affix.base + affix.step * level;
|
||||
const value = affix.BaseValue + affix.LevelAdd * level;
|
||||
|
||||
if (mappingStats?.[affix.property].unit === "%") {
|
||||
if (mappingStats?.[affix.Property].unit === "%") {
|
||||
return (value * 100).toFixed(1);
|
||||
}
|
||||
if (mappingStats?.[affix.property].name === "SPD") {
|
||||
if (mappingStats?.[affix.Property].name === "SPD") {
|
||||
return value.toFixed(1);
|
||||
}
|
||||
|
||||
return value.toFixed(0);
|
||||
}
|
||||
|
||||
export const calcAffixBonus = (affix?: AffixDetail, stepCount?: number, rollCount?: number) => {
|
||||
export const calcAffixBonus = (affix?: SubAffixData, stepCount?: number, rollCount?: number) => {
|
||||
if (!affix || typeof stepCount !== "number" || typeof rollCount !== "number") return "0"
|
||||
if (mappingStats?.[affix.property].unit === "%") {
|
||||
return ((affix.base * rollCount + affix.step * stepCount) * 100).toFixed(1);
|
||||
if (mappingStats?.[affix.Property].unit === "%") {
|
||||
return ((affix.BaseValue * rollCount + affix.StepValue * stepCount) * 100).toFixed(1);
|
||||
}
|
||||
if (mappingStats?.[affix.property].name === "SPD") {
|
||||
return (affix.base * rollCount + affix.step * stepCount).toFixed(1);
|
||||
if (mappingStats?.[affix.Property].name === "SPD") {
|
||||
return (affix.BaseValue * rollCount + affix.StepValue * stepCount).toFixed(1);
|
||||
}
|
||||
return (affix.base * rollCount + affix.step * stepCount).toFixed(0);
|
||||
return (affix.BaseValue * rollCount + affix.StepValue * stepCount).toFixed(0);
|
||||
}
|
||||
|
||||
export const calcBaseStat = (baseStat: number, stepStat: number, roundFixed: number, level: number) => {
|
||||
@@ -72,19 +72,19 @@ export const calcBaseStatRaw = (baseStat?: number, stepStat?: number, level?: nu
|
||||
return baseStat + stepStat * (level-1);
|
||||
}
|
||||
|
||||
export const calcSubAffixBonusRaw = (affix?: AffixDetail, stepCount?: number, rollCount?: number, baseStat?: number) => {
|
||||
export const calcSubAffixBonusRaw = (affix?: SubAffixData, stepCount?: number, rollCount?: number, baseStat?: number) => {
|
||||
if (!affix || typeof stepCount !== "number" || typeof rollCount !== "number" || typeof baseStat !== "number") return 0
|
||||
if (ratioStats.includes(affix.property)) {
|
||||
return (affix.base * rollCount + affix.step * stepCount) * baseStat;
|
||||
if (ratioStats.includes(affix.Property)) {
|
||||
return (affix.BaseValue * rollCount + affix.StepValue * stepCount) * baseStat;
|
||||
}
|
||||
return affix.base * rollCount + affix.step * stepCount;
|
||||
return affix.BaseValue * rollCount + affix.StepValue * stepCount;
|
||||
}
|
||||
|
||||
export const calcMainAffixBonusRaw = (affix?: AffixDetail, level?: number, baseStat?: number) => {
|
||||
export const calcMainAffixBonusRaw = (affix?: MainAffixData, level?: number, baseStat?: number) => {
|
||||
if (!affix || typeof level !== "number" || typeof baseStat !== "number") return 0
|
||||
const value = affix.base + affix.step * level;
|
||||
const value = affix.BaseValue + affix.LevelAdd * level;
|
||||
|
||||
if (ratioStats.includes(affix.property)) {
|
||||
if (ratioStats.includes(affix.Property)) {
|
||||
return baseStat * value
|
||||
}
|
||||
|
||||
@@ -97,4 +97,42 @@ export const calcBonusStatRaw = (affix?: string, baseStat?: number, bonusValue?:
|
||||
return baseStat * bonusValue
|
||||
}
|
||||
return bonusValue
|
||||
}
|
||||
|
||||
export const calcMonsterStats = (
|
||||
monster: MonsterDetail,
|
||||
eliteGroup: number,
|
||||
hardLevelGroup: number,
|
||||
level: number,
|
||||
hardLevelConfig: Record<string, Record<string, HardLevelData>>,
|
||||
eliteConfig: Record<string, EliteData>
|
||||
) => {
|
||||
let hardLevelRatio = {
|
||||
AttackRatio: 1,
|
||||
DefenceRatio:1,
|
||||
HPRatio: 1,
|
||||
SpeedRatio: 1,
|
||||
StanceRatio: 1
|
||||
}
|
||||
if (hardLevelConfig?.[hardLevelGroup.toString()]?.[level.toString()]) {
|
||||
hardLevelRatio = hardLevelConfig?.[hardLevelGroup.toString()]?.[level.toString()]
|
||||
}
|
||||
let eliteRatio = {
|
||||
AttackRatio: 1,
|
||||
DefenceRatio:1,
|
||||
HPRatio: 1,
|
||||
SpeedRatio: 1,
|
||||
StanceRatio: 1
|
||||
}
|
||||
if (eliteConfig?.[eliteGroup.toString()]) {
|
||||
eliteRatio = eliteConfig?.[eliteGroup.toString()]
|
||||
}
|
||||
|
||||
return {
|
||||
atk: monster.Base.AttackBase * monster.Modify.AttackModifyRatio * hardLevelRatio.AttackRatio * eliteRatio.AttackRatio,
|
||||
def: monster.Base.DefenceBase * monster.Modify.DefenceModifyRatio * hardLevelRatio.DefenceRatio * eliteRatio.DefenceRatio,
|
||||
hp: monster.Base.HPBase * monster.Modify.HPModifyRatio * hardLevelRatio.HPRatio * eliteRatio.HPRatio,
|
||||
spd: monster.Base.SpeedBase * monster.Modify.SpeedModifyRatio * hardLevelRatio.SpeedRatio * eliteRatio.SpeedRatio,
|
||||
stance: (monster.Base.StanceBase * monster.Modify.StanceModifyRatio * hardLevelRatio.StanceRatio * eliteRatio.StanceRatio) / 3,
|
||||
}
|
||||
}
|
||||
@@ -1,4 +1,4 @@
|
||||
import { AvatarEnkaDetail, AvatarProfileStore, AvatarStore, CharacterDetail, FreeSRJson, RelicStore } from "@/types";
|
||||
import { AvatarEnkaDetail, AvatarProfileStore, AvatarStore, AvatarDetail, FreeSRJson, RelicStore } from "@/types";
|
||||
|
||||
function safeNumber(val: string | number | null, fallback = 0): number {
|
||||
if (!val) return fallback;
|
||||
@@ -6,7 +6,7 @@ function safeNumber(val: string | number | null, fallback = 0): number {
|
||||
return Number.isFinite(num) && num !== 0 ? num : fallback;
|
||||
}
|
||||
|
||||
export function converterToAvatarStore(data: Record<string, CharacterDetail>): { [key: string]: AvatarStore } {
|
||||
export function converterToAvatarStore(data: Record<string, AvatarDetail>): { [key: string]: AvatarStore } {
|
||||
return Object.fromEntries(
|
||||
Object.entries(data).map(([key, value]) => [
|
||||
key,
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
import useMazeStore from "@/stores/mazeStore";
|
||||
|
||||
import useDetailDataStore from "@/stores/detailDataStore";
|
||||
import { ASConfigStore, AvatarJson, AvatarStore, BattleConfigJson, CEConfigStore, FreeSRJson, LightconeJson, MOCConfigStore, PEAKConfigStore, PFConfigStore, RelicJson } from "@/types";
|
||||
|
||||
|
||||
@@ -11,7 +12,7 @@ export function converterToFreeSRJson(
|
||||
ce_config: CEConfigStore,
|
||||
peak_config: PEAKConfigStore,
|
||||
): FreeSRJson {
|
||||
const { SkillTree } = useMazeStore.getState()
|
||||
const { skillConfig } = useDetailDataStore.getState()
|
||||
const lightcones: LightconeJson[] = []
|
||||
const relics: RelicJson[] = []
|
||||
let battleJson: BattleConfigJson
|
||||
@@ -84,8 +85,8 @@ export function converterToFreeSRJson(
|
||||
Object.entries(avatars).forEach(([avatarId, avatar]) => {
|
||||
const skillsByAnchorType: Record<string, number> = {}
|
||||
for (const [skillId, level] of Object.entries(avatar?.data?.skills || {})) {
|
||||
if (SkillTree?.[skillId]) {
|
||||
skillsByAnchorType[SkillTree[skillId].index_slot] = level > SkillTree[skillId].max_level ? SkillTree[skillId].max_level : level
|
||||
if (skillConfig?.[skillId]) {
|
||||
skillsByAnchorType[skillConfig[skillId].IndexSlot] = level > skillConfig[skillId].MaxLevel ? skillConfig[skillId].MaxLevel : level
|
||||
}
|
||||
}
|
||||
avatarsJson[avatarId] = {
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import { listCurrentLanguage } from "@/constant/constant";
|
||||
import { CharacterBasic, EventBasic, LightConeBasic, MonsterBasic } from "@/types";
|
||||
import { AvatarDetail } from "@/types";
|
||||
import { useTranslations } from "next-intl"
|
||||
|
||||
type TFunc = ReturnType<typeof useTranslations>
|
||||
@@ -7,7 +7,7 @@ type TFunc = ReturnType<typeof useTranslations>
|
||||
export function getNameChar(
|
||||
locale: string,
|
||||
t: TFunc,
|
||||
data: CharacterBasic | undefined
|
||||
data: AvatarDetail | undefined
|
||||
): string {
|
||||
if (!data) return "";
|
||||
|
||||
@@ -17,20 +17,20 @@ export function getNameChar(
|
||||
|
||||
const langKey = listCurrentLanguage[locale as keyof typeof listCurrentLanguage].toLowerCase();
|
||||
|
||||
let text = data.lang[langKey] ?? "";
|
||||
let text = data.Name[langKey] ?? "";
|
||||
|
||||
if (!text) {
|
||||
text = data.lang["en"] ?? "";
|
||||
text = data.Name["en"] ?? "";
|
||||
}
|
||||
|
||||
if (Number(data.id) > 8000) {
|
||||
text = `${t("trailblazer")} • ${t(data?.baseType?.toLowerCase() ?? "")}`;
|
||||
if (data.ID > 8000) {
|
||||
text = `${t("trailblazer")} • ${t(data?.BaseType?.toLowerCase() ?? "")}`;
|
||||
}
|
||||
|
||||
return text;
|
||||
}
|
||||
|
||||
export function getLocaleName(locale: string, data: LightConeBasic | EventBasic | MonsterBasic | undefined): string {
|
||||
export function getLocaleName(locale: string, data: Record<string, string> | undefined | null): string {
|
||||
if (!data) {
|
||||
return ""
|
||||
}
|
||||
@@ -41,10 +41,10 @@ export function getLocaleName(locale: string, data: LightConeBasic | EventBasic
|
||||
const langKey = listCurrentLanguage[locale as keyof typeof listCurrentLanguage].toLowerCase();
|
||||
|
||||
|
||||
let text = data.lang[langKey] ?? "";
|
||||
let text = data[langKey] ?? "";
|
||||
|
||||
if (!text) {
|
||||
text = data.lang["en"] ?? "";
|
||||
text = data["en"] ?? "";
|
||||
}
|
||||
return text
|
||||
}
|
||||
|
||||
@@ -1,18 +1,18 @@
|
||||
import useAvatarStore from "@/stores/avatarStore";
|
||||
|
||||
export function getSkillTree(enhanced: string) {
|
||||
const { avatarSelected, mapAvatarInfo } = useAvatarStore.getState()
|
||||
import { AvatarDetail } from "@/types";
|
||||
|
||||
export function getSkillTree(avatarSelected: AvatarDetail | null, enhanced: string) {
|
||||
if (!avatarSelected) return null;
|
||||
if (enhanced != "") return Object.values(mapAvatarInfo[avatarSelected.id || ""]?.Enhanced[enhanced].SkillTrees || {}).reduce((acc, dataPointEntry) => {
|
||||
const firstEntry = Object.values(dataPointEntry)[0];
|
||||
if (firstEntry) {
|
||||
acc[firstEntry.PointID] = firstEntry.MaxLevel;
|
||||
}
|
||||
return acc;
|
||||
}, {} as Record<string, number>)
|
||||
if (enhanced != "" && !!avatarSelected?.Enhanced?.[enhanced]?.SkillTrees) {
|
||||
return Object.values(avatarSelected?.Enhanced?.[enhanced]?.SkillTrees).reduce((acc, dataPointEntry) => {
|
||||
const firstEntry = Object.values(dataPointEntry)[0];
|
||||
if (firstEntry) {
|
||||
acc[firstEntry.PointID] = firstEntry.MaxLevel;
|
||||
}
|
||||
return acc;
|
||||
}, {} as Record<string, number>)
|
||||
}
|
||||
|
||||
return Object.values(mapAvatarInfo[avatarSelected.id || ""]?.SkillTrees).reduce((acc, dataPointEntry) => {
|
||||
return Object.values(avatarSelected?.SkillTrees).reduce((acc, dataPointEntry) => {
|
||||
const firstEntry = Object.values(dataPointEntry)[0];
|
||||
if (firstEntry) {
|
||||
acc[firstEntry.PointID] = firstEntry.MaxLevel;
|
||||
|
||||
Reference in New Issue
Block a user