public static void Main(string[] args) { System.Console.WriteLine("Hello World!"); var characterInfo = new CharacterInfo(); characterInfo.Input = new Brawler.Input.Packets.ControllerState(); characterInfo.Input.AttackStick = new Brawler.Input.Packets.AnalogStick(); characterInfo.Input.MoveStick = new Brawler.Input.Packets.AnalogStick(); characterInfo.Current = new Brawler.Simulation.PlayerInfo(); characterInfo.Previous = new Brawler.Simulation.PlayerInfo(); var dictionary = new TreeDictionary(); var builder = new BlackboardTreeBuilder <CharacterInfo>( new TreeBuilder(), dictionary); var plan = builder .Selector() .Begin() //.Success() .Failed() .Success() .Success() .End(); var compiled = builder.Build(); //var compiled = BuildSM (builder); var walker = new NodeWalker(compiled); walker.Restart(); walker.ComputeStep(); System.Console.WriteLine("walker.IsComplete : " + walker.IsComplete); System.Console.WriteLine("walker.Outcome : " + walker.Outcome); walker.ComputeStep(); System.Console.WriteLine("walker.IsComplete : " + walker.IsComplete); System.Console.WriteLine("walker.Outcome : " + walker.Outcome); walker.ComputeStep(); System.Console.WriteLine("walker.IsComplete : " + walker.IsComplete); System.Console.WriteLine("walker.Outcome : " + walker.Outcome); walker.ComputeStep(); System.Console.WriteLine("walker.IsComplete : " + walker.IsComplete); System.Console.WriteLine("walker.Outcome : " + walker.Outcome); walker.ComputeStep(); System.Console.WriteLine("walker.IsComplete : " + walker.IsComplete); System.Console.WriteLine("walker.Outcome : " + walker.Outcome); walker.ComputeStep(); System.Console.WriteLine("walker.IsComplete : " + walker.IsComplete); System.Console.WriteLine("walker.Outcome : " + walker.Outcome); //Test1 (characterInfo, walker); //Test2 (characterInfo, walker, timer, MAX_TIMES); }
public void TestCase() { const bool EXPECTED = false; var board = new TransistentBlackboard <CharacterInfo>(() => new CharacterInfo()); var dictionary = new TreeDictionary(); var builder = new BlackboardTreeBuilder <Enemy>(new TreeBuilder(), dictionary); var plan = builder .Success(); var compiled = plan.Build(); var walker = new NodeWalker(compiled); walker.Restart(); walker.ComputeAllSteps(); Assert.AreEqual(EXPECTED, board.Context.IsLeader); Assert.IsTrue(walker.IsComplete); Assert.AreEqual(Result.SUCCESS, walker.Outcome); }
public void EnemyAI() { var dictionary = new TreeDictionary(); var builder = new BlackboardTreeBuilder <Enemy>(new TreeBuilder(), dictionary); builder .Sequence() .Begin() .Selector() .Begin() .IsTrue((e) => e.HasTarget()) .Selector() .Begin() .Action((e) => e.SelectTarget()) .End() .End() .Selector() .Begin() .IsTrue((e) => e.WithinDistance()) .Selector() .Begin() .Action((e) => e.MoveTowards()) .End() .End() .End() .Action((e) => e.HitTarget()) .End() .BuildAndRegisterAs <BaseEnemyAI>(); var topBuilder = new BlackboardTreeBuilder <EnemySituation>(new TreeBuilder(), dictionary); var tree = topBuilder .UseStub <BaseEnemyAI, Enemy>() .Build(); var walker = new NodeWalker(tree); walker.AddBlackboard <EnemySituation>(new Blackboard <EnemySituation> { Context = new EnemySituation() }); walker.AddDependentBlackboard <EnemySituation, Enemy>((es) => { return(es.Individual); }); }
public static void Main(string[] args) { // build empty tree var store = new TreeDictionary(); var minorBuilder = new BlackboardTreeBuilder <Enemy>(new TreeBuilder(), store); // gererate a behavior tree as a stub for later reuse minorBuilder .Sequence() .Begin() .Selector() .Begin() .IsTrue((e) => e.WithinDistance()) .Step((e) => e.MoveTowards()) .End() .Sequence() .Begin() .IsTrue((e) => e.WithinDistance()) .Step((e) => e.HitTarget()) .End() .End() .BuildAndRegisterAs <BaseEnemyAI> (); var playerOne = new Player { HealthPoints = 10, X = 10 }; var ogre = new Enemy(); var locator = new MockPlayerLocator(playerOne); var situation = new Simulation { Individual = ogre, Locator = locator, Current = playerOne }; var upperTree = new BlackboardTreeBuilder <Simulation>(new TreeBuilder(), store); upperTree .Sequence() .Begin() .Selector() .Begin() .IsTrue((e) => e.Individual.HasTarget()) .Step((e) => { bool result = e.Locator.Find(out e.Individual.Target); return((result) ? Result.SUCCESS : Result.FAILED); } ) .End() .UseStub <BaseEnemyAI, Enemy> () .IsTrue((e) => e.Current.HealthPoints <= 0) .End(); var linker = new BlackboardLinker(); linker.AddDependency <Simulation, Enemy>((es) => es.Individual); var board = new Blackboard <Simulation> { Context = situation }; linker.AddParameter <Simulation>(new StaticParameter <Simulation>(board)); // generate tree as a stub for an BaseEnemyAI implementation var finalTree = upperTree.Build(); var walker = new NodeWalker(finalTree, linker); Result outcome = Result.INCOMPLETE; while (!(outcome == Result.SUCCESS || outcome == Result.UNEXCEPTED_ERROR)) { walker.Restart(); walker.ComputeAllSteps(); outcome = walker.Outcome; Console.WriteLine("Ogre X:{0}, Player [HP :{1}] X:{2}", ogre.X, playerOne.HealthPoints, playerOne.X); } Console.WriteLine("PLAYER IS DEAD"); }
static Tree BuildSM (BlackboardTreeBuilder<CharacterInfo> builder) { var plan = builder.Parallel ().Begin ()// local information // is moving .Selector ().Begin ().Sequence ().Begin ().IsTrue (c => { return c.Input.MoveStick.X == 0.0; }).IsTrue (c => { return c.Input.MoveStick.Y == 0.0; }).Set (c => { c.Current.IsMoving = false; }).End ().Set (c => { c.Current.IsMoving = true; }).End ()// // is guard up // .Sequence() // .Begin () // .Set((c) => { c.Current.IsGuardUp = true; }) // .Selector () // .Begin () // .IsTrue((c) => {return c.Input.AttackStick.X == 0.0;}) // .IsTrue((c) => {return c.Input.AttackStick.Y == 0.0;}) // .Set((c) => { c.Current.IsGuardUp = false; }) // .End() // .End() // is facing enemy // nearest enemy gap // // MOVE ANIMATION // .Sequence() // .Begin() // .IsTrue((c) => { return c.Current.IsMoving ; }) // .Selector() // .Begin() // // Stepping // .Sequence() // .Begin() // .IsTrue((c) => { return c.Current.IsFacingEnemy ; }) // .IsTrue((c) => { return c.Current.IsGuardUp ; }) // .Selector() // .Begin() // .Sequence() // .Begin () // .IsTrue((c) => { return c.Current.NearestEnemyGap <= 2.0f; }) // .Selector() // .Begin() //// // RaiseStepping //// .Sequence() //// .Begin() //// .IsTrue((c) => {return c.Input.MoveStick.X > 0.0f;}) //// .IsTrue((c) => {return c.Input.MoveStick.Y == 0.0f;}) //// .Set ((c) => c.Current.LocomotionState = MoveAnimation.StepForward) //// .End () //// //// .Sequence() //// .Begin() //// .IsTrue((c) => {return c.Input.MoveStick.X < 0.0f;}) //// .IsTrue((c) => {return c.Input.MoveStick.Y == 0.0f;}) //// .Set ((c) => c.Current.LocomotionState = MoveAnimation.StepForward) //// .End () //// //// .Sequence() //// .Begin() //// .IsTrue((c) => {return c.Input.MoveStick.Y > 0.0f;}) //// .IsTrue((c) => {return c.Input.MoveStick.X == 0.0f;}) //// .Set ((c) => c.Current.LocomotionState = MoveAnimation.SidestepUp) //// .End () //// //// .Sequence() //// .Begin() //// .IsTrue((c) => {return c.Input.MoveStick.Y < 0.0f;}) //// .IsTrue((c) => {return c.Input.MoveStick.X == 0.0f;}) //// .Set ((c) => c.Current.LocomotionState = MoveAnimation.SidestepDown) //// .End () // .End() // .End() // // forward slide / set crease // .Sequence() // .Begin() // .IsTrue((c) => { return c.Current.NearestEnemyGap <= 3.0f;} ) // .Set ((c) => c.Current.LocomotionState = MoveAnimation.SlideForward) // .End() // .End() // .End () // .Sequence () // .Begin() // .Selector () // .Begin () // // if the distance is greater than 3 feet // .IsTrue((c) => { return c.Current.NearestEnemyGap > 3.0f;} ) // // OR is guard down // .IsFalse((c) => { return c.Current.IsGuardUp ; }) // .End () // .End() // // Raise Run / Walk // .Selector() // .Begin() //// .Sequence() //// .Begin() //// .IsTrue((c) => {return c.Input.MoveStick.X > 0.5f;}) //// .IsTrue((c) => {return c.Input.MoveStick.Y == 0.0f;}) //// .Set ((c) => c.Current.LocomotionState = MoveAnimation.RunForward) //// .End () //// //// .Sequence() //// .Begin() //// .IsTrue((c) => {return c.Input.MoveStick.X > 0.0f;}) //// .IsTrue((c) => {return c.Input.MoveStick.Y == 0.0f;}) //// .Set ((c) => c.Current.LocomotionState = MoveAnimation.WalkForward) //// .End () //// //// .Sequence() //// .Begin() //// .IsTrue((c) => {return c.Input.MoveStick.X < 0.0f;}) //// .IsTrue((c) => {return c.Input.MoveStick.Y == 0.0f;}) //// .Set ((c) => c.Current.LocomotionState = MoveAnimation.WalkBack) //// .End () //// //// .Sequence() //// .Begin() //// .IsTrue((c) => {return c.Input.MoveStick.Y > 0.0f;}) //// .IsTrue((c) => {return c.Input.MoveStick.X == 0.0f;}) //// .Set ((c) => c.Current.LocomotionState = MoveAnimation.WalkUp) //// .End () //// //// .Sequence() //// .Begin() //// .IsTrue((c) => {return c.Input.MoveStick.Y < 0.0f;}) //// .IsTrue((c) => {return c.Input.MoveStick.X == 0.0f;}) //// .Set ((c) => c.Current.LocomotionState = MoveAnimation.WalkDown) //// .End () // .End() // .End() // // default // .Set((c) => c.Current.LocomotionState = MoveAnimation.Idle) // .End() // .End() // HAND ANIMATION // .Selector() // .Begin () // // throwing punch // // // idle default // .Set((c) => c.Current.HandsState = HandsAnimation.Idle) // .End () // //full body override // .Selector() // .Begin () // // idle default // .Set((c) => c.Current.OverrideState = BodyAnimation.Default) // .End () .End (); var compiled = plan.Build (); return compiled; }
public static void Main (string[] args) { System.Console.WriteLine ("Hello World!"); var characterInfo = new CharacterInfo(); characterInfo.Input = new Brawler.Input.Packets.ControllerState(); characterInfo.Input.AttackStick = new Brawler.Input.Packets.AnalogStick(); characterInfo.Input.MoveStick = new Brawler.Input.Packets.AnalogStick(); characterInfo.Current = new Brawler.Simulation.PlayerInfo(); characterInfo.Previous = new Brawler.Simulation.PlayerInfo(); var dictionary = new TreeDictionary(); var builder = new BlackboardTreeBuilder<CharacterInfo>( new TreeBuilder(), dictionary); var plan = builder .Selector() .Begin () //.Success() .Failed () .Success() .Success() .End (); var compiled = builder.Build(); //var compiled = BuildSM (builder); var walker = new NodeWalker(compiled); walker.Restart (); walker.ComputeStep(); System.Console.WriteLine ("walker.IsComplete : " + walker.IsComplete); System.Console.WriteLine ("walker.Outcome : " + walker.Outcome); walker.ComputeStep(); System.Console.WriteLine ("walker.IsComplete : " + walker.IsComplete); System.Console.WriteLine ("walker.Outcome : " + walker.Outcome); walker.ComputeStep(); System.Console.WriteLine ("walker.IsComplete : " + walker.IsComplete); System.Console.WriteLine ("walker.Outcome : " + walker.Outcome); walker.ComputeStep(); System.Console.WriteLine ("walker.IsComplete : " + walker.IsComplete); System.Console.WriteLine ("walker.Outcome : " + walker.Outcome); walker.ComputeStep(); System.Console.WriteLine ("walker.IsComplete : " + walker.IsComplete); System.Console.WriteLine ("walker.Outcome : " + walker.Outcome); walker.ComputeStep(); System.Console.WriteLine ("walker.IsComplete : " + walker.IsComplete); System.Console.WriteLine ("walker.Outcome : " + walker.Outcome); //Test1 (characterInfo, walker); //Test2 (characterInfo, walker, timer, MAX_TIMES); }
public static void Main (string[] args) { // build empty tree var store = new TreeDictionary(); var minorBuilder = new BlackboardTreeBuilder<Enemy>(new TreeBuilder(), store); // gererate a behavior tree as a stub for later reuse minorBuilder .Sequence () .Begin () .Selector () .Begin () .IsTrue ((e) => e.WithinDistance ()) .Step ((e) => e.MoveTowards ()) .End () .Sequence () .Begin () .IsTrue ((e) => e.WithinDistance ()) .Step ((e) => e.HitTarget ()) .End () .End () .BuildAndRegisterAs<BaseEnemyAI> (); var playerOne = new Player{ HealthPoints = 10, X = 10}; var ogre = new Enemy (); var locator = new MockPlayerLocator(playerOne); var situation = new Simulation{Individual=ogre, Locator=locator, Current = playerOne }; var upperTree = new BlackboardTreeBuilder<Simulation>(new TreeBuilder(), store); upperTree .Sequence () .Begin () .Selector () .Begin () .IsTrue ((e) => e.Individual.HasTarget ()) .Step ((e) => { bool result = e.Locator.Find (out e.Individual.Target); return (result) ? Result.SUCCESS : Result.FAILED; } ) .End () .UseStub<BaseEnemyAI, Enemy> () .IsTrue((e) => e.Current.HealthPoints <= 0) .End (); var linker = new BlackboardLinker (); linker.AddDependency<Simulation, Enemy>((es) => es.Individual); var board = new Blackboard<Simulation>{Context = situation}; linker.AddParameter<Simulation>(new StaticParameter<Simulation>(board)); // generate tree as a stub for an BaseEnemyAI implementation var finalTree = upperTree.Build(); var walker = new NodeWalker(finalTree, linker); Result outcome = Result.INCOMPLETE; while (!(outcome == Result.SUCCESS || outcome == Result.UNEXCEPTED_ERROR)) { walker.Restart (); walker.ComputeAllSteps (); outcome = walker.Outcome; Console.WriteLine ("Ogre X:{0}, Player [HP :{1}] X:{2}", ogre.X, playerOne.HealthPoints, playerOne.X); } Console.WriteLine ("PLAYER IS DEAD"); }
static Tree BuildSM(BlackboardTreeBuilder <CharacterInfo> builder) { var plan = builder.Parallel().Begin() // local information // is moving .Selector().Begin().Sequence().Begin().IsTrue(c => { return(c.Input.MoveStick.X == 0.0); }).IsTrue(c => { return(c.Input.MoveStick.Y == 0.0); }).Set(c => { c.Current.IsMoving = false; }).End().Set(c => { c.Current.IsMoving = true; }).End() // // is guard up // .Sequence() // .Begin () // .Set((c) => { c.Current.IsGuardUp = true; }) // .Selector () // .Begin () // .IsTrue((c) => {return c.Input.AttackStick.X == 0.0;}) // .IsTrue((c) => {return c.Input.AttackStick.Y == 0.0;}) // .Set((c) => { c.Current.IsGuardUp = false; }) // .End() // .End() // is facing enemy // nearest enemy gap // // MOVE ANIMATION // .Sequence() // .Begin() // .IsTrue((c) => { return c.Current.IsMoving ; }) // .Selector() // .Begin() // // Stepping // .Sequence() // .Begin() // .IsTrue((c) => { return c.Current.IsFacingEnemy ; }) // .IsTrue((c) => { return c.Current.IsGuardUp ; }) // .Selector() // .Begin() // .Sequence() // .Begin () // .IsTrue((c) => { return c.Current.NearestEnemyGap <= 2.0f; }) // .Selector() // .Begin() //// // RaiseStepping //// .Sequence() //// .Begin() //// .IsTrue((c) => {return c.Input.MoveStick.X > 0.0f;}) //// .IsTrue((c) => {return c.Input.MoveStick.Y == 0.0f;}) //// .Set ((c) => c.Current.LocomotionState = MoveAnimation.StepForward) //// .End () //// //// .Sequence() //// .Begin() //// .IsTrue((c) => {return c.Input.MoveStick.X < 0.0f;}) //// .IsTrue((c) => {return c.Input.MoveStick.Y == 0.0f;}) //// .Set ((c) => c.Current.LocomotionState = MoveAnimation.StepForward) //// .End () //// //// .Sequence() //// .Begin() //// .IsTrue((c) => {return c.Input.MoveStick.Y > 0.0f;}) //// .IsTrue((c) => {return c.Input.MoveStick.X == 0.0f;}) //// .Set ((c) => c.Current.LocomotionState = MoveAnimation.SidestepUp) //// .End () //// //// .Sequence() //// .Begin() //// .IsTrue((c) => {return c.Input.MoveStick.Y < 0.0f;}) //// .IsTrue((c) => {return c.Input.MoveStick.X == 0.0f;}) //// .Set ((c) => c.Current.LocomotionState = MoveAnimation.SidestepDown) //// .End () // .End() // .End() // // forward slide / set crease // .Sequence() // .Begin() // .IsTrue((c) => { return c.Current.NearestEnemyGap <= 3.0f;} ) // .Set ((c) => c.Current.LocomotionState = MoveAnimation.SlideForward) // .End() // .End() // .End () // .Sequence () // .Begin() // .Selector () // .Begin () // // if the distance is greater than 3 feet // .IsTrue((c) => { return c.Current.NearestEnemyGap > 3.0f;} ) // // OR is guard down // .IsFalse((c) => { return c.Current.IsGuardUp ; }) // .End () // .End() // // Raise Run / Walk // .Selector() // .Begin() //// .Sequence() //// .Begin() //// .IsTrue((c) => {return c.Input.MoveStick.X > 0.5f;}) //// .IsTrue((c) => {return c.Input.MoveStick.Y == 0.0f;}) //// .Set ((c) => c.Current.LocomotionState = MoveAnimation.RunForward) //// .End () //// //// .Sequence() //// .Begin() //// .IsTrue((c) => {return c.Input.MoveStick.X > 0.0f;}) //// .IsTrue((c) => {return c.Input.MoveStick.Y == 0.0f;}) //// .Set ((c) => c.Current.LocomotionState = MoveAnimation.WalkForward) //// .End () //// //// .Sequence() //// .Begin() //// .IsTrue((c) => {return c.Input.MoveStick.X < 0.0f;}) //// .IsTrue((c) => {return c.Input.MoveStick.Y == 0.0f;}) //// .Set ((c) => c.Current.LocomotionState = MoveAnimation.WalkBack) //// .End () //// //// .Sequence() //// .Begin() //// .IsTrue((c) => {return c.Input.MoveStick.Y > 0.0f;}) //// .IsTrue((c) => {return c.Input.MoveStick.X == 0.0f;}) //// .Set ((c) => c.Current.LocomotionState = MoveAnimation.WalkUp) //// .End () //// //// .Sequence() //// .Begin() //// .IsTrue((c) => {return c.Input.MoveStick.Y < 0.0f;}) //// .IsTrue((c) => {return c.Input.MoveStick.X == 0.0f;}) //// .Set ((c) => c.Current.LocomotionState = MoveAnimation.WalkDown) //// .End () // .End() // .End() // // default // .Set((c) => c.Current.LocomotionState = MoveAnimation.Idle) // .End() // .End() // HAND ANIMATION // .Selector() // .Begin () // // throwing punch // // // idle default // .Set((c) => c.Current.HandsState = HandsAnimation.Idle) // .End () // //full body override // .Selector() // .Begin () // // idle default // .Set((c) => c.Current.OverrideState = BodyAnimation.Default) // .End () .End(); var compiled = plan.Build(); return(compiled); }