import {z} from 'zod' export type Region = 'JP' | 'NA' | 'CN' | 'KR' | 'TW'; export type GetApiRawRegionCCCcIdArgs = {region: Region, cc_id: number, expand?: boolean | undefined}; export type GetApiRawRegionCCCcIdOptions = {baseUrl?: string | undefined, fetch?: typeof fetch | undefined}; export const mstCommandCode = z.object({id: z.number().int(), collectionNo: z.number().int(), name: z.string(), ruby: z.string(), rarity: z.number().int(), sellQp: z.number().int(), sellMana: z.number().int(), sellRarePri: z.number().int().optional()}); export const mstSkill = z.object({effectList: z.array(z.number().int()), actIndividuality: z.array(z.number().int()), script: z.record(z.string(), z.unknown()), id: z.number().int(), type: z.number().int(), name: z.string(), ruby: z.string(), maxLv: z.number().int(), iconId: z.number().int(), motion: z.number().int()}); export const mstSkillDetail = z.object({id: z.number().int(), detail: z.string(), detailShort: z.string()}); export const mstSvtSkill = z.object({script: z.record(z.string(), z.unknown()).nullable().optional(), strengthStatus: z.number().int(), svtId: z.number().int(), num: z.number().int(), priority: z.number().int(), skillId: z.number().int(), condQuestId: z.number().int(), condQuestPhase: z.number().int(), condLv: z.number().int().optional(), condLimitCount: z.number().int(), eventId: z.number().int(), flag: z.number().int()}); export const mstSkillAdd = z.object({skillId: z.number().int(), priority: z.number().int(), commonReleaseId: z.number().int(), name: z.string(), ruby: z.string()}); export const mstSvtSkillRelease = z.object({svtId: z.number().int(), num: z.number().int(), priority: z.number().int(), idx: z.number().int(), condType: z.number().int(), condTargetId: z.number().int(), condNum: z.number().int(), condGroup: z.number().int()}); export const mstCommonRelease = z.object({id: z.number().int(), priority: z.number().int(), condGroup: z.number().int(), condType: z.number().int(), condId: z.number().int(), condNum: z.number().int()}); export const mstBuff = z.object({vals: z.array(z.number().int()), tvals: z.array(z.number().int()), ckSelfIndv: z.array(z.number().int()), ckOpIndv: z.array(z.number().int()), script: z.record(z.string(), z.unknown()), id: z.number().int(), buffGroup: z.number().int(), type: z.number().int(), name: z.string(), detail: z.string(), iconId: z.number().int(), maxRate: z.number().int()}); export const buffEntityNoReverse = z.object({mstBuff: mstBuff}); export const mstFunc = z.object({vals: z.array(z.number().int()), expandedVals: z.array(buffEntityNoReverse).optional(), tvals: z.array(z.number().int()), questTvals: z.array(z.number().int()), effectList: z.array(z.number().int()), popupTextColor: z.number().int(), script: z.record(z.string(), z.unknown()).nullable().optional(), overWriteTvalsList: z.array(z.array(z.number().int())).nullable().optional(), id: z.number().int(), cond: z.number().int().optional(), funcType: z.number().int(), targetType: z.number().int(), applyTarget: z.number().int(), popupIconId: z.number().int(), popupText: z.string()}); export const mstFuncGroup = z.object({funcId: z.number().int(), eventId: z.number().int(), baseFuncId: z.number().int(), nameTotal: z.string(), name: z.string(), iconId: z.number().int(), priority: z.number().int(), isDispValue: z.boolean()}); export const functionEntityNoReverse = z.object({mstFunc: mstFunc, mstFuncGroup: z.array(mstFuncGroup)}); export const mstSkillLv = z.object({funcId: z.array(z.number().int()), expandedFuncId: z.array(functionEntityNoReverse).nullable().optional(), svals: z.array(z.string()), script: z.record(z.string(), z.unknown()), skillId: z.number().int(), lv: z.number().int(), chargeTurn: z.number().int(), skillDetailId: z.number().int(), priority: z.number().int()}); export const mstSkillGroup = z.object({id: z.number().int(), skillId: z.number().int(), lv: z.number().int()}); export const mstSkillGroupOverwrite = z.object({funcId: z.array(z.number().int()), svals: z.array(z.string()), skillGroupId: z.number().int(), startedAt: z.number().int(), endedAt: z.number().int(), iconId: z.number().int(), vals: z.string(), skillDetailId: z.number().int(), expandedFuncId: z.array(functionEntityNoReverse).nullable().optional()}); export const mstSkillIndividuality = z.object({individuality: z.array(z.number().int()), skillId: z.number().int()}); export const skillEntityNoReverse = z.object({mstSkill: mstSkill, mstSkillDetail: z.array(mstSkillDetail), mstSvtSkill: z.array(mstSvtSkill), mstSkillAdd: z.array(mstSkillAdd), mstSvtSkillRelease: z.array(mstSvtSkillRelease), mstCommonRelease: z.array(mstCommonRelease), mstSkillLv: z.array(mstSkillLv), mstSkillGroup: z.array(mstSkillGroup), mstSkillGroupOverwrite: z.array(mstSkillGroupOverwrite), mstSkillIndividuality: mstSkillIndividuality.nullable().optional(), aiIds: z.record(z.string(), z.array(z.number().int())).nullable().optional()}); export const mstCommandCodeComment = z.object({commandCodeId: z.number().int(), comment: z.string(), illustratorId: z.number().int()}); export const mstIllustrator = z.object({id: z.number().int(), name: z.string(), comment: z.string().optional()}); export const commandCodeEntity = z.object({mstCommandCode: mstCommandCode, mstSkill: z.array(skillEntityNoReverse), mstCommandCodeComment: mstCommandCodeComment.nullable().optional(), mstIllustrator: mstIllustrator.nullable().optional()}); export const validateResponse = async ( schema: { readonly '~standard': { readonly validate: (value: unknown) => ({ readonly value: Output; readonly issues?: undefined } | { readonly issues: ReadonlyArray<{ readonly message: string; readonly path?: ReadonlyArray | undefined }> }) | Promise<{ readonly value: Output; readonly issues?: undefined } | { readonly issues: ReadonlyArray<{ readonly message: string; readonly path?: ReadonlyArray | undefined }> }> } }, value: unknown ): Promise => { const result = await schema['~standard'].validate(value) if (result.issues !== undefined) { const detail = result.issues .map(({ message, path }) => path?.length ? `${path.map((segment) => String(typeof segment === 'object' ? segment.key : segment)).join('.')}: ${message}` : message ) .join('; ') throw new Error(`Response does not match the schema: ${detail}`, { cause: { issues: result.issues } }) } return result.value }; /** * Get Command Code data * * GET /raw/{region}/CC/{cc_id} */ export const getApiRawRegionCCCcId = async (args: GetApiRawRegionCCCcIdArgs, options?: GetApiRawRegionCCCcIdOptions) => { const {baseUrl = "https://api.atlasacademy.io", fetch: fetchFn = fetch} = options ?? {} const query = new URLSearchParams() const headers = new Headers() headers.set('accept', "application/json") if (args.expand != null) query.append("expand", String(args.expand)) const url = `${baseUrl.replace(/\/+$/, '')}/raw/${encodeURIComponent(String(args.region))}/CC/${encodeURIComponent(String(args.cc_id))}${query.size > 0 ? `?${query}` : ''}` const res = await fetchFn(url, {method: "GET", headers}) if (!res.ok) throw new Error(`Request failed with status ${res.status}`, {cause: {status: res.status, body: await res.text()}}) return validateResponse(commandCodeEntity, await res.json()) };