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