增加条件/触发新逻辑处理
This commit is contained in:
parent
960e8afa85
commit
b7a42535c7
@ -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();
|
||||
});
|
||||
};
|
||||
|
||||
/**
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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{
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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) {
|
||||
|
@ -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,
|
||||
};
|
||||
|
||||
// 技能效果类型
|
||||
|
@ -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;
|
||||
|
Loading…
x
Reference in New Issue
Block a user