出卡延时处理和下随从延时处理

This commit is contained in:
yuexin 2021-03-09 16:40:24 +08:00
parent 43f0a21063
commit f98db69c78
5 changed files with 169 additions and 55 deletions

View File

@ -108,6 +108,7 @@ export class SelectPetCommand extends Command<CardGameState, {
dbpt_cnt, dbpt_cnt,
oldpos oldpos
}) })
await this.delay(1000) // 选好卡后延时1秒使用卡牌
let time = this.room.battleMan.useCard(data) let time = this.room.battleMan.useCard(data)
await this.delay(time) await this.delay(time)
const multipEat = !!this.state.rules.get(RULE_MULTIPLEEAT) const multipEat = !!this.state.rules.get(RULE_MULTIPLEEAT)

View File

@ -5,7 +5,7 @@ import { PlayerHandler } from "./PlayerHandler";
import CfgMan from "../CfgMan"; import CfgMan from "../CfgMan";
import { EffectCardType, GameCampType, GameUnitType, SkillEffectType, SkillRangeUnitType } from "../skill/SkillConst"; import { EffectCardType, GameCampType, GameUnitType, SkillEffectType, SkillRangeUnitType } from "../skill/SkillConst";
import { Pet } from "rooms/schema/Pet"; import { Pet } from "rooms/schema/Pet";
import {PetUpdateProcess, PlayerRemoveMsg, SkillParam, SkillResult, SkillTarget} from "../skill/SkillParam"; import {PetUpdateProcess, CachePlayerRemoveMsg, SkillParam, SkillResult, SkillTarget} from "../skill/SkillParam";
import { nosync, Room } from "colyseus"; import { nosync, Room } from "colyseus";
import { Skill } from "../skill/Skill"; import { Skill } from "../skill/Skill";
import { PetHandler } from "./PetHandler"; import { PetHandler } from "./PetHandler";
@ -26,14 +26,16 @@ export class BattleHandler {
_room: Room; _room: Room;
private _flowcount: number = 0; private _flowcount: number = 0;
private _sktime: number; private _sktime: number;
private _pettime: number;
private _gamestart: boolean = false; private _gamestart: boolean = false;
private _usingcard: boolean = false; private _usingcard: boolean = false;
private _cacheSkills: SkillTarget[] = []; private _cacheSkills: SkillTarget[] = [];
private _cachePets: PetHandler[] = []; private _cacheSkillMap: Map<string, SkillTarget[]> = new Map;
private _cacheAddPets: PetHandler[] = [];
private _cachePlayerMsgs: PlayerRemoveMsg[] = []; private _cachePets: PetHandler[] = []; // died/changed
private _cachePlayerMsgs: CachePlayerRemoveMsg[] = []; // died
private _lastlinkph: PlayerHandler; private _lastlinkph: PlayerHandler;
@ -491,6 +493,7 @@ export class BattleHandler {
if(this._flowcount == 0){ if(this._flowcount == 0){
this._sktime = 0; this._sktime = 0;
this._pettime = 0;
this._cacheSkills.length = 0; this._cacheSkills.length = 0;
this._cachePets.length = 0; this._cachePets.length = 0;
this._cachePlayerMsgs.length = 0; this._cachePlayerMsgs.length = 0;
@ -513,8 +516,18 @@ export class BattleHandler {
debugRoom(`[endFlow]${step}|${res}`); debugRoom(`[endFlow]${step}|${res}`);
if(res == 0){ if(res == 0){
this.handleCacheSkills(); let nt = this._pettime * 1000;
let nt = this._sktime * 1000; if(nt > 0){
this._sktime += this.preHandleCacheSkills();
this._room.clock.setTimeout(()=>{
this.handleCacheSkills();
}, nt);
}else{
this._sktime += this.preHandleCacheSkills();
this.handleCacheSkills();
}
nt += this._sktime * 1000;
if(this._cachePets.length > 0 || this._cachePlayerMsgs.length > 0){ if(this._cachePets.length > 0 || this._cachePlayerMsgs.length > 0){
if(nt > 0){ if(nt > 0){
nt += 100; // 延时100ms处理随从 nt += 100; // 延时100ms处理随从
@ -529,8 +542,7 @@ export class BattleHandler {
} }
this._flowcount = res; this._flowcount = res;
// let dt = isusecard? 5000: 100;// 延时100ms开始下个步骤 let dt = 100; // 延时100ms开始下个步骤
let dt = 100;
return nt + dt; return nt + dt;
} }
@ -540,10 +552,112 @@ export class BattleHandler {
return 0; return 0;
}; };
public preHandleCacheSkills(){
let skillres = this._cacheSkills;
/**
* indexOfAttack
start: number: number*/
let __indexOfAttack = function(start: number): number {
for(let i = start; i < skillres.length;i++){
if(skillres[i].bresok && skillres[i].isAttackSkill()){
return i;
}
}
return -1;
};
let __indexOfAttackBk = function(start: number, atkres: SkillTarget): number{
for(let i = start; i < skillres.length;i++){
let obj = skillres[i];
if(obj.bresok && obj.isAttackBackSkill()
&& atkres.dst == obj.srcPet() && obj.dst == atkres.srcPet()){
return i;
}
}
return -1;
};
if(!skillres || skillres.length <= 0){
return 0;
}
// 合并冲锋/反击
let nstart = 0;
while(true){
if(nstart >= skillres.length){
break;
}
let natk = __indexOfAttack(nstart);
if(natk < 0){
break;
}
nstart = natk + 1;
let atkobj = skillres[natk];
let natkbk = __indexOfAttackBk(nstart, atkobj);
if(natkbk >= 0){
let atkbkobj = skillres[natkbk];
if(!atkbkobj){
console.log('[error find attakbk]'+natkbk);
}
atkbkobj.res && atkbkobj.res.forEach((item: SkillResult) => {
if(item.bsuccess){
if(item.effect_type == SkillEffectType.CHG_AP || item.effect_type == SkillEffectType.CHG_HP){
atkobj.success(item.effect_type, item.effect_res, true);
}
}
});
skillres.splice(natkbk, 1);
}
}
let resmap = this._cacheSkillMap;
resmap.clear();
let lastkey = '';
let cnt = 0;
skillres.forEach((item: SkillTarget)=>{
let key = item.srcskillid + '|' + item.srcplayer.getId() + '|' + item.flag;
if(item.srcpet){
key += '|' + item.srcpet._idx;
}
if(lastkey != key && lastkey != ''){
cnt++;
}
lastkey = key;
let realkey = key + '|' + cnt;
let tmplst = resmap.get(realkey);
if(!tmplst){
tmplst = [item];
resmap.set(realkey, tmplst);
}else{
tmplst.push(item);
}
});
let tm = 0;
resmap.forEach((item: SkillTarget[]) =>{
let st = item[0];
tm += st.getLastTime();
});
return tm;
};
public handleCacheSkills(){ public handleCacheSkills(){
if(this._cacheSkills.length > 0){ if(this._cacheSkillMap.size > 0){
this.onSkillResultNotify(this._cacheSkills); let skid = '';
this._cacheSkills.length = 0; let lst: SkillInfoMsg[] = [];
this._cacheSkillMap.forEach((item: SkillTarget[]) =>{
let st = item[0];
lst.push(st.exportMsg(item));
skid += st.srcskillid + '|';
});
this._room.bMsgQueue(lst);
this._cacheSkillMap.clear();
} }
}; };
@ -818,7 +932,7 @@ export class BattleHandler {
return 0; return 0;
} }
if(this.isFlowing()){ if(this.isFlowing()){
let obj = this._cachePlayerMsgs.find((v: PlayerRemoveMsg)=>{ let obj = this._cachePlayerMsgs.find((v: CachePlayerRemoveMsg)=>{
return ph.getId() == v.id; return ph.getId() == v.id;
}); });
if(!obj){ if(!obj){
@ -856,8 +970,8 @@ export class BattleHandler {
// --------------------调用外部接口函数-------------------------- // --------------------调用外部接口函数--------------------------
public onPlayerDiedNotify(players: PlayerRemoveMsg[]){ public onPlayerDiedNotify(players: CachePlayerRemoveMsg[]){
players && players.forEach((item: PlayerRemoveMsg)=>{ players && players.forEach((item: CachePlayerRemoveMsg)=>{
item.pets.forEach((pet: RemovePetMsg) =>{ item.pets.forEach((pet: RemovePetMsg) =>{
this._room.bRemovePet(pet); this._room.bRemovePet(pet);
}); });
@ -865,7 +979,15 @@ export class BattleHandler {
}); });
}; };
public onAddPetNotify(apet: PetHandler){ public onAddPetNotify(apet: PetHandler, isself: boolean){
if(!isself){
if(this.isFlowing()){
this._pettime += 1; // 下随从延时1秒
}else{
this._room.addScheduleTime(1000, 'onAddPetNotify', 'onAddPetNotify');
}
}
return this._room.bAddPet(apet.exportInfoMsg()); return this._room.bAddPet(apet.exportInfoMsg());
}; };
@ -926,22 +1048,22 @@ export class BattleHandler {
}; };
public onPlayerAddCardNotify(aplayer: PlayerHandler, count: number, maxcount: number, public onPlayerAddCardNotify(aplayer: PlayerHandler, count: number, maxcount: number,
from?: PlayerHandler): number{ from?: PlayerHandler, tgt?: SkillTarget): number{
return this._room.addCard(aplayer.getId(), count, maxcount, 1, from? from.getId(): null); return this._room.addCard(aplayer.getId(), count, maxcount, 1, from? from.getId(): null);
}; };
public onPlayerStealCardNotify(srcplayer: PlayerHandler, public onPlayerStealCardNotify(srcplayer: PlayerHandler,
dstplayer: PlayerHandler, count: number): number{ dstplayer: PlayerHandler, count: number, tgt?: SkillTarget): number{
return this._room.drawCardFromPlayer(srcplayer.getId(), dstplayer.getId(), count); return this._room.drawCardFromPlayer(srcplayer.getId(), dstplayer.getId(), count);
}; };
public onPlayerAddDirectCardNotify(aplayer: PlayerHandler, count: number, cardid: number, public onPlayerAddDirectCardNotify(aplayer: PlayerHandler, count: number, cardid: number,
from?: PlayerHandler){ from?: PlayerHandler, tgt?: SkillTarget){
return this._room.generateCard({player: aplayer.getId(), count, effectId: cardid, return this._room.generateCard({player: aplayer.getId(), count, effectId: cardid,
fromplayer: from? from.getId(): null}); fromplayer: from? from.getId(): null});
}; };
public onPlayerDropCardNotify(aplayer: PlayerHandler, count: number, from?: PlayerHandler): number{ public onPlayerDropCardNotify(aplayer: PlayerHandler, count: number, from?: PlayerHandler, tgt?: SkillTarget): number{
return this._room.giveUpCard(aplayer.getId(), count, from? from.getId(): null); return this._room.giveUpCard(aplayer.getId(), count, from? from.getId(): null);
}; };
@ -1003,7 +1125,6 @@ export class BattleHandler {
} }
} }
let checklst: PlayerHandler[] = [];
let lst: SkillInfoMsg[] = []; let lst: SkillInfoMsg[] = [];
let resmap: Map<string, SkillTarget[]> = new Map; let resmap: Map<string, SkillTarget[]> = new Map;
let lastkey = ''; let lastkey = '';
@ -1036,22 +1157,10 @@ export class BattleHandler {
tm += st.getLastTime(); tm += st.getLastTime();
skid += st.srcskillid + '|'; skid += st.srcskillid + '|';
// st.isHurtSkill() && item.forEach((v: SkillTarget)=>{
// if(v.targetIsPet()){
// let ph = v.targetPlayer();
// if(!checklst.includes(ph)){
// checklst.push(ph);
// }
// }
// })
}); });
if(this.isFlowing()){ this._room.addScheduleTime(tm*1000, 'onSkillResultNotify', skid);
this._sktime += tm;
}else{
this._room.addScheduleTime(tm*1000, skid);
}
this._room.bMsgQueue(lst); this._room.bMsgQueue(lst);
// checklst.forEach((item: PlayerHandler) => { // checklst.forEach((item: PlayerHandler) => {

View File

@ -7,7 +7,7 @@ import { Pet } from "rooms/schema/Pet";
import { CondDecideType, CondType, EffectCardType, GameUnitType, SkillEffectType, SkillType, SkillUserType, TriggerType } from "../skill/SkillConst"; import { CondDecideType, CondType, EffectCardType, GameUnitType, SkillEffectType, SkillType, SkillUserType, TriggerType } from "../skill/SkillConst";
import { UnitCfg } from "cfg/parsers/UnitCfg"; import { UnitCfg } from "cfg/parsers/UnitCfg";
import { Skill } from "../skill/Skill"; import { Skill } from "../skill/Skill";
import { PlayerRemoveMsg, SkillParam, SkillTarget } from "../skill/SkillParam"; import { CachePlayerRemoveMsg, SkillParam, SkillTarget } from "../skill/SkillParam";
import SkillMan from "../skill/SkillMan"; import SkillMan from "../skill/SkillMan";
import { Card } from "rooms/schema/Card"; import { Card } from "rooms/schema/Card";
import arrUtil from "utils/array.util"; import arrUtil from "utils/array.util";
@ -303,24 +303,24 @@ export class PlayerHandler {
return this.handleSkill(skillid, count, usertype, this._self, from._petowner, param); return this.handleSkill(skillid, count, usertype, this._self, from._petowner, param);
}; };
public addCard(count: number, from?: PlayerHandler): number{ public addCard(count: number, from?: PlayerHandler, tgt?: SkillTarget): number{
return this._owner.onPlayerAddCardNotify(this, count, 0, from); return this._owner.onPlayerAddCardNotify(this, count, 0, from, tgt);
}; };
public addCardLimit(maxcount: number, from?: PlayerHandler): number{ public addCardLimit(maxcount: number, from?: PlayerHandler, tgt?: SkillTarget): number{
return this._owner.onPlayerAddCardNotify(this, 0, maxcount, from); return this._owner.onPlayerAddCardNotify(this, 0, maxcount, from, tgt);
}; };
public addDirectCard(cardid: number, count: number, from?: PlayerHandler){ public addDirectCard(cardid: number, count: number, from?: PlayerHandler, tgt?: SkillTarget){
return this._owner.onPlayerAddDirectCardNotify(this, count, cardid, from); return this._owner.onPlayerAddDirectCardNotify(this, count, cardid, from, tgt);
}; };
public stealCard(dstplayer: PlayerHandler, count: number): number{ public stealCard(dstplayer: PlayerHandler, count: number, tgt?: SkillTarget): number{
return this._owner.onPlayerStealCardNotify(this, dstplayer, count); return this._owner.onPlayerStealCardNotify(this, dstplayer, count, tgt);
}; };
public dropCard(count: number, from?: PlayerHandler): number{ public dropCard(count: number, from?: PlayerHandler, tgt?: SkillTarget): number{
return this._owner.onPlayerDropCardNotify(this, count, from); return this._owner.onPlayerDropCardNotify(this, count, from, tgt);
}; };
public addHP(value: number, from: PetHandler): number{ public addHP(value: number, from: PetHandler): number{
@ -426,7 +426,7 @@ export class PlayerHandler {
}; };
public onPetBorned(apet: PetHandler, param: SkillParam){ public onPetBorned(apet: PetHandler, param: SkillParam){
this._owner.onAddPetNotify(apet); this._owner.onAddPetNotify(apet, apet == this._self);
this.onEMChanged(apet._enmagic);//增加法强 this.onEMChanged(apet._enmagic);//增加法强
// 战吼 // 战吼
if(!apet.isSilent()){ if(!apet.isSilent()){
@ -883,7 +883,7 @@ export class PlayerHandler {
return this._self? this._self.delBuff(buffid, buffcount, from): -1; return this._self? this._self.delBuff(buffid, buffcount, from): -1;
}; };
public exportRemoveMsg(): PlayerRemoveMsg{ public exportRemoveMsg(): CachePlayerRemoveMsg{
return new PlayerRemoveMsg(this); return new CachePlayerRemoveMsg(this);
}; };
} }

View File

@ -392,7 +392,7 @@ export class Skill {
switch(efftype){ switch(efftype){
case SkillEffectType.CARD_ADD: case SkillEffectType.CARD_ADD:
if(tgt.dsttype == GameUnitType.PLAYER){ if(tgt.dsttype == GameUnitType.PLAYER){
let n = (tgt.dst as PlayerHandler).addCard(res, tgt.srcPlayer()); let n = (tgt.dst as PlayerHandler).addCard(res, tgt.srcPlayer(), tgt);
if(n >= 0){ if(n >= 0){
tgt.success(efftype, n); tgt.success(efftype, n);
}else{ }else{
@ -404,7 +404,7 @@ export class Skill {
break; break;
case SkillEffectType.CARD_ADD_LIMIT: case SkillEffectType.CARD_ADD_LIMIT:
if(tgt.dsttype == GameUnitType.PLAYER){ if(tgt.dsttype == GameUnitType.PLAYER){
let n = (tgt.dst as PlayerHandler).addCardLimit(res, tgt.srcPlayer()); let n = (tgt.dst as PlayerHandler).addCardLimit(res, tgt.srcPlayer(), tgt);
if(n >= 0){ if(n >= 0){
tgt.success(efftype, n); tgt.success(efftype, n);
}else{ }else{
@ -416,7 +416,7 @@ export class Skill {
break; break;
case SkillEffectType.CARD_STEAL: case SkillEffectType.CARD_STEAL:
if(tgt.dsttype == GameUnitType.PLAYER){ if(tgt.dsttype == GameUnitType.PLAYER){
let n = tgt.srcplayer.stealCard((tgt.dst as PlayerHandler), res); let n = tgt.srcplayer.stealCard((tgt.dst as PlayerHandler), res, tgt);
if(n >= 0){ if(n >= 0){
tgt.success(efftype, n); tgt.success(efftype, n);
}else{ }else{
@ -434,7 +434,7 @@ export class Skill {
let cardid = this._data.quotecardid; let cardid = this._data.quotecardid;
let ncount = this.getQuoteValue(this._data.quotecard_times, this._data.quotecard_timesmax, this._orign_effcnt); let ncount = this.getQuoteValue(this._data.quotecard_times, this._data.quotecard_timesmax, this._orign_effcnt);
let n = (tgt.dst as PlayerHandler).addDirectCard(cardid, ncount, tgt.srcPlayer()); let n = (tgt.dst as PlayerHandler).addDirectCard(cardid, ncount, tgt.srcPlayer(), tgt);
if(n >= 0){ if(n >= 0){
tgt.success(efftype, n); tgt.success(efftype, n);
}else{ }else{
@ -447,7 +447,7 @@ export class Skill {
case SkillEffectType.CARD_DROP: case SkillEffectType.CARD_DROP:
{ {
if(tgt.dsttype == GameUnitType.PLAYER){ if(tgt.dsttype == GameUnitType.PLAYER){
let n = (tgt.dst as PlayerHandler).dropCard(res, tgt.srcPlayer()); let n = (tgt.dst as PlayerHandler).dropCard(res, tgt.srcPlayer(), tgt);
if(n >= 0){ if(n >= 0){
tgt.success(efftype, n); tgt.success(efftype, n);
}else{ }else{

View File

@ -404,7 +404,7 @@ export class PetUpdateProcess{
}; };
}; };
export class PlayerRemoveMsg{ export class CachePlayerRemoveMsg{
id: string; id: string;
pets: RemovePetMsg[]; pets: RemovePetMsg[];
constructor(player: PlayerHandler){ constructor(player: PlayerHandler){
@ -414,4 +414,8 @@ export class PlayerRemoveMsg{
this.pets.push(item.exportRemoveMsg()); this.pets.push(item.exportRemoveMsg());
}); });
} }
} };
export class CacheCardMsg{
};