300 lines
9.7 KiB
TypeScript
300 lines
9.7 KiB
TypeScript
import { GUILDACTIVITY } from "../../pubUtils/dicParam";
|
||
import { SimpleGuildRankParam, SimpleRoleRankParam } from '../rank'
|
||
import { prop } from "@typegoose/typegoose";
|
||
import { CITY_STATUS } from "../../consts";
|
||
|
||
export class GateMembersRec {
|
||
roleId: string;
|
||
round: number = 0;
|
||
enemies: number[] = [];
|
||
constructor(roleId: string) {
|
||
this.roleId = roleId;
|
||
}
|
||
}
|
||
|
||
// 军团活动蛮夷入侵城门血量等数据存储
|
||
|
||
export class GateActivityObject {
|
||
private gateHp: Map<string, number> = new Map(); // 城门血条,每个军团有一条血条 guildCode => hp
|
||
private members: Map<string, Array<Member>> = new Map(); // 每个军团参与的成员 guildCode => [{roleId, job}]
|
||
private membersRecord: Map<string, GateMembersRec> = new Map(); // 每个成员的回合数和敌军数,防刷 recCode => GateMembersRec
|
||
private guilds: Map<number, string[]> = new Map(); // 参加的所有军团 server => [guildCode]
|
||
|
||
public getObj(guildCode: string, serverId: number) {
|
||
console.log(guildCode, serverId)
|
||
return {
|
||
gateHp: this.getGateHpAndInc(guildCode),
|
||
members: this.members.get(guildCode)||[],
|
||
memberesRecord: [...this.membersRecord],
|
||
guilds: this.guilds.get(serverId)||[]
|
||
}
|
||
}
|
||
|
||
public getGateHpAndInc(guildCode: string, inc: number = 0) {
|
||
let gateHp = this.gateHp.get(guildCode);
|
||
if(!this.gateHp.has(guildCode)) {
|
||
gateHp = GUILDACTIVITY.GATEACTIVITY_GATEHP;
|
||
}
|
||
if(inc != 0) {
|
||
gateHp += inc;
|
||
this.gateHp.set(guildCode, gateHp);
|
||
}
|
||
if(gateHp <= 0) gateHp = 0;
|
||
return gateHp
|
||
}
|
||
|
||
public getGuilds() {
|
||
return this.guilds;
|
||
}
|
||
|
||
public pushMembers(guildCode: string, serverId: number, roleId: string, job: number) {
|
||
|
||
if(this.members.has(guildCode)) {
|
||
let members = this.members.get(guildCode);
|
||
if(members.findIndex(cur => cur.roleId == roleId) == -1) {
|
||
members.push({ roleId, job });
|
||
}
|
||
} else {
|
||
let arr = new Array<string>();
|
||
arr.push(roleId);
|
||
this.members.set(guildCode, [{ roleId, job }]);
|
||
}
|
||
if(this.guilds.has(serverId)) {
|
||
let arr = this.guilds.get(serverId);
|
||
if(!arr.includes(guildCode)) arr.push(guildCode);
|
||
this.guilds.set(serverId, arr);
|
||
} else {
|
||
this.guilds.set(serverId, [guildCode]);
|
||
}
|
||
|
||
}
|
||
|
||
public getMemberRecord(recCode: string, roleId: string) {
|
||
return this.membersRecord.get(recCode)||new GateMembersRec(roleId)
|
||
}
|
||
|
||
public setMemberRecord(recCode: string, newMemberRecord: GateMembersRec) {
|
||
this.membersRecord.set(recCode, newMemberRecord);
|
||
}
|
||
|
||
public delMemberRecord(recCode: string) {
|
||
this.membersRecord.delete(recCode);
|
||
}
|
||
|
||
public delGuildRecord(guildCode: string, serverId: number) {
|
||
let guildList = this.guilds.get(serverId);
|
||
if(guildList) {
|
||
let index = guildList.indexOf(guildCode);
|
||
guildList.splice(index, 1);
|
||
}
|
||
this.members.delete(guildCode);
|
||
}
|
||
}
|
||
|
||
// 军团诸侯混战等数据
|
||
export class CityActivityObject {
|
||
private gateHp: Map<string, number> = new Map(); // 城门血条,每个cityId有一条血条 serverId&cityId => gateHp
|
||
private members: Map<string, Array<Member>> = new Map(); // 每个军团参与的成员 guildCode => [{roleId, job}]
|
||
private cities: Map<string, string[]> = new Map(); // 各个城池参与的军团 serverId&cityId => [guildCode]
|
||
private guilds: Map<string, number> = new Map(); // 军团所在的城池 guildCode => cityId
|
||
private historyCity: Map<string, number> = new Map(); // 获取自己打开过的城池的页面 roleId => cityId
|
||
|
||
private getKey(serverId: number, cityId: number) {
|
||
return `${serverId}_${cityId}`;
|
||
}
|
||
|
||
private decodeKey(key: string) {
|
||
let arr = key.split('_');
|
||
return {
|
||
serverId: parseInt(arr[0]),
|
||
cityId: parseInt(arr[1])
|
||
}
|
||
}
|
||
|
||
public getObj( serverId: number, cityId: number, guildCode: string) {
|
||
let key = this.getKey(serverId, cityId);
|
||
return {
|
||
gateHp: this.gateHp.get(key),
|
||
members: this.members.get(guildCode),
|
||
city: this.cities.get(key),
|
||
guild: this.guilds.get(guildCode)
|
||
}
|
||
}
|
||
|
||
public getAllCities() {
|
||
let allCities = new Array<{ serverId: number, cityId: number, guildCodes: string[]}>();
|
||
let serverlists = new Array<number>();
|
||
for(let [key, guildCodes] of this.cities) {
|
||
let { serverId, cityId } = this.decodeKey(key);
|
||
allCities.push({ serverId, cityId, guildCodes });
|
||
if(!serverlists.includes(serverId)) serverlists.push(serverId);
|
||
}
|
||
return {cities: allCities, serverlists};
|
||
}
|
||
|
||
public getGuildsInCity(serverId: number, cityId: number) {
|
||
let key = this.getKey(serverId, cityId);
|
||
return this.cities.get(key)||[];
|
||
}
|
||
|
||
public getMembersOfGuild(guildCode: string) {
|
||
return this.members.get(guildCode)||[];
|
||
}
|
||
|
||
public getGateHpAndInc(serverId: number, cityId: number, maxHp: number, inc: number = 0) {
|
||
let key = this.getKey(serverId, cityId);
|
||
let gateHp = this.gateHp.get(key);
|
||
if(!this.gateHp.has(key)) {
|
||
gateHp = maxHp;
|
||
}
|
||
if(inc != 0) {
|
||
gateHp += inc;
|
||
this.gateHp.set(key, gateHp);
|
||
}
|
||
if(gateHp <= 0) gateHp = 0;
|
||
return gateHp
|
||
}
|
||
|
||
public getHistoryCity(roleId: string) {
|
||
return this.historyCity.get(roleId)
|
||
}
|
||
|
||
public setHistoryCity(roleId: string, cityId: number) {
|
||
return this.historyCity.set(roleId, cityId);
|
||
}
|
||
|
||
|
||
public pushMembers(guildCode: string, roleId: string, job: number) {
|
||
|
||
if(this.members.has(guildCode)) {
|
||
let members = this.members.get(guildCode);
|
||
if(members.findIndex(cur => cur.roleId == roleId) == -1) {
|
||
members.push({ roleId, job });
|
||
}
|
||
} else {
|
||
let arr = new Array<string>();
|
||
arr.push(roleId);
|
||
this.members.set(guildCode, [{ roleId, job }]);
|
||
}
|
||
}
|
||
|
||
public pushGuild(guildCode: string, serverId: number, cityId: number) {
|
||
let key = this.getKey(serverId, cityId);
|
||
if(!this.cities.has(key)) {
|
||
this.cities.set(key, [guildCode]);
|
||
} else {
|
||
let arr = this.cities.get(key);
|
||
if(!arr.includes(guildCode)) {
|
||
arr.push(guildCode);
|
||
}
|
||
}
|
||
this.guilds.set(guildCode, cityId);
|
||
}
|
||
|
||
public delCityRecord(cityId: number, serverId: number) {
|
||
let key = this.getKey(serverId, cityId);
|
||
let guildCodes = this.cities.get(key)||[];
|
||
for(let guildCode of guildCodes) {
|
||
this.members.delete(guildCode);
|
||
this.guilds.delete(guildCode);
|
||
}
|
||
this.cities.delete(key);
|
||
}
|
||
}
|
||
|
||
|
||
// 军团诸侯混战等数据
|
||
export class RaceActivityObject {
|
||
private members: Map<string, Array<Member>> = new Map(); // 每个军团参与的成员 guildCode => [{roleId, job}]
|
||
private woodenHorses: Map<string, WoodenHorse> = new Map(); // 每个军团的木牛流马 guildCode => WoodenHorse
|
||
private events: Map<string, Event[]> = new Map(); // 每个军团遇到的事件
|
||
|
||
getWoodenHorse(guildCode: string) {
|
||
if(!this.woodenHorses.has(guildCode)) {
|
||
// this.woodenHorses.set(guildCode, )
|
||
}
|
||
let wh = this.woodenHorses.get(guildCode);
|
||
|
||
}
|
||
}
|
||
|
||
class WoodenHorseMember {
|
||
roleId: string;
|
||
roleName: string;
|
||
}
|
||
|
||
// 木牛流马
|
||
export class WoodenHorse {
|
||
guildCode: string; // 军团code 木马的唯一标识
|
||
guildName: string; // 军团名
|
||
guildCe: number; // 军团战力
|
||
speed: number; // 速度
|
||
durability: number; // 耐久度
|
||
distance: number; // 距离
|
||
time: number; // 到达时间
|
||
memberCnt: number; // 成员人数
|
||
members: WoodenHorseMember[]; // 成员
|
||
|
||
constructor(guildCode: string, guildName: string, guildCe: number) {
|
||
this.guildCode = guildCode;
|
||
this.guildName = guildName;
|
||
this.guildCe = guildCe;
|
||
}
|
||
|
||
calSpeed(events: Event[]) {
|
||
let speed = this.speed;
|
||
for(let event of events) {
|
||
|
||
}
|
||
return speed;
|
||
}
|
||
|
||
getWoodenHorse(events: Event[]) {
|
||
let newObj = new WoodenHorse(this.guildCode, this.guildName, this.guildCe);
|
||
newObj.speed = this.calSpeed(events);
|
||
newObj.durability = this.durability;
|
||
newObj.distance = this.distance;
|
||
newObj.time = this.time;
|
||
newObj.memberCnt = this.memberCnt;
|
||
newObj.members = this.members;
|
||
return newObj;
|
||
}
|
||
|
||
}
|
||
|
||
export class Event {
|
||
id: number;
|
||
fromGuild: string;
|
||
toGuild: string;
|
||
startTime?: number;
|
||
startDistance?: number;
|
||
endTimestamp?: number;
|
||
endDistance?: number;
|
||
effect: number[];
|
||
}
|
||
|
||
export interface GuildGateRankParam {
|
||
guildRank: SimpleGuildRankParam[],
|
||
myGuildRank: SimpleGuildRankParam,
|
||
memberRank: SimpleRoleRankParam[],
|
||
myMemberRank?: SimpleRoleRankParam
|
||
}
|
||
|
||
export class Member {
|
||
@prop({required: true})
|
||
roleId: string; // 玩家id
|
||
@prop({required: true})
|
||
job: number; // 在军团的职位
|
||
}
|
||
|
||
export class CityParam {
|
||
cityId: number = 0; // 城池id
|
||
guardGuildCode: string = ''; // 占领军团id
|
||
guardGuildName: string = ''; // 占领军团名
|
||
declareCount: number = 0; // 宣战数
|
||
status: number = CITY_STATUS.NOT_OPEN; // 城池对于我军状态
|
||
|
||
constructor(cityId: number) {
|
||
this.cityId = cityId;
|
||
}
|
||
}
|