From 55f7580c2cc35c05261b23cf35a9e653a9affa53 Mon Sep 17 00:00:00 2001 From: zhl Date: Mon, 14 Dec 2020 14:42:35 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E7=AE=80=E5=8D=95=E7=9A=84ai?= =?UTF-8?q?,=20=E8=87=AA=E5=8A=A8=E9=80=89=E6=8B=A9=E6=8A=80=E8=83=BD?= =?UTF-8?q?=E7=9A=84=E7=9B=AE=E6=A0=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/robot/RobotClient.ts | 67 ++++++++++++++++++++++++++++++++++++-- src/rooms/schema/Pet.ts | 4 ++- src/rooms/schema/Player.ts | 2 +- src/utils/array.util.ts | 12 +++++++ 4 files changed, 81 insertions(+), 4 deletions(-) diff --git a/src/robot/RobotClient.ts b/src/robot/RobotClient.ts index 9dfdc3f..a5915d0 100644 --- a/src/robot/RobotClient.ts +++ b/src/robot/RobotClient.ts @@ -12,12 +12,14 @@ import {HeroCfg} from "../cfg/parsers/HeroCfg"; import {EffectCardCfg} from "../cfg/parsers/EffectCardCfg"; import CfgMan from '../rooms/logic/CfgMan'; import {SkillTargetType} from "../rooms/logic/skill/SkillConst"; +import {Player} from "../rooms/schema/Player"; export class RobotClient implements Client { id: string; readyState: number; ref: EventEmitter; sessionId: string; + selfPlayer: Player; state: ClientState; svrstate: CardGameState; room: Room; @@ -29,6 +31,7 @@ export class RobotClient implements Client { constructor(sessionId: string, state: CardGameState, clock: Clock, onMessageHandlers: {[id: string]: (client: Client, message: any) => void}) { this.sessionId = sessionId; this.svrstate = state; + this.selfPlayer = this.svrstate.players.get(sessionId); this.clock = clock; this.ref = new EventEmitter(); this.onMessageHandlers = onMessageHandlers; @@ -206,6 +209,37 @@ export class RobotClient implements Client { }); } + /** + * 随机获取敌对玩家 + * @private + */ + private getEnemyPlayer(): Player { + let enemys = []; + for (let [,player] of this.svrstate.players) { + if (player.team !== this.selfPlayer.team) { + enemys.push(player); + } + } + return arrUtil.randomOne(enemys); + } + + /** + * 随机获取可用的随从 + * @param player + * @private + */ + private getRandomPet(player: Player): number { + let pets = []; + for (let [, pet] of player.pets) { + if (pet.ap > 0 && pet.state == 1) + pets.push(pet); + } + let result; + if (pets.length > 0) { + result = arrUtil.randomOne(pets); + } + return result ? result.pos : -1; + } private selectPet() { let cards = [...this.svrstate.cards.values()]; let result; @@ -221,20 +255,49 @@ export class RobotClient implements Client { result = arrUtil.randomGet(cards, 1)[0]; } let targetType: SkillTargetType = CfgMan.getTargetByCard(result.id); + let targetPlayer; + let targetPos; switch (targetType) { case SkillTargetType.ENEMY_PLAYER: + targetPlayer = this.getEnemyPlayer(); break; case SkillTargetType.ENEMY_PET: + for (let [,player] of this.svrstate.players) { + if (player.team !== this.selfPlayer.team) { + let pos = this.getRandomPet(player); + if (pos > - 1) { + targetPlayer = player; + targetPos = pos; + break; + } + } + } break; case SkillTargetType.FRIEND_PET: + for (let [,player] of this.svrstate.players) { + if (player.team == this.selfPlayer.team) { + let pos = this.getRandomPet(player); + if (pos > - 1) { + targetPlayer = player; + targetPos = pos; + break; + } + } + } break; case SkillTargetType.SELF_PET: + let pos = this.getRandomPet(this.selfPlayer); + if (pos > - 1) { + targetPlayer = this.selfPlayer; + targetPos = pos; + break; + } break; } this.reply('select_pet_c2s', { card: result.id, - player: null, - pos: null, + player: targetPlayer?.id, + pos: targetPos, effCards: [] }) } diff --git a/src/rooms/schema/Pet.ts b/src/rooms/schema/Pet.ts index 4d32b62..9e04539 100644 --- a/src/rooms/schema/Pet.ts +++ b/src/rooms/schema/Pet.ts @@ -3,6 +3,7 @@ import {Schema, ArraySchema, type} from "@colyseus/schema"; export class Pet extends Schema { @type("number") id?: number; + pos: number; /** * 当前点数 */ @@ -32,8 +33,9 @@ export class Pet extends Schema { */ @type("number") state: number; - constructor() { + constructor(index: number) { super(); + this.pos = index; this.ap = 0; } diff --git a/src/rooms/schema/Player.ts b/src/rooms/schema/Player.ts index b6fb600..110135e 100644 --- a/src/rooms/schema/Player.ts +++ b/src/rooms/schema/Player.ts @@ -75,7 +75,7 @@ export class Player extends Schema { this.countTotal = 0; this.countPresent = 0; for (let i = 0; i < singleton(GameEnv).maxPlayerPetCount + 1; i++) { - let pet = new Pet(); + let pet = new Pet(i); pet.state = 0; pet.isHero = i === 0; this.pets.set(i+'', pet); diff --git a/src/utils/array.util.ts b/src/utils/array.util.ts index 3b67504..dfda79e 100644 --- a/src/utils/array.util.ts +++ b/src/utils/array.util.ts @@ -102,6 +102,18 @@ let arrUtil = { } return shuffled.slice(min); }, + /** + * 随机获取1个 + * @param arr + */ + randomOne(arr: Array) { + let results = this.randomGet(arr, 1); + if (results.length > 0) { + return results[0]; + } else { + return null; + } + }, /** * 随机移除n个元素 * @param arr