Files
ZYZ/game-server/app/services/task/taskService.ts
2022-04-09 10:28:21 +08:00

378 lines
17 KiB
TypeScript

import { RoleModel, RoleType } from '../../db/Role';
import { pinus, FrontendOrBackendSession } from 'pinus';
import { resResult, shouldRefresh } from '../../pubUtils/util';
import { STATUS, TASK_TYPE, TASK_FUN_TYPE, SHOP_REFRESH_TYPE, WAR_TYPE, PUSH_ROUTE } from '../../consts';
import { TaskParamInter, TaskListReturn } from '../../domain/roleField/task';
import { EPlace, HeroType } from '../../db/Hero';
import { HeroScores } from '../../db/PvpHistoryOpp';
import { ItemInter } from '../../pubUtils/interface';
import { UserTaskModel, UserTaskType } from '../../db/UserTask';
import { UserTaskRecModel } from '../../db/UserTaskRec';
import { UserTaskHistoryModel } from '../../db/UserTaskHistory';
import { gameData } from '../../pubUtils/data';
import { getSeconds, getZeroPointD } from '../../pubUtils/timeUtil';
import { RoleStatus } from '../../db/ComBattleTeam';
import { getActivities } from '../activity/activityService';
import { CheckTask } from './taskObj';
import { getEquipById } from '../equipService';
import { JewelType } from '../../db/Jewel';
import { checkPopUpConditionInCreateHero } from '../activity/popUpShopService';
import { sendMessageToUserWithSuc } from '../pushService';
export async function checkTaskWithRoles(serverId: number, roleId: string, sid: string, taskType: TASK_TYPE, roles: RoleType[]) {
for (let role of roles) {
if (role) {
await checkTaskWithRole(serverId, role.roleId, role.roleId == roleId ? sid : null, taskType, role);
}
}
}
export async function checkTaskWithRole(serverId: number, roleId: string, sid: string, taskType: TASK_TYPE, role: RoleType, args?: TaskParamInter) {
let task = new CheckTask(serverId, roleId);
task.setRole(role);
task.setParam(taskType, args);
await task.saveAndPush(sid);
}
export async function checkTask(serverId: number, roleId: string, sid: string, taskType: TASK_TYPE, args?: TaskParamInter) {
let task = new CheckTask(serverId, roleId);
task.setParam(taskType, args);
await task.saveAndPush(sid);
}
export async function checkTaskInEntry(serverId: number, roleId: string, sid: string, role: RoleType) {
let task = new CheckTask(serverId, roleId);
task.setRole(role);
task.setParam(TASK_TYPE.LOGIN_SUM, {});
task.setParam(TASK_TYPE.LOGIN_SERIES, {});
await task.saveAndPush(sid);
}
export async function checkTaskInCreateHero(serverId: number, roleId: string, sid: string, heroNum: number, heroes: HeroType[]) {
let task = new CheckTask(serverId, roleId);
task.setParam(TASK_TYPE.HERO_NUM, { heroNum });
task.setParam(TASK_TYPE.HERO_QUALITY, { heroes });
task.setParam(TASK_TYPE.HERO_QUALITY_STAR_UP, { heroes });
task.setParam(TASK_TYPE.HERO_LV, { heroes });
await task.saveAndPush(sid);
await checkPopUpConditionInCreateHero(serverId, roleId, heroes);
}
export async function checkTaskInHeroStarUp(serverId: number, roleId: string, sid: string, hero: HeroType, oldStar: number) {
let task = new CheckTask(serverId, roleId);
task.setParam(TASK_TYPE.HERO_STAR_UP, { hero });
task.setParam(TASK_TYPE.HERO_QUALITY_STAR_UP, { hero, oldStar });
await task.saveAndPush(sid);
}
export async function checkTaskInHeroWakeUp(serverId: number, roleId: string, sid: string, hero: HeroType, oldColorStar: number) {
let task = new CheckTask(serverId, roleId);
task.setParam(TASK_TYPE.HERO_STAR_UP, { hero });
task.setParam(TASK_TYPE.HERO_WAKE_UP, { hero, oldColorStar });
task.setParam(TASK_TYPE.HERO_QUALITY_WAKE_UP_COUNT, { hero, oldColorStar });
task.setParam(TASK_TYPE.HERO_WAKE_UP_COUNT, { hero, oldColorStar });
task.setParam(TASK_TYPE.HERO_WAKE_UP_STAR_UP_COUNT, { hero });
await task.saveAndPush(sid);
}
export async function checkTaskInHeroQUalityUp(serverId: number, roleId: string, sid: string, hero: HeroType) {
let task = new CheckTask(serverId, roleId);
task.setParam(TASK_TYPE.HERO_QUALITY_UP, { hero });
task.setParam(TASK_TYPE.HERO_QUALITY_TO_QUALITY_COUNT, { hero });
await task.saveAndPush(sid);
}
export async function checkTaskInHeroTrain(serverId: number, roleId: string, sid: string, hero: HeroType, trainCount: number) {
let task = new CheckTask(serverId, roleId);
task.setParam(TASK_TYPE.HERO_TRAIN, { hero, trainCount });
task.setParam(TASK_TYPE.HERO_TRAIN_SUM, { hero, trainCount });
await task.saveAndPush(sid);
}
export async function checkTaskInActiveScroll(serverId: number, roleId: string, sid: string, scrollActive: boolean, hero: HeroType) {
if (!scrollActive) {
let task = new CheckTask(serverId, roleId);
task.setParam(TASK_TYPE.HERO_UNLOCK, { hero });
task.setParam(TASK_TYPE.ROLE_SCROLL_ACTIVE, { scrollActive });
await task.saveAndPush(sid);
}
}
export async function checkTaskInGuildTrain(serverId: number, roleId: string, sid: string, warId: number, isSuccess: boolean, isComplete: boolean) {
let task = new CheckTask(serverId, roleId);
task.setParam(TASK_TYPE.GUILD_TRAIN_SUCESS, { isSuccess });
task.setParam(TASK_TYPE.GUILD_TRAIN, {});
task.setParam(TASK_TYPE.GUILD_TRAIN_COUNT, { isComplete, warId });
await task.saveAndPush(sid);
}
/**
* battle.normalBattleHandler.battleEnd 中会触发的任务,因为有点多提出来了
*/
export async function checkTaskInBattleEnd(serverId: number, roleId: string, sid: string, warId: number, battleHeroes: number[], battleStar: number) {
let task = new CheckTask(serverId, roleId);
task.setParam(TASK_TYPE.BATTLE_WITH_HERO, { warId, battleHeroes });
task.setParam(TASK_TYPE.BATTLE_MAIN, { warId, count: 1 });
task.setParam(TASK_TYPE.BATTLE_DAILY_STAR, { warId, battleStar });
task.setParam(TASK_TYPE.BATTLE_DAILY, { warId, count: 1 });
task.setParam(TASK_TYPE.BATTLE_DUNGEON, { warId, count: 1 });
task.setParam(TASK_TYPE.BATTLE_DUNGEON_WAR, { warId, count: 1 });
task.setParam(TASK_TYPE.BATTLE_TOWER, { warId, count: 1 });
task.setParam(TASK_TYPE.BATTLE_VESTIGE, { warId, count: 1 });
task.setParam(TASK_TYPE.BATTLE_EXPEDITION, { warId, count: 1 });
task.setParam(TASK_TYPE.BATTLE_MAIN_ELITE, { warId, count: 1 });
await task.saveAndPush(sid);
}
export async function checkTaskInBattleSweep(serverId: number, roleId: string, sid: string, warId: number, count: number) {
let task = new CheckTask(serverId, roleId);
task.setParam(TASK_TYPE.BATTLE_MAIN_SWEEP, { warId, count });
task.setParam(TASK_TYPE.BATTLE_MAIN, { warId, count });
task.setParam(TASK_TYPE.BATTLE_DAILY, { warId, count });
task.setParam(TASK_TYPE.BATTLE_DUNGEON, { warId, count });
task.setParam(TASK_TYPE.BATTLE_DUNGEON_WAR, { warId, count });
task.setParam(TASK_TYPE.BATTLE_TOWER, { warId, count });
task.setParam(TASK_TYPE.BATTLE_VESTIGE, { warId, count });
task.setParam(TASK_TYPE.BATTLE_EXPEDITION, { warId, count });
await task.saveAndPush(sid);
}
export async function checkTaskInComBattleStart(roleStatus: RoleStatus[], capId: string, blueprtId: number) {
// console.log('********', JSON.stringify(roleStatus), capId, quality)
for (let { roleId, isRobot } of roleStatus) {
if (!isRobot) {
let role = await RoleModel.findByRoleId(roleId);
let task = new CheckTask(role.serverId, roleId);
task.setRole(role);
if (roleId == capId && roleStatus.length > 1) { // 招募队友
task.setParam(TASK_TYPE.COM_BATTLE_CREATE_TEAM, {});
} else if (roleId !== capId) { // 协助寻宝
task.setParam(TASK_TYPE.COM_BATTLE_ASSIST_TEAM, {});
}
task.setParam(TASK_TYPE.COM_BATTLE, {});
task.setParam(TASK_TYPE.COM_BATTLE_LV, { gid: blueprtId });
}
}
}
export async function checkTaskInPvpEnd(serverId: number, roleId: string, sid: string, isSuccess: boolean, heroScores: HeroScores[]) {
let task = new CheckTask(serverId, roleId);
task.setParam(TASK_TYPE.PVP_WIN, { isSuccess });
task.setParam(TASK_TYPE.PVP_WIN_SERIES, { isSuccess });
task.setParam(TASK_TYPE.PVP_HERO_SCORE, { heroScores });
await task.saveAndPush(sid);
}
export async function checkTaskInGacha(serverId: number, roleId: string, sid: string, count: number, heroes: HeroType[]) {
let task = new CheckTask(serverId, roleId);
task.setParam(TASK_TYPE.GACHA, { count });
task.setParam(TASK_TYPE.GACHA_QUALITY_COUNT, { heroes });
await task.saveAndPush(sid);
}
export async function checkTaskInComposeEquip(serverId: number, roleId: string, sid: string, oldEplace: EPlace[], newEplace: EPlace[]) {
let task = new CheckTask(serverId, roleId);
task.setParam(TASK_TYPE.EQUIP_COMPOSE, { count: newEplace.length - oldEplace.length });
task.setParam(TASK_TYPE.EQUIP_COMPOSE_CNT, { oldEplace, newEplace });
await task.saveAndPush(sid);
}
export async function checkTaskInEquipLvUp(serverId: number, roleId: string, sid: string, oldEplace: EPlace[], newEplace: EPlace[], ePlaceIds: number[]) {
let task = new CheckTask(serverId, roleId);
task.setParam(TASK_TYPE.EQUIP_LV_TO, { oldEplace, newEplace, ePlaceIds });
task.setParam(TASK_TYPE.EQUIP_LV_UP, { count: ePlaceIds.length });
await task.saveAndPush(sid);
}
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);
let task = new CheckTask(serverId, roleId);
task.setParam(TASK_TYPE.EQUIP_PUT_JEWEL, { oldEquip, newEquip, jewels: [originJewel, curJewel ] });
task.setParam(TASK_TYPE.EQUIP_PUT_JEWEL_CNT, { oldEquip, newEquip });
task.setParam(TASK_TYPE.EQUIP_JEWEL_RANDSE_CNT, { oldEquip, newEquip, jewels: [originJewel, curJewel ] });
await task.saveAndPush(sid);
}
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);
let task = new CheckTask(serverId, roleId);
task.setParam(TASK_TYPE.EQUIP_PUT_STONE, { oldEquip, newEquip });
task.setParam(TASK_TYPE.EQUIP_PUT_STONE_CNT, { oldEquip, newEquip });
task.setParam(TASK_TYPE.EQUIP_STONE_CNT, { oldEquip, newEquip });
task.setParam(TASK_TYPE.EQUIP_STONE_CNT_LV, { oldEquip, newEquip });
task.setParam(TASK_TYPE.EQUIP_JEWEL_RANDSE_CNT, { oldEquip, newEquip, jewels: [jewel ] });
await task.saveAndPush(sid);
}
export async function checkTaskInEquipStarUp(serverId: number, roleId: string, sid: string, oldEplace: EPlace[], newEplace: EPlace[], ePlaceId: number, hid: number, isUpStar: boolean) {
let task = new CheckTask(serverId, roleId);
if(isUpStar) {
let { oldEquip, newEquip } = getEquipById(oldEplace, newEplace, ePlaceId);
task.setParam(TASK_TYPE.EQUIP_STAR_UP_TO, { oldEquip, newEquip });
task.setParam(TASK_TYPE.EQUIP_SUIT_SEID_NUM, { oldEplace, newEplace, ePlaceId, hid });
}
task.setParam(TASK_TYPE.EQUIP_STAR_UP_CNT, { hid, ePlaceId });
await task.saveAndPush(sid);
}
export async function checkTaskInEquipQualityUp(serverId: number, roleId: string, sid: string, oldEplace: EPlace[], newEplace: EPlace[], ePlaceId: number, hid: number, isUpQuality: boolean) {
let task = new CheckTask(serverId, roleId);
if(isUpQuality) {
let { oldEquip, newEquip } = getEquipById(oldEplace, newEplace, ePlaceId);
task.setParam(TASK_TYPE.EQUIP_QUALITY_UP, { hid, ePlaceId });
task.setParam(TASK_TYPE.EQUIP_QUALITY_UP_TO, { oldEquip, newEquip })
}
task.setParam(TASK_TYPE.EQUIP_QUALITY_UP_CNT, {});
await task.saveAndPush(sid);
}
export async function checkTaskInEquipReset(serverId: number, roleId: string, sid: string) {
await checkTask(serverId, roleId, sid, TASK_TYPE.JEWEL_RESET);
}
export async function checkTaskInEquipQuench(serverId: number, roleId: string, sid: string, isSuccess: boolean) {
let task = new CheckTask(serverId, roleId);
task.setParam(TASK_TYPE.JEWEL_QUENCH, {});
if(isSuccess) {
task.setParam(TASK_TYPE.JEWEL_QUENCH_SUCCESS, { isSuccess });
}
await task.saveAndPush(sid);
}
export async function checkTaskInComposeStone(serverId: number, roleId: string, sid: string, count: number) {
await checkTask(serverId, roleId, sid, TASK_TYPE.STONE_COMPOSE, { count });
}
// 获取task状态
export async function getCurTask(roleId: string, session: FrontendOrBackendSession) {
let userTask = await UserTaskModel.findByRole(roleId);
let { dailyTaskRefWeekly, dailyTaskRef } = userTask;
let curWeekStart = getZeroPointD(SHOP_REFRESH_TYPE.WEEKLY);
if (dailyTaskRefWeekly < curWeekStart) { // 刷新周宝箱
dailyTaskRefWeekly = curWeekStart;
}
session.set('refWeekly', getSeconds(dailyTaskRefWeekly));
session.push('refWeekly', () => { });
if (shouldRefresh(dailyTaskRef, new Date())) {
dailyTaskRef = new Date();
userTask = await UserTaskModel.updateInfo(roleId, { dailyTaskRef });
await removeHistoryTask(roleId, TASK_FUN_TYPE.DAILY);
}
session.set('refDaily', getSeconds(dailyTaskRef));
session.push('refDaily', () => { });
let mainTask = await getMainTask(roleId, userTask);
let dailyTask = await getDailyTask(roleId, userTask);
let achievement = await getAchievement(roleId, userTask);
return { mainTask, dailyTask, achievement };
}
export async function getMainTask(roleId: string, userTask: UserTaskType) {
let type = TASK_FUN_TYPE.MAIN;
let { mainTaskStage: stage } = userTask;
let recMap = await UserTaskRecModel.findByRoleAndType(roleId, type); // group=>userTaskRec
let taskList: TaskListReturn[] = [];
for (let [id, dic] of gameData.mainTask) {
if (dic.taskStage == stage) {
let dbRec = recMap.get(dic.taskType)?.get(dic.group);
if (dbRec) {
taskList.push({ type, id, count: dbRec.count, received: dbRec.received.includes(id) });
} else {
taskList.push({ type, id, count: 0, received: false });
}
}
}
return { stage, taskList }
}
export async function getDailyTask(roleId: string, userTask: UserTaskType) {
let type = TASK_FUN_TYPE.DAILY;
let { dailyTaskPoint: point, dailyTaskRefWeekly, dailyTaskPointWeekly: weeklyPoint, dailyTaskBox: box } = userTask;
let curWeekStart = getZeroPointD(SHOP_REFRESH_TYPE.WEEKLY);
if (dailyTaskRefWeekly < curWeekStart) { // 刷新
dailyTaskRefWeekly = curWeekStart;
weeklyPoint = 0;
box = [];
}
let recMap = await UserTaskRecModel.findByRoleAndType(roleId, type); // group=>userTaskRec
let taskList: TaskListReturn[] = [];
for (let [id, dic] of gameData.dailyTask) {
let dbRec = recMap.get(dic.taskType)?.get(dic.group);
if (dbRec) {
taskList.push({ type, id, count: dbRec.count, received: dbRec.received.includes(id) });
} else {
taskList.push({ type, id, count: 0, received: false });
}
}
return { point, weeklyPoint, taskList, box }
}
export async function getAchievement(roleId: string, userTask: UserTaskType) {
let type = TASK_FUN_TYPE.ACHIEVEMENT;
let { achievementBox: box, achievementPoint: point } = userTask;
let recMap = await UserTaskRecModel.findByRoleAndType(roleId, type); // group=>userTaskRec
let taskList: TaskListReturn[] = [];
for (let [id, dic] of gameData.achievement) {
let dbRec = recMap.get(dic.taskType)?.get(dic.group);
if (dbRec) {
taskList.push({ type, id, count: dbRec.count, received: dbRec.received.includes(id) });
} else {
taskList.push({ type, id, count: 0, received: false });
}
}
return { point, taskList, box }
}
export async function getPvpTask(roleId: string) {
let type = TASK_FUN_TYPE.PVP;
let recMap = await UserTaskRecModel.findByRoleAndType(roleId, type); // group=>userTaskRec
let taskList: TaskListReturn[] = [];
for (let [id, dic] of gameData.pvpDailyTask) {
let dbRec = recMap.get(dic.taskType)?.get(dic.group);
if (dbRec) {
taskList.push({ type, id, count: dbRec.count, received: dbRec.received.includes(id) });
} else {
taskList.push({ type, id, count: 0, received: false });
}
}
return { taskList }
}
// 刷新每日任务
export async function refDailyTask(roleId: string, sid: string) {
let userTask = await UserTaskModel.findByRole(roleId);
let taskList = await getDailyTask(roleId, userTask);
// 转移每日任务
await removeHistoryTask(roleId, TASK_FUN_TYPE.DAILY);
sendMessageToUserWithSuc(roleId, PUSH_ROUTE.DAILY_TASK_REFRESH, { taskList }, sid);
}
export async function removeHistoryTask(roleId: string, type: number, today?: Date) {
// 转移每日任务
let history = await UserTaskRecModel.getHistoryRec(roleId, type, today);
if (history.length > 0) {
await UserTaskHistoryModel.pushUserTask(roleId, history);
await UserTaskRecModel.deleteHistory(history);
}
}
// 刷新每日宝箱数量
export async function refDailyTaskBox(roleId: string, sid: string, debug = false) {
let userTask = await UserTaskModel.refreshWeekly(roleId, debug);
if (userTask) {
let { dailyTaskPoint: point, dailyTaskPointWeekly: weeklyPoint, dailyTaskBox: box } = userTask;
sendMessageToUserWithSuc(roleId, PUSH_ROUTE.TASK_BOX_REFRESH, { type: TASK_FUN_TYPE.DAILY, point, weeklyPoint, box }, sid);
}
}