增加简单的ai, 自动选择技能的目标

This commit is contained in:
zhl 2020-12-14 14:42:35 +08:00
parent f19adf27f9
commit 55f7580c2c
4 changed files with 81 additions and 4 deletions

View File

@ -12,12 +12,14 @@ import {HeroCfg} from "../cfg/parsers/HeroCfg";
import {EffectCardCfg} from "../cfg/parsers/EffectCardCfg"; import {EffectCardCfg} from "../cfg/parsers/EffectCardCfg";
import CfgMan from '../rooms/logic/CfgMan'; import CfgMan from '../rooms/logic/CfgMan';
import {SkillTargetType} from "../rooms/logic/skill/SkillConst"; import {SkillTargetType} from "../rooms/logic/skill/SkillConst";
import {Player} from "../rooms/schema/Player";
export class RobotClient implements Client { export class RobotClient implements Client {
id: string; id: string;
readyState: number; readyState: number;
ref: EventEmitter; ref: EventEmitter;
sessionId: string; sessionId: string;
selfPlayer: Player;
state: ClientState; state: ClientState;
svrstate: CardGameState; svrstate: CardGameState;
room: Room; 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}) { constructor(sessionId: string, state: CardGameState, clock: Clock, onMessageHandlers: {[id: string]: (client: Client, message: any) => void}) {
this.sessionId = sessionId; this.sessionId = sessionId;
this.svrstate = state; this.svrstate = state;
this.selfPlayer = this.svrstate.players.get(sessionId);
this.clock = clock; this.clock = clock;
this.ref = new EventEmitter(); this.ref = new EventEmitter();
this.onMessageHandlers = onMessageHandlers; 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() { private selectPet() {
let cards = [...this.svrstate.cards.values()]; let cards = [...this.svrstate.cards.values()];
let result; let result;
@ -221,20 +255,49 @@ export class RobotClient implements Client {
result = arrUtil.randomGet(cards, 1)[0]; result = arrUtil.randomGet(cards, 1)[0];
} }
let targetType: SkillTargetType = CfgMan.getTargetByCard(result.id); let targetType: SkillTargetType = CfgMan.getTargetByCard(result.id);
let targetPlayer;
let targetPos;
switch (targetType) { switch (targetType) {
case SkillTargetType.ENEMY_PLAYER: case SkillTargetType.ENEMY_PLAYER:
targetPlayer = this.getEnemyPlayer();
break; break;
case SkillTargetType.ENEMY_PET: 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; break;
case SkillTargetType.FRIEND_PET: 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; break;
case SkillTargetType.SELF_PET: case SkillTargetType.SELF_PET:
let pos = this.getRandomPet(this.selfPlayer);
if (pos > - 1) {
targetPlayer = this.selfPlayer;
targetPos = pos;
break;
}
break; break;
} }
this.reply('select_pet_c2s', { this.reply('select_pet_c2s', {
card: result.id, card: result.id,
player: null, player: targetPlayer?.id,
pos: null, pos: targetPos,
effCards: [] effCards: []
}) })
} }

View File

@ -3,6 +3,7 @@ import {Schema, ArraySchema, type} from "@colyseus/schema";
export class Pet extends Schema { export class Pet extends Schema {
@type("number") @type("number")
id?: number; id?: number;
pos: number;
/** /**
* *
*/ */
@ -32,8 +33,9 @@ export class Pet extends Schema {
*/ */
@type("number") @type("number")
state: number; state: number;
constructor() { constructor(index: number) {
super(); super();
this.pos = index;
this.ap = 0; this.ap = 0;
} }

View File

@ -75,7 +75,7 @@ export class Player extends Schema {
this.countTotal = 0; this.countTotal = 0;
this.countPresent = 0; this.countPresent = 0;
for (let i = 0; i < singleton(GameEnv).maxPlayerPetCount + 1; i++) { for (let i = 0; i < singleton(GameEnv).maxPlayerPetCount + 1; i++) {
let pet = new Pet(); let pet = new Pet(i);
pet.state = 0; pet.state = 0;
pet.isHero = i === 0; pet.isHero = i === 0;
this.pets.set(i+'', pet); this.pets.set(i+'', pet);

View File

@ -102,6 +102,18 @@ let arrUtil = {
} }
return shuffled.slice(min); return shuffled.slice(min);
}, },
/**
* 1
* @param arr
*/
randomOne<T>(arr: Array<T>) {
let results = this.randomGet(arr, 1);
if (results.length > 0) {
return results[0];
} else {
return null;
}
},
/** /**
* n个元素 * n个元素
* @param arr * @param arr