新增AI-GOAP目标导向计划与ASTAR寻路配合使用

This commit is contained in:
yhh
2020-10-29 11:22:01 +08:00
parent 85cc4b4ecc
commit 1a78dada61
17 changed files with 3045 additions and 19 deletions

View File

@@ -0,0 +1,76 @@
module es {
export class WorldState implements IEquatable<WorldState> {
/**
* 我们使用条件索引上的位掩码移位来翻转位。
*/
public values: number;
/**
* 比特掩码用于明确表示false。
* 我们需要一个单独的负值存储空间,因为一个值的缺失并不一定意味着它是假的
*/
public dontCare: number;
/**
* 是必需的,这样我们就可以从字符串名称中获取条件索引
*/
public planner: ActionPlanner;
/**
*
* @param planner
*/
public static create(planner: ActionPlanner): WorldState {
return new WorldState(planner, 0, -1);
}
/**
*
* @param planner
* @param values
* @param dontcare
*/
constructor(planner: ActionPlanner, values: number, dontcare: number){
this.planner = planner;
this.values = values;
this.dontCare = dontcare;
}
public set(conditionId: number, value: boolean): boolean {
this.values = value ? (this.values | (1 << conditionId)) : (this.values & ~(1 << conditionId));
this.dontCare ^= (1 << conditionId);
return true;
}
/**
*
* @param other
*/
public equals(other: WorldState): boolean {
let care = this.dontCare ^ -1;
return (this.values & care) == (other.values & care);
}
/**
* 用于调试目的。提供一个包含所有前提条件的可读字符串
* @param planner
*/
public describe(planner: ActionPlanner): string {
let s = "";
for (let i = 0; i < ActionPlanner.MAX_CONDITIONS; i ++){
if ((this.dontCare & (1 << i)) == 0){
let val = planner.conditionNames[i];
if (val == null)
continue;
let set = ((this.values & (1 << i)) != 0);
if (s.length > 0)
s += ", ";
s += (set ? val.toUpperCase() : val);
}
}
return s;
}
}
}