Files
ZYZ/shared/domain/battleField/guildActivity.ts

300 lines
9.7 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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;
}
}