增加简单的ai, 自动选择技能的目标
This commit is contained in:
parent
f19adf27f9
commit
55f7580c2c
@ -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: []
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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);
|
||||||
|
@ -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
|
||||||
|
Loading…
x
Reference in New Issue
Block a user