✨ feat(稷下学宫): c67747d87到5ff932e83
This commit is contained in:
@@ -41,7 +41,7 @@ export async function getRougeData(roleId: string) {
|
||||
const dbExtends = await RougelikeExtendModel.findByRoleId(roleId);
|
||||
const limitIds = dbExtends.map(cur => cur.limitId);
|
||||
|
||||
return { isPlaying, gameCode, weeklyScore: dbScore?.score || 0, receivedScore: dbScore?.received || [], ...techData, collections, limitIds }
|
||||
return { isPlaying, gameCode, weeklyScore: dbScore?.score || 0, receivedScore: dbScore?.received || [], ...techData, collections, limitIds, takeoutRewardCnt: dbScore?.takeoutRewardCnt }
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -283,18 +283,24 @@ export async function chooseNode(dbRecord: RougelikeRecordType, layerChooseNode:
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
let weightRecords = [];
|
||||
if ((!dbDetail || !dbDetail.shops || dbDetail.shops.length == 0) && isShop) {
|
||||
shops = await getLayerShopReward(roleId, gameCode, authorType, nodeId, layerPlanData.shopPlan);
|
||||
dbPara.shops = shops;
|
||||
let result = await getLayerShopReward(roleId, gameCode, authorType, nodeId, layerPlanData.shopPlan);
|
||||
dbPara.shops = shops = result.shops;
|
||||
weightRecords = dbPara.weightRecords = (result?.weightRecords || [])
|
||||
}
|
||||
if (dbDetail && dbDetail.shops) shops = dbDetail.shops || shops;
|
||||
if (dbDetail && dbDetail.shops) { shops = dbDetail.shops || shops; weightRecords = dbDetail.weightRecords }
|
||||
|
||||
if ((!dbDetail || !dbDetail.rewards || dbDetail.rewards.length == 0) && isReward) {
|
||||
let result = await getLayerNodeReward(roleId, gameCode, authorType, nodeId, layerPlanData.rewardPlan, layer, dbPara.questType);
|
||||
if (result) {
|
||||
if (result && result.rewards) {
|
||||
reward = result;
|
||||
dbPara.rewards = result.rewards;
|
||||
}
|
||||
|
||||
// TODO正式环境屏蔽
|
||||
weightRecords = dbPara.weightRecords = (result?.weightRecords || []);
|
||||
}
|
||||
if (dbDetail && dbDetail.rewards) {
|
||||
let tempType = (dbDetail?.questType || 0) > 0 ? dbDetail?.questType : nodeType
|
||||
@@ -302,6 +308,8 @@ export async function chooseNode(dbRecord: RougelikeRecordType, layerChooseNode:
|
||||
if (!layerRewardData) return;
|
||||
let { coin, score, tech } = layerRewardData;
|
||||
reward = { rewards: dbDetail.rewards || [], score: score || 0, techScore: tech || 0, takeoutReward: layerPlanData.takeoutReward || [] };
|
||||
// TODO正式环境屏蔽
|
||||
weightRecords = dbDetail.weightRecords
|
||||
}
|
||||
|
||||
if (!dbDetail) {
|
||||
@@ -311,7 +319,7 @@ export async function chooseNode(dbRecord: RougelikeRecordType, layerChooseNode:
|
||||
await RougelikeLayerModel.updateByGameCodeAndLayer(gameCode, layer, detailCode, ROUGE_LIKE_CHOOSE_REWARD.CHOOSE)
|
||||
}
|
||||
|
||||
let curNode = { detailCode, nodeId, nodeType, status, warId, reward, shops, challenge, question, restPoints, }
|
||||
let curNode = { detailCode, nodeId, nodeType, status, warId, reward, shops, challenge, question, restPoints, weightRecords }
|
||||
// console.log('-x-x--x-x-x-x-x-x-x-x-x- curNode', util.inspect(curNode, { depth: null }));
|
||||
return curNode;
|
||||
}
|
||||
@@ -356,55 +364,79 @@ export async function getLayerNodeReward(roleId: string, gameCode: string, type:
|
||||
options: tempOptions,
|
||||
groupStatus: charaChooseNum > 0 ? ROUGE_LIKE_CHOOSE_REWARD.NOCHOOSE : ROUGE_LIKE_CHOOSE_REWARD.CHOOSE,
|
||||
chooseNum: charaChooseNum,
|
||||
reRandRewardCnt: 0,
|
||||
});
|
||||
}
|
||||
|
||||
let passiveCards = await getPassiveCardPlan(passiveCardPlan, passiveCardRandomNum, type, dbRougelikeCards, gameCode, roleId);
|
||||
passiveCardRandomNum = await getPassiveCardRandom(passiveCardChooseNum, passiveCardRandomNum, gameCode, layer, roleId);
|
||||
let { passiveCards, passiveWeightRecords } = await getPassiveCardPlan(passiveCardPlan, passiveCardRandomNum, type, dbRougelikeCards, gameCode, roleId);
|
||||
if (passiveCards && passiveCards.length > 0) {
|
||||
let chooseNum = await getPassiveCardChooseNum(passiveCardChooseNum, passiveCardRandomNum, gameCode, layer, roleId);
|
||||
rewards.push({
|
||||
groupIndex: rewards.length + 1,
|
||||
rewardType: ROUGE_LIKE_CARD_TYPE.PASSIVE,
|
||||
options: passiveCards.map((ele, index) => { return { optionIndex: index++, rewardId: ele.cardId, optionStatus: ROUGE_LIKE_CHOOSE_REWARD.NOCHOOSE, weightRecord: ele.weightRecord } }),
|
||||
options: passiveCards.map((ele, index) => { return { optionIndex: index++, rewardId: ele.cardId, optionStatus: ROUGE_LIKE_CHOOSE_REWARD.NOCHOOSE } }),
|
||||
groupStatus: chooseNum > 0 ? ROUGE_LIKE_CHOOSE_REWARD.NOCHOOSE : ROUGE_LIKE_CHOOSE_REWARD.CHOOSE,
|
||||
chooseNum
|
||||
chooseNum,
|
||||
reRandRewardCnt: 0,
|
||||
});
|
||||
}
|
||||
|
||||
let holyCards = await getHolyCardPlan(holyCardPlan, holyCardRandomNum, dbRougelikeCards, gameCode, roleId);
|
||||
let { holyCards, holyWeightRecords } = await getHolyCardPlan(holyCardPlan, holyCardRandomNum, dbRougelikeCards, gameCode, roleId);
|
||||
if (holyCards && holyCards.length > 0) {
|
||||
rewards.push({
|
||||
groupIndex: rewards.length + 1,
|
||||
rewardType: ROUGE_LIKE_CARD_TYPE.HOLY,
|
||||
options: holyCards.map((ele, index) => { return { optionIndex: index++, rewardId: ele.cardId, optionStatus: ROUGE_LIKE_CHOOSE_REWARD.NOCHOOSE, weightRecord: ele.weightRecord } }),
|
||||
options: holyCards.map((ele, index) => { return { optionIndex: index++, rewardId: ele.cardId, optionStatus: ROUGE_LIKE_CHOOSE_REWARD.NOCHOOSE } }),
|
||||
groupStatus: holyCardChooseNum > 0 ? ROUGE_LIKE_CHOOSE_REWARD.NOCHOOSE : ROUGE_LIKE_CHOOSE_REWARD.CHOOSE,
|
||||
chooseNum: holyCardChooseNum,
|
||||
reRandRewardCnt: 0,
|
||||
});
|
||||
}
|
||||
|
||||
// rewards.push({ groupIndex: rewards.length + 1, rewardType: 0, groupStatus: (coin || 0) > 0 ? ROUGE_LIKE_CHOOSE_REWARD.NOCHOOSE : ROUGE_LIKE_CHOOSE_REWARD.CHOOSE, chooseNum: coin || 0 })
|
||||
|
||||
return { rewards, score, techScore: tech };
|
||||
return { rewards, score, techScore: tech, weightRecords: [...(passiveWeightRecords || []), ...(holyWeightRecords || [])] };
|
||||
}
|
||||
|
||||
// 处理挑战类型中 接下来X次选择特性卡时,可选择的卡片数量少1
|
||||
export async function getPassiveCardRandom(passiveCardChooseNum: number, passiveCardRandomNum: number, gameCode: string, layer: number, roleId: string) {
|
||||
let num = passiveCardRandomNum;
|
||||
let dbDetails = await RougelikeRecordDetailModel.findByGameCodeAndLtLayer(gameCode, layer);
|
||||
if (dbDetails.length == 0) return num;
|
||||
for (let { challenge } of dbDetails) {
|
||||
if (challenge && Object.entries(challenge).length != 0 && challenge.status == 1) {
|
||||
let { challengeId } = challenge;
|
||||
const rougeChallengeData = gameData.rougeChallenge.get(challengeId);
|
||||
if (!rougeChallengeData) return num;
|
||||
for (let effectId of (rougeChallengeData.effectId || [])) {
|
||||
const rougeEffectTypeData = gameData.rougeEffect.get(effectId);
|
||||
if (rougeEffectTypeData.effectType != ROUGE_EFFECT_TYPE.CHALLENGE_PASSIVE_CARD_REDUCE) continue;
|
||||
num -= (rougeEffectTypeData.effectParam[1] || 0);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return num >= 0 ? num : 0;
|
||||
}
|
||||
|
||||
export async function getPassiveCardChooseNum(passiveCardChooseNum: number, passiveCardRandomNum: number, gameCode: string, layer: number, roleId: string) {
|
||||
let chooseNum = passiveCardChooseNum;
|
||||
let dbDetails = await RougelikeRecordDetailModel.findByGameCodeAndLtLayer(gameCode, layer);
|
||||
if (dbDetails.length == 0) return chooseNum;
|
||||
|
||||
for (let { challenge } of dbDetails) {
|
||||
if (challenge && Object.entries(challenge).length != 0 && challenge.status == 1) {
|
||||
let { challengeId } = challenge;
|
||||
const rougeChallengeData = gameData.rougeChallenge.get(challengeId);
|
||||
if (!rougeChallengeData) return chooseNum;
|
||||
for (let effectId of (rougeChallengeData.effectId || [])) {
|
||||
const rougeEffectTypeData = gameData.rougeEffect.get(effectId);
|
||||
if (rougeEffectTypeData.effectType != ROUGE_EFFECT_TYPE.CHALLENGE_PASSIVE_CARD_REDUCE) continue;
|
||||
chooseNum -= (rougeEffectTypeData.effectParam[1] || 0);
|
||||
}
|
||||
}
|
||||
}
|
||||
// for (let { challenge } of dbDetails) {
|
||||
// if (challenge && Object.entries(challenge).length != 0 && challenge.status == 1) {
|
||||
// let { challengeId } = challenge;
|
||||
// const rougeChallengeData = gameData.rougeChallenge.get(challengeId);
|
||||
// if (!rougeChallengeData) return chooseNum;
|
||||
// for (let effectId of (rougeChallengeData.effectId || [])) {
|
||||
// const rougeEffectTypeData = gameData.rougeEffect.get(effectId);
|
||||
// if (rougeEffectTypeData.effectType != ROUGE_EFFECT_TYPE.CHALLENGE_PASSIVE_CARD_REDUCE) continue;
|
||||
// chooseNum -= (rougeEffectTypeData.effectParam[1] || 0);
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
chooseNum += await getAddChoosePassive(roleId, gameCode);
|
||||
|
||||
if (chooseNum < 0) chooseNum = 0;
|
||||
@@ -427,7 +459,7 @@ export async function getSelfPassiveCards(charaId: number, passiveCardPlan: numb
|
||||
let charaData = gameData.rougeChara.get(charaId);
|
||||
if (!charaData) return result;
|
||||
if (charaData.charaType != ROUGE_CHARA_TYPE.HIGH) return result;
|
||||
let passiveCards = await getPassiveCardPlan(passiveCardPlan, charaData.initCardCnt, type, dbRougelikeCards, gameCode, roleId);
|
||||
let { passiveCards } = await getPassiveCardPlan(passiveCardPlan, charaData.initCardCnt, type, dbRougelikeCards, gameCode, roleId);
|
||||
if (passiveCards && passiveCards.length > 0) result.push(...passiveCards.map((ele) => { return ele.cardId }),);
|
||||
|
||||
return result;
|
||||
@@ -446,12 +478,12 @@ export async function getLayerShopReward(roleId: string, gameCode: string, type:
|
||||
let shopPlanData = gameData.rougeShopPlan.get(shopPlan);
|
||||
// let nodeData = gameData.rougeNode.get(nodeId);
|
||||
|
||||
if (!shopPlanData) return shops;
|
||||
if (!shopPlanData) return { shops };
|
||||
|
||||
|
||||
let dbRougelikeCards = await RougelikeCardModel.findByGameCodeAndType(gameCode, ROUGE_LIKE_CARD_TYPE.PASSIVE);
|
||||
|
||||
let passiveCards = await getPassiveCardPlan(shopPlanData.passivecardPlanId, shopPlanData.passiveCardRandomNum, type || 0, dbRougelikeCards, gameCode, roleId);
|
||||
let { passiveCards, passiveWeightRecords } = await getPassiveCardPlan(shopPlanData.passivecardPlanId, shopPlanData.passiveCardRandomNum, type || 0, dbRougelikeCards, gameCode, roleId);
|
||||
let index = 0, discount = await getShopDiscount(roleId, gameCode);
|
||||
if (passiveCards && passiveCards.length > 0) {
|
||||
for (let ele of passiveCards) {
|
||||
@@ -468,7 +500,7 @@ export async function getLayerShopReward(roleId: string, gameCode: string, type:
|
||||
}
|
||||
}
|
||||
|
||||
let holyCards = await getHolyCardPlan(shopPlanData?.holyCardPlanId, shopPlanData?.holyCardRandomNum, dbRougelikeCards, gameCode, roleId);
|
||||
let { holyCards, holyWeightRecords } = await getHolyCardPlan(shopPlanData?.holyCardPlanId, shopPlanData?.holyCardRandomNum, dbRougelikeCards, gameCode, roleId);
|
||||
if (holyCards && holyCards.length > 0) {
|
||||
for (let ele of holyCards) {
|
||||
let price = gameData.rougeHolyCard.get(ele.cardId)?.purchasePrice || 0;
|
||||
@@ -483,7 +515,7 @@ export async function getLayerShopReward(roleId: string, gameCode: string, type:
|
||||
}
|
||||
}
|
||||
|
||||
return shops;
|
||||
return { shops, weightRecords: [...(passiveWeightRecords || []), ...(holyWeightRecords || [])] };
|
||||
}
|
||||
|
||||
|
||||
@@ -533,7 +565,7 @@ export function getCharaCardPlan(planId: number, charaRandomNum: number) {
|
||||
*/
|
||||
export async function getPassiveCardPlan(passiveCardPlan: number, passiveCardRandomNum: number, type: number, dbRougelikeCards: RougelikeCardType[], gameCode: string, roleId: string) {
|
||||
let cards = checkRandomLimit(passiveCardPlan, passiveCardRandomNum, ROUGE_LIKE_CARD_TYPE.PASSIVE);
|
||||
if (cards.length <= passiveCardRandomNum) return cards;
|
||||
if (cards.length <= passiveCardRandomNum) return { passiveCards: cards };
|
||||
|
||||
// 计算变化权重
|
||||
let lableMap = new Map<number, number>(); //统计lable数量
|
||||
@@ -582,9 +614,11 @@ export async function getPassiveCardPlan(passiveCardPlan: number, passiveCardRan
|
||||
|
||||
|
||||
weight += await getAddPassiveWeight(roleId, gameCode, type);
|
||||
if ((passiveCardData?.authorType || 0) == type) weight += ROUGELIKE.AUTHOR_ADD_RANDOM;
|
||||
if ((passiveCardData?.authorType || 0) == type) {
|
||||
weight += ROUGELIKE.AUTHOR_ADD_RANDOM;
|
||||
weightRecord.authorAddWeight = ROUGELIKE.AUTHOR_ADD_RANDOM;
|
||||
}
|
||||
|
||||
weightRecord.authorAddWeight = ROUGELIKE.AUTHOR_ADD_RANDOM;
|
||||
|
||||
let labelNum = lableMap.get(cardId) || 0;
|
||||
if (labelNum >= ROUGELIKE.PASSIVE_LABLE_NUM) {
|
||||
@@ -611,7 +645,7 @@ export async function getPassiveCardPlan(passiveCardPlan: number, passiveCardRan
|
||||
|
||||
let randResult = getRandEelmWithWeightAndNum(newCards, passiveCardRandomNum - result.length);
|
||||
|
||||
return [...result, ...randResult.map(cur => cur.dic)]
|
||||
return { passiveCards: [...result, ...randResult.map(cur => cur.dic)], passiveWeightRecords: newCards }
|
||||
}
|
||||
|
||||
export async function getIsChooseCard(gameCode: string) {
|
||||
@@ -650,7 +684,7 @@ export async function getCardCount(gameCode: string, type: number) {
|
||||
export async function getHolyCardPlan(holyCardPlan: number, holyCardRandomNum: number, dbRougelikeCards: RougelikeCardType[], gameCode: string, roleId: string) {
|
||||
|
||||
let cards = checkRandomLimit(holyCardPlan, holyCardRandomNum, ROUGE_LIKE_CARD_TYPE.HOLY);
|
||||
if (cards.length <= holyCardRandomNum) return cards;
|
||||
if (cards.length <= holyCardRandomNum) return { holyCards: cards };
|
||||
|
||||
let lableMap = new Map<number, number>();//统计lable数量
|
||||
if (dbRougelikeCards && dbRougelikeCards.length > ROUGELIKE.HOLY_LABLE_NUM) {
|
||||
@@ -720,7 +754,7 @@ export async function getHolyCardPlan(holyCardPlan: number, holyCardRandomNum: n
|
||||
}
|
||||
|
||||
let randResult = getRandEelmWithWeightAndNum(newCards, holyCardRandomNum);
|
||||
return randResult.map(cur => cur.dic);
|
||||
return { holyCards: randResult.map(cur => cur.dic), holyWeightRecords: newCards }
|
||||
}
|
||||
|
||||
|
||||
@@ -755,8 +789,6 @@ export function getChallengePlan(planId: number) {
|
||||
|
||||
export async function updateChalleng(dbRecord: RougelikeRecordType, roleId: string, sid: string, gameCode: string, curLayer: number, rougeDamage, isAp?: boolean, isRound?: boolean) {
|
||||
let len = rougeDamage.length;
|
||||
const minHp = rougeDamage.reduce((min, cur) => { return Math.min(min, cur.hp); }, Infinity);
|
||||
|
||||
let challenges: { challengeId: number, status: number, progress: number, detailCode: string }[] = [];
|
||||
const { authorType, type, grade } = dbRecord;
|
||||
let dbDetails = await RougelikeRecordDetailModel.findByGameCodeAndLtLayer(gameCode, curLayer);
|
||||
@@ -778,8 +810,18 @@ export async function updateChalleng(dbRecord: RougelikeRecordType, roleId: stri
|
||||
if (rougeEffectTypeData.effectType == ROUGE_EFFECT_TYPE.CHALLENGE_PASSIVE_CARD_REDUCE) continue;
|
||||
if (rougeEffectTypeData.effectType == ROUGE_EFFECT_TYPE.CHALLENGE_CHARA_NO_AP_SKILL && isAp) continue;
|
||||
if (rougeEffectTypeData.effectType == ROUGE_EFFECT_TYPE.CHALLENGE_CHARA_NO_ROUND_SKILL && isRound) continue;
|
||||
if (rougeEffectTypeData.effectType == ROUGE_EFFECT_TYPE.CHALLENGE_CHARA_HP_LIMIT && (rougeEffectTypeData.effectParam[1] || 0) > minHp) continue;
|
||||
if (rougeEffectTypeData.effectType == ROUGE_EFFECT_TYPE.CHALLENGE_CHARA_NUM_LIMIT && (rougeEffectTypeData.effectParam[1] || 0) != len) continue;//接下来X场战斗,每场战斗只能上阵2名学员
|
||||
if (rougeEffectTypeData.effectType == ROUGE_EFFECT_TYPE.CHALLENGE_CHARA_HP_LIMIT) {
|
||||
let isNext = true;
|
||||
for (let obj of rougeDamage) {
|
||||
const { maxHp = 0, hp = 0 } = (obj || {});
|
||||
if (maxHp == 0 || hp == 0) { isNext = false; break; }
|
||||
if (maxHp * (rougeEffectTypeData.effectParam[1] || 0) / 100 > hp) { isNext = false; break; }
|
||||
}
|
||||
|
||||
if (!isNext) continue;
|
||||
}
|
||||
|
||||
if (rougeEffectTypeData.effectType == ROUGE_EFFECT_TYPE.CHALLENGE_CHARA_NUM_LIMIT && (rougeEffectTypeData.effectParam[1] || 0) < len) continue;//接下来X场战斗,每场战斗不超过上阵2名学员
|
||||
}
|
||||
|
||||
challenge.progress += 1;
|
||||
@@ -892,14 +934,17 @@ export async function getMaxHp(roleId: string, gameCode: string, charaId: number
|
||||
return Math.floor(maxHp);
|
||||
}
|
||||
|
||||
export async function updateMaxHp(roleId: string, gameCode: string, type: number, grade: number) {
|
||||
export async function updateMaxHp(roleId: string, gameCode: string, type: number, grade: number, updateCharasMap) {
|
||||
let dbCharas = await RougelikeCharaModel.findByGameCode(gameCode);
|
||||
if (dbCharas.length == 0) return [];
|
||||
|
||||
let result: RougelikeCharaType[] = [];
|
||||
for (let val of dbCharas) {
|
||||
if (updateCharasMap.has(val.charaCode)) {
|
||||
val = { ...val, ...updateCharasMap.get(val.charaCode) }
|
||||
}
|
||||
let tempMaxHp = await getMaxHp(roleId, gameCode, val.charaId, type, grade);
|
||||
if (tempMaxHp == val.maxHp) continue;
|
||||
if (tempMaxHp == val.maxHp && !updateCharasMap.has(val.charaCode)) continue;
|
||||
val.maxHp = tempMaxHp;
|
||||
result.push(val);
|
||||
}
|
||||
@@ -947,7 +992,7 @@ export async function getGame(roleId: string) {
|
||||
const charas: CommonChara[] = formateCharasOrCards(await RougelikeCharaModel.findByGameCode(gameCode), ROUGE_LIKE_CARD_TYPE.CHARA)?.charas || [];
|
||||
const cards: CommonCard[] = formateCharasOrCards(await RougelikeCardModel.findByGameCode(gameCode), ROUGE_LIKE_CARD_TYPE.PASSIVE | ROUGE_LIKE_CARD_TYPE.HOLY)?.cards || [];
|
||||
|
||||
console.log("x-x-x-x-x-x-x-x- dbCurLayerChooseNode", dbCurLayerChooseNode)
|
||||
// console.log("x-x-x-x-x-x-x-x- dbCurLayerChooseNode", dbCurLayerChooseNode)
|
||||
if (Object.entries(dbCurLayerChooseNode).length != 0) curNode = await chooseNode(dbRecord, dbCurLayerChooseNode, curLayer)
|
||||
|
||||
return {
|
||||
|
||||
Reference in New Issue
Block a user