"mais quand y'a beaucoup d'entité ça consomme"
Je pense que tu applique trop bêtement les tutos que tu trouve sur le net (on a tous débuter un jour c'est normal), mais il est important de prendre un peu de recul sur ce que l'on apprend.
Déjà au niveau du code : tu fait du C++ alors fait de l'objet et arrête de coder en procédural comme en C.
Ta fonction main fait 100 lignes : NON, c'est trop, l'organisation du projet n'est pas vraiment la bonne, ton main doit contenir très peu de code. En fait à ton niveau aucune de tes fonctions ne doit contenir autant de lignes de code.
"string type;" Les types doivent toujours être une énumération (ou un entier)
"int posX, posY; // position de l'ordre
int posX2, posY2; // position de l'ordre en cas d'ordre "Move"
Va voir du côté du polymorphisme, c'est pas correct de faire comme ça, en fait une structure pour des ordres n'est pas très adapté, le mieux est de faire une classe pour chaque ordre. En faisant comme ça tu éliminera normalement tes problèmes de performances de l'IA.
D'un point de vue conception actuellement tu as : "une unité exécute un ordre" si plusieurs unités exécutent le même ordre (un move avec plusieurs unités de sélectionné par exemple) chaque unité va calculer la même chose. Avec des classes bien faites tu auras : "un ordre controle des unités", donc par exemple l'ordre move calculera une seule fois le chemin et déplacera les unités, peu importe le nombre d'unité, l'ordre ne sera calculé qu'une seule fois.
Du coup il te faudra une queue d'unité qui ne font rien, et c'est l'ordre qui ira prendre les unités de libres ou qui attendra qu'une unité se libère.
Faire comme ça est beaucoup plus complexe à mettre en place (ça reste à la portée d'un débutant
) mais permet de faire des jeux beaucoup plus gros plus rapidement.