librairie python pour modifier/enrichir les missions

Avatar de l’utilisateur

Topic author
lefuneste
Pilote Philanthrope
Pilote Philanthrope
Messages : 2142
Inscription : 26 février 2005

librairie python pour modifier/enrichir les missions

#1

Message par lefuneste »

Hello,
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.
Avatar de l’utilisateur

Topic author
lefuneste
Pilote Philanthrope
Pilote Philanthrope
Messages : 2142
Inscription : 26 février 2005

Re: librairie python pour modifier/enrichir les missions

#2

Message par lefuneste »

Genius a écrit :
dim. août 30, 2020 5:57 pm
Ce qui serait bien :
- pouvoir endommager les objets statiques sur une zone spécifique
- pouvoir donner une entité à un objet, groupe d'objets dans une zone spécifique
la 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.
Avatar de l’utilisateur

Topic author
lefuneste
Pilote Philanthrope
Pilote Philanthrope
Messages : 2142
Inscription : 26 février 2005

Re: librairie python pour modifier/enrichir les missions

#3

Message par lefuneste »

Bon, 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:
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
Code python sur la mission (les lignes commecant par # sont des commentaires)
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'))
Resultat des traitements:
***************************************
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
En l'état on pourrait deja l'utiliser pour résoudre les problèmes de la nouvelle hauteur de la carte "Moscou".
Reste maintenant à ajouter les parties cibles "Target" et "Objet", puis à gérer "OnReport" et "OnEvent", ensuite je pourrais passer aux fonctions de "haut niveau".
Avatar de l’utilisateur

Jaguar
Pilote Philanthrope
Pilote Philanthrope
Messages : 3413
Inscription : 17 novembre 2001

Re: librairie python pour modifier/enrichir les missions

#4

Message par Jaguar »

Salut !
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
Avatar de l’utilisateur

Topic author
lefuneste
Pilote Philanthrope
Pilote Philanthrope
Messages : 2142
Inscription : 26 février 2005

Re: librairie python pour modifier/enrichir les missions

#5

Message par lefuneste »

Jaguar a écrit :
dim. sept. 06, 2020 4:34 pm
Salut !
T'as "gité" tout ton code ?
Pas 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...
Avatar de l’utilisateur

Jaguar
Pilote Philanthrope
Pilote Philanthrope
Messages : 3413
Inscription : 17 novembre 2001

Re: librairie python pour modifier/enrichir les missions

#6

Message par Jaguar »

Ok ! 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 ;)
Je suis donc je pense
J'ai choisi
La joie comme vengeance
Vae soli

Mass hysteria
Avatar de l’utilisateur

Topic author
lefuneste
Pilote Philanthrope
Pilote Philanthrope
Messages : 2142
Inscription : 26 février 2005

Re: librairie python pour modifier/enrichir les missions

#7

Message par lefuneste »

Jaguar a écrit :
dim. sept. 06, 2020 5:47 pm
Ok ! 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 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.
Avatar de l’utilisateur

Jaguar
Pilote Philanthrope
Pilote Philanthrope
Messages : 3413
Inscription : 17 novembre 2001

Re: librairie python pour modifier/enrichir les missions

#8

Message par Jaguar »

Et 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 :)
Je suis donc je pense
J'ai choisi
La joie comme vengeance
Vae soli

Mass hysteria
Avatar de l’utilisateur

Topic author
lefuneste
Pilote Philanthrope
Pilote Philanthrope
Messages : 2142
Inscription : 26 février 2005

Re: librairie python pour modifier/enrichir les missions

#9

Message par lefuneste »

il 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.
Avatar de l’utilisateur

Jaguar
Pilote Philanthrope
Pilote Philanthrope
Messages : 3413
Inscription : 17 novembre 2001

Re: librairie python pour modifier/enrichir les missions

#10

Message par Jaguar »

Justement, 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 :)
Je suis donc je pense
J'ai choisi
La joie comme vengeance
Vae soli

Mass hysteria
Avatar de l’utilisateur

Topic author
lefuneste
Pilote Philanthrope
Pilote Philanthrope
Messages : 2142
Inscription : 26 février 2005

Re: librairie python pour modifier/enrichir les missions

#11

Message par lefuneste »

Ca 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.
Avatar de l’utilisateur

Jaguar
Pilote Philanthrope
Pilote Philanthrope
Messages : 3413
Inscription : 17 novembre 2001

Re: librairie python pour modifier/enrichir les missions

#12

Message par Jaguar »

Aucun 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 :notworthy :notworthy :notworthy

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 :emlaugh: :crying:

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 :ouin:

Bravo encore, bonne continuation, merci pour la communauté, et fly safe :cheer: :cheer:
Je suis donc je pense
J'ai choisi
La joie comme vengeance
Vae soli

Mass hysteria
Répondre

Revenir à « Editeurs de missions et skins »