增加条件/触发新逻辑处理

This commit is contained in:
yuexin 2021-01-06 17:37:44 +08:00
parent 960e8afa85
commit b7a42535c7
7 changed files with 188 additions and 50 deletions

View File

@ -28,6 +28,7 @@ export class BattleHandler {
private _gamestart: boolean = false;
private _cacheSkills: SkillTarget[] = [];
private _lastlinkph: PlayerHandler;
//--------------------对外接口--player相关---(外部调用)----------------------------
public init(cs: CardGameState, room: Room){
@ -145,44 +146,42 @@ export class BattleHandler {
bok = !!pet;
break;
case SkillRangeUnitType.RANDOM_ONE:
if(checktaunt){
let lst:PetHandler[] = [];
players.forEach((item:PlayerHandler)=>{
item.findAllTauntPets(lst, isonlypet);
});
if(lst.length > 0){
pet = arrUtil.randomOne(lst);
bok = true;
case SkillRangeUnitType.RANDOM_ONE_EXOWNER:
case SkillRangeUnitType.RANDOM_ONE_EXSELF:
{
let expet:PetHandler = null;
if(ut == SkillRangeUnitType.RANDOM_ONE_EXOWNER){
expet = senderpet;
}else if(ut == SkillRangeUnitType.RANDOM_ONE_EXSELF){
expet = srcpet;
}
}
if(!bok){
let lst:PetHandler[] = [];
players.forEach((item:PlayerHandler)=>{
item.findAllPets(lst, isonlypet);
});
if(lst.length > 0){
pet = arrUtil.randomOne(lst);
bok = true;
if(checktaunt){
let lst:PetHandler[] = [];
players.forEach((item:PlayerHandler)=>{
item.findAllTauntPets(lst, isonlypet, expet);
});
if(lst.length > 0){
pet = arrUtil.randomOne(lst);
bok = true;
}
}
if(!bok){
let lst:PetHandler[] = [];
players.forEach((item:PlayerHandler)=>{
item.findAllPets(lst, isonlypet, expet);
});
if(lst.length > 0){
pet = arrUtil.randomOne(lst);
bok = true;
}
}
}
break;
case SkillRangeUnitType.RANDOM_ONE_EXOWNER:
case SkillRangeUnitType.RANDOM_ONE_EXSELF:
let expet = ut == SkillRangeUnitType.RANDOM_ONE_EXOWNER? senderpet: srcpet;
if(checktaunt){
case SkillRangeUnitType.RANDOM_ONE_NOSHIELD:
{
let lst:PetHandler[] = [];
players.forEach((item:PlayerHandler)=>{
item.findAllTauntPets(lst, isonlypet, expet);
});
if(lst.length > 0){
pet = arrUtil.randomOne(lst);
bok = true;
}
}
if(!bok){
let lst:PetHandler[] = [];
players.forEach((item:PlayerHandler)=>{
item.findAllPets(lst, isonlypet, expet);
item.findAllNoShieldPets(lst, isonlypet);
});
if(lst.length > 0){
pet = arrUtil.randomOne(lst);
@ -232,6 +231,18 @@ export class BattleHandler {
bok = !!pet;
}
break;
case SkillRangeUnitType.PET_LAST:
{
let lst:PetHandler[] = [];
players.forEach((item:PlayerHandler)=>{
let obj = item.getLastPet();
obj && lst.push(obj);
});
if(lst.length > 0){
pet = arrUtil.randomOne(lst);
bok = true;
}
}break;
default:
{
bok = this.petIsValid(pet, players, ct);
@ -267,9 +278,13 @@ export class BattleHandler {
if(players.length > 0){
switch(skill._data.targetid){
case GameUnitType.PLAYER:
players.forEach((item:PlayerHandler)=>{
lst.push(new SkillTarget(skill, param.srcplayer, param.srcpet, item, GameUnitType.PLAYER));
});
if(skill._data.rangeid == SkillRangeUnitType.PLAYER_BELINKED){
this._lastlinkph && lst.push(new SkillTarget(skill, param.srcplayer, param.srcpet, this._lastlinkph, GameUnitType.PLAYER));
}else{
players.forEach((item:PlayerHandler)=>{
lst.push(new SkillTarget(skill, param.srcplayer, param.srcpet, item, GameUnitType.PLAYER));
});
}
break;
case GameUnitType.HERO:
players.forEach((item:PlayerHandler)=>{
@ -445,6 +460,13 @@ export class BattleHandler {
this._flowcount = res;
return 0;
};
public onPlayerCardChanged(player: PlayerHandler){
this._players.forEach((item: PlayerHandler) => {
item.onCardChanged(player);
});
};
//--------------------对外接口(外部调用)----------------------------
/**
* 使
@ -566,8 +588,12 @@ export class BattleHandler {
this.beginFlow('onCardLinkOver');
this._lastlinkph = fromph;
ph.onCardLinkEnd(linkcards, fromph);
this._lastlinkph = null;
return this.endFlow('onCardLinkOver');
};
@ -686,6 +712,9 @@ export class BattleHandler {
public onPlayerDead(aplayer: Player){
let ph = this.getPlayer(aplayer);
ph && ph.die();
this._players.forEach((item: PlayerHandler) => {
(item != ph) && item.onPlayerDie(ph);
});
this.delPlayer(aplayer);
};
@ -693,7 +722,9 @@ export class BattleHandler {
*
*/
public onGameStart(){
this._players.forEach((item: PlayerHandler) => {
item.onGameStart();
});
};
/**

View File

@ -327,6 +327,7 @@ export class PetHandler {
// 圣盾减伤后消失
if(this.hasShield()){
this.delShield();
this._owner.onShieldUsed(this);
rv = 0;
}
}
@ -412,7 +413,7 @@ export class PetHandler {
let n = apet.beHurt(myap, this);
!isAtkBack && this._owner.onBeAttack(apet, param);
!isAtkBack && this._owner.onAttackAfter(apet, param);
let nowap = apet.totalAP();
@ -586,7 +587,7 @@ export class PetHandler {
return n;
};
public checkSkills(tgtype: TriggerType, tgtv: any, sp: SkillParam, cb?: any){
public checkSkills(tgtype: TriggerType, tgtv: PlayerHandler, sp: SkillParam, cb?: any){
if(this._isSilent){
return;
}

View File

@ -408,6 +408,8 @@ export class PlayerHandler {
if(!apet.isSilent()){
this.simpleCheckSkills(apet._bornSkills, apet, param);
}
this.checkSkills(TriggerType.PET_BORN, null, null, apet);
};
public onPetDied(apet: PetHandler): boolean{
@ -421,6 +423,7 @@ export class PlayerHandler {
}
// this.delPet(apet);
this.checkSkills(TriggerType.PET_DIE, null, null, apet);
return true;
};
@ -497,12 +500,21 @@ export class PlayerHandler {
this.singleCheckSkills(apet, TriggerType.BEFORE_ATTACK, null, sp);
};
onAttackAfter(apet: PetHandler, sp?: SkillParam){
this.singleCheckSkills(apet, TriggerType.AFTER_ATTACK, null, sp);
};
// 暂不用
onBeAttack(apet: PetHandler, sp?: SkillParam){
this.singleCheckSkills(apet, TriggerType.BE_ATTACK, null, sp);
};
onBeHurt(apet: PetHandler, value: number){
this.singleCheckSkills(apet, TriggerType.BE_HURT, value);
this.singleCheckSkills(apet, TriggerType.BE_HURT);
};
onShieldUsed(apet: PetHandler){
this.singleCheckSkills(apet, TriggerType.SHIELD_USED);
};
public isMyPet(apet: PetHandler){
@ -557,6 +569,24 @@ export class PlayerHandler {
return ncnt;
};
public findAllNoShieldPets(lst: PetHandler[], exself: boolean, expet?: PetHandler): number{
if(!lst){
return -1;
}
let ncnt = 0;
if(!exself && this._self && this._self != expet && !this._self.hasShield()){
lst.push(this._self);
ncnt++;
}
this._pets.forEach((item: PetHandler) =>{
if(item != expet && item.isAlive() && !item.hasShield()){
lst.push(item);
ncnt++;
}
});
return ncnt;
};
public getMaxAPPet(exself: boolean): PetHandler{
let res: PetHandler = exself? null: this._self;
this._pets.forEach((item: PetHandler) =>{
@ -581,6 +611,13 @@ export class PlayerHandler {
return res;
};
public getLastPet(): PetHandler{
if(this._pets.length > 0){
return this._pets[this._pets.length - 1];
}
return null;
};
public hasTransEffCardSkill(): boolean{
if(!this._self){
return false;
@ -626,8 +663,12 @@ export class PlayerHandler {
this.checkSkills(TriggerType.CARD_GETTED);
};
onCardChanged(srcplayer: PlayerHandler){
this.checkSkills(TriggerType.CARD_CHANGED, srcplayer);
};
onUseCardEnd(sp: SkillParam){
this.checkSkills(TriggerType.CARD_USED, 0, sp);
this.checkSkills(TriggerType.CARD_USED, null, sp);
this._cardstate = CondType.NO_COND; // 重置状态
};
@ -640,14 +681,22 @@ export class PlayerHandler {
this._cardstate = CondType.NO_COND; // 重置状态
};
checkSkills(tgttype: TriggerType, tgtvalue?: any, tgtsp?: SkillParam){
onGameStart(){
this.checkSkills(TriggerType.PLAYER_BORN);
};
onPlayerDie(srcplayer: PlayerHandler){
this.checkSkills(TriggerType.PLAYER_DIE, srcplayer);
};
checkSkills(tgttype: TriggerType, tgtvalue?: PlayerHandler, tgtsp?: SkillParam, expet?: PetHandler){
let sp = tgtsp;
if(!sp){
sp = new SkillParam(0, 0, 0, this, this._self, null, null);
}
let reslst: SkillTarget[] = [];
this._self && this._self.checkSkills(tgttype, tgtvalue, sp, (skill: Skill, ap: SkillParam, res: SkillTarget[])=>{
this._self && (this._self != expet) && this._self.checkSkills(tgttype, tgtvalue, sp, (skill: Skill, ap: SkillParam, res: SkillTarget[])=>{
if(res){
reslst.push(...res);
}else{
@ -661,6 +710,9 @@ export class PlayerHandler {
if(!item.isAlive()){
return;
}
if(item == expet){
return;
}
sp.srcpet = item;
item.checkSkills(tgttype, tgtvalue, sp, (skill: Skill, ap: SkillParam, res: SkillTarget[])=>{
if(res){
@ -676,7 +728,7 @@ export class PlayerHandler {
this._owner.onSkillResult(reslst);
};
singleCheckSkills(apet: PetHandler, tgttype: TriggerType, tgtvalue?: any, tgtsp?: SkillParam){
singleCheckSkills(apet: PetHandler, tgttype: TriggerType, tgtvalue?: PlayerHandler, tgtsp?: SkillParam){
let sp = tgtsp;
if(!sp){
sp = new SkillParam(0, 0, 0, this, apet, null, null);
@ -706,7 +758,7 @@ export class PlayerHandler {
}
let reslst: SkillTarget[] = [];
skills.forEach((item: Skill)=>{
item.checkTrigger(TriggerType.NO_COND, 0, sp, (skill: Skill, ap: SkillParam, res: SkillTarget[])=>{
item.checkTrigger(TriggerType.NO_COND, null, sp, (skill: Skill, ap: SkillParam, res: SkillTarget[])=>{
if(res){
reslst.push(...res);
}else{

View File

@ -22,7 +22,7 @@ export class Condition {
this._v = cond_value;
};
public isOK(tg_value: any, tg_owner: PlayerHandler){
public isOK(tg_value: PlayerHandler, tg_owner: PlayerHandler){
if(this._type == CondType.NO_COND){
return true;
}
@ -40,6 +40,14 @@ export class Condition {
case CondType.CARD_ACTION_LINK:
return tg_owner._cardstate == CondType.CARD_ACTION_LINK_OTHER ||
tg_owner._cardstate == CondType.CARD_ACTION_LINK_SELF;
case CondType.SELF:
return tg_value? tg_value == tg_owner: true;
case CondType.FRIEND:
return tg_value? tg_owner._friend == tg_value: false;
case CondType.MYTEAM:
return tg_value? (tg_owner == tg_value || tg_owner._friend == tg_value): true;
case CondType.ENEMY:
return tg_value? (tg_owner != tg_value && tg_owner._friend != tg_value): false;
default:
break;
}

View File

@ -135,7 +135,7 @@ export class Skill {
return this._data.rangeid == SkillRangeUnitType.ALL;
};
isInRange(srcpet: PetHandler, dstpet: PetHandler, exself: boolean){
isInRange(srcpet: PetHandler, dstpet: PetHandler, exhero: boolean){
switch(this._data.rangeid){
case SkillRangeUnitType.SELF:
return srcpet == dstpet;
@ -156,9 +156,13 @@ export class Skill {
case SkillRangeUnitType.RANDOM_ONE_EXOWNER:
return dstpet != this._petowner;
case SkillRangeUnitType.MAXAP_ONE:
return dstpet == this._owner.getMaxAPPet(exself);
return dstpet == this._owner.getMaxAPPet(exhero);
case SkillRangeUnitType.MINAP_ONE:
return dstpet == this._owner.getMinAPPet(exself);
return dstpet == this._owner.getMinAPPet(exhero);
case SkillRangeUnitType.PET_LAST:
return dstpet == this._owner.getLastPet();
case SkillRangeUnitType.RANDOM_ONE_NOSHIELD:
return dstpet && !dstpet.hasShield();
default:
return false;
}
@ -356,7 +360,7 @@ export class Skill {
}
};
checkTrigger(tg_type: TriggerType, tg_value: any, tg_target: SkillParam, cb?: any) {
checkTrigger(tg_type: TriggerType, tg_value: PlayerHandler, tg_target: SkillParam, cb?: any) {
if (tg_type == TriggerType.ROUND_START_MYSELF) {
this._roundCount++;
if (this._start) {

View File

@ -6,6 +6,10 @@
* 3./
* 4.
* 5.
* 6.
* 7.
* 8.+
* 9.
*/
export const enum CondType
@ -21,6 +25,14 @@ export const enum CondType
CARD_ACTION_LINK_OTHER = 4,
CARD_ACTION_LINK_SELF = 5,
SELF = 6,
FRIEND = 7,
MYTEAM = 8,
ENEMY = 9,
};
// 判断方式
@ -52,6 +64,14 @@ export const enum CondDecideType {
* 10.
* 11.
* 12.ID40122
* 13.
* 14.
* 15.
* 16.
* 17.
* 18.
* 19.
* 20.
*/
export const enum TriggerType
{
@ -78,6 +98,20 @@ export const enum TriggerType
BEFORE_ATTACK = 12,
BE_ATTACK = 13,
AFTER_ATTACK = 14,
CARD_CHANGED = 15,
PET_BORN = 16,
PET_DIE = 17,
PLAYER_BORN = 18,
PLAYER_DIE = 19,
SHIELD_USED = 20,
};
// 技能大类
@ -121,6 +155,8 @@ export const enum SkillType{
* 12.
* 13.
* 14.
* 15.
* 16.
*/
export const enum SkillRangeUnitType{
NONE = 0,
@ -138,6 +174,12 @@ export const enum SkillRangeUnitType{
MAXAP_ONE = 13,
MINAP_ONE = 14,
PET_LAST = 15,
PLAYER_BELINKED = 16,
RANDOM_ONE_NOSHIELD = 17,
};
// 技能效果类型

View File

@ -25,7 +25,7 @@ export class TriggerCtrl{
this._cond = condobj;
};
checkTrigger(tg_type: TriggerType, tg_value: any, tg_owner: PlayerHandler, callback?: any): boolean{
checkTrigger(tg_type: TriggerType, tg_value: PlayerHandler, tg_owner: PlayerHandler, callback?: any): boolean{
if(tg_type == TriggerType.NO_COND){
// callback && callback();
return true;