增加简单的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 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: []
})
}

View File

@ -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;
}

View File

@ -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);

View File

@ -102,6 +102,18 @@ let arrUtil = {
}
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个元素
* @param arr