武将:抽象武将创建接口

This commit is contained in:
luying
2021-04-23 19:32:02 +08:00
parent 2b246c4bc9
commit 0cd6939f5e
18 changed files with 213 additions and 95 deletions
@@ -1,16 +1,22 @@
import { Application, BackendSession } from "pinus";
import { resResult, getRandomWithWeight } from "../../../pubUtils/util";
import { STATUS, GACHA_ID } from "../../../consts";
import { resResult, getRandomWithWeight, getRandEelm } from "../../../pubUtils/util";
import { STATUS, GACHA_ID, HERO_QUALITY_TYPE, TASK_TYPE } from "../../../consts";
import { gameData } from "../../../pubUtils/data";
import { GachaListReturn, GachaResult } from "../../../domain/activityField/gachaField";
import { GachaListReturn, GachaResult, GachaData } from "../../../domain/activityField/gachaField";
import { UserGachaModel } from "../../../db/UserGacha";
import { refreshGacha, getFloorResult, getResultFromContentId, transPiece } from "../../../services/gachaService";
import { refreshGacha, getFloorResult, getResultFromContentId } from "../../../services/gachaService";
import { RoleModel } from "../../../db/Role";
import { HeroModel, HeroUpdate } from "../../../db/Hero";
import { RewardInter } from "../../../pubUtils/interface";
import { handleCost, createHeroes, addItems } from "../../../services/rewardService";
import { getAfterDateByDay } from "../../../pubUtils/timeUtil";
import { UserGachaRecModel } from "../../../db/UserGachaRec";
import { ActivityModel } from "../../../db/Activity";
import { checkTask } from "../../../services/taskService";
import { RECRUIT } from "../../../pubUtils/dicParam";
import { getAllHeroByQuality } from "../../../services/gachaService";
import { transPiece } from "../../../pubUtils/itemUtils";
import { CreateHeroParam } from "../../../domain/roleField/hero";
export default function (app: Application) {
return new GachaHandler(app);
@@ -58,6 +64,7 @@ export class GachaHandler {
const roleName: string = session.get('roleName');
const sid: string = session.get('sid');
const serverId: number = session.get('serverId');
const funcs: number[] = session.get('funcs');
let { lv } = await RoleModel.findByRoleId(roleId);
@@ -71,7 +78,7 @@ export class GachaHandler {
let userHeroes = await HeroModel.findByRole(roleId);
let items: RewardInter[] = [], heroInfo: HeroUpdate[] = [], resultList: GachaResult[] = [];
let items: RewardInter[] = [], heroInfo: CreateHeroParam[] = [], resultList: GachaResult[] = [];
for(let i = 0; i < count; i++) {
// 按照一般概率抽出
let { dic: { id: base } } = getRandomWithWeight(dicGacha.percent);
@@ -113,16 +120,18 @@ export class GachaHandler {
if(!costResult) return resResult(STATUS.GACHA_COST_NOT_ENOUGH);
}
// 给东西
let heroes = await createHeroes(roleId, sid, serverId, heroInfo);
let { heroes, goods } = await createHeroes(roleId, roleName, sid, serverId, heroInfo);
await addItems(roleId, roleName, sid, items);
// 更新数据
point += count;
point = Math.floor(count/RECRUIT.RECRUIT_BONUS);
userGacha = await UserGachaModel.updateInfo(roleId, gachaId, activityId, {
freeCount, hope, floor, count, point
});
await UserGachaRecModel.createRec(roleId, gachaId, activityId, count, resultList);
// 任务
await checkTask(roleId, sid, funcs, TASK_TYPE.GASHA, count, true, {});
return resResult(STATUS.SUCCESS, {
gachaId, activityId,
freeCount, refFreeTime: getAfterDateByDay(refFreeTime, dicGacha.free.day), count, point, floor,
@@ -140,7 +149,19 @@ export class GachaHandler {
const { gachaId, hope } = msg;
const roleId: string = session.get('roleId');
return resResult(STATUS.SUCCESS);
for(let { hid } of hope) {
let dicHero = gameData.hero.get(hid);
if(!dicHero) return resResult(STATUS.DIC_DATA_NOT_FOUND);
if(dicHero.quality != HERO_QUALITY_TYPE.GOLD) {
return resResult(STATUS.GACHA_HOPE_NOT_GOLD);
}
}
let userGacha = await UserGachaModel.updateInfo(roleId, gachaId, 0, { hope: hope.map(cur => { return {...cur, hasGet: false} }) })
return resResult(STATUS.SUCCESS, {
gachaId,
hope: userGacha.hope
});
}
/**
@@ -153,6 +174,23 @@ export class GachaHandler {
const { gachaId } = msg;
const roleId: string = session.get('roleId');
let userGacha = await UserGachaModel.findByRole(roleId, gachaId, 0);
if(userGacha.point < RECRUIT.RECRUIT_BONUS_RECRUIT) return resResult(STATUS.GACHA_TURNTABLE_POINT_NOT_ENOUGH)
let { dic: { quality } } = getRandomWithWeight(gameData.gachaTurntable);
// 根据品质查武将
let pool = getAllHeroByQuality(quality);
let hero = getRandEelm(pool);
let contentId = gameData.gachaContentHero.get(hero[0]);
let result = new GachaResult(contentId);
result.setHero(hero[0]);
// 获得或者转成碎片
// 扣除积分
// 记录
return resResult(STATUS.SUCCESS);
}
@@ -163,10 +201,33 @@ export class GachaHandler {
* @param {BackendSession} session
* @memberof GachaHandler
*/
async setPickHero(msg: { gachaId: number, pickHero: number }, session: BackendSession) {
const { gachaId, pickHero } = msg;
async setPickHero(msg: { gachaId: number, activityId: number, pickHero: number }, session: BackendSession) {
const { gachaId, activityId, pickHero } = msg;
const roleId: string = session.get('roleId');
if(gachaId != GACHA_ID.ASSIGN && gachaId != GACHA_ID.TIMELIMIT)
return resResult(STATUS.WRONG_PARMS);
let dicHero = gameData.hero.get(pickHero);
if(!dicHero) return resResult(STATUS.DIC_DATA_NOT_FOUND);
let heroes: number[] = [];
if(gachaId == GACHA_ID.TIMELIMIT) {
let activityData = await ActivityModel.findActivity(activityId, true);
if(!activityData) return resResult(STATUS.ACTIVITY_MISSING);
let gachaData = new GachaData(activityData);
heroes = gachaData.heroes;
if(!heroes.includes(pickHero)) {
return resResult(STATUS.GACHA_CAN_NOT_PICK)
}
}
let userGacha = await UserGachaModel.updateInfo(roleId, gachaId, activityId, { pickHero })
return resResult(STATUS.SUCCESS, {
gachaId,
heroes,
pickHero: userGacha.pickHero
});
return resResult(STATUS.SUCCESS);
}
}
@@ -81,11 +81,8 @@ export class SevenDaysHandler {
// 根据dic_hero 获得 1. 碎片id 2. 碎片数量 3. 初始武将星级 4. 初始品质
let dicHero = gameData.hero.get(hid);
if (!dicHero) return resResult(STATUS.DIC_DATA_NOT_FOUND);
let { pieceId, quality, initialStars: star, pieceCount, jobid: job, name: hName, initialSkin } = dicHero;
// createHero
let hero = await createHero(roleId, sid, serverId, {
roleId, serverId, roleName, hid, hName, star, quality, job, skins: [{ id: initialSkin, enable: true }]
});
let hero = await createHero(roleId, roleName, sid, serverId, { hid });
addHeros.push(hero);
}
}
@@ -139,12 +136,11 @@ export class SevenDaysHandler {
// 根据dic_hero 获得 1. 碎片id 2. 碎片数量 3. 初始武将星级 4. 初始品质
let dicHero = gameData.hero.get(hid);
if (!dicHero) return resResult(STATUS.DIC_DATA_NOT_FOUND);
let { pieceId, quality, initialStars: star, pieceCount, jobid: job, name: hName, initialSkin } = dicHero;
// createHero
let hero = await createHero(roleId, sid, serverId, {
roleId, serverId, roleName, hid, hName, star, quality, job, skins: [{ id: initialSkin, enable: true }]
});
addHeros.push(hero);
let { heroes } = await createHero(roleId, roleName, sid, serverId, { hid });
for(let hero of heroes) {
addHeros.push(hero);
}
}
}
@@ -344,7 +344,7 @@ export class NormalBattleHandler {
});
// 任务
await checkTaskWithWar(roleId, sid, funcs, TASK_TYPE.BATTLE_MAIN_SWEEP, warInfo, [], count, 0);
await checkTaskWithWar(roleId, sid, funcs, TASK_TYPE.BATTLE_MAIN_SWEEP, battleId, [], count, 0);
return resResult(STATUS.SUCCESS, {
battleId, count,
@@ -191,8 +191,8 @@ export class PvpHandler {
return resResult(STATUS.BATTLE_MISS_INFO);
}
let checkHeroes = await checkBattleHeroesByHid(roleId, heroes);
if(!checkHeroes) return resResult(STATUS.BATTLE_HERO_NOT_FOUND);
let { isOK } = await checkBattleHeroesByHid(roleId, heroes);
if(!isOK) return resResult(STATUS.BATTLE_HERO_NOT_FOUND);
const pvpDefense = await PvpDefenseModel.findByRoleId(roleId);
if(!pvpDefense) return resResult(STATUS.PVP_NOT_OPEN);
@@ -134,17 +134,15 @@ export class HeroHandler {
// 根据dic_hero 获得 1. 碎片id 2. 碎片数量 3. 初始武将星级 4. 初始品质
let dicHero = gameData.hero.get(hid);
if(!dicHero) return resResult(STATUS.DIC_DATA_NOT_FOUND);
let {pieceId, quality, initialStars: star, pieceCount, jobid: job, name: hName, initialSkin} = dicHero;
let {pieceId, quality, pieceCount} = dicHero;
// 碎片数量是否足够
let costResult = await handleCost(roleId, sid, [{id: pieceId, count: pieceCount}]);
if(!costResult) return resResult(STATUS.ROLE_MATERIAL_NOT_ENOUGH);
// createHero
let hero = await createHero(roleId, sid, serverId, {
roleId, serverId, roleName, hid, hName, star, quality, job, skins:[{id: initialSkin, enable: true}]
});
let { heroes } = await createHero(roleId, roleName, sid, serverId, { hid });
pushComposeOrangeHero(roleId, roleName, serverId, hero);
return resResult(STATUS.SUCCESS, {curHero: returnHeroCeRatio(hero)});
pushComposeOrangeHero(roleId, roleName, serverId, heroes[0]);
return resResult(STATUS.SUCCESS, {curHero: heroes[0]});
}
// 武将升级
+5 -13
View File
@@ -15,7 +15,7 @@ import { RECRUIT } from "../pubUtils/dicParam";
*/
export async function getLimitGacha(activityId: number) {
let activityData: ActivityModelType = await ActivityModel.findActivity(activityId, true);
let activityData = await ActivityModel.findActivity(activityId, true);
if(!activityData) return false;
let gachaData = new GachaData(activityData);
@@ -224,10 +224,9 @@ function getPoolByHope(hope: Hope[], qualtiy: number) {
if(h.hasGet) hasGetHope.push(h.id);
}
let list = decodeArrayListStr(RECRUIT.RECRUIT_WISH_LIST).map(cur => {
let curHope = hopeMap.get(parseInt(cur[0]));
return { id: parseInt(cur[0]), hasGet: curHope?.hasGet||false, weight: parseInt(cur[1]) }
});
let list = gameData.gachaHope.map(cur => {
return {...cur, hasGet: hopeMap.get(cur.id)?.hasGet||false};
})
let { dic: { id, hasGet } } = getRandomWithWeight(list);
if(id == 0 || hasGet) {
return getAllHeroByQuality(qualtiy).filter(cur => !hasGetHope.includes(cur) );
@@ -249,7 +248,7 @@ function getPoolByHope(hope: Hope[], qualtiy: number) {
* 根据品质获得武将池
* @param quality 品质
*/
function getAllHeroByQuality(quality: number) {
export function getAllHeroByQuality(quality: number) {
if(quality == 0) return [ GACHA_OCCUPY_HID ];
let allHero: number[] = [];
@@ -300,10 +299,3 @@ function getSuitPaper(lv: number) {
}
return items;
}
export function transPiece(hid: number) {
let dicHero = gameData.hero.get(hid);
let { pieceId, quality } = dicHero;
let dicPiece = decodeIdCntArrayStr(RECRUIT.RECRUIT_CHANGE_SHARD, 1); // 多少品质对应多少碎片
return { pieceId, count: dicPiece.get(quality.toString()) }
}
@@ -87,7 +87,7 @@ export async function checkBattleHeroesByHid(roleId: string, heroes: Array<numbe
let hero = findHeroes.find(cur => cur.hid == hid);
if (!hero) flag = false;
}
return flag;
return { isOK: flag, heroes: findHeroes };
}
export async function updateWarStar(roleId: string, battleId: number, warType: number, star: number) {
+44 -30
View File
@@ -8,14 +8,15 @@ import { calAllHeroCe, pushCalPlayerCe, pushCalAllHeroCe } from './playerCeServi
import { ItemModel } from '../db/Item';
import { STATUS } from '../consts/statusCode';
import { pinus } from 'pinus';
import { addEquips, addBags, addSkins, addFigure, unlockFigure as pubUnlockFigure, createHero as pubCreateHero, createHeroes as pubCreateHeroes } from '../pubUtils/itemUtils';
import { EquipInter, ItemInter, BagInter } from '../pubUtils/interface';
import { addEquips, addBags, addSkins, addFigure, unlockFigure as pubUnlockFigure, createHeroes as pubCreateHeroes, transPiece } from '../pubUtils/itemUtils';
import { EquipInter, ItemInter, BagInter, RewardInter } from '../pubUtils/interface';
import { gameData } from '../pubUtils/data';
import { uniq, indexOf, findIndex } from 'underscore';
import { HeroModel, HeroUpdate } from '../db/Hero';
import { HeroModel, HeroUpdate, HeroType } from '../db/Hero';
import { Figure } from '../domain/dbGeneral';
import { Rank } from './rankService';
import { pushTaskUpdate } from './taskService';
import { CreateHeroParam } from '../domain/roleField/hero';
export async function handleFixedReward(roleId: string, roleName: string, sid: string, rewardStr: string, multi: number) {
let reward = parseGoodStr(rewardStr);
@@ -311,38 +312,51 @@ export async function pushFigureUpdate(roleId: string, sid: string, figureInfo:
* @param serverId
* @param heroInfo
*/
export async function createHeroes(roleId: string, sid: string, serverId: number, heroInfo: HeroUpdate[]) {
let { heroes, role, figureInfo, calHeroResults, calAllHeroResults, taskPushMessage } = await pubCreateHeroes(roleId, heroInfo);
export async function createHeroes(roleId: string, roleName: string, sid: string, serverId: number, heroInfo: CreateHeroParam[]) {
let r = new Rank(REDIS_KEY.HERO_NUM_RANK, { serverId });
await r.setRankWithRoleInfo(roleId, role.heroNum, role.heroNumUpdatedAt, role);
let hids = heroInfo.map(cur => cur.hid);
let userHeroesMap = await HeroModel.findMapByHidRange(hids, roleId);
await pushFigureUpdate(roleId, sid, figureInfo);
for(let calHeroResult of calHeroResults) {
await pushCalPlayerCe(roleId, sid, calHeroResult);
}
for(let calAllHeroResult of calAllHeroResults) {
await pushCalAllHeroCe(roleId, sid, calAllHeroResult);
let newHeroInfo: CreateHeroParam[] = [], pieces: ItemInter[] = [];
for(let h of heroInfo) {
if(userHeroesMap.has(h.hid)) {
let {pieceId, count} = transPiece(h.hid);
pieces.push({ id: pieceId, count });
} else {
newHeroInfo.push(h)
}
}
pushTaskUpdate(roleId, sid, null, taskPushMessage);
let resultHeroes: HeroType[], resultItems: ItemInter[];
if(newHeroInfo.length > 0) {
let { heroes, role, figureInfo, calHeroResults, calAllHeroResults, taskPushMessage } = await pubCreateHeroes(roleId, roleName, serverId, newHeroInfo);
return heroes;
let r = new Rank(REDIS_KEY.HERO_NUM_RANK, { serverId });
await r.setRankWithRoleInfo(roleId, role.heroNum, role.heroNumUpdatedAt, role);
await pushFigureUpdate(roleId, sid, figureInfo);
for(let calHeroResult of calHeroResults) {
await pushCalPlayerCe(roleId, sid, calHeroResult);
}
for(let calAllHeroResult of calAllHeroResults) {
await pushCalAllHeroCe(roleId, sid, calAllHeroResult);
}
pushTaskUpdate(roleId, sid, null, taskPushMessage);
resultHeroes = heroes;
}
if(pieces.length > 0) {
let goods = await addItems(roleId, roleName, sid, pieces);
resultItems = goods;
}
return { heroes: resultHeroes, goods: resultItems }
}
export async function createHero(roleId: string, sid: string, serverId: number, heroInfo: HeroUpdate) {
let { hero, role, figureInfo, calHeroResult, calAllHeroResult, taskPushMessage } = await pubCreateHero(roleId, heroInfo);
let r = new Rank(REDIS_KEY.HERO_NUM_RANK, { serverId });
await r.setRankWithRoleInfo(roleId, role.heroNum, role.heroNumUpdatedAt, role);
await pushFigureUpdate(roleId, sid, figureInfo);
await pushCalPlayerCe(roleId, sid, calHeroResult);
await pushCalAllHeroCe(roleId, sid, calAllHeroResult);
pushTaskUpdate(roleId, sid, null, taskPushMessage);
return hero;
export async function createHero(roleId: string, roleName: string, sid: string, serverId: number, heroInfo: CreateHeroParam) {
let result = await createHeroes(roleId, roleName, sid, serverId, [heroInfo]);
return result;
}