122 lines
3.2 KiB
TypeScript
Raw Normal View History

2023-11-04 05:56:28 +08:00
import GFSMBase, { GFSMProcessEnum, GFSMProcessInfo, GFSMProcessMode } from "../../base/fsm/GFSMBase";
import GOnHookMode, { GOnHookModePlayerEnum } from "../GOnHookMode";
2023-11-03 19:01:58 +08:00
//流程枚举
enum ProcessEnum {
SeekEnemy = 0, //寻找敌人(场上没有敌人 或者敌人都击杀完)
2023-11-04 05:56:28 +08:00
GenNextFight = 1, //生成下一个战斗位置
2023-11-03 19:01:58 +08:00
LeaveFight = 2, //前往战斗
GenEnemy = 3, //生成敌人
Fight = 4, //战斗
}
//无限模式的状态类
export default class GFSMOnHookMode extends GFSMBase{
mode:GOnHookMode;
constructor(mode:GOnHookMode){
super();
this.mode = mode;
}
2023-11-04 05:56:28 +08:00
start:number = ProcessEnum.SeekEnemy;
2023-11-03 19:01:58 +08:00
process:{[key:number]:GFSMProcessInfo} = {
2023-11-04 05:56:28 +08:00
[ProcessEnum.SeekEnemy]:{
title:"寻找敌人",
mode:GFSMProcessMode.Execute,
execute: this.onSeekEnemyProcess.bind(this),
to:[ProcessEnum.GenNextFight,ProcessEnum.Fight]
},
[ProcessEnum.GenNextFight]:{
title:"生成下一个战斗位置",
mode:GFSMProcessMode.Execute,
execute: this.onGenNextFightProcess.bind(this),
to:[ProcessEnum.LeaveFight]
},
[ProcessEnum.LeaveFight]:{
title:"前往战斗",
mode:GFSMProcessMode.WaitExecute,
execute: this.onLeaveFightProcess.bind(this),
to:[ProcessEnum.GenEnemy]
},
[ProcessEnum.GenEnemy]:{
title:"生成敌人",
mode:GFSMProcessMode.Execute,
execute: this.onGenEnemyProcess.bind(this),
to:[ProcessEnum.Fight]
},
[ProcessEnum.Fight]:{
title:"战斗",
mode:GFSMProcessMode.WaitExecute,
execute: this.onFightProcess.bind(this),
to:[ProcessEnum.SeekEnemy]
}
}
//寻找敌人
onSeekEnemyProcess(dt:number){
//判断是否还有敌人
if(this.mode.isHaveEnemy()){
return ProcessEnum.Fight; //如果有则攻击
}else{
return ProcessEnum.GenNextFight; //没有则生成下一个战斗位置
}
}
//生成下一个战斗位置
onGenNextFightProcess(){
this.mode.onNextTarget();
return ProcessEnum.LeaveFight; //前往战斗位置
}
//前往战斗
onLeaveFightProcess(){
//判断玩家是否前往到战斗位置
let roles = this.mode.getOnesRoleAlive(GOnHookModePlayerEnum.PLAYER);
if(roles.length == 0) return GFSMProcessEnum.Reset;
for (let index = 0; index < roles.length; index++) {
const role = roles[index];
if(!(role.isTacticalPos())){
//如果不在位置则等待
return GFSMProcessEnum.Wait;
}
}
//到达位置生成敌人
return ProcessEnum.GenEnemy;
}
//生成敌人
onGenEnemyProcess(){
this.mode.onResetGenerateEnemy();
return ProcessEnum.Fight;
}
//战斗
onFightProcess(){
//等待敌人击杀完
if(!(this.mode.isHaveEnemy())){
return ProcessEnum.SeekEnemy; //击杀完寻找敌人
}
//没有击杀完则等待击杀
return GFSMProcessEnum.Wait;
2023-11-03 19:01:58 +08:00
}
}