✨ feat(稷下学宫): c67747d87到5ff932e83
This commit is contained in:
@@ -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 });
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user