//-----------------------------------------------------------------------------
// Purpose: Fill out given response with the appropriate one for this concept
//-----------------------------------------------------------------------------
void CBaseMultiplayerPlayer::SpeakConcept( AI_Response &outResponse, int iConcept )
{
	m_iCurrentConcept = iConcept;
	AIConcept_t concept( g_pszMPConcepts[iConcept] );
	FindResponse( outResponse, concept );
}
QtPvdbTestEdgeItemDialog::QtPvdbTestEdgeItemDialog(QWidget *parent) :
  QtHideAndShowDialog(parent),
  ui(new Ui::QtPvdbTestEdgeItemDialog),
  m_edge_item(nullptr),
  m_from(CreateFrom()),
  m_to(CreateTo())
{
  ui->setupUi(this);
  #ifndef NDEBUG
  Test();
  #endif
  assert(ui->view->scene());
  assert(m_from);
  assert(m_to);
  {
    const std::size_t index = 4; //Must have examples
    assert(index < pvdb::EdgeFactory::GetTests(m_from,m_to).size());
    m_edge = pvdb::EdgeFactory::GetTests(m_from,m_to)[index];
    assert(m_edge->GetConcept());
    assert(m_edge->GetConcept()->GetExamples());
    assert(!m_edge->GetConcept()->GetExamples()->Get().empty()
      && "Otherwise 'ui->box_competency->addItem(qs)' will fail, due to on_box_competency_currentIndexChanged");
  }

  assert(m_edge);
  #ifndef NDEBUG
  {
    const int edge_use_count = m_edge.use_count();
    assert(edge_use_count == 1);
  }
  #endif

  //Create three nodes that the edges can connect to
  QtPvdbNodeItem * node1 = nullptr;
  {
    //m_from->GetConcept()->SetName("1");
    const boost::shared_ptr<QtPvdbConceptItem> item(new QtPvdbDisplayConceptItem(m_from->GetConcept()));
    node1 = new QtPvdbNodeItem(m_from,item);
    node1->m_signal_request_scene_update.connect(
      boost::bind(&QtPvdbTestEdgeItemDialog::OnRequestSceneUpdate,this));
  }
  QtPvdbNodeItem * node2 = nullptr;
  {
    //m_to->GetConcept()->SetName("2");
    const boost::shared_ptr<QtPvdbConceptItem> item(new QtPvdbEditConceptItem(m_to->GetConcept()));
    node2 = new QtPvdbNodeItem(m_to,item);
    node2->m_signal_request_scene_update.connect(
      boost::bind(&QtPvdbTestEdgeItemDialog::OnRequestSceneUpdate,this));
  }
  assert(node1);
  assert(node2);
  assert(node1->GetNode());
  assert(node2->GetNode());
  assert(node1->GetNode()->GetConcept());
  assert(node2->GetNode()->GetConcept());

  //Create the edge
  {
    assert(m_edge);
    boost::shared_ptr<QtPvdbEditConceptItem> concept(new QtPvdbEditConceptItem(m_edge->GetConcept()));
    m_edge_item = new QtPvdbEdgeItem(m_edge,concept,node1,node2);
  }

  //Node is used in: m_edge and QtPvdbNodeConcept::m_edge
  //assert(m_edge.use_count() == 2);
  //Concept is used in: m_edge::m_concept, QtPvdbDisplayConcept::m_edge::m_concept and QtPvdbConcept::m_concept
  assert(m_edge.get() == m_edge_item->GetEdge().get());
  assert(m_edge->GetConcept().get() == m_edge_item->GetEdge()->GetConcept().get());

  #ifndef NDEBUG
  {
    const int edge_use_count = m_edge.use_count();
    assert(edge_use_count == 2);
  }
  #endif

  //Add items to the scene
  assert(node1);
  assert(node2);
  assert(m_edge_item);
  assert(!node1->scene());
  assert(!node2->scene());
  assert(!m_edge_item->scene());

  ui->view->scene()->addItem(node1);
  ui->view->scene()->addItem(node2);
  ui->view->scene()->addItem(m_edge_item);
  assert(ui->view->scene()->items().size() == 3);
  {
    QList<QGraphicsItem *> v = ui->view->scene()->items();
    assert(
      std::count_if(v.begin(),v.end(),
        [](const QGraphicsItem * const item)
        {
          return dynamic_cast<const QtPvdbEdgeItem*>(item);
        }
      ) == 1);
  }

  //Put nodes (not the edges) into place
  //The nodes must reposition themselves
  node1->SetPos(-100.0,-100.0);
  m_edge_item->SetPos(0.0,0.0);
  node2->SetPos( 100.0, 100.0);

  {
    const std::vector<pvdb::Competency> v = pvdb::GetAllCompetencies();
    const std::size_t sz = boost::numeric_cast<int>(v.size());
    for (std::size_t i=0; i!=sz; ++i)
    {
      assert(i < v.size());
      const pvdb::Competency competency = v[i];
      const std::string s = pvdb::CompetencyToDutchStr(competency);
      const QString qs = s.c_str();
      assert(ui);
      assert(ui->box_competency);
      assert(GetEdgeCurrentWay());
      assert(GetEdgeCurrentWay()->GetConcept());
      assert(GetEdgeCurrentWay()->GetConcept()->GetExamples());
      assert(!GetEdgeCurrentWay()->GetConcept()->GetExamples()->Get().empty()
        && "Otherwise 'ui->box_competency->addItem(qs)' will fail, due to on_box_competency_currentIndexChanged");
      ui->box_competency->addItem(qs); //2013-06-22: BUG: std::out_of_range' what():  vector::_M_range_check
    }
  }

  assert(this->GetEdgeCurrentWay()->GetConcept()->GetExamples());
  assert(!this->GetEdgeCurrentWay()->GetConcept()->GetExamples()->Get().empty());

  ui->box_complexity->setCurrentIndex(this->GetEdgeCurrentWay()->GetConcept()->GetRatingComplexity() + 1);
  ui->box_concreteness->setCurrentIndex(this->GetEdgeCurrentWay()->GetConcept()->GetRatingConcreteness() + 1);
  ui->box_specificity->setCurrentIndex(this->GetEdgeCurrentWay()->GetConcept()->GetRatingSpecificity() + 1);

  ui->edit_name->setText(this->GetEdgeCurrentWay()->GetConcept()->GetName().c_str());
  ui->edit_example_text->setText(this->GetEdgeCurrentWay()->GetConcept()->GetExamples()->Get().at(0)->GetText().c_str());

  ui->box_arrow_head->setCurrentIndex(this->GetEdgeCurrentWay()->HasHeadArrow());
  ui->box_arrow_tail->setCurrentIndex(this->GetEdgeCurrentWay()->HasTailArrow());
  ui->box_competency->setCurrentIndex(static_cast<int>(this->GetEdgeCurrentWay()->GetConcept()->GetExamples()->Get().at(0)->GetCompetency()));
}