军团活动:修复粮草先行
This commit is contained in:
@@ -215,6 +215,8 @@ export class CityActivityObject {
|
||||
|
||||
// 军团诸侯混战等数据
|
||||
export class RaceActivityObject {
|
||||
private status = 0; // 活动状态 0-未开始 1-已开始 2-已结束
|
||||
public guildList: Array<{ serverId: number, guildCode: string }> = []; // 所有军团
|
||||
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(); // 每个军团遇到的事件
|
||||
@@ -247,7 +249,11 @@ export class RaceActivityObject {
|
||||
if(!woodenHorse) return false;
|
||||
woodenHorse.joinMember(roleId, roleName, sid)
|
||||
this.pushMember(guildCode, roleId, job);
|
||||
this.handleItems(woodenHorse);
|
||||
|
||||
if(this.status == 1) {
|
||||
let item = getRaceEventItems();
|
||||
this.handleItems(roleId, sid, item);
|
||||
}
|
||||
return woodenHorse;
|
||||
}
|
||||
|
||||
@@ -261,29 +267,35 @@ export class RaceActivityObject {
|
||||
let guildRankParam = new GuildRankParam(guild.icon, guild.name, guild.lv, leader);
|
||||
await setRank(REDIS_KEY.RACE_ACTIVITY, serverId, guild.code, 0, Math.pow(10, 11) - guild.guildCe, guildRankParam, true);
|
||||
let { name: guildName, guildCe } = guild;
|
||||
this.woodenHorses.set(guildCode, new WoodenHorse(guildCode, guildName, guildCe, serverId))
|
||||
this.woodenHorses.set(guildCode, new WoodenHorse(guildCode, guildName, guildCe, serverId));
|
||||
this.guildList.push({guildCode, serverId});
|
||||
if(this.status == 1) {
|
||||
this.woodenHorseStartRace(this.woodenHorses.get(guildCode));
|
||||
}
|
||||
}
|
||||
let woodenHorse = this.woodenHorses.get(guildCode);
|
||||
let events = this.events.get(guildCode)||[];
|
||||
woodenHorse.calCurWoodenHorse(events);
|
||||
let needSendEnd = woodenHorse.calCurWoodenHorse(events);
|
||||
if(woodenHorse.status == 1 || woodenHorse.status == 2) { // 更新距离
|
||||
await setRankWithoutUserInfo(REDIS_KEY.RACE_ACTIVITY, serverId, guildCode, woodenHorse.distance, Math.floor((woodenHorse.time - woodenHorse.startTime)/1000), true, false);
|
||||
if (woodenHorse.status == 2) { // 抵达后发送奖励,发送消息,结算
|
||||
if (needSendEnd) { // 抵达后发送奖励,发送消息,结算
|
||||
await sendSingleRaceActEndMsg(guildCode, woodenHorse);
|
||||
}
|
||||
}
|
||||
this.handleItems(woodenHorse);
|
||||
this.handleItemsByWoodenHorse(woodenHorse);
|
||||
return woodenHorse;
|
||||
}
|
||||
|
||||
public async useItem(fromRoleId: string, sid: string, fromGuild: string, toGuild: string, id: number, count: number) {
|
||||
let rec = this.handleItem(fromRoleId, sid, id, count);
|
||||
let rec = this.handleItems(fromRoleId, sid, [{id, count: -1 * count}]);
|
||||
if(!rec) return false;
|
||||
let event = new Event(id, fromGuild, toGuild, count);
|
||||
if(!this.events.has(toGuild)) {
|
||||
this.events.set(toGuild, [event]);
|
||||
} else {
|
||||
this.events.get(toGuild).push(event);
|
||||
let events = this.events.get(toGuild)||[];
|
||||
events.push(event);
|
||||
this.events.set(toGuild, events);
|
||||
}
|
||||
let chatSid = await getGuildChannelSid(toGuild);
|
||||
pinus.app.rpc.chat.guildRemote.sendRaceEvent.toServer(chatSid, toGuild, [event]);
|
||||
@@ -293,22 +305,25 @@ export class RaceActivityObject {
|
||||
|
||||
// 定时任务到,开始比赛,设置开始赛道,发放初始道具
|
||||
public startRace() {
|
||||
this.status = 1;
|
||||
let guildCodes = new Array<string>();
|
||||
for(let [code, woodenHorse] of this.woodenHorses) {
|
||||
woodenHorse.status = 1;
|
||||
woodenHorse.time = Date.now();
|
||||
woodenHorse.startTime = Date.now();
|
||||
let members = woodenHorse.members;
|
||||
for(let { roleId, sid } of members) {
|
||||
let item = getRaceEventItems();
|
||||
for(let { id, count } of item) {
|
||||
this.handleItem(roleId, sid, id, count);
|
||||
}
|
||||
}
|
||||
this.woodenHorseStartRace(woodenHorse);
|
||||
guildCodes.push(code);
|
||||
}
|
||||
return guildCodes;
|
||||
}
|
||||
|
||||
private woodenHorseStartRace(woodenHorse: WoodenHorse) {
|
||||
woodenHorse.status = 1;
|
||||
woodenHorse.time = Date.now();
|
||||
woodenHorse.startTime = Date.now();
|
||||
let members = woodenHorse.members;
|
||||
for(let { roleId, sid } of members) {
|
||||
let item = getRaceEventItems();
|
||||
this.handleItems(roleId, sid, item);
|
||||
}
|
||||
}
|
||||
|
||||
// 初始进入就随机9个灵球事件
|
||||
public initEvents(guildCode: string) {
|
||||
@@ -327,10 +342,10 @@ export class RaceActivityObject {
|
||||
|
||||
for(let [distance, type] of dicEncounter.events) {
|
||||
if(type == RACE_EVENT_TYPE.ITEM) {
|
||||
let event = new Event(RACE_EVENT.ITEM, guildCode, guildCode, distance);
|
||||
let event = new Event(RACE_EVENT.ITEM, guildCode, guildCode, 1, distance);
|
||||
this.events.get(guildCode).push(event);
|
||||
} else if (type == RACE_EVENT_TYPE.EVENT) {
|
||||
let event = new Event(events[index], guildCode, guildCode, distance);
|
||||
let event = new Event(events[index], guildCode, guildCode, 1, distance);
|
||||
this.events.get(guildCode).push(event);
|
||||
index ++;
|
||||
}
|
||||
@@ -353,38 +368,40 @@ export class RaceActivityObject {
|
||||
return result;
|
||||
}
|
||||
|
||||
private handleItems(woodenHorse: WoodenHorse) {
|
||||
private handleItemsByWoodenHorse(woodenHorse: WoodenHorse) {
|
||||
let { members } = woodenHorse;
|
||||
for(let { roleId, sid, items = [] } of members) {
|
||||
for(let {id, count} of items) {
|
||||
this.handleItem(roleId, sid, id, count);
|
||||
}
|
||||
for(let curMember of members) {
|
||||
let { roleId, sid, items = [] } = curMember;
|
||||
if(items.length > 0) this.handleItems(roleId, sid, items);
|
||||
curMember.items = [];
|
||||
}
|
||||
}
|
||||
|
||||
private handleItem(roleId: string, sid: string, id: number, inc: number) {
|
||||
private handleItems(roleId: string, sid: string, incItems: {id: number, count: number}[]) {
|
||||
let items = this.items.get(roleId)||[];
|
||||
let curItem = items.find(cur => cur.id == id);
|
||||
if(!curItem && inc < 0) return false;
|
||||
if(!curItem) {
|
||||
curItem = { id, count: 0 };
|
||||
items.push(curItem);
|
||||
let sendItems = new Array<{id: number, count: number}>();
|
||||
for(let {id, count: inc} of incItems) {
|
||||
let curItem = items.find(cur => cur.id == id);
|
||||
if(!curItem) {
|
||||
curItem = { id, count: 0 };
|
||||
items.push(curItem);
|
||||
}
|
||||
if(curItem.count + inc < 0 ) return false;
|
||||
if(inc != 0) {
|
||||
curItem.count += inc;
|
||||
sendItems.push({ id, count: curItem.count });
|
||||
}
|
||||
}
|
||||
if(curItem.count + inc < 0 ) return false;
|
||||
curItem.count += inc;
|
||||
this.items.set(roleId, items);
|
||||
let uids = [{uid: roleId, sid}];
|
||||
pinus.app.get('channelService').pushMessageByUids('onRaceItemUpdate', resResult(STATUS.SUCCESS, { items }), uids);
|
||||
pinus.app.get('channelService').pushMessageByUids('onRaceItemUpdate', resResult(STATUS.SUCCESS, { items: sendItems }), uids);
|
||||
|
||||
return items;
|
||||
}
|
||||
|
||||
public deleteRecord(guildCode: string) {
|
||||
let members = this.members.get(guildCode);
|
||||
this.woodenHorses.delete(guildCode);
|
||||
this.events.delete(guildCode);
|
||||
for(let roleId of members) {
|
||||
this.items.delete(roleId.roleId);
|
||||
}
|
||||
this.members.delete(guildCode);
|
||||
public deleteFromList(guildCode: string) {
|
||||
let index = this.guildList.findIndex(cur => cur.guildCode == guildCode);
|
||||
this.guildList.splice(index, 1);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -435,27 +452,31 @@ export class WoodenHorse {
|
||||
this.serverId = serverId;
|
||||
}
|
||||
|
||||
public calCurWoodenHorse(events: Event[]) {
|
||||
/**
|
||||
* 根据时间计算当前木马速度距离耐久等
|
||||
* @param events
|
||||
* @returns {boolean} needSendEnd 是否跑到终点发送结束新号
|
||||
*/
|
||||
public calCurWoodenHorse(events: Event[]): boolean {
|
||||
console.log('**', JSON.stringify(events))
|
||||
if(this.status == 2) return false;
|
||||
if(this.status == 0 && this.stopContinueTime && Date.now() > this.stopContinueTime) {
|
||||
this.status = 1; this.stopContinueTime = 0;
|
||||
}
|
||||
|
||||
if(this.status == 1) {
|
||||
this.distance += Math.floor((Date.now() - this.time)/1000 * 10 * this.speed)/10; // 1位小数点
|
||||
this.time = Date.now();
|
||||
|
||||
if(this.distance >= GUILDACTIVITY.RACEACTIVITY_LENGTH) {
|
||||
this.distance = GUILDACTIVITY.RACEACTIVITY_LENGTH;
|
||||
// TODO发送结束信号
|
||||
this.status = 2;
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
this.distance += Math.floor((Date.now() - this.time)/1000 * 10 * this.speed)/10; // 1位小数点
|
||||
this.time = Date.now();
|
||||
}
|
||||
let effectiveEvents = new Array<Event>();
|
||||
let delEvents = new Array<number>();
|
||||
for(let i = 0; i < events.length; i++) {
|
||||
let event = events[i];
|
||||
console.log('******', this.distance, event.startDistance, event.endDistance)
|
||||
if(!event.startTime && event.startDistance && this.distance > event.startDistance) {
|
||||
let startTime = Date.now() - Math.floor((this.distance - event.startDistance) / this.speed);
|
||||
event.setStartTime(startTime); // 距离生效的事件的实际生效时间,主要用于速度叠加顺序
|
||||
@@ -466,6 +487,12 @@ export class WoodenHorse {
|
||||
} else if (event.startDistance <= this.distance && event.endDistance > this.distance) {
|
||||
isEffective = true;
|
||||
} else if (event.endTime < Date.now() || event.endDistance < this.distance) {
|
||||
if(event.endTime && event.startTime == event.endTime) {
|
||||
isEffective = true;
|
||||
}
|
||||
if(event.endDistance && event.startDistance == event.endDistance) {
|
||||
isEffective = true;
|
||||
}
|
||||
delEvents.push(i);
|
||||
}
|
||||
if(isEffective) {
|
||||
@@ -475,28 +502,31 @@ export class WoodenHorse {
|
||||
for(let i of delEvents) events.splice(i, 1); // 删除过期事件
|
||||
effectiveEvents.sort((a, b) => a.startTime - b.startTime);
|
||||
this.speed = this.memberCnt * 10;
|
||||
console.log('******', effectiveEvents.length);
|
||||
for(let { id, count, endTime } of effectiveEvents) {
|
||||
this.calEvent(id, count, endTime);
|
||||
}
|
||||
return this;
|
||||
return false;
|
||||
}
|
||||
|
||||
private calEvent(id: number, count: number = 1, endTime?: number) {
|
||||
let { effect } = gameData.raceActivityEvents.get(id);
|
||||
|
||||
console.log('**********', effect, id)
|
||||
switch (id) {
|
||||
case RACE_EVENT.LIANNU:
|
||||
if (this.shieldTime > Date.now()) {
|
||||
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()) {
|
||||
if (this.shieldTime < Date.now()) {
|
||||
this.stopContinueTime = endTime;
|
||||
this.status = 0;
|
||||
}
|
||||
@@ -513,26 +543,36 @@ export class WoodenHorse {
|
||||
case RACE_EVENT.JIANSU_2:
|
||||
this.speed += effect[0]; break;
|
||||
case RACE_EVENT.HUIFU_1:
|
||||
this.durability += effect[0]; break;
|
||||
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]; break;
|
||||
case RACE_EVENT.SHANGHAI_1:
|
||||
this.durability -= effect[0]; break;
|
||||
this.durability -= effect[0];
|
||||
if(this.durability > 100) this.durability = 100;
|
||||
if(this.durability < 0) this.durability = 0;
|
||||
break;
|
||||
case RACE_EVENT.ITEM:
|
||||
let ranMember: WoodenHorseMember[] = getRandEelm(this.members, GUILDACTIVITY.RACEACTIVITY_EVENT_MEMBERCNT);
|
||||
if(ranMember.length <= 0) ranMember = this.members;
|
||||
for(let obj of ranMember) {
|
||||
let item = gameData.raceEventItems;
|
||||
obj.items = obj.items.concat(item);
|
||||
obj.items = (obj.items||[]).concat(item);
|
||||
}
|
||||
for(let obj of this.members) {
|
||||
let item = getRaceEventItems();
|
||||
obj.items = obj.items.concat(item);
|
||||
obj.items = (obj.items||[]).concat(item);
|
||||
}
|
||||
break;
|
||||
}
|
||||
if(this.durability <= 0) {
|
||||
this.status = 0;
|
||||
this.speed = 0;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -565,7 +605,7 @@ export class Event {
|
||||
@prop({required: true})
|
||||
count: number = 1;
|
||||
|
||||
constructor(id: number, fromGuild: string, toGuild: string, distance?: number, count?: number) {
|
||||
constructor(id: number, fromGuild: string, toGuild: string, count?: number, distance?: number) {
|
||||
let dicEvent = gameData.raceActivityEvents.get(id);
|
||||
this.id = id;
|
||||
this.fromGuild = fromGuild;
|
||||
|
||||
Reference in New Issue
Block a user