import { gameData } from './data'; import { DicTask } from './dictionary/DicTask'; import { TASK_TYPE, ABI_STAGE, WAR_TYPE, GUILD_JOB, TASK_FUN_TYPE, FUNCS_ID } from '../consts'; import { UserTaskRecModel, UserTaskRecType } from '../db/UserTaskRec' import { RoleType, RoleModel } from '../db/Role'; import { TaskParam, TaskListReturn } from '../domain/roleField/task'; import { getTodayZeroPoint } from './timeUtil'; import { HeroType } from '../db/Hero'; import { EquipType, EquipModel } from '../db/Equip'; import { ItemInter } from './interface'; export async function checkTaskWithRoles(taskType: number, roles: RoleType[], funcs?: number[]) { let pushMessage = new Array(); for(let role of roles) { if(role) { let singlePush = await checkTaskWithRole(role.roleId, taskType, role, funcs); pushMessage.concat(singlePush); } } return pushMessage } export async function checkTaskWithRole(roleId: string, taskType: number, role: RoleType, funcs?: number[]) { let pushMessage = new Array(); if(taskType == TASK_TYPE.LOGIN_SUM) { let today = getTodayZeroPoint(); if(today > role.loginTime) { pushMessage = await checkTask(roleId, taskType, 1, true, {}, funcs); } } else if (taskType == TASK_TYPE.LOGIN_SERIES) { let today = getTodayZeroPoint(); if(today > role.loginTime) { if(today - role.loginTime > 24 * 60 * 60 ) { pushMessage = await checkTask(roleId, taskType, 0, false, {}, funcs); } else { pushMessage = await checkTask(roleId, taskType, 1, true, {}, funcs); } } } else if (taskType == TASK_TYPE.FRIEND_NUM) { let { friendCnt } = role; pushMessage = await checkTask(roleId, taskType, friendCnt, false, {}, funcs); } return pushMessage } export async function checkTaskWithHeroes(roleId: string, taskType: number, heroes: HeroType[], funcs?: number[]) { let pushMessage = new Array(); for(let hero of heroes) { let singlePush = await checkTaskWithHero(roleId, taskType, hero, [], funcs); pushMessage.concat(singlePush); } return pushMessage } export async function checkTaskWithHero(roleId: string, taskType: number, hero: HeroType, args: number[] = [], funcs?: number[]) { let pushMessage = new Array(); if(taskType == TASK_TYPE.HERO_STAR_UP) { let dicHero = gameData.hero.get(hero.hid); let starUp = hero.star - dicHero.initialStars; if(hero.colorStar > 1) starUp += hero.colorStar - 1; pushMessage = await checkTask(roleId, taskType, 1, true, { star: starUp }, funcs) } else if(taskType == TASK_TYPE.HERO_QUALITY) { let dicHero = gameData.hero.get(hero.hid); pushMessage = await checkTask(roleId, taskType, 1, true, { quality: dicHero.quality }, funcs); } else if (taskType == TASK_TYPE.HERO_QUALITY_STAR_UP) { let dicHero = gameData.hero.get(hero.hid); pushMessage = await checkTask(roleId, taskType, 1, true, { quality: dicHero.quality, star: hero.star }, funcs); } else if (taskType == TASK_TYPE.HERO_LV) { pushMessage = await checkTask(roleId, taskType, 1, true, { lv: hero.lv }, funcs); } else if (taskType == TASK_TYPE.HERO_TRAIN) { let dicHero = gameData.hero.get(hero.hid); let initGrage = gameData.job.get(dicHero.jobid).grade; let curGrade = gameData.job.get(hero.job).grade; let count = (curGrade - initGrage) * (ABI_STAGE.END - ABI_STAGE.START) + (hero.jobStage - ABI_STAGE.START); // 训练次数 pushMessage = await checkTask(roleId, taskType, 1, true, { count }, funcs); } else if (taskType == TASK_TYPE.HERO_QUALITY_UP) { let dicHero = gameData.hero.get(hero.hid); if(hero.quality - dicHero.quality == 1) { // 每个武将升品算一次 pushMessage = await checkTask(roleId, taskType, 1, true, {}, funcs); } } else if (taskType == TASK_TYPE.HERO_STAGE_UP) { let dicHero = gameData.hero.get(hero.hid); let initGrage = gameData.job.get(dicHero.jobid).grade; let curGrade = gameData.job.get(hero.job).grade; let count = curGrade - initGrage; // 进阶次数 pushMessage = await checkTask(roleId, taskType, 1, true, { count }, funcs); } else if (taskType == TASK_TYPE.HERO_FAVOUR_LV) { pushMessage = await checkTask(roleId, taskType, 1, true, { favourLv: hero.favourLv }, funcs) } else if (taskType == TASK_TYPE.EQUIP_BY_HERO) { // arg[0] 1:穿上 -1:脱下 let { ePlace } = hero; let count = ePlace.filter(cur => cur.equip).length; pushMessage = await checkTask(roleId, taskType, args[0], true, { count, isPutOn: args[0] }, funcs); } else if (taskType == TASK_TYPE.EQUIP_STRENGTHEN) { // args: 依次为原先的装备的强化等级 let { ePlace } = hero; let index = 0; for(let { lv } of ePlace) { let p = await checkTask(roleId, taskType, 1, true, { oldLv: args[index++], lv }, funcs); pushMessage = pushMessage.concat(p); } } return pushMessage } export async function checkTaskWithEquip(roleId: string, taskType: number, equip: EquipType, args: number[] = [], funcs?: number[]) { let pushMessage = new Array(); if(taskType == TASK_TYPE.EQUIP_QUALITY) { // args[0] 1:装上 -1:脱下 let dicGood = gameData.goods.get(equip.id); pushMessage = await checkTask(roleId, taskType, args[0], true, { quality: dicGood.quality }, funcs) } else if (taskType == TASK_TYPE.EQUIP_JEWEL) { // args[0] 原来镶嵌了多少宝石 let { holes } = equip; let jewelCount = holes.filter(cur => cur.jewel > 0).length; if(jewelCount > 0 && args[0] <= 0) { // 原来没有,镶嵌上了 pushMessage = await checkTask(roleId, taskType, 1, true, {}, funcs); } else if (jewelCount <= 0 && args[0] > 0) { // 原来镶嵌着,现在没了 pushMessage = await checkTask(roleId, taskType, -1, true, {}, funcs); } } else if (taskType == TASK_TYPE.EQUIP_COMPOSE_SUIT) { let dicGood = gameData.goods.get(equip.id); if(dicGood.suitId) { pushMessage = await checkTask(roleId, taskType, 1, true, {}, funcs); } } else if (taskType == TASK_TYPE.EQUIP_SUIT) { let dicGood = gameData.goods.get(equip.id); if(dicGood.suitId) { let suit = gameData.suit.get(dicGood.suitId); let equips = await EquipModel.getEquipsByIds(roleId, suit.tireInfo); let everyEquip = new Map(); for(let equip of equips) { if(everyEquip.has(equip.id)) { everyEquip.set(equip.id, everyEquip.get(equip.id) + 1); } else { everyEquip.set(equip.id, 1); } } let minCount = 0, curCount = 0; for(let id of suit.tireInfo) { let count = everyEquip.get(id)||0; if(minCount > count) minCount = count; if(id == equip.id) curCount = count; } if(curCount == minCount) { pushMessage = await checkTask(roleId, taskType, 1, true, {}, funcs); } } } else if (taskType == TASK_TYPE.EQUIP_JEWEL_SUM) { // args[0] 原来镶嵌了多少宝石 let { holes } = equip; let jewelCount = holes.filter(cur => cur.jewel > 0).length; pushMessage = await checkTask(roleId, taskType, jewelCount - args[0], true, {}, funcs); } return pushMessage } export async function checkTaskWithArgs(roleId: string, taskType: number, args: number[], funcs?: number[]) { let pushMessage = new Array(); if(taskType == TASK_TYPE.ROLE_SCHOOL_PUT_HERO) { let [ hid, preHid ] = args; if(hid > 0 && preHid <= 0) { // 放置 pushMessage = await checkTask(roleId, taskType, 1, true, {}, funcs); } else if (hid <= 0 && preHid > 0) { // 卸下 pushMessage = await checkTask(roleId, taskType, -1, true, {}, funcs); } } else if (taskType == TASK_TYPE.EQUIP_JEWEL_STAGE) { // args 装上的, 卸下的 let [putOnJewel, putOffJewel] = args; if(putOnJewel > 0) { let dicGood = gameData.goods.get(putOnJewel); let push = await checkTask(roleId, taskType, 1, true, { stage: dicGood.lvLimited }, funcs); pushMessage.concat(push); } if(putOffJewel > 0) { let dicGood = gameData.goods.get(putOffJewel); let push = await checkTask(roleId, taskType, -1, true, { stage: dicGood.lvLimited }, funcs); pushMessage.concat(push); } } else if (taskType == TASK_TYPE.CHAT) { // args[0] 聊天type 1-系统 2-世界 3-军团 4-组队 5-私聊 pushMessage = await checkTask(roleId, taskType, 1, true, { chatType: args[0] }, funcs) } return pushMessage } export async function checkTaskWithWar(roleId: string, taskType: number, warId: number, heroes: number[], count: number, star: number, funcs?: number[]) { let dicWar = gameData.war.get(warId); let pushMessage = new Array(); if(taskType == TASK_TYPE.BATTLE_WITH_HERO) { pushMessage = await checkTask(roleId, taskType, count, true, { warId, heroes }, funcs); } else if (taskType == TASK_TYPE.BATTLE_MAIN) { if(dicWar.warType == WAR_TYPE.NORMAL) { pushMessage = await checkTask(roleId, taskType, count, true, { warId }, funcs); } } else if (taskType == TASK_TYPE.BATTLE_MAIN_SWEEP) { if(dicWar.warType == WAR_TYPE.NORMAL) { pushMessage = await checkTask(roleId, taskType, count, true, {}, funcs); } } else if (taskType == TASK_TYPE.BATTLE_DAILY_STAR) { if(dicWar.warType == WAR_TYPE.DAILY) { pushMessage = await checkTask(roleId, taskType, count, true, { warId, star }, funcs); } } else if (taskType == TASK_TYPE.BATTLE_DAILY) { if(dicWar.warType == WAR_TYPE.DAILY) { pushMessage = await checkTask(roleId, taskType, count, true, { dailyType: dicWar.dailyType }, funcs) } } else if (taskType == TASK_TYPE.BATTLE_DUNGEON) { if(dicWar.warType == WAR_TYPE.MYSTERY||dicWar.warType == WAR_TYPE.MYSTERY_ELITE) { pushMessage = await checkTask(roleId, taskType, count, true, {}, funcs); } } else if (taskType == TASK_TYPE.BATTLE_DUNGEON_WAR) { if(dicWar.warType == WAR_TYPE.MYSTERY||dicWar.warType == WAR_TYPE.MYSTERY_ELITE) { pushMessage = await checkTask(roleId, taskType, count, true, { warId }, funcs); } } else if (taskType == TASK_TYPE.BATTLE_TOWER) { if(dicWar.warType == WAR_TYPE.TOWER) { pushMessage = await checkTask(roleId, taskType, count, true, {}, funcs); } } else if (taskType == TASK_TYPE.BATTLE_VESTIGE) { if(dicWar.warType == WAR_TYPE.VESTIGE) { pushMessage = await checkTask(roleId, taskType, count, true, {}, funcs); } } else if (taskType == TASK_TYPE.BATTLE_EXPEDITION) { if(dicWar.warType == WAR_TYPE.EXPEDITION) { pushMessage = await checkTask(roleId, taskType, count, true, {}, funcs); } } return pushMessage } export async function checkTaskWithGoods(roleId: string, taskType: number, goods: ItemInter[], funcs?: number[]) { let pushMessage = new Array(); if(taskType == TASK_TYPE.COM_BATTLE_DROP) { for(let { id, count } of goods) { let push = await checkTask(roleId, taskType, count, true, { gid: id }, funcs); pushMessage.concat(push); } } return pushMessage } // 根据taskType判断有哪些任务需要check的 export async function checkTask(roleId: string, taskType: number, count: number, isInc: boolean, param: TaskParam, funcs?: number[]) { let tasks = gameData.taskType.get(taskType)||[]; let pushMessage = new Array(); let groups = new Map(); for(let dicTask of tasks) { if(!groups.has(dicTask.group)) { groups.set(dicTask.group, { task0: dicTask, tasks: new Array() }); } groups.get(dicTask.group).tasks.push(dicTask); } if(!funcs) { let role = await RoleModel.findByRoleId(roleId, 'funcs'); funcs = role.funcs||[]; } for(let [ group, { task0, tasks } ] of groups) { let rec = await checkTaskRec(roleId, group, task0, count, isInc, param, funcs); if(rec) { for(let dicTask of tasks) { if(checkRecResult(rec, dicTask.id, dicTask.condition)) { let received = rec.received||[]; pushMessage.push({ type: dicTask.type, id: dicTask.id, count: rec.count, received: received.includes(dicTask.id) }); } } } } return pushMessage; } // 检查各项任务是否达成,达成了就保存到数据库 export async function checkTaskRec(roleId: string, group: number, dicTask: DicTask, count: number, isInc: boolean, param: TaskParam, funcs: number[] ) { let { type, taskParam, taskType } = dicTask; let sp = [TASK_TYPE.LOGIN_SUM, TASK_TYPE.LOGIN_SERIES]; if(type == TASK_FUN_TYPE.DAILY && funcs.indexOf(FUNCS_ID.DAILY_TASK) == -1 && sp.indexOf(taskType) == -1) { // 功能未开启 return false; } let isMatch = true; // 条件是否满足 let checkHistory = false; // 是否检查历史 switch(taskType) { case TASK_TYPE.ROLE_TITLE: isMatch = taskParam[0] == param.title; checkHistory = true; break; case TASK_TYPE.HERO_STAR_UP: isMatch = taskParam[1] == param.star; break; case TASK_TYPE.HERO_QUALITY: case TASK_TYPE.EQUIP_QUALITY: isMatch = taskParam[1] == param.quality; break; case TASK_TYPE.HERO_QUALITY_STAR_UP: isMatch = taskParam[1] == param.quality && taskParam[2] == param.star; break; case TASK_TYPE.HERO_LV: isMatch = taskParam[1] == param.lv; break; case TASK_TYPE.HERO_TRAIN: isMatch = taskParam[1] == param.count; break; case TASK_TYPE.HERO_FAVOUR_LV: isMatch = taskParam[1] == param.favourLv; break; case TASK_TYPE.HERO_CONNECT: isMatch = taskParam[1] == param.connectLv; break; case TASK_TYPE.EQUIP_BY_HERO: isMatch = false; if(param.isPutOn && param.count == taskParam[1]) { // 装上之后达到 +1 isMatch = true; } else if (!param.isPutOn && param.count < taskParam[1]) { // 脱下后不能达到 -1 isMatch = true; } break; case TASK_TYPE.EQUIP_STRENGTHEN: isMatch = param.oldLv < taskParam[1] && param.lv >= taskParam[1]; break; case TASK_TYPE.EQUIP_JEWEL_STAGE: isMatch = param.stage == taskParam[1]; break; case TASK_TYPE.CHAT: isMatch = taskParam[0] == 0 || param.chatType == taskParam[0]; break; case TASK_TYPE.BATTLE_WITH_HERO: isMatch = checkIdList(taskParam, 2, param.warId) && checkHero(taskParam, 0, param.heroes); break; case TASK_TYPE.BATTLE_MAIN: case TASK_TYPE.BATTLE_DUNGEON_WAR: isMatch = checkIdList(taskParam, 0, param.warId); break; case TASK_TYPE.BATTLE_EVENT: isMatch = taskParam[0] == 0 || param.eventType == taskParam[0]; break; case TASK_TYPE.BATTLE_DAILY_STAR: isMatch = (taskParam[0] == 0 || param.star == taskParam[0]) && checkIdList(taskParam, 2, param.warId); break; case TASK_TYPE.BATTLE_DAILY: isMatch = taskParam[0] == 0 || param.dailyType == taskParam[0]; break; case TASK_TYPE.BATTLE_EXPEDITION_BOX: isMatch = taskParam[1] == 0 || param.point == taskParam[1]; break; case TASK_TYPE.COM_BATTLE_BLUEPRT: case TASK_TYPE.COM_BATTLE_QUALITY: isMatch = taskParam[0] == 0 || param.quality == taskParam[0]; break; case TASK_TYPE.COM_BATTLE_DROP: isMatch = checkIdList(taskParam, 1, param.gid); break; case TASK_TYPE.PVP_HERO_SCORE: for(let { score } of param.heroScores) { if(score >= taskParam[0]) { count++; } } if(count <= 0) isMatch = false; break; case TASK_TYPE.PVP_RANK: isMatch = taskParam[0] <= param.rankLv; checkHistory = true; break; case TASK_TYPE.GUILD_JOB: isMatch = taskParam[0] <= param.job && param.job != GUILD_JOB.DAJIANGJUN; checkHistory = true; break; case TASK_TYPE.GUILD_REFINE: isMatch = taskParam[0] == 0 || param.quality == taskParam[0]; break; } console.log('****isMatch', isMatch, checkHistory, type, taskType, group, count) if(isMatch) { if(isInc) { let rec = await UserTaskRecModel.incTaskRec(roleId, type, taskType, group, count); return rec; } else { if(checkHistory) { let rec = await UserTaskRecModel.checkHistoryAndSetTaskRec(roleId, type, taskType, group, count); return rec; } else { let rec = await UserTaskRecModel.setTaskRec(roleId, type, taskType, group, count); return rec; } } } } /** * 检查id是否在某列表中 * @param taskParam 条件number[] 填法 如: count&id&... 有多少id就count填几 * @param index count在第几位,0开始 * @param id 关卡id */ function checkIdList(taskParam: number[], index: number, id: number) { let count = taskParam[index]; if(!count) return false; let idList = taskParam.slice(index + 1, index + 1 + count); return idList.indexOf(id) != -1; } function checkHero(taskParam: number[], index: number, heroes: number[]) { let hid = taskParam[index]; return heroes.indexOf(hid) != -1; } function checkRecResult(rec: UserTaskRecType, id: number, condition: number) { if(!rec) return false; if(rec.received && rec.received.includes(id)) return false; // 已领取,不再推送 if(rec.count >= condition) { return rec } else { return false } }