226 lines
11 KiB
TypeScript
226 lines
11 KiB
TypeScript
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<EPlace>) {
|
|
let newEplace: EPlace[] = [];
|
|
let newEquip: EPlace;
|
|
let updatedEplace: Partial<EPlace>[] = [];
|
|
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<number, Partial<EPlace>>) {
|
|
let newEplace: EPlace[] = [];
|
|
let updatedEplace: Partial<EPlace>[] = [];
|
|
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;
|
|
} |