diff --git a/game-server/app/servers/battle/handler/rougeHandler.ts b/game-server/app/servers/battle/handler/rougeHandler.ts index 35fe4dfd7..a9881d06e 100644 --- a/game-server/app/servers/battle/handler/rougeHandler.ts +++ b/game-server/app/servers/battle/handler/rougeHandler.ts @@ -1,7 +1,7 @@ import { Application, BackendSession, pinus, HandlerService, } from 'pinus'; import { RougelikeRecordModel } from '../../../db/RougelikeRecord'; import { genCode, getRandEelmWithWeight, resResult } from '../../../pubUtils/util'; -import { COLLECTION_TYPE, ITEM_CHANGE_REASON, REST_POINT_TYPE, ROUGE_LIKE_CARD_TYPE, ROUGE_LIKE_CHOOSE_REWARD, ROUGE_LIKE_NODE_TYPE, ROUGE_LIKE_STATUS, TASK_TYPE } from '../../../consts'; +import { COLLECTION_TYPE, ITEM_CHANGE_REASON, REST_POINT_TYPE, ROUGE_LIKE_CARD_TYPE, ROUGE_LIKE_CHOOSE_REWARD, ROUGE_LIKE_NODE_TYPE, ROUGE_LIKE_STATUS, TASK_ROUGE_CARD_TYPE, TASK_TYPE } from '../../../consts'; import { Quest, RestPoint, RougelikeRecordDetailModel } from '../../../db/RougelikeRecordDetail'; import { STATUS } from '../../../consts/statusCode'; import { RougelikeCardModel, RougelikeCardPara, RougelikeCardType } from '../../../db/RougelikeCard'; @@ -95,7 +95,7 @@ export class RougeHandler { const charaCards = getInitCharaCard() || []; - let handleAddFun = new HandleAddCard(roleId, sid, gameCode); + let handleAddFun = new HandleAddCard(session, gameCode); for (let ele of charaCards) { handleAddFun.pushChara(ele.id, await getMaxHp(roleId, gameCode, ele.id, type, grade), []); } @@ -120,6 +120,7 @@ export class RougeHandler { async startGame(msg: { gameCode: string, authorType: number }, session: BackendSession) { let roleId = session.get('roleId'); let sid = session.get('sid'); + let serverId = session.get('serverId'); const { gameCode, authorType } = msg; @@ -150,10 +151,16 @@ export class RougeHandler { let { addCoin, cardIds } = await getEffectWhenGameStart(roleId, gameCode, authorType); dbRecord = await RougelikeRecordModel.updateByGameCode(gameCode, { $inc: { coin: addCoin, coinTotal: addCoin } }); + //任务 + if (addCoin > 0) { + await checkTask(serverId, roleId, sid, TASK_TYPE.ROUGE_GET_COIN, { addCoin }); + } + await checkTask(serverId, roleId, sid, TASK_TYPE.ROUGE_GAME_COUNT, { count: 1 }); + const charas: CommonChara[] = formateCharasOrCards(await RougelikeCharaModel.findByGameCode(gameCode), ROUGE_LIKE_CARD_TYPE.CHARA)?.charas || []; - let handleAddFun = new HandleAddCard(roleId, sid, gameCode); + let handleAddFun = new HandleAddCard(session, gameCode); handleAddFun.pushHolyCards(cardIds); let result = await handleAddFun.save(); result = await handleAddFun.getHolyEffect(); @@ -187,7 +194,7 @@ export class RougeHandler { let takeoutRewardMap = takeoutReward.reduce((map, cur) => { map.set(cur.id, cur.count); return map; }, new Map()); let spiritIds: number[] = []; - let addCoin = 0, addScore = 0, addTech = 0, isPass = true; + let addScore = 0, addTech = 0, isPass = true; if (dbLayers.length == 0) isPass = false; for (const { layer, hasPass = false, layerNodes } of dbLayers) { if (layer > dbRecord.curLayer) { @@ -208,8 +215,8 @@ export class RougeHandler { nodeType = dbDetail?.questType || 0; } const layerReward = getLayerRewardOneData(type, grade, layer, nodeType); - const { takeoutReward = [], coin = 0, score = 0, tech = 0, spiritPlan } = clone(layerReward); - addCoin += coin, addScore += score, addTech += tech; + const { takeoutReward = [], score = 0, tech = 0, spiritPlan } = clone(layerReward); + addScore += score, addTech += tech; for (const { id, count } of takeoutReward) takeoutRewardMap.set(id, takeoutRewardMap.get(id) || 0 + count); spiritIds.push(...getRandomSpirit(spiritPlan)); } @@ -222,9 +229,9 @@ export class RougeHandler { if (!dbRecord) return resResult(STATUS.NO_ROUGELIKE_GAME); - dbRecord = await RougelikeRecordModel.updateByGameCode(gameCode, { $set: { status, takeoutReward }, $inc: { score: addScore, coin: addCoin, techScore: addTech } }); + dbRecord = await RougelikeRecordModel.updateByGameCode(gameCode, { $set: { status, takeoutReward }, $inc: { score: addScore, techScore: addTech } }); - let { score = 0, coin = 0, techScore = 0 } = dbRecord; + let { score = 0, techScore = 0 } = dbRecord; let dbScore = await RougelikeScoreModel.incScore(roleId, score); let goods = await addItems(roleId, roleName, sid, [getRougeTechScoreObject(techScore)], ITEM_CHANGE_REASON.ROUGE_TECH_SCORE); @@ -237,12 +244,11 @@ export class RougeHandler { firstReward = await addItems(roleId, roleName, sid, typeGradeData?.firstReward || [], ITEM_CHANGE_REASON.ROUGE_FIRST_REWARD); await RougelikeExtendModel.update(roleId, typeGradeData.id, firstReward, gameCode); } - await checkTask(serverId, roleId, sid, TASK_TYPE.FUND_ROUGE, { rougeId: typeGradeData.id }); + await checkTask(serverId, roleId, sid, TASK_TYPE.FUND_ROUGE, { rougeId: typeGradeData.id, count: 1 }); } - return resResult(STATUS.SUCCESS, { - gameCode, goods, score, techScore, coin, hasReceivedTakeout, firstReward, + gameCode, goods, score, techScore, hasReceivedTakeout, firstReward, takeoutReward, weeklyScore: dbScore?.score || 0, takeoutRewardCnt: dbScore?.takeoutRewardCnt || 0 }); @@ -366,7 +372,7 @@ export class RougeHandler { let roleId = session.get('roleId'); let roleName = session.get('roleName'); let sid = session.get('sid'); - + let serverId = session.get('serverId'); let { gameCode, detailCode, battleCode, warId, status, round, rougeDamage } = msg; let dbDetail = await RougelikeRecordDetailModel.findByCode(gameCode, detailCode); @@ -386,13 +392,19 @@ export class RougeHandler { const dbCharaMap = dbCharas.reduce((result, cur) => { result.set(cur.charaCode, { ...cur }); return result; }, new Map()); - let isAp: boolean = false, isRound: boolean = false; + let isAp: boolean = false, isRound: boolean = false, arrAuthorType: number[] = []; for (let obj of rougeDamage) { if (obj.isAp) isAp = true; if (obj.isRound) isRound = true; const chara = dbCharaMap.get(obj.charaCode); if (!chara) return resResult(STATUS.BATTLE_ABNORMAL) obj.maxHp = (chara.maxHp || 0); + + if (!chara.cards || chara.cards.length == 0) console; + for (const { cardId } of chara.cards) { + const passiveCardData = gameData.rougePassiveCard.get(cardId); + if (nodeType == ROUGE_LIKE_NODE_TYPE.BOSS && passiveCardData && passiveCardData.authorType) arrAuthorType.push(passiveCardData.authorType); + } } await updateChalleng(dbRecord, roleId, sid, gameCode, layer, rougeDamage, isAp, isRound); @@ -450,10 +462,18 @@ export class RougeHandler { if (incCoin > 0) { charas = await updateMaxHp(roleId, gameCode, dbRecord.type, dbRecord.grade, updateCharasMap) + + //任务 + await checkTask(serverId, roleId, sid, TASK_TYPE.ROUGE_GET_COIN, { addCoin: incCoin }); + } else { await RougelikeCharaModel.bulkWriteUpdate(updateCharas); } + if (status == 1 && arrAuthorType.length > 0 && arrAuthorType.every(cur => cur == arrAuthorType[0])) { + await checkTask(serverId, roleId, sid, TASK_TYPE.ROUGE_BOSS_PASS, { authorType: arrAuthorType[0], count: 1 }); + } + return resResult(STATUS.SUCCESS, { status, gameCode, detailCode, charas, incCoin }); } @@ -522,7 +542,7 @@ export class RougeHandler { // if (groupStatus == ROUGE_LIKE_CHOOSE_REWARD.CHOOSE) return resResult(STATUS.REWARD_NO_CHOOSE); - let handleAddFun = new HandleAddCard(roleId, sid, gameCode, dbDetail); + let handleAddFun = new HandleAddCard(session, gameCode, dbDetail); let incCoin = 0, redCoin = 0; // //处理下试炼币 // if (rewardType == 0) { @@ -638,7 +658,7 @@ export class RougeHandler { await RougelikeRecordDetailModel.updateShopByCode(gameCode, detailCode, optionIndex, shop.optionStatus); await RougelikeRecordModel.updateByGameCode(gameCode, { $set: { coin: (dbRecord.coin || 0) - shop.price } }); - let handleAddFun = new HandleAddCard(roleId, sid, gameCode, dbDetail); + let handleAddFun = new HandleAddCard(session, gameCode, dbDetail); handleAddFun.pushCard(shop.rewardId, shop.rewardType); let result = await handleAddFun.save(); result = await handleAddFun.getHolyEffect(); @@ -682,6 +702,8 @@ export class RougeHandler { async chooseOption(msg: { gameCode: string, detailCode: string, eventOptions: number[] }, session: BackendSession) { let roleId = session.get('roleId'); let sid = session.get('sid'); + let serverId = session.get('serverId'); + const { gameCode, detailCode, eventOptions } = msg; let dbDetail = await RougelikeRecordDetailModel.findByCode(gameCode, detailCode); @@ -690,7 +712,7 @@ export class RougeHandler { if (status == 1) return resResult(STATUS.NODE_NO_CHOOSE); let checkAfterGroup = 0, optionGroupIds: number[] = []; - let handleAddFun = new HandleAddCard(roleId, sid, gameCode, dbDetail); + let handleAddFun = new HandleAddCard(session, gameCode, dbDetail); for (let [index, id] of eventOptions.entries()) { const rougeEventOptionData = gameData.rougeEventOption.get(id); if (!rougeEventOptionData) return resResult(STATUS.NODE_NO_CHOOSE); @@ -723,6 +745,8 @@ export class RougeHandler { result = await handleAddFun.getHolyEffect(); await addSameTypeCollect(roleId, sid, gameCode, COLLECTION_TYPE.EVENT, optionGroupIds); + //任务 + await checkTask(serverId, roleId, sid, TASK_TYPE.ROUGE_EVENT_COLLECT, { eventGroups: optionGroupIds }); return resResult(STATUS.SUCCESS, { ...result }) } @@ -843,6 +867,7 @@ export class RougeHandler { async chooseSkillCard(msg: { gameCode: string, charaCode: string, skillType: number, id: number }, session: BackendSession) { let roleId: string = session.get('roleId'); let sid: string = session.get('sid'); + let serverId: number = session.get('serverId'); const { gameCode, charaCode, skillType, id } = msg; @@ -864,6 +889,10 @@ export class RougeHandler { // 更新图鉴 await addSingleCollect(roleId, sid, gameCode, COLLECTION_TYPE.SKILL_CARD, id); + // 任务 + let dicSkillCard = gameData.rougeSkillCard.get(id); + await checkTask(serverId, roleId, sid, TASK_TYPE.ROUGE_AUTHOR_CARD_COLLECT, { authorType: dicSkillCard.authorType, cardType: TASK_ROUGE_CARD_TYPE.SKILL, cardIds: [id] }); + return resResult(STATUS.SUCCESS, { curChara: new CommonChara(chara) }) @@ -990,6 +1019,8 @@ export class RougeHandler { async unlockTech(msg: { techId: number }, session: BackendSession) { let roleId: string = session.get('roleId'); let sid: string = session.get('sid'); + let serverId: number = session.get('serverId'); + const { techId } = msg; let dicTech = gameData.rougeTech.get(techId); @@ -1009,6 +1040,9 @@ export class RougeHandler { await updateEffectId(techRecord); let resultData = getCurTechData(techRecord, techId); + //任务 + await checkTask(serverId, roleId, sid, TASK_TYPE.ROUGE_TECH_OPEN, { count: 1 }); + return resResult(STATUS.SUCCESS, { ...resultData }); @@ -1141,7 +1175,7 @@ export class RougeHandler { return resResult(STATUS.NO_ROUGELIKE_GAME); } - let handleAddFun = new HandleAddCard(roleId, sid, dbRecord.gameCode); + let handleAddFun = new HandleAddCard(session, dbRecord.gameCode); if (type == ROUGE_LIKE_CARD_TYPE.CHARA) { handleAddFun.pushChara(id, await getMaxHp(roleId, dbRecord?.gameCode || '', id, dbRecord.type, dbRecord.grade), []); } else if (type == ROUGE_LIKE_CARD_TYPE.HOLY) { diff --git a/game-server/app/services/battle/rougeCollectService.ts b/game-server/app/services/battle/rougeCollectService.ts index 5df9eb890..251648936 100644 --- a/game-server/app/services/battle/rougeCollectService.ts +++ b/game-server/app/services/battle/rougeCollectService.ts @@ -1,5 +1,5 @@ import { RougelikeRecordDetailType } from '../../db/RougelikeRecordDetail'; -import { COLLECTION_TYPE, PUSH_ROUTE, ROUGE_LIKE_CARD_TYPE } from '../../consts'; +import { COLLECTION_TYPE, PUSH_ROUTE, ROUGE_LIKE_CARD_TYPE, TASK_ROUGE_CARD_TYPE, TASK_TYPE } from '../../consts'; import { genCode } from '../../pubUtils/util'; import { Card, RougelikeCharaModel, RougelikeCharaPara, RougelikeCharaType } from '../../db/RougelikeChara'; import { RougelikeCardPara, RougelikeCardModel } from '../../db/RougelikeCard'; @@ -9,10 +9,13 @@ import { sendMessageToUserWithSuc } from '../pushService'; import { gameData } from '../../pubUtils/data'; import { clone } from 'underscore'; import { RougeEffect, getSlotUnlockPoint } from './rougeEffectService'; +import { BackendSession } from 'pinus'; +import { checkTask } from '../task/taskService'; export class HandleAddCard { roleId: string; sid: string; + serverId: number; gameCode: string; getLayer: number = 0; getWay: number = 0; @@ -21,9 +24,10 @@ export class HandleAddCard { addHolyCards: RougelikeCardPara[] = []; // 需要更新的圣物 addCoin: number = 0; // 需要增加的试炼币 - constructor(roleId: string, sid: string, gameCode: string, recordDetail?: RougelikeRecordDetailType) { - this.roleId = roleId; - this.sid = sid; + constructor(session: BackendSession, gameCode: string, recordDetail?: RougelikeRecordDetailType) { + this.roleId = session.get('roleId'); + this.sid = session.get('sid'); + this.serverId = session.get('serverId'); this.gameCode = gameCode; if (recordDetail) { this.getLayer = recordDetail.layer; @@ -107,6 +111,22 @@ export class HandleAddCard { } if (collections.length > 0) await addCollection(this.roleId, this.sid, this.gameCode, collections); + //任务 + if (this.addPassiveCards.length > 0) { + let passiveCardMap = new Map(); + for (const { cardId } of this.addPassiveCards) { + const passiveCardData = gameData.rougePassiveCard.get(cardId); + let count = passiveCardMap.get(passiveCardData.authorType) || 0; + passiveCardMap.set(passiveCardData.authorType, count + 1); + } + for (const [authorType, count] of passiveCardMap) { + await checkTask(this.serverId, this.roleId, this.sid, TASK_TYPE.ROUGE_AUTHOR_CARD_COLLECT, { authorType, cardType: TASK_ROUGE_CARD_TYPE.PASSIVE, cardIds:this.addPassiveCards.map(cur => cur.cardId) }); + } + } + if (this.addHolyCards.length > 0) { + await checkTask(this.serverId, this.roleId, this.sid, TASK_TYPE.ROUGE_HOLY_COLLECT, {cardIds:this.addHolyCards.map(cur => cur.cardId)}); + } + if (this.addCharas.length > 0) { result.addCharas = await this.getCharasByHolyEffect(); } diff --git a/game-server/app/services/task/taskObj.ts b/game-server/app/services/task/taskObj.ts index da904897d..cbe9ff193 100644 --- a/game-server/app/services/task/taskObj.ts +++ b/game-server/app/services/task/taskObj.ts @@ -1503,6 +1503,83 @@ export class CheckSingleTask { } break; } + case TASK_TYPE.FUND_ROUGE: //143 通关XX试炼几 + { + let { rougeId, count } = param; + if (rougeId == dicTaskParam[0]) { + result = { inc: count }; + } + break; + } + case TASK_TYPE.FUND_AUTHOR: //144 列传收集进度 + { + let { authorProgress } = param; + result = { set: authorProgress }; + break; + } + case TASK_TYPE.ROUGE_GET_COIN: // 145. 学宫积累x个试炼币 + { + let { addCoin } = param; + result = { inc: addCoin } + break; + } + case TASK_TYPE.ROUGE_AUTHOR_CARD_COLLECT: // 146.流派卡收集 + { + let records = await getRecord(); + let { authorType, cardType, cardIds } = param; + if (authorType == dicTaskParam[0] && cardType == dicTaskParam[1]) { + for (let cardId of cardIds) { + if (records.indexOf(`${cardId}`) == -1) { + records.push(`${cardId}`); + } + } + result = { records, set: records.length }; + } + break;; + } + case TASK_TYPE.ROUGE_HOLY_COLLECT: // 147.圣物卡收集 + { + let records = await getRecord(); + let { cardIds } = param; + for (let cardId of cardIds) { + if (records.indexOf(`${cardId}`) == -1) { + records.push(`${cardId}`); + } + } + result = { records, set: records.length }; + + break; + } + case TASK_TYPE.ROUGE_EVENT_COLLECT: // 148.事件收集 + { + let records = await getRecord(); + let { eventGroups } = param; + for (let eventGroup of eventGroups){ + records.push(`${eventGroup}`); + } + result = { records, set: records.length }; + break; + } + case TASK_TYPE.ROUGE_TECH_OPEN: // 149.法阵开启数量 + { + let { count } = param; + result = { inc: count }; + break; + } + case TASK_TYPE.ROUGE_GAME_COUNT: // 150.肉鸽次数 + { + let { count } = param; + result = { inc: count }; + break; + } + case TASK_TYPE.ROUGE_BOSS_PASS: // 151.试炼通过boss关 + { + let { authorType, count } = param; + if (authorType == dicTaskParam[0]) { + result = { inc: count }; + } + break; + } } return result } diff --git a/shared/consts/constModules/sysConst.ts b/shared/consts/constModules/sysConst.ts index a766dcbef..b3f9f2ed7 100644 --- a/shared/consts/constModules/sysConst.ts +++ b/shared/consts/constModules/sysConst.ts @@ -932,6 +932,21 @@ export enum TASK_TYPE { FUND_ROUGE = 143, // 学宫密卷 FUND_AUTHOR = 144, // 列传密卷 + // 学宫相关 + ROUGE_GET_COIN = 145, // 累计获得x个试炼币 + ROUGE_AUTHOR_CARD_COLLECT = 146, // 流派卡收集 + ROUGE_HOLY_COLLECT = 147, // 圣物卡收集 + ROUGE_EVENT_COLLECT = 148, // 事件收集 + ROUGE_TECH_OPEN = 149, // 法阵开启 + ROUGE_GAME_COUNT = 150, // rouge次数 + ROUGE_BOSS_PASS = 151, // 试炼通过boss关 + // + + +} +export enum TASK_ROUGE_CARD_TYPE { + PASSIVE = 1, // 特性卡 + SKILL = 2, // 技能卡(怒气技+回合技) } // 任务累积类型 diff --git a/shared/domain/roleField/task.ts b/shared/domain/roleField/task.ts index 6dd02aa7c..1c2a9bec5 100644 --- a/shared/domain/roleField/task.ts +++ b/shared/domain/roleField/task.ts @@ -65,8 +65,18 @@ export class TaskParamInter { score?: number; // 小游戏得分 step?: number; // 步数 gameType?: number; // 小游戏类型 + rougeId?:number; //学宫 authorProgress?:number; // 列传 + + //学宫相关 + addCoin?:number; // 积累试炼币 + authorType?:number; // 流派类型 + cardType?:number; // 卡类型 + cardIds?:number[]; // 圣物id + eventGroups?:number[]; // 事件组 + + }; export class TaskParam extends TaskParamInter { diff --git a/shared/resource/jsons/dic_zyz_taskType.json b/shared/resource/jsons/dic_zyz_taskType.json index 4352d87e8..0d6e12764 100644 --- a/shared/resource/jsons/dic_zyz_taskType.json +++ b/shared/resource/jsons/dic_zyz_taskType.json @@ -1198,5 +1198,115 @@ "content": "(小于等于均可)", "condition": "count", "sumType": 2 + }, + { + "id": 141, + "name": "王者争霸", + "info": "匹配x次", + "param": "count&", + "string": "匹配次数&", + "content": "开始挑战就算", + "condition": "count", + "sumType": 2 + }, + { + "id": 142, + "name": "王者争霸", + "info": "匹配战斗胜利x次", + "param": "count&", + "string": "匹配胜利次数&", + "content": "必须挑战且结算胜利才算", + "condition": "count", + "sumType": 2 + }, + { + "id": 143, + "name": "稷下学宫", + "info": "通关XX试炼几", + "param": "id&count", + "string": "XX试炼难度几的唯一id&通关几次", + "content": "dic_rougeType_grade表的id字段", + "condition": "count", + "sumType": 2 + }, + { + "id": 144, + "name": "列传密卷", + "info": "收集进度达X", + "param": "value&", + "string": "收集进度值", + "content": "&", + "condition": "count", + "sumType": 1 + }, + { + "id": 145, + "name": "稷下学宫", + "info": "累积获得过X个试炼币", + "param": "value&", + "string": "试炼币总值", + "content": "包括用掉的试炼币", + "condition": "value", + "sumType": 1 + }, + { + "id": 146, + "name": "稷下学宫", + "info": "XX流派XX卡全收集", + "param": "authorType&type&count", + "string": "百家流派的type&卡片type&该卡片在流派中的数量", + "content": "卡片type 1:特性卡 2:传人卡(怒气技+回合技)", + "condition": "count", + "sumType": 1 + }, + { + "id": 147, + "name": "稷下学宫", + "info": "圣物卡全收集", + "param": "count&", + "string": "圣物卡总数量", + "content": 0, + "condition": "count", + "sumType": 1 + }, + { + "id": 148, + "name": "稷下学宫", + "info": "事件全收集", + "param": "count&", + "string": "事件总数量", + "content": 0, + "condition": "count", + "sumType": 1 + }, + { + "id": 149, + "name": "稷下学宫", + "info": "学宫法阵开启至XX", + "param": "count&", + "string": "开启法阵数量&", + "content": 0, + "condition": "count", + "sumType": 1 + }, + { + "id": 150, + "name": "稷下学宫", + "info": "试炼挑战X次", + "param": "count&", + "string": "挑战总次数&", + "content": "不论输赢", + "condition": "count", + "sumType": 1 + }, + { + "id": 151, + "name": "稷下学宫", + "info": "全部装配XX流派特性卡通关X次", + "param": "authorType&count&", + "string": "流派type&通关次数", + "content": "试炼通关时检测上阵学员装配的特性卡流派", + "condition": "count", + "sumType": 1 } ] \ No newline at end of file