🦄 refactor(热更新): 分割状态代码和功能代码
This commit is contained in:
@@ -1,23 +1,8 @@
|
||||
import { COM_BTL_CONST, COM_TEAM_STATUS } from '../../consts';
|
||||
import { gameData, getBossHpByBlueprtId, getDicBlueprtById } from '../../pubUtils/data';
|
||||
import { COM_TEAM_STATUS } from '../../consts';
|
||||
import { getBossHpByBlueprtId, getDicBlueprtById } from '../../pubUtils/data';
|
||||
import ComBattleTeam from './../../db/ComBattleTeam';
|
||||
import { cloneDeep } from 'lodash'
|
||||
import { FriendParams } from '../roleField/friend';
|
||||
import { nowSeconds } from '../../pubUtils/timeUtil';
|
||||
import moment = require('moment');
|
||||
|
||||
/**
|
||||
* 拷贝敌军数组并添加当前血量字段
|
||||
* @param source 原敌军数组,不包含当前血量字段
|
||||
*/
|
||||
export function transBossHpArr(source: Array<{ dataId: number, hp: number, actorId: number }>): Array<{ dataId: number, hp: number, curHp: number, actorId: number }> {
|
||||
let desArr = [];
|
||||
source.forEach(elem => {
|
||||
let { hp } = elem;
|
||||
desArr.push(Object.assign(elem, { curHp: hp }));
|
||||
});
|
||||
return cloneDeep(desArr);
|
||||
}
|
||||
import { transBossHpArr } from '../../pubUtils/battleUtils';
|
||||
|
||||
|
||||
export class MemComBtlTeam extends ComBattleTeam {
|
||||
@@ -50,13 +35,6 @@ export class MemComBtlTeam extends ComBattleTeam {
|
||||
findMemberByRoleId(roleId: string) {
|
||||
return this.roleStatus.find(cur => cur.roleId == roleId);
|
||||
}
|
||||
|
||||
startTeam() {
|
||||
this.status = COM_TEAM_STATUS.FIGHTING;
|
||||
this.startTime = nowSeconds();
|
||||
this.endTime = nowSeconds() + COM_BTL_CONST.BTL_TIME_LMT/1000;
|
||||
this.hasTimeExtraReward = isComBattleTimeLimit();
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
@@ -75,18 +53,3 @@ export class MemComBtlTeam extends ComBattleTeam {
|
||||
this.status = comBattle.status;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 当前是否是有加成的特殊时间
|
||||
*/
|
||||
export function isComBattleTimeLimit() {
|
||||
let arr = gameData.comBattleRewardTime;
|
||||
for(let { from, to } of arr) {
|
||||
let fromTime = moment(moment().format(`YYYY-MM-DD ${from}`)).valueOf();
|
||||
let toTime = moment(moment().format(`YYYY-MM-DD ${to}`)).valueOf();
|
||||
let now = moment().valueOf();
|
||||
if(fromTime <= now && toTime >= now) return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
@@ -1,20 +1,11 @@
|
||||
import { GUILDACTIVITY } from "../../pubUtils/dicParam";
|
||||
import { SimpleGuildRankParam, SimpleRoleRankParam } from '../rank'
|
||||
import { prop } from "@typegoose/typegoose";
|
||||
import { CITY_STATUS, RACE_ACTIVITY_STATUS, RACE_EVENT, RACE_EVENT_TYPE } from "../../consts";
|
||||
import { CITY_STATUS, RACE_ACTIVITY_STATUS, RACE_EVENT, RACE_EVENT_TYPE, GUILD_ACTIVITY_STATUS } from "../../consts";
|
||||
import { gameData, getRaceEventItems } from "../../pubUtils/data";
|
||||
import { getRandEelm, getRandResultByMember, } from "../../pubUtils/util";
|
||||
import { RewardInter } from "../../pubUtils/interface";
|
||||
|
||||
export class GateMembersRec {
|
||||
roleId: string;
|
||||
round: number = 0;
|
||||
enemies: number[] = [];
|
||||
constructor(roleId: string) {
|
||||
this.roleId = roleId;
|
||||
}
|
||||
}
|
||||
|
||||
export class WoodenHorseMember {
|
||||
roleId: string;
|
||||
roleName: string;
|
||||
@@ -113,196 +104,6 @@ export class WoodenHorse {
|
||||
this.isRobot = isRobot;
|
||||
}
|
||||
|
||||
public startRace(allStartTime: number) {
|
||||
this.status = RACE_ACTIVITY_STATUS.START;
|
||||
this.time = Date.now();
|
||||
this.startTime = Date.now();
|
||||
this.allStartTime = allStartTime;
|
||||
}
|
||||
|
||||
public stopRace() {
|
||||
this.status = RACE_ACTIVITY_STATUS.END;
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据时间计算当前木马速度距离耐久等
|
||||
* @param events
|
||||
* @returns {boolean} needSendEnd 是否跑到终点发送结束新号
|
||||
*/
|
||||
public calCurWoodenHorse(events: Event[]): boolean {
|
||||
if(this.status == RACE_ACTIVITY_STATUS.END) return false;
|
||||
|
||||
if(this.status == RACE_ACTIVITY_STATUS.START) {
|
||||
if(this.distance >= GUILDACTIVITY.RACEACTIVITY_LENGTH) {
|
||||
this.distance = GUILDACTIVITY.RACEACTIVITY_LENGTH;
|
||||
this.status = RACE_ACTIVITY_STATUS.END;
|
||||
this.speed = 0;
|
||||
return true;
|
||||
}
|
||||
|
||||
this.distance = Math.floor((this.distance + (Date.now() - this.time)/1000 * this.speed ) * 1000)/1000; // 1位小数点
|
||||
this.time = Date.now();
|
||||
}
|
||||
let effectiveEvents = new Array<Event>();
|
||||
for(let i = 0; i < events.length; i++) {
|
||||
let event = events[i];
|
||||
if(event.useDistance() && event.startDistance && this.distance > event.startDistance) {
|
||||
let startTime = Date.now() - Math.floor((this.distance - event.startDistance) / this.speed);
|
||||
event.setStartTime(startTime); // 距离生效的事件的实际生效时间,主要用于速度叠加顺序
|
||||
}
|
||||
let isEffective = false;
|
||||
if(event.useTime()) {
|
||||
if(event.startTime <= Date.now() && event.endTime > Date.now()) {
|
||||
isEffective = true;
|
||||
}
|
||||
if(event.endTime < Date.now()) {
|
||||
if(event.endTime && event.startTime == event.endTime) {
|
||||
isEffective = true;
|
||||
}
|
||||
let index = events.findIndex(cur => cur.id == event.id);
|
||||
events.splice(index, 1);
|
||||
}
|
||||
}
|
||||
if(event.useDistance()) {
|
||||
if(event.startDistance <= this.distance && event.endDistance > this.distance) {
|
||||
isEffective = true;
|
||||
}
|
||||
if(event.endDistance < this.distance) {
|
||||
if(event.endDistance && event.startDistance == event.endDistance) {
|
||||
isEffective = true;
|
||||
}
|
||||
let index = events.findIndex(cur => cur.id == event.id);
|
||||
events.splice(index, 1);
|
||||
}
|
||||
}
|
||||
|
||||
if(isEffective) {
|
||||
effectiveEvents.push(event);
|
||||
}
|
||||
}
|
||||
|
||||
effectiveEvents.sort((a, b) => a.startTime - b.startTime);
|
||||
this.speed = GUILDACTIVITY.RACE_INIT_SPEED + this.memberCnt * GUILDACTIVITY.RACE_PER_SPEED;
|
||||
for(let { id, count, endTime } of effectiveEvents) {
|
||||
this.calEvent(id, count, endTime);
|
||||
}
|
||||
if(this.durability <= 0) {
|
||||
this.status = RACE_ACTIVITY_STATUS.BREAK;
|
||||
this.speed = 0;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
private calEvent(id: number, count: number = 1, endTime?: number) {
|
||||
let { effect } = gameData.raceActivityEvents.get(id);
|
||||
|
||||
switch (id) {
|
||||
case RACE_EVENT.LIANNU:
|
||||
if (this.shieldTime < Date.now()) {
|
||||
if (this.shield >= count) {
|
||||
this.shield -= count;
|
||||
} else {
|
||||
this.shield = 0;
|
||||
this.durability -= (count - this.shield) * effect[0];
|
||||
if(this.durability > 100) this.durability = 100;
|
||||
if(this.durability < 0) this.durability = 0;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case RACE_EVENT.GUISHOUYINFU:
|
||||
if (this.shieldTime < Date.now()) {
|
||||
this.time = endTime;
|
||||
this.speed = effect[1]||0.1;
|
||||
}
|
||||
break;
|
||||
case RACE_EVENT.FENGCHE:
|
||||
case RACE_EVENT.WUGUIBANYUNFU:
|
||||
this.speed *= Math.pow(1 + effect[0] / 100, count); break;
|
||||
case RACE_EVENT.LUDUN:
|
||||
this.shield += count * effect[0]; break;
|
||||
case RACE_EVENT.TIANSHIDUNFU:
|
||||
this.shieldTime = endTime; break;
|
||||
case RACE_EVENT.JIASU_1:
|
||||
this.speed *= Math.pow(1 + effect[0] / 100, count); break;
|
||||
case RACE_EVENT.JIASU_2:
|
||||
this.speed += effect[0]; break;
|
||||
case RACE_EVENT.HUIFU_1:
|
||||
this.durability += effect[0];
|
||||
if(this.durability > 100) this.durability = 100;
|
||||
if(this.durability < 0) this.durability = 0;
|
||||
break;
|
||||
case RACE_EVENT.JIANSU_1:
|
||||
this.speed *= Math.pow(1 - effect[0] / 100, count); break;
|
||||
case RACE_EVENT.JIANSU_2:
|
||||
this.speed -= effect[0];
|
||||
if(this.speed < 0) this.speed = 0;
|
||||
break;
|
||||
case RACE_EVENT.SHANGHAI_1:
|
||||
this.durability -= effect[0];
|
||||
if(this.durability > 100) this.durability = 100;
|
||||
if(this.durability < 0) this.durability = 0;
|
||||
break;
|
||||
case RACE_EVENT.ITEM:
|
||||
let onlineMembers = this.members.filter(member => member.isOnline);
|
||||
let memberCnt = onlineMembers.length;
|
||||
console.log('##### HANDLE_ITEM', memberCnt, onlineMembers)
|
||||
|
||||
let ranMember: WoodenHorseMember[] = getRandEelm(onlineMembers, GUILDACTIVITY.RACEACTIVITY_EVENT_MEMBERCNT);
|
||||
if(ranMember.length <= 0) ranMember = onlineMembers;
|
||||
for(let member of ranMember) {
|
||||
let item = gameData.raceEventItems;
|
||||
member.addTempItems(item);
|
||||
}
|
||||
let normalItems = getRaceEventItems();
|
||||
|
||||
for(let [id, {total, max}] of normalItems) {
|
||||
let randResult = getRandResultByMember(total, max, memberCnt);
|
||||
for(let i = 0; i < onlineMembers.length; i++) {
|
||||
let count = randResult.arr[i]||0;
|
||||
if(count > 0) {
|
||||
onlineMembers[i].addTempItem({ id, count });
|
||||
normalItems.get(id).total -= count;
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public joinMember(roleId: string, roleName: string, sid: string, code: string) {
|
||||
let index = this.members.findIndex(cur => cur.roleId == roleId)
|
||||
if(index == -1) {
|
||||
let member = new WoodenHorseMember(roleId, roleName, sid, code);
|
||||
this.members.push(member);
|
||||
this.speed++;
|
||||
this.memberCnt++;
|
||||
return member;
|
||||
} else {
|
||||
return this.members[index];
|
||||
}
|
||||
}
|
||||
|
||||
public updateMemberSid(roleId: string, sid: string) {
|
||||
let index = this.members.findIndex(cur => cur.roleId == roleId);
|
||||
if(index != -1) {
|
||||
this.members[index].updateSid(sid);
|
||||
}
|
||||
}
|
||||
|
||||
public leaveMemberSid(roleId: string, isQuit = false) {
|
||||
let index = this.members.findIndex(cur => cur.roleId == roleId);
|
||||
if(index != -1) {
|
||||
this.members[index].leave();
|
||||
}
|
||||
if(isQuit) this.memberCnt--;
|
||||
if(this.memberCnt < 0) this.memberCnt = 0;
|
||||
}
|
||||
|
||||
public setRemainItem(id: number, remain: number, max: number) {
|
||||
this.remainItems.set(id, { total: remain, max });
|
||||
}
|
||||
|
||||
public getTreatTime() {
|
||||
return {...this, time: this.time - this.allStartTime }
|
||||
}
|
||||
@@ -425,4 +226,72 @@ export class RaceActivityRankParam {
|
||||
setRank(rank: number) {
|
||||
this.rank = rank;
|
||||
}
|
||||
}
|
||||
|
||||
export class CityActivityData {
|
||||
public guildActivityStatus = GUILD_ACTIVITY_STATUS.WAITING; // 活动状态 0-未开始 1-已开始 2-已结束
|
||||
public gateHp: Map<string, number> = new Map(); // 城门血条,每个cityId有一条血条 serverId&cityId => gateHp
|
||||
public maxHp: Map<string, number> = new Map(); // 城门血条,每个cityId最大城门血量 serverId&cityId => gateHp
|
||||
public members: Map<string, Array<Member>> = new Map(); // 每个军团参与的成员 guildCode => [{roleId, job}]
|
||||
public cities: Map<string, string[]> = new Map(); // 各个城池参与的军团 serverId&cityId => [guildCode]
|
||||
public guilds: Map<string, number> = new Map(); // 军团所在的城池 guildCode => cityId
|
||||
public sentCity: string[] = [];
|
||||
public startTime: number = 0;
|
||||
}
|
||||
|
||||
export class GateMembersRec {
|
||||
roleId: string;
|
||||
round: number = 0;
|
||||
enemies: number[] = [];
|
||||
constructor(roleId: string) {
|
||||
this.roleId = roleId;
|
||||
}
|
||||
}
|
||||
|
||||
export class GateActivityData {
|
||||
public startTime: number;
|
||||
public members: Map<string, Array<Member>> = new Map(); // 每个军团参与的成员 guildCode => [{roleId, job}]
|
||||
public membersRecord: Map<string, GateMembersRec> = new Map(); // 每个成员的回合数和敌军数,防刷 recCode => GateMembersRec
|
||||
public guilds: Map<number, string[]> = new Map(); // 参加的所有军团 server => [guildCode]
|
||||
}
|
||||
|
||||
export class MemberInfo extends Member {
|
||||
isQuit: boolean = false;
|
||||
|
||||
constructor(roleId: string, job: number, code: string) {
|
||||
super();
|
||||
this.roleId = roleId;
|
||||
this.job = job;
|
||||
this.code = code;
|
||||
}
|
||||
|
||||
public quit() {
|
||||
this.isQuit = true;
|
||||
}
|
||||
}
|
||||
|
||||
export class GuildInfo {
|
||||
serverId: number;
|
||||
guildCode: string;
|
||||
isDissmiss: boolean = false;
|
||||
|
||||
constructor(serverId: number, guildCode: string) {
|
||||
this.serverId = serverId;
|
||||
this.guildCode = guildCode;
|
||||
}
|
||||
|
||||
dismiss() {
|
||||
this.isDissmiss = true;
|
||||
}
|
||||
}
|
||||
|
||||
export class RaceActivityData {
|
||||
public status = GUILD_ACTIVITY_STATUS.WAITING; // 活动状态 0-未开始 1-已开始 2-已结束
|
||||
public allStartTime = 0; // 开启时间,每天晚上8点
|
||||
public guildList: GuildInfo[] = []; // 所有军团
|
||||
public members: Map<string, MemberInfo[]> = new Map(); // 每个军团参与的成员 guildCode => [{roleId, job}]
|
||||
public woodenHorses: Map<string, WoodenHorse> = new Map(); // 每个军团的木牛流马 guildCode => WoodenHorse
|
||||
public events: Map<string, Event[]> = new Map(); // 每个军团遇到的事件
|
||||
public items: Map<string, RewardInter[]> = new Map(); // 每个玩家的道具 roleId => [{id, count}]
|
||||
public hasSentGuild: string[] = [];
|
||||
}
|
||||
@@ -1,5 +1,8 @@
|
||||
import * as crc from 'crc';
|
||||
import { md5 } from './sdkUtil';
|
||||
import { gameData } from './data';
|
||||
import moment = require('moment');
|
||||
import { cloneDeep } from 'lodash';
|
||||
|
||||
const BATTLE_CLASS_MOD = 100; // 存档分类模数
|
||||
const CDN_URL_PREFIX_SQ = 'https://download-sgzzyz.yev242.com'; // sq cdn 服务器地址前缀
|
||||
@@ -79,4 +82,32 @@ export function getLocalImgUrl(curEnv: string, type: string) {
|
||||
export function getRemoteImgUrl(curEnv: string, fileName: string, type: string) {
|
||||
const rplUrl = `${getPrefixByEnv(curEnv)}/img/${type}/` + fileName;
|
||||
return rplUrl;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 寻宝当前是否是有加成的特殊时间
|
||||
*/
|
||||
export function isComBattleTimeLimit() {
|
||||
let arr = gameData.comBattleRewardTime;
|
||||
for(let { from, to } of arr) {
|
||||
let fromTime = moment(moment().format(`YYYY-MM-DD ${from}`)).valueOf();
|
||||
let toTime = moment(moment().format(`YYYY-MM-DD ${to}`)).valueOf();
|
||||
let now = moment().valueOf();
|
||||
if(fromTime <= now && toTime >= now) return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* 拷贝敌军数组并添加当前血量字段
|
||||
* @param source 原敌军数组,不包含当前血量字段
|
||||
*/
|
||||
export function transBossHpArr(source: Array<{ dataId: number, hp: number, actorId: number }>): Array<{ dataId: number, hp: number, curHp: number, actorId: number }> {
|
||||
let desArr = [];
|
||||
source.forEach(elem => {
|
||||
let { hp } = elem;
|
||||
desArr.push(Object.assign(elem, { curHp: hp }));
|
||||
});
|
||||
return cloneDeep(desArr);
|
||||
}
|
||||
Reference in New Issue
Block a user