import { getRandEelm, } from '../pubUtils/util'; import { EPlace, Stone } from "../db/Hero"; import { gameData, getRandEffectByGroupAndLevel } from "../pubUtils/data"; import { JewelType, RandSe } from '../db/Jewel'; import { getJewelRandSe } from '../pubUtils/itemUtils'; import { checkActivityTask, checkTask, checkTaskWithEplaces, checkTaskWithEplace } from './taskService'; import { TASK_TYPE } from '../consts'; import { DicRandomEffectPool } from '../pubUtils/dictionary/DicRandomEffectPool'; export function getRandSeResult(id: number, randSe: RandSe[], originSe: RandSe[] = [], originId?: number) { let { randomEffect, effectCount, lv } = gameData.jewel.get(id); let chosen = randSe.filter(cur => cur.locked).map(cur => cur.seid); // 上一轮随机出来的 let newRandSe: RandSe[] = []; // 随机结果 let startId = 0; for(let { id, seid } of originSe) { let { lv: oldLv } = gameData.jewel.get(originId); // 替换成高阶 let dicRandomEffect = gameData.randomEffectPool.get(seid); let nextRandEffect: DicRandomEffectPool; let targetRandLv = dicRandomEffect.level + lv - oldLv; while(!nextRandEffect) { nextRandEffect = getRandEffectByGroupAndLevel(dicRandomEffect.group, targetRandLv); targetRandLv--; if(targetRandLv < 0) break; } let newSeid = nextRandEffect? nextRandEffect.id: seid; newRandSe.push(getJewelRandSe(id, newSeid)); chosen.push(seid); startId++; } let randomResult: number[] = getRandEelm(randomEffect.filter(cur => !chosen.includes(cur)), effectCount); // 随机出的结果 if(randomResult.length < effectCount) { // 去上轮之后不够,把上轮加入 let chosenRandom = getRandEelm(chosen, effectCount - randomResult.length); randomResult.push(...chosenRandom); } if(randomResult.length < effectCount) { // 还是不够 let allRandom = getRandEelm(randomEffect, effectCount - randomResult.length); randomResult.push(...allRandom); } for (let i = startId; i < effectCount; i++) { if(randSe[i]) { if(randSe[i] && randSe[i].locked) { newRandSe.push(randSe[i]); } else { newRandSe.push(getJewelRandSe(randSe[i].id, randomResult[i])); } } else { newRandSe.push(getJewelRandSe(i + 1, randomResult[i])); } } return newRandSe } export function updateStone(origin: Stone[], id: number, target: number) { let newStones: Stone[] = []; let hasTarget = false; for(let stone of origin) { if(stone.id == id) { newStones.push({ id, stone: target }); hasTarget = true; } else { newStones.push(stone); } } if(!hasTarget) { newStones.push({ id, stone: target }); } return newStones; } export function updateEplace(eplace: EPlace[], eplaceId: number, update: Partial) { let newEplace: EPlace[] = []; let newEquip: EPlace; let updatedEplace: Partial[] = []; for(let equip of eplace) { if(equip.id == eplaceId) { newEplace.push({ ...equip, ...update }); newEquip = { ...equip, ...update }; updatedEplace.push({ id: equip.id, equipId: equip.equipId, ...update }); } else { newEplace.push(equip); } } return {newEplace, updatedEplace, newEquip }; } export function updateEplaces(eplace: EPlace[], update: Map>) { let newEplace: EPlace[] = []; let updatedEplace: Partial[] = []; for(let equip of eplace) { if(update.has(equip.id)) { newEplace.push({ ...equip, ...update.get(equip.id) }); updatedEplace.push({ id: equip.id, equipId: equip.equipId, ...update.get(equip.id) }); } else { newEplace.push(equip); } } return {newEplace, updatedEplace}; } /** * 检查天晶石能否装备上这个装备 * @param equip * @param jewel */ export function checkJewelCanPutOnEquip(equip: EPlace, jewel: JewelType) { // 位置是否满足 let dicJewel = gameData.jewel.get(jewel.id); if(!dicJewel || dicJewel.eplaceId != equip.id) return false; // 品质是否满足 let dicEquipQualityExtra = gameData.equipQualityExtra.get(equip.quality); if(!dicEquipQualityExtra || dicEquipQualityExtra.jewelCnt == 0) return false; return true } export function checkStoneCanPutOnEquip(equip: EPlace, id: number, stone: number) { if(stone == 0) return true; // 卸载 // 位置是否满足 let dicStone = gameData.stone.get(stone); if(!dicStone || dicStone.eplaceId != equip.id) return false; // 品质是否满足 let dicEquipQualityExtra = gameData.equipQualityExtra.get(equip.quality); if(!dicEquipQualityExtra || dicEquipQualityExtra.stoneCnt < id) return false; return true; } export async function checkTaskInComposeEquip(serverId: number, roleId: string, sid: string, oldEplace: EPlace[], newEplace: EPlace[], ePlaceId: number) { await checkTask(roleId, sid, TASK_TYPE.EQUIP_COMPOSE, newEplace.length - oldEplace.length, true, {}); await checkTaskWithEplaces(roleId, sid, TASK_TYPE.EQUIP_COMPOSE_CNT, oldEplace, newEplace, [ePlaceId]); await checkActivityTask(serverId, sid, roleId, TASK_TYPE.EQUIP_COMPOSE, newEplace.length - oldEplace.length); await checkActivityTask(serverId, sid, roleId, TASK_TYPE.EQUIP_COMPOSE_CNT, 1, { oldEplace, newEplace }); } export async function checkTaskInEquipLvUp(serverId: number, roleId: string, sid: string, oldEplace: EPlace[], newEplace: EPlace[], ePlaceIds: number[]) { await checkTaskWithEplaces(roleId, sid, TASK_TYPE.EQUIP_LV_TO, oldEplace, newEplace, ePlaceIds); await checkTask(roleId, sid, TASK_TYPE.EQUIP_LV_UP, ePlaceIds.length, true, {}); await checkActivityTask(serverId, sid, roleId, TASK_TYPE.EQUIP_LV_TO, 1, { oldEplace, newEplace, ePlaceIds }); await checkActivityTask(serverId, sid, roleId, TASK_TYPE.EQUIP_LV_UP, ePlaceIds.length, true); } export async function checkTaskInPutJewel(serverId: number, roleId: string, sid: string, oldEplace: EPlace[], newEplace: EPlace[], ePlaceId: number, originJewel: JewelType, curJewel: JewelType) { let { oldEquip, newEquip } = getEquipById(oldEplace, newEplace, ePlaceId); await checkTaskWithEplace(roleId, sid, TASK_TYPE.EQUIP_PUT_JEWEL, oldEquip, newEquip, { jewels: [originJewel, curJewel ] }); await checkTaskWithEplace(roleId, sid, TASK_TYPE.EQUIP_PUT_JEWEL_CNT, oldEquip, newEquip); await checkTaskWithEplace(roleId, sid, TASK_TYPE.EQUIP_JEWEL_RANDSE_CNT, oldEquip, newEquip, { jewels: [originJewel, curJewel ] }); await checkActivityTask(serverId, sid, roleId, TASK_TYPE.EQUIP_PUT_JEWEL, 1, { oldEquip, newEquip, jewels: [originJewel, curJewel ] }); await checkActivityTask(serverId, sid, roleId, TASK_TYPE.EQUIP_PUT_JEWEL_CNT, 1, { oldEquip, newEquip }); await checkActivityTask(serverId, sid, roleId, TASK_TYPE.EQUIP_JEWEL_RANDSE_CNT, 1, { oldEquip, newEquip, jewels: [originJewel, curJewel ] }); } export async function checkTaskInPutStone(serverId: number, roleId: string, sid: string, oldEplace: EPlace[], newEplace: EPlace[], ePlaceId: number, jewel: JewelType) { let { oldEquip, newEquip } = getEquipById(oldEplace, newEplace, ePlaceId); await checkTaskWithEplace(roleId, sid, TASK_TYPE.EQUIP_PUT_STONE, oldEquip, newEquip); await checkTaskWithEplace(roleId, sid, TASK_TYPE.EQUIP_PUT_STONE_CNT, oldEquip, newEquip); await checkTaskWithEplace(roleId, sid, TASK_TYPE.EQUIP_STONE_CNT, oldEquip, newEquip); await checkTaskWithEplace(roleId, sid, TASK_TYPE.EQUIP_STONE_CNT_LV, oldEquip, newEquip); await checkTaskWithEplace(roleId, sid, TASK_TYPE.EQUIP_JEWEL_RANDSE_CNT, oldEquip, newEquip, { jewels: [ jewel ] }); await checkActivityTask(serverId, sid, roleId, TASK_TYPE.EQUIP_PUT_STONE, 1, { oldEquip, newEquip }); await checkActivityTask(serverId, sid, roleId, TASK_TYPE.EQUIP_PUT_STONE_CNT, 1, { oldEquip, newEquip }); await checkActivityTask(serverId, sid, roleId, TASK_TYPE.EQUIP_STONE_CNT, 1, { oldEquip, newEquip }); await checkActivityTask(serverId, sid, roleId, TASK_TYPE.EQUIP_STONE_CNT_LV, 1, { oldEquip, newEquip }); await checkActivityTask(serverId, sid, roleId, TASK_TYPE.EQUIP_JEWEL_RANDSE_CNT, 1, { oldEquip, newEquip, jewels: [ jewel ] }); } export async function checkTaskInEquipStarUp(serverId: number, roleId: string, sid: string, oldEplace: EPlace[], newEplace: EPlace[], ePlaceId: number, hid: number, isUpStar: boolean) { if(isUpStar) { let { oldEquip, newEquip } = getEquipById(oldEplace, newEplace, ePlaceId); await checkTaskWithEplace(roleId, sid, TASK_TYPE.EQUIP_STAR_UP_TO, oldEquip, newEquip); await checkTaskWithEplaces(roleId, sid, TASK_TYPE.EQUIP_SUIT_SEID_NUM, oldEplace, newEplace, [ePlaceId], { hid }); await checkActivityTask(serverId, sid, roleId, TASK_TYPE.EQUIP_STAR_UP_TO, 1, { oldEquip, newEquip }); await checkActivityTask(serverId, sid, roleId, TASK_TYPE.EQUIP_SUIT_SEID_NUM, 1, { oldEplace, newEplace, ePlaceId, hid }); } await checkTask(roleId, sid, TASK_TYPE.EQUIP_STAR_UP_CNT, 1, true, {}); await checkActivityTask(serverId, sid, roleId, TASK_TYPE.EQUIP_STAR_UP_CNT, 1, {}); } export async function checkTaskInEquipQualityUp(serverId: number, roleId: string, sid: string, oldEplace: EPlace[], newEplace: EPlace[], ePlaceId: number, hid: number, isUpQuality: boolean) { if(isUpQuality) { let { oldEquip, newEquip } = getEquipById(oldEplace, newEplace, ePlaceId); await checkTaskWithEplace(roleId, sid, TASK_TYPE.EQUIP_QUALITY_UP, oldEquip, newEquip, { hid }); await checkTaskWithEplace(roleId, sid, TASK_TYPE.EQUIP_QUALITY_UP_TO, oldEquip, newEquip); await checkActivityTask(serverId, sid, roleId, TASK_TYPE.EQUIP_QUALITY_UP, 1, { ePlaceId, hid }); await checkActivityTask(serverId, sid, roleId, TASK_TYPE.EQUIP_QUALITY_UP_TO, 1, { oldEquip, newEquip, hid }); } await checkTask(roleId, sid, TASK_TYPE.EQUIP_QUALITY_UP_CNT, 1, true, {}); await checkActivityTask(serverId, sid, roleId, TASK_TYPE.EQUIP_QUALITY_UP_CNT, 1); } export async function checkTaskInEquipReset(serverId: number, roleId: string, sid: string) { await checkTask(roleId, sid, TASK_TYPE.JEWEL_RESET, 1, true, {}); await checkActivityTask(serverId, sid, roleId, TASK_TYPE.JEWEL_RESET, 1); } export async function checkTaskInEquipQuench(serverId: number, roleId: string, sid: string, isSuccess: boolean) { await checkTask(roleId, sid, TASK_TYPE.JEWEL_QUENCH, 1, true, {}); await checkActivityTask(serverId, sid, roleId, TASK_TYPE.JEWEL_QUENCH, 1); if(isSuccess) { await checkTask(roleId, sid, TASK_TYPE.JEWEL_QUENCH_SUCCESS, 1, true, {}); await checkActivityTask(serverId, sid, roleId, TASK_TYPE.JEWEL_QUENCH_SUCCESS, 1); } } export async function checkTaskInComposeStone(serverId: number, roleId: string, sid: string, count: number) { await checkTask(roleId, sid, TASK_TYPE.STONE_COMPOSE, count, true, {}); await checkActivityTask(serverId, sid, roleId, TASK_TYPE.STONE_COMPOSE, count); } function getEquipById(oldEplace: EPlace[], newEplace: EPlace[], eplaceId: number) { let oldEquip = oldEplace.find(cur => cur.id == eplaceId)||new EPlace(eplaceId, 0); let newEquip = newEplace.find(cur => cur.id == eplaceId)||new EPlace(eplaceId, 0); return { oldEquip, newEquip } } export function isLocked(randSe: RandSe[]) { for(let { locked } of randSe) { if(locked) return true; } return false; }