scenario enclume (
  acteurTrigger * triggerMechant,
  acteurCamera * camera,
  acteurBouton * boutonStart,
  acteurBouton * boutonCamera1,
  acteurBouton * boutonCamera2,
  acteurBouton * boutonCamera3,
  acteurKontondant * kontondant
)
{
  include {
    #include "acteurTrigger.h"
    #include "variableTableId.h"
    #include "utilisateurCarte.h"
    #include "acteurKontondant.h"
  };
 
  declaration {
    variableTableId _table;
    ensembleActeur _visiteurs;
    ensembleActeur _mechants;
    utilisateurCarte * _perdu;
  };

  c++ {
    PsNomSym tmp = Nom();

    triggerMechant -> setTableId(&_table);
    triggerMechant -> initTrigger(tmp);
    triggerMechant -> setPosition(27.5,-5);
  };

  use ordonne(
    triggerMechant,
    camera,boutonStart, boutonCamera1, boutonCamera2, boutonCamera3 ,
    kontondant,
    &_visiteurs, &_mechants, &_perdu, &_table
  );
}

scenario ordonne
(
  acteurTrigger * triggerMechant,
  acteurCamera * camera,
  acteurBouton * boutonStart,
  acteurBouton * boutonCamera1,
  acteurBouton * boutonCamera2,
  acteurBouton * boutonCamera3,
  acteurKontondant * kontondant,
  ensembleActeur * visiteurs,
  ensembleActeur * mechants,
  utilisateurCarte ** perdu,
  variableTableId * table
)
{
  instance iCreation of creationHumanos(visiteurs,mechants,perdu,table);
  instance iVoir of voir(
    camera,
    boutonCamera1,
    boutonCamera2,
    boutonCamera3
  );
  instance iActions of actions(
    triggerMechant,kontondant,
    visiteurs,mechants,perdu,table
  );
  instance iSecondaire of scenarioSecondaire(mechants,boutonStart);
 
  schedule {
     iCreation meets iVoir;
     start of iVoir equals start of iActions;
     iCreation meets iSecondaire;
  };
}

scenario creationUnHumano(
  utilisateurCarte **retour,
  variableTableId * table,
  std::string nom,
  std::string x,
  std::string z,
  std::string geometrie
)
{
  include {
    #include "utilisateurCarte.h"
    #include "variableTableId.h"
  };
  declaration { utilisateurCarte * nouveau; };
  c++ {
    nouveau = _refObjetSimul.utilisateurCarteCreation();
    nouveau -> creerModulesAssocies(
      _refObjetSimul,          // le createur de modules
      nom,                     // la base de nom de module cree
      "musee","sol",           // nom du musee et de l'etage
       "cible",Nom().Chaine(), // cible privee et module scenario
      x,z,"0","0",             // position + orientation
      "0",                     // delai au demarrage
      "humano",                // fichiers de donnees mouvements
      geometrie                // fichier de donnees geometrique
    );
  };
  wait (0.04),
  c++ { nouveau -> initId(); };
  waitfor ( nouveau -> idValide() );
  c++ {
    table -> ajouteActeur( nouveau -> getId(), nouveau);
    *retour = nouveau;
  };
}

scenario actions
(
  acteurTrigger * triggerMechant,
  acteurKontondant * kontondant,
  ensembleActeur * visiteurs,
  ensembleActeur * mechants,
  utilisateurCarte ** perdu,
  variableTableId * table
)
{
  include {
    #include "acteurTrigger.h"
    #include "variableTableId.h"
    #include "utilisateurCarte.h"
    #include "acteurKontondant.h"
  };

  declaration {
    utilisateurCarte * _perdu;
    utilisateurCarte * _unMechant;
    bool _situation;
    bool _enclumeTombee;
    bool _abandon;
    bool _free;
  };

  on entree(acteurTriggerGenere * emetteur,ensembleActeur & ensemble)
  from actor triggerMechant type acteurTrigger
  {
    ensembleActeur filtre = ensemble && *mechants;
    if (!filtre.empty())
    {
      _situation = true;
      _unMechant = dynamic_cast<utilisateurCarte *>(*(filtre .begin()));
    }
  };

  c++ {
    _perdu = *perdu;
    kontondant -> setChute(23,50,0, 23,0,0, 30, 1);
    _enclumeTombee = false;
    _situation = false;
    triggerMechant -> active();
  };

  aslongas (!_situation) { use longEnLarge(_perdu); };

  reserve ( actor _unMechant priority(10) )
  {
    success { _abandon = false; }
    failure { _abandon = true; }
  };

  if (!_abandon)
  {
    use discussion(_perdu,_unMechant);

    c++ { _unMechant -> vaJusque(90,0); };
    use versCroix(_perdu);
    c++ { kontondant -> timber(); };
 
    waitfor(_enclumeTombee);

    on butAtteind(acteurKontondantGenere * emetteur)
    from actor kontondant type acteurKontondant
    { _enclumeTombee = true; };
 

    c++ {
      _perdu -> detruireModulesAssocies(_refObjetSimul);
      table -> enleveActeur(_perdu -> getId());
      _refObjetSimul.utilisateurCarteDestruction(_perdu);
 
      kontondant -> setChute(23,0,0, 23,50,0, 200, 1);
      kontondant -> timber();
    };

    free actor _unMechant;

    wait (10),
    reserve ( actor _unMechant priority(1))
    {
      success {
        _unMechant -> stop();
        _free = false;
      }
      failure { _free = true; }
    };
    if (!_free) { free actor _unMechant; };
  };
}

scenario scenarioSecondaire(
  ensembleActeur * ptrMechants,
  acteurBouton * bouton
)
{
  include {
    #include "acteurBouton.h"
    #include "ensembleActeur.h"
  };

  declaration { bool _clic; };

  on clicGauche(acteurBoutonGenere * emetteur)
  from actor bouton type acteurBouton
  { _clic = true; };

  c++ { _clic = false; };
 
  eachtime(_clic)
  {
    c++ { _clic = false; };
    use actionSecondaire(ptrMechants);
  };

  join;
}

scenario actionSecondaire(
  ensembleActeur * ptrMechants
)
{
  include {
    #include "utilisateurCarte.h"
    #include "ensembleActeur.h"
  };

  declaration {
    ensembleActeur source;
    ensembleActeur selection;
    utilisateurCarte * effrayeur;
    bool _termine;
  };

  on confiscation(acteurComRes * confisque) { _termine = true; };

  c++ { source = *ptrMechants; };

  reserve ( from source to selection count(1) priority(1) )
  {
    success { _termine = false; }
    failure { _termine = true; }
  };

  aslongas ( !_termine)
  {
    use embeterOiseaux(selection);
    c++ { _termine = true; };
    free ( selection );
  };
}