#pragma once
#include "../../DecisionMaking/Layer1Reactive/Layer1FSM/Behaviors/Protoss/EngageEnemies/GroupAttack/UnitAttack/HighTemplarUnitAttackBehavior.h"
#include "../Scenario.h"

class PsionicStormScenario : public Scenario<PsionicStormScenario>
{
public:
  PsionicStormScenario()
    : m_templarBehavior(*this)
  {
  }

  template <class SparAIFactory>
  SparAIContainer* instantiateSparAIImpl(SparAIFactory& sparFactory)
  {
    typedef SparAIModule<Layer1GameState, Layer2Cueing, Layer3TacticalRecognition, Layer4StrategicRecognition,
                         Layer1FSM, InactiveLayer2, InactiveLayer3, InactiveLayer4> SPAR;

    return sparFactory.instantiate<Layer1GameState, Layer2Cueing, Layer3TacticalRecognition, Layer4StrategicRecognition,
                                   Layer1FSM, InactiveLayer2, InactiveLayer3, InactiveLayer4>(this);
  }

protected:
  virtual void onSparStarted(void* data);

  virtual void onSparEnded(void* data);

  virtual void _output(std::ostream& out) const
  {
    out << "PsionicStorm Scenario";
  }

  ProcessContainer<HighTemplarUnitAttackBehavior> m_templarBehavior;
};