feat(任务): 添加稷下学宫任务

This commit is contained in:
luying
2023-09-06 20:00:23 +08:00
parent 194615bbc6
commit 44b0ba0dce
6 changed files with 287 additions and 21 deletions

View File

@@ -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<number, number>());
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<string, RougelikeCharaType>());
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) {

View File

@@ -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<number, number>();
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();
}

View File

@@ -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
}

View File

@@ -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, // 技能卡(怒气技+回合技)
}
// 任务累积类型

View File

@@ -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 {

View File

@@ -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
}
]