feat(稷下学宫): c67747d87到5ff932e83

This commit is contained in:
luying
2023-09-04 14:48:16 +08:00
parent 9b391ef61f
commit 58e58a8a38
16 changed files with 10586 additions and 9645 deletions

View File

@@ -359,13 +359,13 @@ export class RougeHandler {
* @param session
* @returns
*/
async battleEnd(msg: { gameCode: string, detailCode: string, battleCode: string, warId: number, status: number, round: number, rougeDamage: RougeDamageInter[], isAp: boolean, isRound: boolean }, session: BackendSession) {
async battleEnd(msg: { gameCode: string, detailCode: string, battleCode: string, warId: number, status: number, round: number, rougeDamage: RougeDamageInter[] }, session: BackendSession) {
let roleId = session.get('roleId');
let roleName = session.get('roleName');
let sid = session.get('sid');
let { gameCode, detailCode, battleCode, warId, status, round, rougeDamage, isAp, isRound } = msg;
let { gameCode, detailCode, battleCode, warId, status, round, rougeDamage } = msg;
let dbDetail = await RougelikeRecordDetailModel.findByCode(gameCode, detailCode);
if (!dbDetail || (dbDetail.warId || 0) != warId || warId == 0 || (dbDetail.status || 0) != 0) return resResult(STATUS.WAR_NO_CHOOSE);
let { layer, nodeType, questType = 0 } = dbDetail;
@@ -381,15 +381,23 @@ export class RougeHandler {
$set: { status, 'record.round': round, 'record.rougeDamage': rougeDamage, }
}, { new: true, upsert: true }).lean(true);
await updateChalleng(dbRecord, roleId, sid, gameCode, layer, rougeDamage, isAp, isRound);
const dbCharaMap = dbCharas.reduce((result, cur) => { result.set(cur.charaCode, { ...cur }); return result; }, new Map<string, RougelikeCharaType>());
let isAp: boolean = false, isRound: boolean = false;
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);
}
await updateChalleng(dbRecord, roleId, sid, gameCode, layer, rougeDamage, isAp, isRound);
let updateCharas: RougelikeCharaPara[] = [], charas: CommonChara[] = [];
let recoveryHp = false;
if (status == 0 && nodeType != ROUGE_LIKE_NODE_TYPE.BOSS) {
if (status != 0 && nodeType != ROUGE_LIKE_NODE_TYPE.BOSS) {
recoveryHp = await getNoBossRecoveryHp(roleId, gameCode);
if (recoveryHp) status = 1;
}
@@ -398,24 +406,25 @@ export class RougeHandler {
if (status == 1) {
hpRatio = await getCharaHp(roleId, gameCode);
}
let recoveryNum = await getBattleRecoveryNum(roleId, gameCode);
const minHp = rougeDamage.reduce((min, cur) => { return Math.min(min, cur.hp); }, Infinity);
let recoveryNum = 0;
if (minHp == 0) recoveryNum = await getBattleRecoveryNum(roleId, gameCode);
for (let { charaCode, hp, ap, shield } of rougeDamage) {
let updateCharasMap = new Map();
for (let { charaCode, hp, ap, shield, others } of rougeDamage) {
const chara = dbCharaMap.get(charaCode);
if (!chara) return resResult(STATUS.BATTLE_ABNORMAL)
if (chara.maxHp < hp) hp = chara.maxHp;
if (recoveryHp) hp = chara.maxHp;
if (hpRatio > 0) hp = Math.min(Math.floor(hp * (1 + hpRatio / 100)), chara.maxHp);
if (hpRatio > 0) hp = Math.min(Math.floor(hp + (chara.maxHp * hpRatio / 100)), chara.maxHp);
if (recoveryNum-- > 0 && hp == 0) hp = chara.maxHp;
if ((recoveryNum--) > 0 && hp == 0) { hp = chara.maxHp; }
charas.push({ charaCode, charaId: chara.charaId, seqId: chara.seqId, cards: chara.cards, hp, maxHp: chara.maxHp, ap, shield, apSkill: chara.apSkill, roundSkill: chara.roundSkill })
updateCharas.push({ gameCode, charaCode, hp, ap, shield });
charas.push({ charaCode, charaId: chara.charaId, seqId: chara.seqId, cards: chara.cards, hp, maxHp: chara.maxHp, ap, shield, others, apSkill: chara.apSkill, roundSkill: chara.roundSkill })
updateCharas.push({ gameCode, charaCode, hp, ap, shield, others });
updateCharasMap.set(charaCode, { hp, ap, shield, others });
}
let incCoin = 0;
@@ -434,9 +443,13 @@ export class RougeHandler {
// await RougelikeRecordDetailModel.findOneAndUpdate({ gameCode, detailCode, 'rewards.rewardType': 0 }, { 'rewards.$.chooseNum': coinReward.chooseNum, }, { new: true, upsert: true }).lean(true);
// }
await RougelikeCharaModel.bulkWriteUpdate(updateCharas);
await RougelikeRecordDetailModel.updateByCode(gameCode, detailCode, { $set: { status } })
if (incCoin > 0) {
charas = await updateMaxHp(roleId, gameCode, dbRecord.type, dbRecord.grade, updateCharasMap)
} else {
await RougelikeCharaModel.bulkWriteUpdate(updateCharas);
}
return resResult(STATUS.SUCCESS, { status, gameCode, detailCode, charas, incCoin });
}
@@ -457,7 +470,8 @@ export class RougeHandler {
let dbDetail = await RougelikeRecordDetailModel.findByCode(gameCode, detailCode);
if (!dbDetail) return resResult(STATUS.REWARD_NO_CHOOSE);
if (dbDetail.reRandRewardCnt > 0) return resResult(STATUS.ROUGE_RE_RANDOM_CNT_OVER);
let dbDetailReward = dbDetail.rewards.find(cur => cur.rewardType == rewardType);
if (!dbDetailReward || dbDetailReward.reRandRewardCnt > 0) return resResult(STATUS.ROUGE_RE_RANDOM_CNT_OVER);
const typeGradeData = gameData.rougeTypeGrade.get(dbRecord.type + '_' + dbRecord.grade);
const nodeData = gameData.rougeNode.get(dbDetail.nodeId);
@@ -471,10 +485,10 @@ export class RougeHandler {
let replaceReward = await getLayerNodeReward(roleId, gameCode, dbRecord.authorType, dbDetail.nodeId, layerPlanData.rewardPlan, dbDetail.layer);
let { rewards } = dbDetail;
let newRewards = [...rewards.filter(reward => reward.rewardType != rewardType), ...replaceReward.rewards.filter(reward => reward.rewardType == rewardType)].sort((a, b) => a.groupIndex - b.groupIndex);
dbDetail = await RougelikeRecordDetailModel.updateByCode(gameCode, detailCode, { $set: { rewards: newRewards }, $inc: { reRandRewardCnt: 1 } });
let newRewards = [...rewards.filter(reward => reward.rewardType != rewardType), ...replaceReward.rewards.filter(reward => reward.rewardType == rewardType)].map(reward => ({ ...reward, reRandRewardCnt: 1 })).sort((a, b) => a.groupIndex - b.groupIndex);
dbDetail = await RougelikeRecordDetailModel.updateByCode(gameCode, detailCode, { $set: { rewards: newRewards } });
return resResult(STATUS.SUCCESS, { rewards: dbDetail.rewards, reRandRewardCnt: dbDetail.reRandRewardCnt });
return resResult(STATUS.SUCCESS, { rewards: dbDetail.rewards });
}
/**
@@ -503,7 +517,7 @@ export class RougeHandler {
if (!rewards || rewards.length == 0) return resResult(STATUS.REWARD_NO_CHOOSE);
let { rewardType, options, groupStatus, chooseNum } = rewards.find((obj) => obj.groupIndex == groupIndex);
if (groupStatus == ROUGE_LIKE_CHOOSE_REWARD.CHOOSE) return resResult(STATUS.REWARD_NO_CHOOSE);
// if (groupStatus == ROUGE_LIKE_CHOOSE_REWARD.CHOOSE) return resResult(STATUS.REWARD_NO_CHOOSE);
let handleAddFun = new HandleAddCard(roleId, sid, gameCode, dbDetail);
let incCoin = 0, redCoin = 0;
@@ -560,7 +574,7 @@ export class RougeHandler {
//处理特性卡组
groupStatus = ROUGE_LIKE_CHOOSE_REWARD.CHOOSE;
if (rewardType == ROUGE_LIKE_CARD_TYPE.PASSIVE || rewardType == ROUGE_LIKE_CARD_TYPE.CHARA) {
if (rewardType == ROUGE_LIKE_CARD_TYPE.PASSIVE) {
groupStatus = ROUGE_LIKE_CHOOSE_REWARD.NOCHOOSE;
if (chooseNum - passiveChooseCount == optionIndexs.length) {
groupStatus = ROUGE_LIKE_CHOOSE_REWARD.CHOOSE;
@@ -572,7 +586,7 @@ export class RougeHandler {
// 挑战领奖
let dbPara = {};
if (rewards.find((obj) => obj.groupStatus != ROUGE_LIKE_CHOOSE_REWARD.CHOOSE) == undefined) {
if (rewards.find((obj) => obj.groupStatus != ROUGE_LIKE_CHOOSE_REWARD.CHOOSE && rewardType != ROUGE_LIKE_CARD_TYPE.CHARA) == undefined) {
if (nodeType == ROUGE_LIKE_NODE_TYPE.CHALLENGE) {
challenge.status = 3;
dbPara['challenge'] = challenge;
@@ -742,7 +756,7 @@ export class RougeHandler {
let hpRatio = await getRecoveryExtendHp(roleId, gameCode);
for (let { gameCode, charaCode, charaId, cards, hp, maxHp = 0, ap, shield, roundSkill, apSkill } of dbCharas) {
let beforeHp = hp;
hp = Math.floor(Math.min(hp + maxHp * ROUGELIKE.RECOVERY_RATIO / 100 + hp * hpRatio / 100, maxHp));
hp = Math.floor(Math.min(hp + maxHp * ROUGELIKE.RECOVERY_RATIO / 100 + maxHp * hpRatio / 100, maxHp));
updateCharas.push({ gameCode, charaCode, hp });
restPoint.recoveryCharas.push({ charaCode, charaId, beforeHp, afterHp: hp });
}