1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86
| class TechniqueSoin{
public:
void soigner(Personnage & cible){
soigner(cible, seletionnerSoinPersonne());
}
void soigner(Zone & cible){
soigner(cible, seletionnerSoinZone());
}
private:
SoinPersonne const & selectionnerSoinPersonne(){
/* il faut choisir le soin qui sera utilisé */
}
SoinZone const & selectionnerSoinZone(){
/* il faut choisir le soin qui sera utilisé */
}
void soigner(Personnage & cible, SoinPersonne const & soin){
/* appliquer le soin à la cible */
}
void soigner(Zone & cible, SoinZone const & soin){
/* appliquer le soin à la cible */
}
std::list<std::reference_wrapper<SoinPersonne>> & listeSoinsPersonnes;
std::list<std::reference_wrapper<SoinZone>> & listeSoinsZones;
};
class TechniqueDeSorts{
public:
void utiliserSort(Personnage & cible){
utiliserSort(cible, seletionnerSortPersonne());
}
void utiliserSort(Zone & cible){
utiliserSort(cible, seletionnerSortZone());
}
private:
SoinPersonne const & selectionnerSortPersonne(){
/* il faut choisir le sort qui sera utilisé */
}
SoinZone const & selectionnerSortZone(){
/* il faut choisir le sort qui sera utilisé */
}
void utiliserSort(Personnage & cible, SoinPersonne const & soin){
/* appliquer le sort à la cible */
}
void soigner(Zone & cible, SoinZone const & soin){
/* appliquer le sort à la cible */
}
std::list<std::reference_wrapper<SortPersonne>> & listeSortsPersonnes;
std::list<std::reference_wrapper<SortZone>> & listeSortsZones;
};
/* les techniques de combats nécessitent sans doute des spécialisation...
* on pourrait donc travailler avec des template et des politiques
*/
struct TagCorpsACorps{};
struct TagDistance{};
struct tagMagie{};
template <typename TagTechnique
class TechniqueDeCombat{
public:
void attaquer(Personnage & cible){
attaquer(cible, selectionnerAttaquePersonne();
}
void attaquer(Zone & cible){
attaquer(cible, selectionnerAttaquePersonne();
}
private:
AttaquePersonne<TagTechnique> const & selectionnerAttaquePersonne(){
/* il faut choisir le sort qui sera utilisé */
}
AttaqueZone<TagTechnique> const & selectionnerAttaqueZone(){
/* il faut choisir le sort qui sera utilisé */
}
void attaquer(Personnage & cible, AttaquePersonne<TagTechnique> const & attaque){
/* appliquer l'attaque à la cible */
}
void attaquer(Zone & cible, AttaqueZone<TagTechnique> const & soin){
/* appliquer l'attaque à la cible */
}
std::list<std::reference_wrapper<AttaquePersonne<TagTechnique>>> & listeSortsPersonnes;
std::list<std::reference_wrapper<AttaqueZone<TagTechnique>>> & listeSortsZones;
};
/* et, par facilité, on peut créer des alias de type */
using TechniqueCorpsACorps = TechniqueDeCombat<tagCorpACorps>;
using TechniqueDistance= TechniqueDeCombat<tagDistance>;
using TechniqueMagique = TechniqueDeCombat<tagMagie>; |
Partager