Files
ZYZ/shared/domain/battleField/guildActivity.ts
2023-05-06 13:21:43 +08:00

296 lines
9.4 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, RACE_EVENT, RACE_EVENT_TYPE, GUILD_ACTIVITY_STATUS } from "../../consts";
import { gameData } from "../../pubUtils/data";
import { RewardInter } from "../../pubUtils/interface";
export class WoodenHorseMember {
roleId: string;
roleName: string;
sid: string;
items: RewardInter[] = [];
code?: string;
hasReceiveInitItems: boolean = false;
isOnline: boolean = false;
constructor(roleId: string, roleName: string, sid: string, code: string) {
this.roleId = roleId;
this.roleName = roleName;
this.sid = sid;
this.code = code;
if(sid) this.isOnline = true;
}
addTempItem(item: RewardInter) {
this.items.push(item);
}
addTempItems(items: RewardInter[]) {
this.items.push(...items);
}
getTempItems() {
return this.items;
}
receiveTempItems() {
let items = [...this.items];
this.items = [];
return items;
}
isReceived() {
return this.hasReceiveInitItems;
}
setReceived(hasReceiveInitItems: boolean) {
this.hasReceiveInitItems = hasReceiveInitItems;
}
updateSid(sid: string) {
this.sid = sid;
this.isOnline = true;
}
leave() {
this.isOnline = false;
}
}
// 木牛流马
export class WoodenHorse {
@prop({required: true})
serverId: number = 0; // 服务器id
@prop({required: true})
guildCode: string = ""; // 军团code 木马的唯一标识
@prop({required: true})
guildName: string = ""; // 军团名
@prop({required: true})
guildCe: number = 0; // 军团战力
@prop({required: true})
status: number = 0; // 状态 0-停止 1-开启 2-结束
@prop({required: true})
speed: number = GUILDACTIVITY.RACE_INIT_SPEED; // 速度
@prop({required: true})
durability: number = 100; // 耐久度
@prop({required: true})
distance: number = 0; // 距离
@prop({required: true})
allStartTime: number = 0; // 全服开启世界
@prop({required: true})
startTime: number = 0; // 开始时间
@prop({required: true})
time: number = 0; // 到达时间
@prop({required: true})
memberCnt: number = 0; // 成员人数
@prop({required: true})
members: WoodenHorseMember[] = []; // 成员
@prop({required: true})
shield: number = 0; // 护盾数量
@prop({required: true})
shieldTime: number = 0; // 天师盾符
remainItems: Map<number, { total: number, max: number }> = new Map();
isRobot: boolean = false; // debug接口生成
constructor(guildCode: string, guildName: string, guildCe: number, serverId: number, allStartTime: number, isRobot: boolean) {
this.guildCode = guildCode;
this.guildName = guildName;
this.guildCe = guildCe;
this.serverId = serverId;
this.allStartTime = allStartTime;
this.isRobot = isRobot;
}
public getTreatTime() {
return {...this, time: this.time - this.allStartTime }
}
}
export class Event {
@prop({required: true})
id: number;
@prop({required: true})
fromGuild: string;
@prop({required: true})
toGuild: string;
@prop({required: true})
startTime?: number;
@prop({required: true})
startDistance?: number;
@prop({required: true})
endTime?: number;
@prop({required: true})
endDistance?: number;
@prop({required: true})
count: number = 1;
@prop({required: true})
type: number = 0; // 1-时间开启 2-距离开启
constructor(id: number, fromGuild: string, toGuild: string, count: number = 0, distance: number = 0) {
let dicEvent = gameData.raceActivityEvents.get(id);
this.id = id;
this.fromGuild = fromGuild;
this.toGuild = toGuild;
this.startDistance = distance;
this.endDistance = this.startDistance + dicEvent.continueDistance;
this.startTime = Date.now() + dicEvent.effectTime * 1000;
this.endTime = this.startTime + dicEvent.continueTime * 1000;
if(count) {
this.count = count;
}
this.type = dicEvent.type;
}
setStartTime(time: number) {
this.startTime = time;
}
needReCalHorse() {
let importantEvents = [
RACE_EVENT.LIANNU, // 连弩可能durability突然变0
RACE_EVENT.GUISHOUYINFU, // 鬼手阴符
RACE_EVENT.FENGCHE, // 风车
RACE_EVENT.WUGUIBANYUNFU, // 五鬼搬运符
];
return importantEvents.indexOf(this.id) != -1
}
useDistance() {
return this.type == RACE_EVENT_TYPE.EVENT||this.type == RACE_EVENT_TYPE.ITEM;
}
useTime() {
return this.type == RACE_EVENT_TYPE.DEFAULT;
}
}
export interface GuildRankParams {
guildRank: SimpleGuildRankParam[],
myGuildRank: SimpleGuildRankParam,
memberRank?: SimpleRoleRankParam[],
myMemberRank?: SimpleRoleRankParam
}
export class Member {
@prop({required: true})
roleId: string; // 玩家id
@prop({required: true})
job: number; // 在军团的职位
@prop({required: false})
code?: string; // 玩家的当前记录的code
}
export class JoinMember extends Member{
@prop({required: true})
roleName: string; // 玩家名
}
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;
}
}
export class RaceActivityRankParam {
rank: number = 0;
code: string;
name: string;
time: number;
sortTime: number;
sortDistance: number;
num: number;
durability: number;
constructor(woodenHorse: WoodenHorse) {
this.code = woodenHorse.guildCode;
this.name = woodenHorse.guildName;
this.durability = woodenHorse.durability;
let distance = woodenHorse.distance > GUILDACTIVITY.RACEACTIVITY_LENGTH? GUILDACTIVITY.RACEACTIVITY_LENGTH: woodenHorse.distance;
this.sortDistance = distance;
this.sortTime = woodenHorse.time - woodenHorse.allStartTime;
this.num = Math.floor(distance);
this.time = Math.floor((woodenHorse.time - woodenHorse.allStartTime)/1000)
}
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[] = [];
}