diff --git a/doc/todolist.xmind b/doc/todolist.xmind index d22f2ea..1458837 100644 Binary files a/doc/todolist.xmind and b/doc/todolist.xmind differ diff --git a/src/rooms/logic/Handler/BattleHandler.ts b/src/rooms/logic/Handler/BattleHandler.ts index 33d7a82..dd87585 100644 --- a/src/rooms/logic/Handler/BattleHandler.ts +++ b/src/rooms/logic/Handler/BattleHandler.ts @@ -3,14 +3,15 @@ import {Card} from "../../schema/Card"; import {CardGameState} from "../../schema/CardGameState"; import { PlayerHandler } from "./PlayerHandler"; import CfgMan from "../CfgMan"; -import { EffectCardType, GameCampType, GameUnitType } from "../skill/SkillConst"; +import { EffectCardType, GameCampType, GameUnitType, SkillRangeUnitType } from "../skill/SkillConst"; import { Pet } from "rooms/schema/Pet"; import {SkillParam, SkillTarget} from "../skill/SkillParam"; import { Room } from "colyseus"; import { Skill } from "../skill/Skill"; import { PetHandler } from "./PetHandler"; -import { SkillInfoMsg } from "message/SkillInfo"; +import { SKillEffectData, SkillInfoMsg } from "message/SkillInfo"; import { PetInfo } from "message/PetInfo"; +import arrUtil from "utils/array.util"; export class BattleHandler { @@ -97,21 +98,73 @@ export class BattleHandler { } }; - public getFinalTarget(players: PlayerHandler[], apet: PetHandler, ct: GameUnitType, + public getFinalTarget(ut: SkillRangeUnitType, players: PlayerHandler[], apet: PetHandler, expet: PetHandler, ct: GameUnitType, checktaunt: boolean=false): PetHandler { let pet = apet; - let bok = this.petIsValid(pet, players, ct); - if(checktaunt && (!bok || !pet.isTaunt())){ - for(let i = 0; i < players.length;i++){ - let obj = players[i].findTauntPet(); - if(obj){ - pet = obj; - bok = true; - break; + let bok = false; + switch(ut){ + case SkillRangeUnitType.RANDOM_ONE: + if(checktaunt){ + let lst:PetHandler[] = []; + players.forEach((item:PlayerHandler)=>{ + item.findAllTauntPets(lst); + }); + if(lst.length > 0){ + pet = arrUtil.randomOne(lst); + bok = true; + } } - } + if(!bok){ + let lst:PetHandler[] = []; + players.forEach((item:PlayerHandler)=>{ + item.findAllPets(lst); + }); + if(lst.length > 0){ + pet = arrUtil.randomOne(lst); + bok = true; + } + } + break; + case SkillRangeUnitType.RANDOM_ONE_EXSELF: + if(checktaunt){ + let lst:PetHandler[] = []; + players.forEach((item:PlayerHandler)=>{ + item.findAllTauntPets(lst, expet); + }); + if(lst.length > 0){ + pet = arrUtil.randomOne(lst); + bok = true; + } + } + if(!bok){ + let lst:PetHandler[] = []; + players.forEach((item:PlayerHandler)=>{ + item.findAllPets(lst, expet); + }); + if(lst.length > 0){ + pet = arrUtil.randomOne(lst); + bok = true; + } + } + break; + default: + { + bok = this.petIsValid(pet, players, ct); + if(checktaunt && (!bok || !pet.isTaunt())){ + for(let i = 0; i < players.length;i++){ + let obj = players[i].findTauntPet(); + if(obj){ + pet = obj; + bok = true; + break; + } + } + } + } + break; } + return bok? pet: null; }; @@ -133,7 +186,7 @@ export class BattleHandler { case GameUnitType.BATTLEUNIT: case GameUnitType.PET: if(skill.isSingleTarget()){ - let pet = this.getFinalTarget(players, param.dstpet, skill._data.targetid, + let pet = this.getFinalTarget(skill._data.rangeid, players, param.dstpet, param.srcpet, skill._data.targetid, skill.isHurtPowerSkill()); pet && lst.push(new SkillTarget(skill, param.srcplayer, param.srcpet, pet, pet._isHero? GameUnitType.HERO: GameUnitType.PET)); @@ -204,6 +257,44 @@ export class BattleHandler { } } break; + case GameCampType.RANDOM_ENEMY: + { + let tmp: PlayerHandler[] = []; + for(let [key, obj] of this._players){ + if(obj != src && obj != src._friend && obj.isAlive()){ + tmp.push(obj); + } + } + lst.push(arrUtil.randomOne(tmp)); + } + break; + case GameCampType.RANDOM_US: + { + let tmp: PlayerHandler[] = []; + if(src){ + src.isAlive() && tmp.push(src); + let obj = this.getFriend(src); + obj && obj.isAlive() && tmp.push(obj); + } + (tmp.length > 0) && lst.push(arrUtil.randomOne(tmp)); + } + break; + case GameCampType.FACE_ENEMY: + { + let bfind = false; + let player = this._room.getOppositePlayer(src.getId()); + if(player){ + let ph = this.getPlayer(player); + if(ph){ + lst.push(ph); + bfind = true; + } + } + if(!bfind){ + return this.getTargetPlayers(GameCampType.RANDOM_ENEMY, src, dst); + } + } + break; default: break; } diff --git a/src/rooms/logic/Handler/PlayerHandler.ts b/src/rooms/logic/Handler/PlayerHandler.ts index 18a1245..cfe3896 100644 --- a/src/rooms/logic/Handler/PlayerHandler.ts +++ b/src/rooms/logic/Handler/PlayerHandler.ts @@ -10,6 +10,7 @@ import { Skill } from "../skill/Skill"; import { SkillParam, SkillTarget } from "../skill/SkillParam"; import SkillMan from "../skill/SkillMan"; import { Card } from "rooms/schema/Card"; +import arrUtil from "utils/array.util"; export class PlayerHandler { public _player: Player; @@ -363,7 +364,43 @@ export class PlayerHandler { } return this._pets.find((item: PetHandler) =>{ return item.isTaunt(); - }) + }); + }; + + public findAllTauntPets(lst: PetHandler[], expet?: PetHandler): number{ + if(!lst){ + return -1; + } + let ncnt = 0; + if(this._self && this._self.isTaunt() && this._self != expet){ + lst.push(this._self); + ncnt++; + } + this._pets.forEach((item: PetHandler) =>{ + if(item.isTaunt() && this._self != expet){ + lst.push(item); + ncnt++; + } + }); + return ncnt; + }; + + public findAllPets(lst: PetHandler[], expet?: PetHandler): number{ + if(!lst){ + return -1; + } + let ncnt = 0; + if(this._self && this._self != expet){ + lst.push(this._self); + ncnt++; + } + this._pets.forEach((item: PetHandler) =>{ + if(this._self != expet){ + lst.push(item); + ncnt++; + } + }); + return ncnt; }; public hasTransEffCardSkill(): boolean{ diff --git a/src/rooms/logic/skill/Skill.ts b/src/rooms/logic/skill/Skill.ts index d969417..b9cb967 100644 --- a/src/rooms/logic/skill/Skill.ts +++ b/src/rooms/logic/skill/Skill.ts @@ -335,7 +335,8 @@ export class Skill { let ncount = 1 + exparam.edd_cnt; switch(efftype){ case SkillEffectType.SUMMON_NPC: - let n = tgt.dst.summonPet(this._data.quoteunitid, ncount, exparam); + let obj = tgt.srcpet? tgt.srcpet: tgt.srcplayer; + let n = obj.summonPet(this._data.quoteunitid, ncount, exparam); if(n >= 0){ tgt.success(efftype, n); } diff --git a/src/rooms/logic/skill/SkillConst.ts b/src/rooms/logic/skill/SkillConst.ts index 763d476..7b51ca8 100644 --- a/src/rooms/logic/skill/SkillConst.ts +++ b/src/rooms/logic/skill/SkillConst.ts @@ -89,6 +89,15 @@ export const enum SkillType{ }; // 技能作用范围(对单位而言) +/** + * 1.自己 + * 2.单体:即(指定单体)可以由玩家指定一个目标 + * 3.(自己外)单体:作用于一个目标,但是不包括技能的使用者 + * 4.全体:作用于全体目标 + * 5.(自己外)全体:作用于全体目标,但是不包括技能的使用者 + * 6.随机单体:在可以选择的目标范围内,随机一个目标 + * 7.(自己外)随机单体:自己除外 + */ export const enum SkillRangeUnitType{ NONE = 0, SELF = 1, @@ -96,6 +105,8 @@ export const enum SkillRangeUnitType{ OTHER = 3, ALL = 4, ALL_EXSELF = 5, + RANDOM_ONE = 6, + RANDOM_ONE_EXSELF = 7, }; // 技能效果类型