librairie python pour modifier/enrichir les missions
librairie python pour modifier/enrichir les missions
#1Hello,
Histoire de me former à l'usage des classes en python, j'ai engagé la realisation d'une librairie python permettant de lire/modifier/sauvegarder les missions d'IL2GB.
L'idée est de concentrer dans l'éditeur 3D tout ce qui concerne la création/placement d'objets et autre mise à jour de propriétés nécéssitant l'IHM, et de pousser dans l'usage de la libraire toute la mécanique de la mission, basée sur l'usage des MCU qui est très lourdingue à la longue.
L'idée est d'avoir une mission définie en 2 composants:
* La partie 3D dans l'éditeur de mission ne contenant que le strict necessaire
* La partie python faisant toute la logique de la mission.
La selection des objets se faisant par critères, on peut espérer que la maintenabiltié et la re utilisabilité sera grandement améliorée.
J'ai pu valider que la base fonctionne : je sais lire et sauvegarder et accéder aux objets d'une mission générée par le mode carrière d'IL2, contenant ce genre de chose:
Map : "moscow-autumn"
Total number of objects : 7934
MCU_CheckZone : 30
MCU_Icon : 19
MCU_Timer : 90
MCU_TR_MissionBegin : 26
Vehicle : 24
MCU_TR_Entity : 42
MCU_CMD_AttackArea : 19
Block : 5438
MCU_Spawner : 12
MCU_Delete : 12
MCU_CMD_ForceComplete : 14
MCU_Deactivate : 51
MCU_Activate : 36
MCU_TR_CameraOperator : 1
MCU_H_PresetDescription : 1
MCU_Waypoint : 8
MCU_CMD_Land : 4
Plane : 11
MCU_CMD_Formation : 9
MCU_TR_Subtitle : 3
MCU_TR_MissionObjective : 2
MCU_Counter : 1
MCU_CMD_Cover : 2
Airfield : 2
MCU_Proximity : 4
Flag : 5
Group : 867
Ground : 167
Bridge : 1033
Je vais maintenant engager la rédaction des fonctions permettant de faire ceci :
selection d'objet par critère
application d'operation de modification sur l'ensemble des objets selectionnés.
La partie mise à jour des éléments clé/valeur et l'ajout de Targets ou d'Objects est deja quasi faite, mais j'aurai besoin de "use case" haut niveau pour mieux cibler ce qu'il faudrait faire.
Exemple :
pouvoir definir / ajouter les objets à activer au démarrage de la mission sans avoir à créer un seul timer
pouvoir transformer un avion en un "flight", en lui associant un ensemble de waypoint qui seront aussi visibles sur la carte (il faudra juste repositionner les avions 'fils' une fois la mission générée)
definir les critères de succès et d'echec de la mission
charger un groupe contenant les objets (blocks) de la carte en supprimant automatiquement ceux en dehors d'une zone geographique
Je n'ai jamais créé de mission autres que basiques, donc je ne sais ce qu'il faudrait viser pour atteindre une cible visant à grandement simplifier la vie des créateurs de mission...Votre avis sera le bienvenu.
Bien sur, je vais mettre tout le code dans GitHub afin que tout un chacun puisse le faire vivre et l'enrichir, je n'aurai pas le temps d'assumer la vie courante de ce bouzin.
Histoire de me former à l'usage des classes en python, j'ai engagé la realisation d'une librairie python permettant de lire/modifier/sauvegarder les missions d'IL2GB.
L'idée est de concentrer dans l'éditeur 3D tout ce qui concerne la création/placement d'objets et autre mise à jour de propriétés nécéssitant l'IHM, et de pousser dans l'usage de la libraire toute la mécanique de la mission, basée sur l'usage des MCU qui est très lourdingue à la longue.
L'idée est d'avoir une mission définie en 2 composants:
* La partie 3D dans l'éditeur de mission ne contenant que le strict necessaire
* La partie python faisant toute la logique de la mission.
La selection des objets se faisant par critères, on peut espérer que la maintenabiltié et la re utilisabilité sera grandement améliorée.
J'ai pu valider que la base fonctionne : je sais lire et sauvegarder et accéder aux objets d'une mission générée par le mode carrière d'IL2, contenant ce genre de chose:
Map : "moscow-autumn"
Total number of objects : 7934
MCU_CheckZone : 30
MCU_Icon : 19
MCU_Timer : 90
MCU_TR_MissionBegin : 26
Vehicle : 24
MCU_TR_Entity : 42
MCU_CMD_AttackArea : 19
Block : 5438
MCU_Spawner : 12
MCU_Delete : 12
MCU_CMD_ForceComplete : 14
MCU_Deactivate : 51
MCU_Activate : 36
MCU_TR_CameraOperator : 1
MCU_H_PresetDescription : 1
MCU_Waypoint : 8
MCU_CMD_Land : 4
Plane : 11
MCU_CMD_Formation : 9
MCU_TR_Subtitle : 3
MCU_TR_MissionObjective : 2
MCU_Counter : 1
MCU_CMD_Cover : 2
Airfield : 2
MCU_Proximity : 4
Flag : 5
Group : 867
Ground : 167
Bridge : 1033
Je vais maintenant engager la rédaction des fonctions permettant de faire ceci :
selection d'objet par critère
application d'operation de modification sur l'ensemble des objets selectionnés.
La partie mise à jour des éléments clé/valeur et l'ajout de Targets ou d'Objects est deja quasi faite, mais j'aurai besoin de "use case" haut niveau pour mieux cibler ce qu'il faudrait faire.
Exemple :
pouvoir definir / ajouter les objets à activer au démarrage de la mission sans avoir à créer un seul timer
pouvoir transformer un avion en un "flight", en lui associant un ensemble de waypoint qui seront aussi visibles sur la carte (il faudra juste repositionner les avions 'fils' une fois la mission générée)
definir les critères de succès et d'echec de la mission
charger un groupe contenant les objets (blocks) de la carte en supprimant automatiquement ceux en dehors d'une zone geographique
Je n'ai jamais créé de mission autres que basiques, donc je ne sais ce qu'il faudrait viser pour atteindre une cible visant à grandement simplifier la vie des créateurs de mission...Votre avis sera le bienvenu.
Bien sur, je vais mettre tout le code dans GitHub afin que tout un chacun puisse le faire vivre et l'enrichir, je n'aurai pas le temps d'assumer la vie courante de ce bouzin.
Re: librairie python pour modifier/enrichir les missions
#2la première demande sera remplie par ce qui est prévu. Et je dirai même qu'il serait très facile de les mettre a jour (pour une nouvelle mission) tels qu'ils ont été laissés a la fin de la précédente, si tu as les infos dans les logs de celle-ci.
Par contre, je ne comprend pas la deuxieme demande...S'il s'agit d'ajouter au champ "objet" ou "target" d'un ou plusieurs objet (selectionnés precedemment par n'importe quel critère, donc y compris géographique) une ou plusieurs cibles elles mêmes trouvées par des critères, oui c'est aussi prévu.
Re: librairie python pour modifier/enrichir les missions
#3Bon, ca commence à prendre forme. La partie requète est finalisée, la partie modification aussi.
Exemple sur une petite mission avec quelques objets et des groupes empilés:
Reste maintenant à ajouter les parties cibles "Target" et "Objet", puis à gérer "OnReport" et "OnEvent", ensuite je pourrais passer aux fonctions de "haut niveau".
Exemple sur une petite mission avec quelques objets et des groupes empilés:
Code python sur la mission (les lignes commecant par # sont des commentaires)Map : "lapino-winter"
Total number of objects : 16
Plane : 3
MCU_TR_Entity : 4
Vehicle : 3
MCU_Counter : 1
MCU_CMD_Land : 1
Group : 3
maximum Index number : 20
Mission contain
ID:4, Type = Plane, Name="Plane1", XPos=29054.343, AILevel=2
ID:7, Type = Plane, Name="Plane2", XPos=29718.886, AILevel=2
ID:18, Type = Plane, Name="Plane", XPos=29359.229, AILevel=2
ID:5, Type = MCU_TR_Entity, Name="Plane entity", XPos=29054.343
ID:8, Type = MCU_TR_Entity, Name="Plane entity", XPos=29718.886
ID:13, Type = MCU_TR_Entity, Name="Vehicle1 entity", XPos=29634.649
ID:16, Type = MCU_TR_Entity, Name="Vehicle2 entity", XPos=28998.185
ID:10, Type = Vehicle, Name="Vehicle", XPos=29435.909, AILevel=2
ID:12, Type = Vehicle, Name="Vehicle1", XPos=29634.649, AILevel=2
ID:15, Type = Vehicle, Name="Vehicle2", XPos=28998.185, AILevel=2
ID:19, Type = MCU_Counter, Name="Trigger Counter", XPos=30257.482
ID:20, Type = MCU_CMD_Land, Name="command Land", XPos=30586.111
Resultat des traitements:print("test on mission file reading")
newMission=Mission()
#Lecture et afichage d'un résumé de la mission
ReadMissionFromFile(newMission,"D:\\jeux\\IL-2 Sturmovik Great Battles\\data\\Missions\\MyMission.Mission")
print(newMission)
# affichage de certaines caracteristiques des objets
print("Mission contain")
objList = findObject(newMission)
print(scanObjectList(newMission, objList, 'Name', 'XPos', 'AILevel'))
print("***************************************")
# test de selection : on trouve les objets de type 'plane' dans un rayon de 1500m autour de l'objet nommé 'Plane1' et on les affiche en controle
print("test selection")
centerObj=findObject(newMission, Name='Plane1')
objList=findObjectInRange(newMission,centerObj, range=1500, Type='Plane')
print(scanObjectList(newMission, objList, 'Name', 'XPos', 'AILevel'))
print("***************************************")
# test de modification
print("test K/V modification")
# on definit ici des fonctions pour modifier XPos et Name
changedX = lambda obj: obj.PropList['XPos']+10
changedName = lambda obj: "\""+obj.PropList['Name'].replace("\"","")+"_test"+"\""
# pour les objets précédemment trouvés, on modifie XPos et Name avec les fonctions ci-dessus et on met AILevel avec une valeur à 1
modify_kv(newMission, objList, XPos=changedX, AILevel=1, Name=changedName)
#on affiche le resultat
print(scanObjectList(newMission, objList, 'Name', 'XPos', 'AILevel'))
En l'état on pourrait deja l'utiliser pour résoudre les problèmes de la nouvelle hauteur de la carte "Moscou".***************************************
test selection
ID:4, Type = Plane, Name="Plane1", XPos=29054.343, AILevel=2
ID:7, Type = Plane, Name="Plane2", XPos=29718.886, AILevel=2
***************************************
test K/V modification
ID:4, Type = Plane, Name="Plane1_test", XPos=29064.343, AILevel=1
ID:7, Type = Plane, Name="Plane2_test", XPos=29728.886, AILevel=1
Reste maintenant à ajouter les parties cibles "Target" et "Objet", puis à gérer "OnReport" et "OnEvent", ensuite je pourrais passer aux fonctions de "haut niveau".
Re: librairie python pour modifier/enrichir les missions
#4Salut !
T'as "gité" tout ton code ?
Qu'on aille voir le code complet parce que la je ne vois pas tes classes, ni même leur appel via leurs méthodes...
À moins que tu ai un import * en début de script ?
T'as "gité" tout ton code ?
Qu'on aille voir le code complet parce que la je ne vois pas tes classes, ni même leur appel via leurs méthodes...
À moins que tu ai un import * en début de script ?
Je suis donc je pense
J'ai choisi
La joie comme vengeance
Vae soli
Mass hysteria
J'ai choisi
La joie comme vengeance
Vae soli
Mass hysteria
Re: librairie python pour modifier/enrichir les missions
#5Pas encore parce que 1er jet pas tout a fait fini.
Oui, il y a un ou deux imports que j'ai oublié de copier coller, mais l'idée est surtout de montrer a quoi ça peut ressembler vu côté "End User" qui ne veut/peut pas trop developper en python.
La tripaille de classe, c'est pour ceux qui voudraient ajouter des nouvelles fonctions pour faciliter la vie de ceux qui font les missions. Sais pas si il y en aura...
Re: librairie python pour modifier/enrichir les missions
#6Ok ! Par contre là j'ai l'impression que tu importe des fonctions d'un autre module, ok, mais je ne vois pas de méthode de class ! Pas d'objet quoi...
C'est pas une critique hein, c'est juste par rapport à ton post de base, tu parlais de classe, donc j'ai pensé "class", donc POO....
En tout cas, faire des projets comme ça pour s'améliorer, je trouve ça super, je fais pareil
C'est pas une critique hein, c'est juste par rapport à ton post de base, tu parlais de classe, donc j'ai pensé "class", donc POO....
En tout cas, faire des projets comme ça pour s'améliorer, je trouve ça super, je fais pareil
Je suis donc je pense
J'ai choisi
La joie comme vengeance
Vae soli
Mass hysteria
J'ai choisi
La joie comme vengeance
Vae soli
Mass hysteria
Re: librairie python pour modifier/enrichir les missions
#7C'est fait pour. Ca doit être hyper simple a utiliser pour le créateur de mission. Les classes sont cachées de l'utilisateur, sauf pour les fonctions lambda ou la il faut bien que tu accedes aux infos de l'objet...
newMission par exemple est une instance de la classe Mission.
Re: librairie python pour modifier/enrichir les missions
#8Et t'as des méthodes sur tes class?
On devrait voir newMission.methode1 par exemple, à moins que tu les ai dissimulé dans tes fonctions ? (findObject par exemple)
Je répète que je ne cherche pas des noise à ton code hein, j'essaye de comprendre et de contribuer, et t'aider si besoin et si c'est dans mes cordes
On devrait voir newMission.methode1 par exemple, à moins que tu les ai dissimulé dans tes fonctions ? (findObject par exemple)
Je répète que je ne cherche pas des noise à ton code hein, j'essaye de comprendre et de contribuer, et t'aider si besoin et si c'est dans mes cordes
Je suis donc je pense
J'ai choisi
La joie comme vengeance
Vae soli
Mass hysteria
J'ai choisi
La joie comme vengeance
Vae soli
Mass hysteria
Re: librairie python pour modifier/enrichir les missions
#9il y a des méthodes et des fonctions, car des fois c'est plus simple quand il s'agit de combiner des choses. Par exemple, tu as des methodes sur un objet mission, mais quid quand tu as besoin d'accéder a des choses qui dependent d'un autre objet lié (genre le mcu qui est créé quand tu actives un objet) ? Une méthode ne concerne que l'objet en lui meme...
Et je suis plutot un tacheron du python, donc faut pas non plus espérer voir du code de haut vol.
Et je suis plutot un tacheron du python, donc faut pas non plus espérer voir du code de haut vol.
Re: librairie python pour modifier/enrichir les missions
#10Justement, moi je n'ai jamais créé ni touché de fichier mission pour IL2 (je l'ai mais à peine pris en main j'avoue), par contre en python je suis pas trop mauvais, et vu que l'objet de ton post c'est de t'améliorer, si je peux aider
Par exemple ton exemple entre parenthèse j'ai pas compris ce que tu veux faire, ne connaissant pas l'édition de mission IL2..
Pour revenir à l'objet, tu as les méthodes, et tu as aussi les propriétés, qui semblent adaptées pour justement accéder à la donnée liée à un objet..
Ce qui est un peu dur en POO au début c'est de justement bien penser ce qu'est notre objet, comment on y accède et comment on interagit avec !
Si ton objet c'est une mission, tu peux avoir une méthode mettons, je dis n'importe quoi, qui permet de définir l'heure de takeoff, genre mission.setTakeofftime, qui est au final une simple fonction (def) dans ta class "mission", et cette méthode modifie la valeur de la propriété mission.takeoffTime. A laquelle tu peux accéder via une autre méthode, de lecture (get) par exemple ! (qui ne fait que lire la valeur et la retourne)
Du coup en créant plusieurs objets tu jongle avec les valeurs de chaque.
Et quand on crée une librairie, en général on préfère créer une méthode pour lire une propriété plutôt que d'accéder à la propriété elle même, ce que python autorise mais qui n'est pas dans "les règles de l'art"
Mais on peut aussi penser complètement différemment en disant que avion c'est un objet, dca un autre, piste encore un autre, environnement un autre (avec l'heure et la météo par exemple), je parle generiquement parce que je connais pas assez la structure des fichiers que tu modifie pour te donner un exemple ou une proposition plus pertinente
Même si ton code n'est pas fini, tu peux le giter quand-même et on regarde
Par exemple ton exemple entre parenthèse j'ai pas compris ce que tu veux faire, ne connaissant pas l'édition de mission IL2..
Pour revenir à l'objet, tu as les méthodes, et tu as aussi les propriétés, qui semblent adaptées pour justement accéder à la donnée liée à un objet..
Ce qui est un peu dur en POO au début c'est de justement bien penser ce qu'est notre objet, comment on y accède et comment on interagit avec !
Si ton objet c'est une mission, tu peux avoir une méthode mettons, je dis n'importe quoi, qui permet de définir l'heure de takeoff, genre mission.setTakeofftime, qui est au final une simple fonction (def) dans ta class "mission", et cette méthode modifie la valeur de la propriété mission.takeoffTime. A laquelle tu peux accéder via une autre méthode, de lecture (get) par exemple ! (qui ne fait que lire la valeur et la retourne)
Du coup en créant plusieurs objets tu jongle avec les valeurs de chaque.
Et quand on crée une librairie, en général on préfère créer une méthode pour lire une propriété plutôt que d'accéder à la propriété elle même, ce que python autorise mais qui n'est pas dans "les règles de l'art"
Mais on peut aussi penser complètement différemment en disant que avion c'est un objet, dca un autre, piste encore un autre, environnement un autre (avec l'heure et la météo par exemple), je parle generiquement parce que je connais pas assez la structure des fichiers que tu modifie pour te donner un exemple ou une proposition plus pertinente
Même si ton code n'est pas fini, tu peux le giter quand-même et on regarde
Je suis donc je pense
J'ai choisi
La joie comme vengeance
Vae soli
Mass hysteria
J'ai choisi
La joie comme vengeance
Vae soli
Mass hysteria
Re: librairie python pour modifier/enrichir les missions
#11Ca y est, j'ai publié la 1.0, c'est ici : https://github.com/lefufu/PylGBMiMec
Elle contient un fichier template qui permet de répondre aux 3 besoins suivants:
1) changer les propriétés d'un ensemble d'object, en ajoutant par exemple +50 à YPos.
2) changer la 'country' d'un ensemble d'objet dans un rayon autour d'un autre object (MCU)
3) changer les scripts et country utilisés dans des complex trigger pour par exemple les adapter aux appareils de la mission, si on les a importés d'un groupe "template".
Tout est écrit avec mon anglais, j'ai la flemme de retraduire en Francais.
Il y a un readme sur la page d'acceuil qui explique à quoi ca sert, comment l'installer.
Je dois démarrer le wiki pour expliquer plus en détail les fonctions, leur paramétres et les propriétés que l'on peut utiliser pour les recherches et les modifications.
Le plus interessant est le fichier template qui montre comment ca marche avec une petite mission démo (qui ne marche pas dans IL2, elle n'est pas cablée pour ca. L'objectif est de vérifier dans l'éditeur de mission que les changements sont OK).
Comme d'habitude, je n'ai pas eu le temps de tester intensivement. Il se peut que des choses "sautent" entre l'entrée et la sortie. J'ai validé avec la mission du tutorial de prangster que tout passe sans erreur en relisant dans l'éditeur de mission et fait des tests unitaire, mais rien dans IL2.
Si soucis il faudra le reporter afin que je corrige.
Pour Jaguar, merci de ne pas me remonter de choses sur le code. Ca marche comme ca et je n'ai pas envie de passer du temps à modifier pour être plus "académique". Par contre, si tu veux l'enrichir pas de soucis, mais il faudra que tu comprennes comment marche l'éditeur de mission. Tu peux commencer par la : https://forum.il2sturmovik.com/topic/26 ... er-manual/ ou la : https://forum.il2sturmovik.com/topic/17 ... ing-guide/
Merci de vos retours sur l'utilisation du truc (si toutefois il y a des volontaires). Je pense que c'est le socle qui permettrait de faire des choses qui rendraient la vie vraiment plus facile aux créateurs de mission. Mais il reste encore beaucoup de fonctions à implémenter pour cela.
Elle contient un fichier template qui permet de répondre aux 3 besoins suivants:
1) changer les propriétés d'un ensemble d'object, en ajoutant par exemple +50 à YPos.
2) changer la 'country' d'un ensemble d'objet dans un rayon autour d'un autre object (MCU)
3) changer les scripts et country utilisés dans des complex trigger pour par exemple les adapter aux appareils de la mission, si on les a importés d'un groupe "template".
Tout est écrit avec mon anglais, j'ai la flemme de retraduire en Francais.
Il y a un readme sur la page d'acceuil qui explique à quoi ca sert, comment l'installer.
Je dois démarrer le wiki pour expliquer plus en détail les fonctions, leur paramétres et les propriétés que l'on peut utiliser pour les recherches et les modifications.
Le plus interessant est le fichier template qui montre comment ca marche avec une petite mission démo (qui ne marche pas dans IL2, elle n'est pas cablée pour ca. L'objectif est de vérifier dans l'éditeur de mission que les changements sont OK).
Comme d'habitude, je n'ai pas eu le temps de tester intensivement. Il se peut que des choses "sautent" entre l'entrée et la sortie. J'ai validé avec la mission du tutorial de prangster que tout passe sans erreur en relisant dans l'éditeur de mission et fait des tests unitaire, mais rien dans IL2.
Si soucis il faudra le reporter afin que je corrige.
Pour Jaguar, merci de ne pas me remonter de choses sur le code. Ca marche comme ca et je n'ai pas envie de passer du temps à modifier pour être plus "académique". Par contre, si tu veux l'enrichir pas de soucis, mais il faudra que tu comprennes comment marche l'éditeur de mission. Tu peux commencer par la : https://forum.il2sturmovik.com/topic/26 ... er-manual/ ou la : https://forum.il2sturmovik.com/topic/17 ... ing-guide/
Merci de vos retours sur l'utilisation du truc (si toutefois il y a des volontaires). Je pense que c'est le socle qui permettrait de faire des choses qui rendraient la vie vraiment plus facile aux créateurs de mission. Mais il reste encore beaucoup de fonctions à implémenter pour cela.
Re: librairie python pour modifier/enrichir les missions
#12Aucun souci, je te laisse là
En tout cas c'est un super boulot et excellent pour se perfectionner, c'est le genre de projet qui permet de se former ET d'être utile à une communauté, donc un grand bravo à toi
Je ne vais pas l'enrichir car ça n'est pas du tout mon envie, quand j'aurai le temps de m'y remettre j'ai déjà un projet en cours pour de la famille et je ne trouve pas le temps de finir
Je n'intervenais que parce que tu avais mis "Histoire de me former à l'usage des classes en python" dans ton premier message et que je pensais réellement que tu voulais des retours "techniques" sur ton code! Voyant ton message disant vouloir progresser sur les classes et n'en voyant pas dans ton bout de code (je les vois maintenant avec ton code complet, y aurait des choses à dire, mais bon comme tu dit ça fonctionne, c'est super ), j'ai pensé pouvoir t'aider si tu le souhaitais. Je pense que j'ai mal compris ton intention de départ, aucun souci, désolé de t'avoir saoulé en tout cas
Bravo encore, bonne continuation, merci pour la communauté, et fly safe
En tout cas c'est un super boulot et excellent pour se perfectionner, c'est le genre de projet qui permet de se former ET d'être utile à une communauté, donc un grand bravo à toi
Je ne vais pas l'enrichir car ça n'est pas du tout mon envie, quand j'aurai le temps de m'y remettre j'ai déjà un projet en cours pour de la famille et je ne trouve pas le temps de finir
Je n'intervenais que parce que tu avais mis "Histoire de me former à l'usage des classes en python" dans ton premier message et que je pensais réellement que tu voulais des retours "techniques" sur ton code! Voyant ton message disant vouloir progresser sur les classes et n'en voyant pas dans ton bout de code (je les vois maintenant avec ton code complet, y aurait des choses à dire, mais bon comme tu dit ça fonctionne, c'est super ), j'ai pensé pouvoir t'aider si tu le souhaitais. Je pense que j'ai mal compris ton intention de départ, aucun souci, désolé de t'avoir saoulé en tout cas
Bravo encore, bonne continuation, merci pour la communauté, et fly safe
Je suis donc je pense
J'ai choisi
La joie comme vengeance
Vae soli
Mass hysteria
J'ai choisi
La joie comme vengeance
Vae soli
Mass hysteria