武将攻略:武将对比
This commit is contained in:
@@ -25,6 +25,9 @@ import { JewelModel } from "../../../db/Jewel";
|
|||||||
import { getHeroesAttributes } from "../../../services/playerCeService";
|
import { getHeroesAttributes } from "../../../services/playerCeService";
|
||||||
import { sendMessageToUsersWithSuc, sendMessageToUserWithSuc } from "../../../services/pushService";
|
import { sendMessageToUsersWithSuc, sendMessageToUserWithSuc } from "../../../services/pushService";
|
||||||
import { PrivateMessageModel } from "../../../db/PrivateMessage";
|
import { PrivateMessageModel } from "../../../db/PrivateMessage";
|
||||||
|
import { RoleCeModel } from "../../../db/RoleCe";
|
||||||
|
import { CalCe } from "../../../services/role/calCe";
|
||||||
|
import { getSchoolPoint } from "../../../services/roleService";
|
||||||
|
|
||||||
|
|
||||||
export default function (app: Application) {
|
export default function (app: Application) {
|
||||||
@@ -730,14 +733,21 @@ export class FriendHandler {
|
|||||||
|
|
||||||
let { roleId: hisRoleId, hids } = msg;
|
let { roleId: hisRoleId, hids } = msg;
|
||||||
|
|
||||||
let role = await RoleModel.findByRoleId(hisRoleId, ROLE_SELECT.ATTR);
|
let role = await RoleModel.findByRoleId(hisRoleId, 'title');
|
||||||
if (!role) return resResult(STATUS.ROLE_NOT_FOUND);
|
if (!role) return resResult(STATUS.ROLE_NOT_FOUND);
|
||||||
|
|
||||||
|
let roleCe = await RoleCeModel.findByRoleId(hisRoleId);
|
||||||
|
if (!roleCe) return resResult(STATUS.ROLE_NOT_FOUND);
|
||||||
|
|
||||||
let heroList = await HeroModel.findByHidRange(hids, hisRoleId, HERO_SELECT.HERO_DETAIL, true);
|
let heroList = await HeroModel.findByHidRange(hids, hisRoleId, HERO_SELECT.HERO_DETAIL, true);
|
||||||
if (heroList.length <= 0) return resResult(STATUS.HERO_NOT_FIND);
|
if (heroList.length <= 0) return resResult(STATUS.HERO_NOT_FIND);
|
||||||
|
|
||||||
let jewels = await JewelModel.findMapbyRoleAndHids(hisRoleId, hids);
|
let jewels = await JewelModel.findMapbyRoleAndHids(hisRoleId, hids);
|
||||||
|
|
||||||
|
let school = await getSchoolPoint(hisRoleId);
|
||||||
|
|
||||||
|
let calCe = new CalCe(hisRoleId);
|
||||||
|
calCe.setRoleCe(roleCe);
|
||||||
let attrByHid = await getHeroesAttributes(hisRoleId);
|
let attrByHid = await getHeroesAttributes(hisRoleId);
|
||||||
let list: HeroDetailParam[] = [];
|
let list: HeroDetailParam[] = [];
|
||||||
for (let hero of heroList) {
|
for (let hero of heroList) {
|
||||||
@@ -747,9 +757,18 @@ export class FriendHandler {
|
|||||||
let heroParam = new HeroDetailParam(hero);
|
let heroParam = new HeroDetailParam(hero);
|
||||||
heroParam.setAttributes(attributes);
|
heroParam.setAttributes(attributes);
|
||||||
heroParam.setJewels(jewels);
|
heroParam.setJewels(jewels);
|
||||||
|
|
||||||
|
heroParam.setRole(
|
||||||
|
role.title,
|
||||||
|
calCe.calSingleGlobalPartCe(hero.hid, 'scroll'),
|
||||||
|
calCe.calSingleGlobalPartCe(hero.hid, 'teraph'),
|
||||||
|
school
|
||||||
|
);
|
||||||
|
|
||||||
list.push(heroParam);
|
list.push(heroParam);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
return resResult(STATUS.SUCCESS, { list });
|
return resResult(STATUS.SUCCESS, { list });
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -191,6 +191,7 @@ export class HeroHandler {
|
|||||||
let { curHero } = await calculateCeWithHero(HERO_SYSTEM_TYPE.STAR, roleId, serverId, sid, hid, update, { hid, hero, isUpStar });
|
let { curHero } = await calculateCeWithHero(HERO_SYSTEM_TYPE.STAR, roleId, serverId, sid, hid, update, { hid, hero, isUpStar });
|
||||||
if (isUpStar) {
|
if (isUpStar) {
|
||||||
await checkTaskInHeroStarUp(serverId, roleId, sid, curHero, oldStar); // 任务
|
await checkTaskInHeroStarUp(serverId, roleId, sid, curHero, oldStar); // 任务
|
||||||
|
await SchoolModel.updateByHid(roleId, hid, { hid, star: update.star });
|
||||||
}
|
}
|
||||||
return resResult(STATUS.SUCCESS, { isUpStar, curHero: pick(curHero, ['hid', 'star', 'starStage', 'colorStar', 'colorStarStage']) });
|
return resResult(STATUS.SUCCESS, { isUpStar, curHero: pick(curHero, ['hid', 'star', 'starStage', 'colorStar', 'colorStarStage']) });
|
||||||
}
|
}
|
||||||
@@ -236,6 +237,7 @@ export class HeroHandler {
|
|||||||
consumes: addConsumeToHero(hero.consumes, material)
|
consumes: addConsumeToHero(hero.consumes, material)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
await SchoolModel.updateByHid(roleId, hid, { hid, star: update.quality });
|
||||||
let { curHero } = await calculateCeWithHero(HERO_SYSTEM_TYPE.QUALITY, roleId, serverId, sid, hid, update, { hero });
|
let { curHero } = await calculateCeWithHero(HERO_SYSTEM_TYPE.QUALITY, roleId, serverId, sid, hid, update, { hero });
|
||||||
await checkTaskInHeroQUalityUp(serverId, roleId, sid, curHero);
|
await checkTaskInHeroQUalityUp(serverId, roleId, sid, curHero);
|
||||||
pushHeroQualityUpMsg(roleId, roleName, serverId, curHero);
|
pushHeroQualityUpMsg(roleId, roleName, serverId, curHero);
|
||||||
@@ -312,6 +314,7 @@ export class HeroHandler {
|
|||||||
|
|
||||||
let { curHero } = await calculateCeWithHero(HERO_SYSTEM_TYPE.COLORSTAR, roleId, serverId, sid, hid, update, { hero, isUpStar });
|
let { curHero } = await calculateCeWithHero(HERO_SYSTEM_TYPE.COLORSTAR, roleId, serverId, sid, hid, update, { hero, isUpStar });
|
||||||
if (isUpStar) {
|
if (isUpStar) {
|
||||||
|
await SchoolModel.updateByHid(roleId, hid, { hid, star: update.colorStar });
|
||||||
await checkTaskInHeroWakeUp(serverId, roleId, sid, curHero, oldColorStar); // 任务
|
await checkTaskInHeroWakeUp(serverId, roleId, sid, curHero, oldColorStar); // 任务
|
||||||
}
|
}
|
||||||
if (isWakeUp) pushHeroWakeUp(roleId, roleName, serverId, curHero); // 第一次觉醒
|
if (isWakeUp) pushHeroWakeUp(roleId, roleName, serverId, curHero); // 第一次觉醒
|
||||||
|
|||||||
@@ -230,7 +230,7 @@ export class RoleHandler {
|
|||||||
return resResult(STATUS.ROLE_SCHOOL_POSITION_LOCKED);
|
return resResult(STATUS.ROLE_SCHOOL_POSITION_LOCKED);
|
||||||
}
|
}
|
||||||
|
|
||||||
await SchoolModel.updateBySclAndPos(roleId, schoolId, positionId, { hid, isOpen })
|
await SchoolModel.updateBySclAndPos(roleId, schoolId, positionId, { hid, isOpen, star: curHero?.star??0, quality: curHero?.quality??0, colorStar: curHero?.colorStar??0 });
|
||||||
await calculateCeWithRole(HERO_SYSTEM_TYPE.SCHOOL, roleId, serverId, sid, {}, { schoolId, hero: curHero, schoolHid: hid, preSchoolHid: preHid });
|
await calculateCeWithRole(HERO_SYSTEM_TYPE.SCHOOL, roleId, serverId, sid, {}, { schoolId, hero: curHero, schoolHid: hid, preSchoolHid: preHid });
|
||||||
|
|
||||||
// 任务
|
// 任务
|
||||||
|
|||||||
@@ -73,6 +73,18 @@ export class CalCe {
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public calSingleGlobalPartCe(hid: number, field: 'teraph'|'scroll') {
|
||||||
|
let arr: { id: number, val: number }[] = [];
|
||||||
|
for(let [attrId, globalAttr] of this.data.globalAttrs) {
|
||||||
|
arr.push({ id: attrId, val: globalAttr[field]||0 });
|
||||||
|
}
|
||||||
|
let lv = this.data.heroLv.get(hid)||1;
|
||||||
|
let obj = new AttributeCal();
|
||||||
|
obj.setLv(lv);
|
||||||
|
obj.setByWarJson(arr);
|
||||||
|
return obj.calCe();
|
||||||
|
}
|
||||||
|
|
||||||
public getCeInc() {
|
public getCeInc() {
|
||||||
let ceResult = this.calHeroCe();
|
let ceResult = this.calHeroCe();
|
||||||
// console.log('##### ceResult', ceResult, 'originCes', this.originCes)
|
// console.log('##### ceResult', ceResult, 'originCes', this.originCes)
|
||||||
|
|||||||
@@ -253,3 +253,19 @@ export function checkSystemIsOpen(role: RoleType, id: SYSTEM_OPEN_ID) {
|
|||||||
let guideId = dicSystemOpenTime.warId > 0? GuideUnloadNum.GkNewFuncNum + dicSystemOpenTime.warId: GuideUnloadNum.LvUpNum + dicSystemOpenTime.lv;
|
let guideId = dicSystemOpenTime.warId > 0? GuideUnloadNum.GkNewFuncNum + dicSystemOpenTime.warId: GuideUnloadNum.LvUpNum + dicSystemOpenTime.lv;
|
||||||
return role.guide.indexOf(guideId) != -1;
|
return role.guide.indexOf(guideId) != -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function calSchoolPoint(quality: number, star: number, colorStar: number) {
|
||||||
|
let _star = colorStar > 0? colorStar: star;
|
||||||
|
let point = (quality - 1) * 6 + _star;
|
||||||
|
return point > 0? point: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function getSchoolPoint(roleId: string) {
|
||||||
|
let schools = await SchoolModel.findByRoleId(roleId);
|
||||||
|
return schools.reduce((pre, cur) => {
|
||||||
|
if(cur.isOpen && cur.hid > 0) {
|
||||||
|
return pre + calSchoolPoint(cur.quality, cur.star, cur.colorStar);
|
||||||
|
}
|
||||||
|
return pre;
|
||||||
|
}, 0);
|
||||||
|
}
|
||||||
@@ -7,7 +7,7 @@ export enum ROLE_SELECT {
|
|||||||
// 显示申请需要的信息
|
// 显示申请需要的信息
|
||||||
SHOW_FRIEND_APPLY_LIST = 'roleId roleName ce head frame spine heads frames spines lv title job quitTime vLv guildName friendCnt recFrdApplyCnt serverId userInfo.serverType',
|
SHOW_FRIEND_APPLY_LIST = 'roleId roleName ce head frame spine heads frames spines lv title job quitTime vLv guildName friendCnt recFrdApplyCnt serverId userInfo.serverType',
|
||||||
HANDLE_APPLY = 'roleId friendCnt lv',
|
HANDLE_APPLY = 'roleId friendCnt lv',
|
||||||
ATTR = 'attr',
|
ATTR = 'attr title',
|
||||||
GET_LV = 'lv',
|
GET_LV = 'lv',
|
||||||
GET_ROLE_ID = 'roleId roleName lv head frame spine heads frames spines ce title friendCnt serverId userInfo.serverType',
|
GET_ROLE_ID = 'roleId roleName lv head frame spine heads frames spines ce title friendCnt serverId userInfo.serverType',
|
||||||
GET_MY_SERVER = 'lv serverId userInfo.serverType',
|
GET_MY_SERVER = 'lv serverId userInfo.serverType',
|
||||||
@@ -19,7 +19,7 @@ export enum ROLE_SELECT {
|
|||||||
|
|
||||||
export enum HERO_SELECT {
|
export enum HERO_SELECT {
|
||||||
ENTRY = '-_id -attr -__v',
|
ENTRY = '-_id -attr -__v',
|
||||||
HERO_DETAIL = 'roleId roleName hid hName ce lv star colorStar quality job skins attr ePlace skinId',
|
HERO_DETAIL = 'roleId roleName hid hName ce lv star colorStar quality job skins attr ePlace skinId connections favourLv',
|
||||||
// 排行榜中lineup字段
|
// 排行榜中lineup字段
|
||||||
RANK_LINEUP = 'seqId roleId hid star colorStar lv quality job ce updatedAt skinId'
|
RANK_LINEUP = 'seqId roleId hid star colorStar lv quality job ce updatedAt skinId'
|
||||||
}
|
}
|
||||||
@@ -57,7 +57,7 @@ export enum FRIEND_SHIP_SELECT {
|
|||||||
GET_FRIEND_VALUE = 'friendValue friendLv'
|
GET_FRIEND_VALUE = 'friendValue friendLv'
|
||||||
}
|
}
|
||||||
|
|
||||||
export const ENTERY_ROLE_PICK = ['roleId', 'roleName', 'serverId', 'ce', 'topLineupCe', 'coin', 'lv', 'exp', 'vLv', 'gold', 'heros', 'jewels', 'consumeGoods', 'title', 'teraphs', 'showLineup', 'heads', 'head', 'frames', 'frame', 'spines', 'spine', 'hasGuild', 'guildCode', 'todayZeroPoint', 'apJson', 'skins', 'totalPay', 'guide', 'hasInit', 'renameCnt', 'totalCost', 'guildName', 'isVip'];
|
export const ENTERY_ROLE_PICK = ['roleId', 'roleName', 'serverId', 'ce', 'topLineupCe', 'coin', 'lv', 'exp', 'vLv', 'gold', 'heros', 'jewels', 'consumeGoods', 'title', 'teraphs', 'showLineup', 'heads', 'head', 'frames', 'frame', 'spines', 'spine', 'hasGuild', 'guildCode', 'todayZeroPoint', 'apJson', 'skins', 'totalPay', 'guide', 'hasInit', 'renameCnt', 'totalCost', 'guildName', 'isVip', 'createTime'];
|
||||||
|
|
||||||
export enum SURVEY_SELECT {
|
export enum SURVEY_SELECT {
|
||||||
FIND = '-__v -_id -surveyName -roleIndex -reward -mailContent -receivedRole -createdAt -updatedAt'
|
FIND = '-__v -_id -surveyName -roleIndex -reward -mailContent -receivedRole -createdAt -updatedAt'
|
||||||
|
|||||||
+14
-1
@@ -19,6 +19,12 @@ export default class School extends BaseModel {
|
|||||||
positionId: number; // 位置id
|
positionId: number; // 位置id
|
||||||
@prop({ required: true, default: 0 })
|
@prop({ required: true, default: 0 })
|
||||||
hid: number; // 放置的武将
|
hid: number; // 放置的武将
|
||||||
|
@prop({ required: true, default: 0 })
|
||||||
|
quality: number; // 放置的武将的品质
|
||||||
|
@prop({ required: true, default: 0 })
|
||||||
|
star: number; // 放置的武将的星级
|
||||||
|
@prop({ required: true, default: 0 })
|
||||||
|
colorStar: number; // 放置的武将的彩星
|
||||||
@prop({ required: true, default: false })
|
@prop({ required: true, default: false })
|
||||||
isOpen: boolean; // 位置是否开启
|
isOpen: boolean; // 位置是否开启
|
||||||
|
|
||||||
@@ -37,7 +43,7 @@ export default class School extends BaseModel {
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static async updateBySclAndPos(roleId: string, schoolId: number, positionId: number, update: {hid?: number, isOpen?: boolean}) {
|
public static async updateBySclAndPos(roleId: string, schoolId: number, positionId: number, update: SchoolUpdate) {
|
||||||
|
|
||||||
const doc = new SchoolModel();
|
const doc = new SchoolModel();
|
||||||
const setOnInsert = doc.toJSON();
|
const setOnInsert = doc.toJSON();
|
||||||
@@ -48,6 +54,12 @@ export default class School extends BaseModel {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static async updateByHid(roleId: string, hid: number, update: SchoolUpdate) {
|
||||||
|
const result: SchoolType = await SchoolModel.findOneAndUpdate({ roleId, hid }, { $set: update }, { new: true }).lean();
|
||||||
|
return result;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
public static async deleteAccount(roleId: string) {
|
public static async deleteAccount(roleId: string) {
|
||||||
let result = await SchoolModel.deleteMany({ roleId });
|
let result = await SchoolModel.deleteMany({ roleId });
|
||||||
return result;
|
return result;
|
||||||
@@ -57,3 +69,4 @@ export default class School extends BaseModel {
|
|||||||
export const SchoolModel = getModelForClass(School);
|
export const SchoolModel = getModelForClass(School);
|
||||||
|
|
||||||
export interface SchoolType extends Pick<DocumentType<School>, keyof School> { };
|
export interface SchoolType extends Pick<DocumentType<School>, keyof School> { };
|
||||||
|
export type SchoolUpdate = Partial<SchoolType>; // 将所有字段变成可选项
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ import { RoleType } from "../../db/Role";
|
|||||||
import { FriendShipType } from "../../db/FriendShip";
|
import { FriendShipType } from "../../db/FriendShip";
|
||||||
import * as friendUtil from '../../pubUtils/friendUtil'
|
import * as friendUtil from '../../pubUtils/friendUtil'
|
||||||
import { FRIEND_RELATION_TYPE } from "../../consts";
|
import { FRIEND_RELATION_TYPE } from "../../consts";
|
||||||
import { EPlace, HeroType, Stone, Talent } from "../../db/Hero";
|
import { Connect, EPlace, HeroType, Stone, Talent } from "../../db/Hero";
|
||||||
import { JewelType, RandSe } from "../../db/Jewel";
|
import { JewelType, RandSe } from "../../db/Jewel";
|
||||||
|
|
||||||
export class FriendParams {
|
export class FriendParams {
|
||||||
@@ -191,6 +191,14 @@ export class HeroDetailParam {
|
|||||||
mdef: number;
|
mdef: number;
|
||||||
}
|
}
|
||||||
talent: Talent[] = [];
|
talent: Talent[] = [];
|
||||||
|
connections: Connect[] = [];
|
||||||
|
favourLv: number = 0;
|
||||||
|
role: {
|
||||||
|
title: number;
|
||||||
|
scroll: number;
|
||||||
|
teraph: number;
|
||||||
|
school: number;
|
||||||
|
};
|
||||||
|
|
||||||
constructor(hero: HeroType) {
|
constructor(hero: HeroType) {
|
||||||
this.roleId = hero.roleId;
|
this.roleId = hero.roleId;
|
||||||
@@ -210,7 +218,8 @@ export class HeroDetailParam {
|
|||||||
this.talent = skin.talent||[];
|
this.talent = skin.talent||[];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
this.connections = hero.connections;
|
||||||
|
this.favourLv = hero.favourLv;
|
||||||
}
|
}
|
||||||
|
|
||||||
setAttributes(attributes: {hp: number, atk: number, def: number, mdef: number}) {
|
setAttributes(attributes: {hp: number, atk: number, def: number, mdef: number}) {
|
||||||
@@ -224,4 +233,8 @@ export class HeroDetailParam {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
setRole(title: number, scroll: number, teraph: number, school: number) {
|
||||||
|
this.role = { title, scroll, teraph, school };
|
||||||
|
}
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user