public void testStatefulSeq() { log.enterScope("testStatefulSeq"); bool first = true; var foo = new StatefulSequence(new BehaviorAction(delegate(){ return(BehaviorReturnCode.Success); }), new BehaviorAction(delegate(){ if (first) { first = false; return(BehaviorReturnCode.Running); } else { return(BehaviorReturnCode.Success); } }), new BehaviorAction(delegate(){ return(BehaviorReturnCode.Success); })); new VerificationPoint().VerifyEquals("1st running", true, foo.Behave(), BehaviorReturnCode.Running); new VerificationPoint().VerifyEquals("2nd success", true, foo.Behave(), BehaviorReturnCode.Success); new VerificationPoint().VerifyEquals("3rd success", true, foo.Behave(), BehaviorReturnCode.Success); log.logMessage("restting first"); first = true; new VerificationPoint().VerifyEquals("after reset running", true, foo.Behave(), BehaviorReturnCode.Running); new VerificationPoint().VerifyEquals("final success", true, foo.Behave(), BehaviorReturnCode.Success); log.exitScope(); }
public void When_behave_successfull_then_goes_through_all_sequence_elements() { _calledAndSuccessTimes = 0; var returnCode = new StatefulSequence(new BehaviourAction(CalledAndSuccess), new BehaviourAction(CalledAndSuccess), new BehaviourAction(CalledAndSuccess)).Behave(); Assert.AreEqual(3, _calledAndSuccessTimes); Assert.AreEqual(BehaviourReturnCode.Success, returnCode); }
public void When_running_Then_complete_with_many_behave_calls() { var sequence = new StatefulSequence(new BehaviourAction(CalledAndSuccess), new BehaviourAction(new TestHelper().RunningTwiceThenSuccess), new BehaviourAction(CalledAndSuccess)); Assert.AreEqual(BehaviourReturnCode.Running, sequence.Behave()); Assert.AreEqual(BehaviourReturnCode.Running, sequence.Behave()); Assert.AreEqual(BehaviourReturnCode.Running, sequence.Behave()); Assert.AreEqual(BehaviourReturnCode.Success, sequence.Behave()); Assert.AreEqual(2, _calledAndSuccessTimes); }
public void When_behave_Running_then_completes_until_running_behaviour() { _calledAndSuccessTimes = 0; var seq = new StatefulSequence(new BehaviourAction(CalledAndSuccess), new BehaviourAction(CalledAndRunning), new BehaviourAction(CalledAndSuccess)); var returnCode = seq.Behave(); Assert.AreEqual(1, _calledAndSuccessTimes); Assert.AreEqual(BehaviourReturnCode.Running, returnCode); }
private StatefulSequence CalculatePath(System.Func <BehaviorReturnCode> calcPathStratigie) { BehaviorAction updateMemory = new BehaviorAction(aiToTarget.UpdateMemory); BehaviorAction calculatePath = new BehaviorAction(calcPathStratigie); BehaviorAction updateMemoryAdditional = new BehaviorAction(aiToTarget.UpdateMemoryWithAdditionalRange); StatefulSequence calcNewPath = new StatefulSequence(updateMemoryAdditional, calculatePath); StatefulSelector calculatePathSecure = new StatefulSelector(calculatePath, calcNewPath); return(new StatefulSequence(updateMemory, calculatePathSecure)); }
public void When_behave_running_takes_up_from_where_it_left_without_re_evaluating_prev_conditions() { var called = 0; var exclusive = new StatefulSequence(new Conditional(() => { called++; return(true); }), TestHelper.CreateRunningAction(), TestHelper.CreateSuccessAction() ); exclusive.Behave(); exclusive.Behave(); Assert.AreEqual(1, called); }
public void StatefulSequence() { var first = true; var statefulSequence = new StatefulSequence( new BehaviorAction(() => first ? BehaviorState.Success : BehaviorState.Failure), new BehaviorAction(() => { if (first) { first = false; return(BehaviorState.Running); } return(BehaviorState.Success); }), new BehaviorAction(() => BehaviorState.Success) ); var statefulSequenceError = new StatefulSequence( new BehaviorAction(() => { throw new Exception("Failure"); }) ); // test init Assert.IsTrue(first, "init first"); Assert.AreEqual(statefulSequence.Tick(), BehaviorState.Running, "1st running"); Assert.IsFalse(first, "1st Tick failed"); Assert.AreEqual(statefulSequence.Tick(), BehaviorState.Success, "2nd success"); Assert.AreEqual(statefulSequence.Tick(), BehaviorState.Failure, "3rd failure"); first = true; // test reset Assert.IsTrue(first, "reset first"); Assert.AreEqual(statefulSequence.Tick(), BehaviorState.Running, "1st running"); Assert.IsFalse(first, "1st Tick failed"); Assert.AreEqual(statefulSequence.Tick(), BehaviorState.Success, "2nd success"); Assert.AreEqual(statefulSequence.Tick(), BehaviorState.Failure, "3rd failure"); // test exception Assert.AreEqual(statefulSequenceError.Tick(), BehaviorState.Failure, "error failure"); Assert.AreEqual(statefulSequenceError.LastBehavior, 0); }
static void Main() { BehaviorComponent tree; Blackboard blackboard; blackboard = new Blackboard(); blackboard.SetVariable("num", 0); tree = new StatefulSequence( new BehaviorAction(delegate(object ag, Blackboard bb) { int num = (int)bb.GetVariable("num"); if (num < 9) { bb.SetVariable("num", num + 1); return(BehaviorReturnCode.Running); } return(BehaviorReturnCode.Success); }), new BehaviorAction(delegate(object ag, Blackboard bb) { bb.SetVariable("successCode", 45); return(BehaviorReturnCode.Success); }) ); BehaviorReturnCode treeState; do { treeState = tree.Behave(null, blackboard); }while (treeState == BehaviorReturnCode.Running); int res = (int)blackboard.GetVariable("num"); int suc = (int)blackboard.GetVariable("successCode"); // If res isn't 9 and suc isn't 45, then the tree didn't work as expected if (res != 9 || suc != 45 || treeState != BehaviorReturnCode.Success) { throw new Exception(); } System.Console.WriteLine("All tests passed! Press ESC to exit"); Console.ReadKey(); }
public void TestStatefulSeq() { //_log.enterScope("testStatefulSeq"); bool first = true; var foo = new StatefulSequence(new BehaviorAction(delegate(){ if (first) { return(BehaviorReturnCode.Success); } else { return(BehaviorReturnCode.Failure); } }), new BehaviorAction(delegate(){ if (first) { first = false; return(BehaviorReturnCode.Running); } else { return(BehaviorReturnCode.Success); } }), new BehaviorAction(delegate(){ return(BehaviorReturnCode.Success); })); Assert.That(foo.Behave() == BehaviorReturnCode.Running); Assert.That(foo.Behave() == BehaviorReturnCode.Success); Assert.That(foo.Behave() == BehaviorReturnCode.Failure); first = true; Assert.That(foo.Behave() == BehaviorReturnCode.Running); Assert.That(foo.Behave() == BehaviorReturnCode.Success); Assert.That(foo.Behave() == BehaviorReturnCode.Failure); }
/// <summary> /// LoadContent will be called once per game and is the place to load /// all of your content. /// </summary> protected override void LoadContent() { // Create a new SpriteBatch, which can be used to draw textures. spriteBatch = new SpriteBatch(GraphicsDevice); bgSprite = new GameSprite(Content.Load <Texture2D>("bgImage"), Vector2.Zero, Color.White); bgSprite.ScaleToViewport(GraphicsDevice.Viewport); titleText1 = new DropInFont(Content.Load <SpriteFont>("GameFont"), new Vector2(viewport.HalfWidth(), -1000), screenSize / 2, new Vector2(0, 20), "Great Minds", Color.OrangeRed); titleText1.TargetPosition = new Vector2(titleText1.TargetPosition.X, titleText1.TargetPosition.Y - titleText1.Size.Y / 4); titleText1.SetCenterAsOrigin(); titleText1.ShadowPosition = new Vector2(titleText1.Position.X - 4, titleText1.Position.Y + 4); titleText1.ShadowColor = Color.Black; titleText1.StateChanged += new EventHandler <StateEventArgs>(statefulFont_StateChanged); Vector2 titleText2Pos = new Vector2(titleText1.Position.X + titleText1.Size.X / 2, viewport.HalfHeight() + titleText1.Size.Y / 4); titleText2 = new FadingFont(Content.Load <SpriteFont>("GameFont"), titleText2Pos, Color.Orange); titleText2.Text.Append("Robotics"); titleText2.FadeStep /= 5f; titleText2.StateChanged += new EventHandler <StateEventArgs>(titleText2_StateChanged); titleText2.Fade = false; titleText2.Position -= new Vector2(titleText2.Size.X / 2, 0); titleText2.ShadowPosition -= new Vector2(titleText2.Size.X / 2, 0); titleText2.SetCenterAsOrigin(); titleText1.Text.Clear(); titleText1.Text.Append("Great "); Vector2 titleText3Pos = new Vector2(titleText1.Position.X + titleText1.Size.X / 2, -2000); titleText3 = new DropInFont(Content.Load <SpriteFont>("GameFont"), titleText3Pos, screenSize / 2, new Vector2(0, 20), "Minds", Color.OrangeRed); titleText3.TargetPosition = titleText1.TargetPosition; titleText3.SetCenterAsOrigin(); titleText3.ShadowPosition = new Vector2(titleText3.Position.X - 4, titleText3.Position.Y + 4); titleText3.ShadowColor = Color.Black; titleText3.StateChanged += new EventHandler <StateEventArgs>(statefulFont_StateChanged); titleText3.Tag = GameTags.StartTitleFadeIn; Vector2 byPos = new Vector2(titleText1.Position.X - 100, -1000); by = new AccelDropInFont(Content.Load <SpriteFont>("GameFont"), byPos, screenSize / 2, new Vector2(0, 5), "By:", Color.Orange, new Vector2(0, 1.5f)); by.TargetPosition = titleText1.TargetPosition - new Vector2(100, 100); by.SetCenterAsOrigin(); by.ShadowPosition = new Vector2(by.Position.X - 4, by.Position.Y + 4); by.ShadowColor = Color.Black; by.MaxDropSpeed = new Vector2(15, 15); crashEffect = Content.Load <SoundEffect>("Crash"); //Obtained from http://www.freesound.org/people/EdgardEdition/sounds/113095/ coinsEffect = Content.Load <SoundEffect>("insertcoin"); insertCoins = new ArcadeFont(Content.Load <SpriteFont>("ArcadeFont"), new Vector2(300, 400), Color.Red, Color.White, Color.Yellow, Color.Blue); insertCoins.ShadowPosition = new Vector2(insertCoins.Position.X - 1, insertCoins.Position.Y + 1); insertCoins.ColorCyclesPerSecond = 15; //Default is 10; smaller number blinks slower insertCoins.Text.Append("INSERT COINS"); insertCoins.IsVisible = false; slidingText = new StatefulSequence <SlidingFont>(SlidingFont.FontState.Done, typeof(SlidingFont.FontState)); Vector2 targetPos = new Vector2(505, 400); foreach (char letter in "COOL") { slidingText.Add(new SlidingFont(Content.Load <SpriteFont>("SlidingFont"), new Vector2(50, 350), targetPos, 2f, letter.ToString(), Color.Red) { EnableShadow = false, IsVisible = false, TargetTolerance = 0.625f }); targetPos.X += slidingText[slidingText.Count - 1].Size.X; //Magic # - bad idea } targetPos = new Vector2(505, 420); random = new Random(); foreach (char letter in "Effects!") { slidingText.Add(new SlidingFont(Content.Load <SpriteFont>("SlidingFont"), new Vector2(random.Next(0, GraphicsDevice.Viewport.Width), random.Next(0, GraphicsDevice.Viewport.Height)), targetPos, 1f + (float)random.NextDouble(), letter.ToString(), Color.Red) { EnableShadow = false, IsVisible = false }); targetPos.X += slidingText[slidingText.Count - 1].Size.X; //Magic # - bad idea } coolPanel = new TexturePanel(Content.Load <Texture2D>("WavyEffect"), new Vector2(120, 60), Vector2.One * .5f, new Vector2(550, 425), new Color(60, 60, 60, 128)); coolPanel.IsVisible = false; insertFive = new AchievementPanel(0, Content.Load <SpriteFont>("SlidingFont"), Content.Load <SpriteFont>("ArcadeFont"), "Insert 5 coins", GraphicsDevice); insertFive.Condition = AchievementPanel.AreFiveCoinsInsert; donateHundred = new AchievementPanel(0, Content.Load <SpriteFont>("SlidingFont"), Content.Load <SpriteFont>("ArcadeFont"), "Donate $100 to GMR", GraphicsDevice); donateHundred.Condition = AchievementPanel.AreHundredDollarsDonated; noCoinSpam = new AchievementPanel(0, Content.Load <SpriteFont>("SlidingFont"), Content.Load <SpriteFont>("ArcadeFont"), "Don't insert coins for 30 seconds", GraphicsDevice); noCoinSpam.Position = new Vector2(GraphicsDevice.Viewport.Width - noCoinSpam.Width, noCoinSpam.Position.Y); noCoinSpam.Condition = AchievementPanel.IsNoCoinsInsertedAtThirtySeconds; allAchievementsDone = new AchievementPanel(0, Content.Load <SpriteFont>("SlidingFont"), Content.Load <SpriteFont>("ArcadeFont"), "Finish all achievements", GraphicsDevice); allAchievementsDone.Condition = delegate(GameTime gt) { return(standardAchievementsCompleted); }; StatefulSequence <AchievementPanel> allAchievementPanels = new StatefulSequence <AchievementPanel>(AchievementPanel.PanelState.Done, typeof(AchievementPanel.PanelState)); allAchievementPanels.Add(noCoinSpam); allAchievementPanels.Add(donateHundred); allAchievementPanels.Add(insertFive); allAchievementPanels.SequenceReachedMonitoredState += new StatefulSequence <AchievementPanel> .MonitoredStateReached(allAchievementPanels_SequenceReachedMonitoredState); slidingText.SequenceReachedMonitoredState += new StatefulSequence <SlidingFont> .MonitoredStateReached(slidingText_SequenceReachedMonitoredState); colorfulTypingText = new TypingFont(Content.Load <SpriteFont>("ArcadeFont"), new Vector2(200, 0), Color.Black, "Typing text here", TimeSpan.FromMilliseconds(200)); colorfulTypingText.StateChanged += new EventHandler <StateEventArgs>(typingText_StateChanged); colorfulTypingText.CharacterTyped += new EventHandler <TypingFont.CharacterTypedEventArgs>(typingText_CharacterTyped); colorfulTypingText.Tag = "1"; colorfulTypingText.Start(); regularTypingText = new TypingFont(Content.Load <SpriteFont>("ArcadeFont"), new Vector2(400, 0), Color.Black, "... and more typing text here...", TimeSpan.FromMilliseconds(50)); regularTypingText.StateChanged += new EventHandler <StateEventArgs>(typingText_StateChanged); regularTypingText.Tag = "2"; }
/// <summary> /// LoadContent will be called once per game and is the place to load /// all of your content. /// </summary> protected override void LoadContent() { // Create a new SpriteBatch, which can be used to draw textures. spriteBatch = new SpriteBatch(GraphicsDevice); bgSprite = new GameSprite(Content.Load<Texture2D>("bgImage"), Vector2.Zero, Color.White); bgSprite.ScaleToViewport(GraphicsDevice.Viewport); titleText1 = new DropInFont(Content.Load<SpriteFont>("GameFont"), new Vector2(viewport.HalfWidth(), -1000), screenSize / 2, new Vector2(0, 20), "Great Minds", Color.OrangeRed); titleText1.TargetPosition = new Vector2(titleText1.TargetPosition.X, titleText1.TargetPosition.Y - titleText1.Size.Y / 4); titleText1.SetCenterAsOrigin(); titleText1.ShadowPosition = new Vector2(titleText1.Position.X - 4, titleText1.Position.Y + 4); titleText1.ShadowColor = Color.Black; titleText1.StateChanged += new EventHandler<StateEventArgs>(statefulFont_StateChanged); Vector2 titleText2Pos = new Vector2(titleText1.Position.X + titleText1.Size.X / 2, viewport.HalfHeight() + titleText1.Size.Y / 4); titleText2 = new FadingFont(Content.Load<SpriteFont>("GameFont"), titleText2Pos, Color.Orange); titleText2.Text.Append("Robotics"); titleText2.FadeStep /= 5f; titleText2.StateChanged += new EventHandler<StateEventArgs>(titleText2_StateChanged); titleText2.Fade = false; titleText2.Position -= new Vector2(titleText2.Size.X / 2, 0); titleText2.ShadowPosition -= new Vector2(titleText2.Size.X / 2, 0); titleText2.SetCenterAsOrigin(); titleText1.Text.Clear(); titleText1.Text.Append("Great "); Vector2 titleText3Pos = new Vector2(titleText1.Position.X + titleText1.Size.X / 2, -2000); titleText3 = new DropInFont(Content.Load<SpriteFont>("GameFont"), titleText3Pos, screenSize / 2, new Vector2(0, 20), "Minds", Color.OrangeRed); titleText3.TargetPosition = titleText1.TargetPosition; titleText3.SetCenterAsOrigin(); titleText3.ShadowPosition = new Vector2(titleText3.Position.X - 4, titleText3.Position.Y + 4); titleText3.ShadowColor = Color.Black; titleText3.StateChanged += new EventHandler<StateEventArgs>(statefulFont_StateChanged); titleText3.Tag = GameTags.StartTitleFadeIn; Vector2 byPos = new Vector2(titleText1.Position.X - 100, -1000); by = new AccelDropInFont(Content.Load<SpriteFont>("GameFont"), byPos, screenSize / 2, new Vector2(0, 5), "By:", Color.Orange, new Vector2(0, 1.5f)); by.TargetPosition = titleText1.TargetPosition - new Vector2(100, 100); by.SetCenterAsOrigin(); by.ShadowPosition = new Vector2(by.Position.X - 4, by.Position.Y + 4); by.ShadowColor = Color.Black; by.MaxDropSpeed = new Vector2(15, 15); crashEffect = Content.Load<SoundEffect>("Crash"); //Obtained from http://www.freesound.org/people/EdgardEdition/sounds/113095/ coinsEffect = Content.Load<SoundEffect>("insertcoin"); insertCoins = new ArcadeFont(Content.Load<SpriteFont>("ArcadeFont"), new Vector2(300, 400), Color.Red, Color.White, Color.Yellow, Color.Blue); insertCoins.ShadowPosition = new Vector2(insertCoins.Position.X - 1, insertCoins.Position.Y + 1); insertCoins.ColorCyclesPerSecond = 15; //Default is 10; smaller number blinks slower insertCoins.Text.Append("INSERT COINS"); insertCoins.IsVisible = false; slidingText = new StatefulSequence<SlidingFont>(SlidingFont.FontState.Done, typeof(SlidingFont.FontState)); Vector2 targetPos = new Vector2(505, 400); foreach (char letter in "COOL") { slidingText.Add(new SlidingFont(Content.Load<SpriteFont>("SlidingFont"), new Vector2(50, 350), targetPos, 2f, letter.ToString(), Color.Red) { EnableShadow = false, IsVisible = false, TargetTolerance = 0.625f }); targetPos.X += slidingText[slidingText.Count - 1].Size.X; //Magic # - bad idea } targetPos = new Vector2(505, 420); random = new Random(); foreach (char letter in "Effects!") { slidingText.Add(new SlidingFont(Content.Load<SpriteFont>("SlidingFont"), new Vector2(random.Next(0, GraphicsDevice.Viewport.Width), random.Next(0, GraphicsDevice.Viewport.Height)), targetPos, 1f + (float)random.NextDouble(), letter.ToString(), Color.Red) { EnableShadow = false, IsVisible = false }); targetPos.X += slidingText[slidingText.Count - 1].Size.X; //Magic # - bad idea } coolPanel = new TexturePanel(Content.Load<Texture2D>("WavyEffect"), new Vector2(120, 60), Vector2.One * .5f, new Vector2(550, 425), new Color(60, 60, 60, 128)); coolPanel.IsVisible = false; insertFive = new AchievementPanel(0, Content.Load<SpriteFont>("SlidingFont"), Content.Load<SpriteFont>("ArcadeFont"), "Insert 5 coins", GraphicsDevice); insertFive.Condition = AchievementPanel.AreFiveCoinsInsert; donateHundred = new AchievementPanel(0, Content.Load<SpriteFont>("SlidingFont"), Content.Load<SpriteFont>("ArcadeFont"), "Donate $100 to GMR", GraphicsDevice); donateHundred.Condition = AchievementPanel.AreHundredDollarsDonated; noCoinSpam = new AchievementPanel(0, Content.Load<SpriteFont>("SlidingFont"), Content.Load<SpriteFont>("ArcadeFont"), "Don't insert coins for 30 seconds", GraphicsDevice); noCoinSpam.Position = new Vector2(GraphicsDevice.Viewport.Width - noCoinSpam.Width, noCoinSpam.Position.Y); noCoinSpam.Condition = AchievementPanel.IsNoCoinsInsertedAtThirtySeconds; allAchievementsDone = new AchievementPanel(0, Content.Load<SpriteFont>("SlidingFont"), Content.Load<SpriteFont>("ArcadeFont"), "Finish all achievements", GraphicsDevice); allAchievementsDone.Condition = delegate(GameTime gt) { return standardAchievementsCompleted; }; StatefulSequence<AchievementPanel> allAchievementPanels = new StatefulSequence<AchievementPanel>(AchievementPanel.PanelState.Done, typeof(AchievementPanel.PanelState)); allAchievementPanels.Add(noCoinSpam); allAchievementPanels.Add(donateHundred); allAchievementPanels.Add(insertFive); allAchievementPanels.SequenceReachedMonitoredState += new StatefulSequence<AchievementPanel>.MonitoredStateReached(allAchievementPanels_SequenceReachedMonitoredState); slidingText.SequenceReachedMonitoredState += new StatefulSequence<SlidingFont>.MonitoredStateReached(slidingText_SequenceReachedMonitoredState); colorfulTypingText = new TypingFont(Content.Load<SpriteFont>("ArcadeFont"), new Vector2(200, 0), Color.Black, "Typing text here", TimeSpan.FromMilliseconds(200)); colorfulTypingText.StateChanged += new EventHandler<StateEventArgs>(typingText_StateChanged); colorfulTypingText.CharacterTyped += new EventHandler<TypingFont.CharacterTypedEventArgs>(typingText_CharacterTyped); colorfulTypingText.Tag = "1"; colorfulTypingText.Start(); regularTypingText = new TypingFont(Content.Load<SpriteFont>("ArcadeFont"), new Vector2(400, 0), Color.Black, "... and more typing text here...", TimeSpan.FromMilliseconds(50)); regularTypingText.StateChanged += new EventHandler<StateEventArgs>(typingText_StateChanged); regularTypingText.Tag = "2"; }