Commit 9200f807 authored by Arnaud Cadot's avatar Arnaud Cadot

- Refactored Etape (WIP)

parent 8174a823
......@@ -3,6 +3,8 @@
#include "position.h"
#define ETAPE_INVALID_IDX -1
class ActionGoTo;
class MediumLevelAction;
......@@ -65,34 +67,9 @@ public:
};
/** @brief Constructeur vide d'une etape */
Etape();
/** @brief Constructeur d'une etape *
* @param le numero de cette étape */
Etape(int numero);
static int makeEtape(MediumLevelAction* action);
static int makeEtape(Position position, EtapeType type = POINT_PASSAGE);
/** @brief Constructeur d'une etape *
* @param le numero de cette étape *
* @param l'étape à réaliser */
Etape(int numero, MediumLevelAction* action);
/** @brief Constructeur d'une etape *
* @param position Position de cette étape *
* @param typeType d'étape (un feu, un point de passage...) *
* @param state Etat de cette étape, utilisé pour l'exploration du graphe
* @param nombreEtapesLieesParFinirEtape Nombre d'étapes qui doivent être considérées comme finie si celle-ci l'est */
Etape(int numero, Position position, EtapeType type = POINT_PASSAGE, int state = -1, int nombreEtapesLieesParFinirEtape = 0);
/** @brief Constructeur d'une etape *
* @param position Position de cette étape *
* @param le nombre d'étapes attachées à celle_ci *
* @param le numero de cette étape *
* @param le tableau contenant toutes les étapes, pour qu'elle s'y ajoute *
* @param typeType d'étape (un feu, un point de passage...) *
* @param state Etat de cette étape, utilisé pour l'exploration du graphe
* @param nombreEtapesLieesParFinirEtape Nombre d'étapes qui doivent être considérées comme finie si celle-ci l'est */
Etape(Position position,/* int nbChildren, */int numero, Etape** tableaudebug, EtapeType type = POINT_PASSAGE, int state = -1, int nombreEtapesLieesParFinirEtape = 0);
/** @brief Renvoi un pointeur vers une des etapes attachees a celle-ci *
* @param nb le numéro du lien vers l'autre etape */
......@@ -216,11 +193,13 @@ public:
void setGoBack(bool val);
static int getTotalEtapes();
static Etape** initTableauEtapeTotal(int number);
static Etape* get(int index);
static Etape** getTableaudebug();
static Etape** getTableauEtapesTotal();
#ifndef ROBOTHW
static QString getNameType(EtapeType type);
......@@ -228,6 +207,14 @@ public:
#endif
private:
/** @brief Constructeur d'une etape *
* @param position Position de cette étape *
* @param typeType d'étape (un feu, un point de passage...) *
* @param state Etat de cette étape, utilisé pour l'exploration du graphe
* @param nombreEtapesLieesParFinirEtape Nombre d'étapes qui doivent être considérées comme finie si celle-ci l'est */
Etape(Position position, EtapeType type = POINT_PASSAGE);
/** @brief Tableau des étapes attachées à celle-ci */
Etape** children;
......@@ -271,9 +258,11 @@ private:
MediumLevelAction* action;
static int numberInit;
//static int numberInit;
static int totalEtapesInstanciated;
static Etape** tableaudebug;
static Etape** tableauEtapesTotal;
void postInit();
};
......
......@@ -63,7 +63,7 @@ protected:
/** @brief le tableau des étapes constituant le graphe à explorer */
//Etape** tableauEtapes;
Etape** tableaudebug;
Etape** tableauEtapesTotal;
/** @brief vient-on de détecter un robot */
bool avoiding;
......
......@@ -117,6 +117,7 @@
<Unit filename="include/position.h" />
<Unit filename="include/positionPlusAngle.h" />
<Unit filename="include/strategie/actionGoTo.h" />
<Unit filename="include/strategie/cabine.h" />
<Unit filename="include/strategie/clap.h" />
<Unit filename="include/strategie/deposerGobelet.h" />
<Unit filename="include/strategie/deposerPied.h" />
......@@ -190,9 +191,9 @@
<Unit filename="src/strategie/actionGoTo.cpp" />
<Unit filename="src/strategie/anciens_fichiers/feuKrabi (copie).cpp.victor" />
<Unit filename="src/strategie/anciens_fichiers/feukrabilateral.cpp.limitVitesseVictor" />
<Unit filename="src/strategie/cabine.cpp" />
<Unit filename="src/strategie/clap.cpp" />
<Unit filename="src/strategie/deposerGobelet.cpp" />
<Unit filename="src/strategie/deposerPied.cpp" />
<Unit filename="src/strategie/dijkstra.cpp" />
<Unit filename="src/strategie/etape.cpp" />
<Unit filename="src/strategie/gobelet.cpp" />
......
This diff is collapsed.
......@@ -6,76 +6,61 @@
#include <QDebug>
#endif
Etape** Etape::tableaudebug = 0;
Etape** Etape::tableauEtapesTotal = 0;
Etape::Etape(){}
int Etape::totalEtapesInstanciated = 0;
Etape::Etape(int numero)
Etape::Etape(Position position, EtapeType type)
{
this->position = Position();
this->type = POINT_PASSAGE;
this->state = -1;
this->numero = numero;
this->nombreEtapesLieesParFinirEtape = 0;
postInit();
}
int idx = (Etape::totalEtapesInstanciated++);
Etape::Etape(int numero, MediumLevelAction* action)
{
this->position = Position();
this->type = POINT_PASSAGE;
this->state = -1;
this->numero = numero;
this->position = position;
this->type = type;
this->state = -1;
this->action = 0;
this->nbChildren = 0;
this->distance = -1;
this->score = 0;
this->numero = idx;
this->numeroEtapeFinAction = idx;
this->nombreEtapesLieesParFinirEtape = 0;
postInit();
this->actionGoTo = new ActionGoTo(getPosition());
setAction(action);
if(idx != ETAPE_INVALID_IDX)
tableauEtapesTotal[idx] = this;
}
Etape::Etape(int numero, Position position, EtapeType type, int state, int nombreEtapesLieesParFinirEtape)
int Etape::makeEtape(MediumLevelAction* action)
{
this->position = position;
this->type = type;
this->state = state;
this->numero = numero;
this->nombreEtapesLieesParFinirEtape = nombreEtapesLieesParFinirEtape;
this->numeroEtapeFinAction = numero;//Par défaut, on fini à l'endroit de l'étape
int idx = Etape::makeEtape(Position(), Etape::POINT_PASSAGE);
//Initialisation du tableau de voisins à vide
/*for(int i = 0 ; i < nbChildren ; i++)
{
this->children[i] = 0;
}*/
if(idx == ETAPE_INVALID_IDX)
return idx;
Etape::get(idx)->setAction(action);
postInit();
return idx;
}
Etape::Etape(Position position, int numero, Etape** tableaudebug, EtapeType type, int state, int nombreEtapesLieesParFinirEtape)
int Etape::makeEtape(Position position, EtapeType type)
{
this->position = position;
this->type = type;
this->state = state;
this->numero = numero;
this->nombreEtapesLieesParFinirEtape = nombreEtapesLieesParFinirEtape;
Etape* e = new Etape(position, type);
postInit();
}
int idx = e->getNumero();
void Etape::postInit()
{
this->action = 0;
this->nbChildren = 0;
this->distance = -1;
this->score = 0;
this->numeroEtapeFinAction = numero;//Par défaut, on fini à l'endroit de l'étape
if(idx == ETAPE_INVALID_IDX)
delete e;
tableaudebug[this->numero] = this;
return idx;
}
this->actionGoTo = new ActionGoTo(getPosition());
int Etape::getTotalEtapes()
{
return Etape::totalEtapesInstanciated;
}
Etape* Etape::getChild(int nb){
return this->children[nb];
}
......@@ -176,10 +161,14 @@ void Etape::setDistances(int* distances)
this->distances = distances;
}
void Etape::computeChildDistances(){
void Etape::computeChildDistances()
{
if(nbChildren == 0)
return;
this->distances = new int[this->nbChildren];
for(int i=0; i<this->nbChildren; i++)
for(int i=0; i<this->nbChildren; ++i)
{
this->distances[i] = Dijkstra::calculDistanceDirect(this->children[i], this);
}
......@@ -268,22 +257,6 @@ void Etape::addVoisin(Etape* newVoisin, bool autreSens)
this->nbChildren++;
}
/*int i = 0;
//On cherche le premier voisin non-initialisé
while(this->children[i]!=0 && i < this->nbChildren)
{
i++;
}
//Erreur, il y a trop de voisins !
if (i == nbChildren)
{
#ifndef ROBOTHW
qDebug() << "ERREUR, TROP DE VOISINS !!!";
#endif
}
this->children[i] = newVoisin;
*/
if (autreSens)
{
newVoisin->addVoisin(this, false);
......@@ -359,22 +332,22 @@ int Etape::getNumeroEtapeFinAction()
Etape** Etape::initTableauEtapeTotal(int number)
{
tableaudebug = new Etape*[number];
tableauEtapesTotal = new Etape*[number];
for(int i(0); i<number; ++i)
tableaudebug[i] = 0;
return tableaudebug;
tableauEtapesTotal[i] = 0;
return tableauEtapesTotal;
}
Etape* Etape::get(int index)
{
if (tableaudebug[index] == 0)
new Etape(index);
return tableaudebug[index];
if (tableauEtapesTotal[index] == 0)
0;/*new Etape(index);*/
return tableauEtapesTotal[index];
}
Etape** Etape::getTableaudebug()
Etape** Etape::getTableauEtapesTotal()
{
return tableaudebug;
return tableauEtapesTotal;
}
#ifndef ROBOTHW
......
......@@ -4,77 +4,59 @@
Krabi2015::Krabi2015(bool isYellow) : StrategieV3(isYellow)
{
#if 0
// Initialisation des stocks
//Initialisation des tableaux d'étapes
this->nombreEtapes = NOMBRE_ETAPES;
this->numeroEtapeGarage = ETAPE_GARAGE;
tableaudebug = Etape::initTableauEtapeTotal(NOMBRE_ETAPES);//new Etape*[NOMBRE_ETAPES];
tableauEtapesTotal = Etape::initTableauEtapeTotal(NOMBRE_ETAPES);//new Etape*[NOMBRE_ETAPES];
//actionEtape = new MediumLevelAction*[NOMBRE_ETAPES];
//actionGoto = new ActionGoTo[NOMBRE_ETAPES];
// Création des étapes
// Les étapes correspondant à des actions sont créées automatiquement lors de l'ajout d'actions
new Etape(0, Position(250, 1000, true), Etape::DEPART); // départ au fond de la zone de départ
new Etape(0, Position(250, 1000, true), Etape::DEPART); // départ au fond de la zone de départ
// Points de passage
// numéro étape, position
new Etape(1, Position(700, 1000, true));
new Etape(3, Position(880, 1140, true));
new Etape(3, Position(320, 1203, true));
new Etape(5, Position(1120, 1203, true));
new Etape(7, Position(1303, 883, true));
new Etape(8, Position(620, 700, true));
new Etape(12, Position(747, 650, true));
new Etape(14, Position(695, 445, true));
new Etape(15, Position(2293, 540, true));
new Etape(16, Position(2500, 273, true));
new Etape(21, Position(1493, 716, true));
new Etape(22, Position(1763, 876, true));
new Etape(22, Position(2463, 676, true));
new Etape(23, Position(1593, 1150, true));
new Etape(24, Position(1896, 1156, true));
new Etape(27, Position(2086, 1156, true));
new Etape(27, Position(1206, 1586, true));
new Etape(28, Position(1706, 1586, true));
new Etape(29, Position(1976, 1550, true));
new Etape(30, Position(260, 1570, true));
new Etape(31, Position(596, 1413, true));
new Etape(33, Position(260, 1450, true));
new Etape(34, Position(756, 1606, true));
new Etape(35, Position(1116, 1600, true));
new Etape(37, Position(2376, 1413, true));
new Etape(38, Position(2216, 1636, true));
new Etape(39, Position(2460, 1610, true));
new Etape(33, Position(260, 1450, true));
new Etape(21, Position(1046, 1040, true));
new Etape(34, Position(773, 340, true));
new Etape(8, Position(620, 700, true));
new Etape(12, Position(747, 650, true));
// Manipulation dans les coins
// new Etape(14, new ManipulationCoinGaucheHaut(Position(695, 445)) );
// new Etape(40, new ManipulationCoinGaucheHautPiedSolitaire(Position(315, 330)) );
// new Etape(30, new ManipulationCoinGaucheBas( Position(260, 1570)) );
new Etape(14, Position(695, 445, true));
new Etape(40, Position(315, 330, true));
new Etape(30, Position(260, 1570, true));
//Si gobelets:
new Etape(15, Position(2293, 540, true));
new Etape(16, Position(2500, 273, true));
//Pour pousser les objets (bourrin) du coin bas gauche avant de faire les claps
new Etape(41, Position(300, 1610, true));
new Etape(42, Position(933, 1780, true) );
new Etape(43, Position(400, 1780, true) );
new Etape(44, Position(2300, 1780, true) );
new Etape(45, Position(550, 1670, true));
//C'est provisoire: assurer les claps et bannir ces objets
//En plus de ça on commente les voisins de l'étape 4
new Etape(49, Position(750, 1530, true));
// Actions
// numéro étape, mediumLevelAction
// Claps
new Etape(2, new Clap(Position(836, 1780, true), Position(933, 1780, true)) );
new Etape(4, new Clap(Position(236, 1780, true), Position(400, 1780)) );
new Etape(6, new Clap(Position(2500, 1780, true), Position(2300, 1780, true)) );
new Etape(42, Position(933, 1780, true) );
new Etape(43,Position(400, 1780, true) );
new Etape(44, Position(2300, 1780, true) );
// Ramasser Gobelets
new Etape(9, new Gobelet(Position(910, 805, true)) );
......@@ -84,29 +66,32 @@ Krabi2015::Krabi2015(bool isYellow) : StrategieV3(isYellow)
// Déposer Gobelet
new Etape(25, new DeposerGobelet(Position(2696, 1496, true)) );
new Etape(26, new DeposerGobelet(Position(2786, 576, true)) );
new Etape(32, new DeposerGobelet(Position(490, 1000, true)) );
new Etape(13, new DeposerGobelet(Position(283, 496, true)) );
new Etape(32, new DeposerGobelet(Position(790, 1000, true)) );
new Etape(13, new DeposerGobelet(Position(183, 496, true)) );
// Tapis
new Etape(17, new Tapis(Position(1080, 780, true)) );
new Etape(36, new Tapis(Position(1420, 780, true)) );
// Cabine
new Etape(17, new Cabine(Position(480, 780, true)) );
new Etape(36, new Tapis(Position(1420, 180, true)) );
// Ramasser Pied
new Etape(18, new RamasserPied(Position(870, 1355, true)) );
new Etape(19, new RamasserPied(Position(1100, 1770, true)) );
new Etape(20, new RamasserPied(Position(1300, 1400, true)) );
// Ramasser Pied, version sans arriver jusqu'au point du graphe
new Etape(46, new RamasserPied(Position(856, 210, true)) );
new Etape(47, new RamasserPied(Position(850, 106, true)) );
new Etape(48, new RamasserPied(Position(90, 203, true)) );
new Etape(49, Position(750, 1530, true));
// Certaines actions d'étapes ne finnissent pas là où elles ont commencé :
// Clapets:
Etape::get(4)->setNumeroEtapeFinAction(43); //Clapet notre côté vers notre bord
Etape::get(2)->setNumeroEtapeFinAction(42); //Clapet notre côté vers milieu
Etape::get(6)->setNumeroEtapeFinAction(44); //Clapet côté adverse
// Ramasser pieds sans aller jusqu'au point:
Etape::get(19)->setNumeroEtapeFinAction(-1);
Etape::get(46)->setNumeroEtapeFinAction(-1);
......@@ -114,123 +99,21 @@ Krabi2015::Krabi2015(bool isYellow) : StrategieV3(isYellow)
Etape::get(48)->setNumeroEtapeFinAction(-1);
// pousser pied
// Etape::get(2)->addVoisin(11);
// Voisins
Etape::get(0)->addVoisin(1, false);
Etape::get(1)->addVoisins(3, 8, 31);
Etape::get(1)->addVoisins(12, 21, 45);
Etape::get(3)->addVoisins(31, 36);
// Etape::get(4)->addVoisins(30, 33, 45, 18);
Etape::get(4)->addVoisins(45);
Etape::get(5)->addVoisins(23);
//Etape::get(5)->addVoisins(35);
Etape::get(7)->addVoisins(5, 22);
Etape::get(7)->addVoisins(23, 3);
Etape::get(14)->addVoisins(34);
// Voisins des pieds
Etape::get(18)->addVoisins(3, 5, 1);
Etape::get(18)->addVoisins(31, 35, 27, 45);
Etape::get(19)->addVoisins(35, 42);
Etape::get(20)->addVoisins(5, 35, 23, 28);
Etape::get(20)->addVoisins(7);
Etape::get(46)->addVoisins(34);
Etape::get(47)->addVoisins(34);
Etape::get(48)->addVoisins(40);
Etape::get(0)->addVoisin(1);
Etape::get(17)->addVoisins(1);
Etape::get(18)->addVoisins(5, 1);
Etape::get(18)->addVoisins(35, 27);
Etape::get(20)->addVoisins(5, 35 , 28);
Etape::get(21)->addVoisins(3, 27);
Etape::get(21)->addVoisins(7);
// Etape::get(21)->addVoisins(17);
Etape::get(22)->addVoisins(24, 27, 36);
Etape::get(23)->addVoisins(22, 24);
Etape::get(23)->addVoisins(3);
Etape::get(27)->addVoisins(24, 37);
Etape::get(29)->addVoisins(24, 28, 38);
Etape::get(30)->addVoisins(33);
Etape::get(31)->addVoisins(30, 33, 17);
// Etape::get(34)->addVoisins(19, 35, 43, 45);
//Etape::get(34)->addVoisins(2);
//Etape::get(34)->addVoisins(30, 31, 18, 1);
// Etape::get(36)->addVoisins(36);
Etape::get(35)->addVoisins(28, 2);
Etape::get(36)->addVoisins(5);
Etape::get(37)->addVoisins(25, 38);
Etape::get(38)->addVoisins(6, 28);
Etape::get(39)->addVoisins(25, 37, 38, 6);
Etape::get(40)->addVoisins(12, 13, 14);
Etape::get(8)->addVoisins(12, 13, 14);
Etape::get(12)->addVoisins(14);
Etape::get(13)->addVoisins(14);
Etape::get(15)->addVoisins(16, 26);
Etape::get(16)->addVoisins(26);
Etape::get(17)->addVoisins(7);
Etape::get(36)->addVoisins(7, 17);
Etape::get(41)->addVoisins(1);
//aretes pour baisser les claps
Etape::get(2)->addVoisins(42);
Etape::get(4)->addVoisins(43);
Etape::get(6)->addVoisins(44);
// Etape::get(42)->addVoisins(45);
Etape::get(43)->addVoisins(30);
Etape::get(43)->addVoisins(2);
Etape::get(44)->addVoisins(37);
Etape::get(44)->addVoisins(38);
Etape::get(45)->addVoisins(31);
Etape::get(45)->addVoisins(35);
Etape::get(49)->addVoisins(2, 35);
//aretes pour coin gauche haut
Etape::get(8)->addVoisins(40);
//Les trajets transversaux:
Etape::get(27)->addVoisins(1);
//Seulement si on fait les gobelets
// Etape::get(9)->addVoisins(3, 5, 7);
// Etape::get(9)->addVoisins(12, 36, 1);
// Etape::get(10)->addVoisins(20, 35, 23, 28);
// Etape::get(11)->addVoisins(22, 24, 27, 15);
// Etape::get(11)->addVoisins(18);
Etape::get(22)->addVoisins(27, 36);
Etape::get(29)->addVoisins(28, 38);
Etape::get(42)->addVoisins(1);
// Lancer Dijkstra
startDijkstra();
#endif
}
int Krabi2015::getScoreEtape(int i){
......@@ -238,7 +121,7 @@ int Krabi2015::getScoreEtape(int i){
Plus tard : pourquoi pas changer le système en ayant les FEU etc... fils de Etape, ça éviterait aussi le switch dans updateStock().
Juste faire attention à comment transmettre le stock à update.
*/
switch (this->tableaudebug[i]->getEtapeType())
switch (this->tableauEtapesTotal[i]->getEtapeType())
{
case Etape::DEPART :
return 0;
......
......@@ -2,113 +2,72 @@
#include "ascenseur.h"
#include "pinces.h"
#ifndef ROBOTHW
#include <QDebug>
#endif
Krabi2016::Krabi2016(bool isYellow) : StrategieV3(isYellow)
{
// Initialisation des stocks
//Initialisation des tableaux d'étapes
this->nombreEtapes = NOMBRE_ETAPES;
this->numeroEtapeGarage = ETAPE_GARAGE;
tableaudebug = Etape::initTableauEtapeTotal(NOMBRE_ETAPES);//new Etape*[NOMBRE_ETAPES];
tableauEtapesTotal = Etape::initTableauEtapeTotal(NOMBRE_ETAPES);//new Etape*[NOMBRE_ETAPES];
//actionEtape = new MediumLevelAction*[NOMBRE_ETAPES];
//actionGoto = new ActionGoTo[NOMBRE_ETAPES];
new Etape(0, Position(250, 1000, true), Etape::DEPART); // départ au fond de la zone de départ
// Points de passage
// numéro étape, position
new Etape(1, Position(700, 1000, true));
new Etape(3, Position(320, 1203, true));
new Etape(5, Position(1120, 1203, true));
new Etape(7, Position(1303, 883, true));
new Etape(8, Position(620, 700, true));
new Etape(12, Position(747, 650, true));
new Etape(14, Position(695, 445, true));
new Etape(15, Position(2293, 540, true));
new Etape(16, Position(2500, 273, true));
new Etape(21, Position(1493, 716, true));
new Etape(22, Position(2463, 676, true));
new Etape(23, Position(1593, 1150, true));
new Etape(24, Position(1896, 1156, true));
new Etape(27, Position(1206, 1586, true));
new Etape(28, Position(1706, 1586, true));
new Etape(29, Position(1976, 1550, true));
new Etape(30, Position(260, 1570, true));
new Etape(31, Position(596, 1413, true));
new Etape(33, Position(260, 1450, true));
new Etape(34, Position(756, 1606, true));
new Etape(35, Position(1116, 1600, true));
new Etape(37, Position(2376, 1413, true));
new Etape(38, Position(2216, 1636, true));
new Etape(39, Position(2460, 1610, true));
new Etape(40, Position(315, 330, true));
new Etape(41, Position(300, 1610, true));
new Etape(42, Position(933, 1780, true) );
new Etape(43, Position(400, 1780, true) );
new Etape(44, Position(2300, 1780, true) );
new Etape(45, Position(550, 1670, true));
new Etape(49, Position(750, 1530, true));
// Actions
// numéro étape, mediumLevelAction
// Claps
new Etape(6, new Clap(Position(2500, 1780, true), Position(2300, 1780, true)) );
// Ramasser Gobelets
new Etape(9, new Gobelet(Position(910, 805, true)) );
new Etape(10, new Gobelet(Position(1500, 1650, true)) );
new Etape(11, new Gobelet(Position(2090, 800, true)) );
// Déposer Gobelet
new Etape(25, new DeposerGobelet(Position(2696, 1496, true)) );
new Etape(26, new DeposerGobelet(Position(2786, 576, true)) );
new Etape(32, new DeposerGobelet(Position(790, 1000, true)) );
new Etape(13, new DeposerGobelet(Position(183, 496, true)) );
// Cabine
new Etape(17, new Cabine(Position(480, 780, true)) );
new Etape(36, new Tapis(Position(1420, 180, true)) );
// Ramasser Pied
new Etape(18, new RamasserPied(Position(870, 1355, true)) );
new Etape(19, new RamasserPied(Position(1100, 1770, true)) );
new Etape(20, new RamasserPied(Position(1300, 1400, true)) );
// Ramasser Pied, version sans arriver jusqu'au point du graphe
new Etape(46, new RamasserPied(Position(856, 210, true)) );
new Etape(47, new RamasserPied(Position(850, 106, true)) );
// Création des étapes
// Les étapes correspondant à des actions sont créées automatiquement lors de l'ajout d'actions
int start = Etape::makeEtape(Position(250, 1000, true), Etape::DEPART); // départ au fond de la zone de départ
// Certaines actions d'étapes ne finnissent pas là où elles ont commencé :
/** Points de passage **/
int wa = Etape::makeEtape(Position(700, 1000, true));
int wb = Etape::makeEtape(Position(880, 1140, true));
int wc = Etape::makeEtape(Position(1120, 1203, true));
/** Actions **/
// Gobelets
int ga = Etape::makeEtape(new Gobelet(Position(910, 805, true)));
int gb = Etape::makeEtape(new Gobelet(Position(1500, 1650, true)));
int gc = Etape::makeEtape(new Gobelet(Position(2090, 800, true)));
// Pieds
int pa = Etape::makeEtape(new RamasserPied(Position(870, 1355, true)));
int pb = Etape::makeEtape(new RamasserPied(Position(1100, 1770, true)));
// Etc.
// Clapets:
Etape::get(4)->setNumeroEtapeFinAction(43); //Clapet notre côté vers notre bord
Etape::get(2)->setNumeroEtapeFinAction(42); //Clapet notre côté vers milieu
Etape::get(6)->setNumeroEtapeFinAction(44); //Clapet côté adverse
// Ramasser pieds sans aller jusqu'au point:
Etape::get(19)->setNumeroEtapeFinAction(-1);
Etape::get(46)->setNumeroEtapeFinAction(-1);
Etape::get(47)->setNumeroEtapeFinAction(-1);
Etape::get(48)->setNumeroEtapeFinAction(-1);
/** Liens **/
// [WIP]
Etape::get(start) ->addVoisin(wa);
Etape::get(wa) ->addVoisin(wb, wc);
Etape::get(wb) ->addVoisin(wc);