Special Aircraft Service
Individual Mods and Packs for IL-2 1946 => Skins, Maps, Missions & Campaigns => Campaigns => Topic started by: andqui on March 15, 2015, 08:29:23 AM
-
With the latest release of CUP providing a new platform for making campaigns, I'm releasing the first version of a campaign validator that I've been working on. This will scan the mission files in a campaign, as well as files in the IL2 installation of choice, and make sure that the aircraft, skins, weapon loadouts, objects, vehicles, ships, etc are all present and that nothing is missing.
A version with an executable and maybe a user interface is coming, but I'm releasing the script version early for any campaign maker who wants a head start in adapting their old campaigns up to the new standard. Download the script below, edit the first three lines to point to the campaign, STD, and skin folders. You also need to have Python 3.4.3 installed until I release a compiled version. Run it through the command line, "python main.py". You can use it for any modded installtion (CUP, HSFX, DBW, more) as long as you point it to the right STD folder.
WARNING: In CUP WAW, and possible other installs, the air.ini has some bad characters that cause the script to crash on some PC's. To be safe, open up your air.ini, go down to the Japanese A6M section, and delete the "@" character in the middle of the whitespace next to some of the entries, as well as some of the whitespace around it.
https://www.mediafire.com/download/8sog1rcs99smk92/Main.py (https://www.mediafire.com/download/8a72i2c9h7k57or/Main.py)
Here's a sample output of Poltava's Abbeville Boys campaign for 4.12, with CUP #WAW:
Reading mission abbeville-01.mis
Aircraft used: FW_190A5, SPITFIRE9C, TYPHOON1B
Chiefs used: Ger_Staff
Stationaries used: GenericSpawnPointPlane, VW82t, OpelBlitz6700A_fuel, OpelBlitz36S, Grossdeutscher_Rundfunk, FW_190A5, JU_52_3MG4E, OpelKadett, Flak18_37mm
Reading mission abbeville-02.mis
Aircraft used: A_20C, BF_109G6, FW_190A5, SPITFIRE9C, TYPHOON1B
Chiefs used: BikeBMW
Stationaries used: GenericSpawnPointPlane, VW82t, OpelBlitz6700A_fuel, OpelBlitz36S, Grossdeutscher_Rundfunk, FW_190A5, JU_52_3MG4E, OpelKadett, Flak18_37mm
Reading mission abbeville-03.mis
Aircraft used: FW_190A5, P_51A
Chiefs used: Germany_CargoFuelTrain, GermanyCarsColumnH
###Chief GermanyCarsColumnH not found!
Stationaries used: VW82t, OpelBlitz6700A_fuel, Siren, OpelBlitz36S, Grossdeutscher_Rundfunk, FW_190A5, JU_52_3MG4E, OpelKadett, Flak18_37mm
Reading mission abbeville-04.mis
Aircraft used: BF_109G6, B_24J100, FW_190A5, SPITFIRE5BLF, SPITFIRE925LBS, SPITFIRE9M63
Chiefs used: Germany_CargoTrain, GermanyCarsColumnH
###Chief GermanyCarsColumnH not found!
Stationaries used: GenericSpawnPointPlane, VW82t, OpelBlitz6700A_fuel, OpelBlitz36S, Grossdeutscher_Rundfunk, FW_190A5, JU_52_3MG4E, OpelKadett, Flak18_37mm
Reading mission abbeville-05.mis
Aircraft used: B_17F, FW_190A5, P_47D10
Chiefs used: BMW_MGr
Stationaries used: GenericSpawnPointPlane, VW82t, OpelBlitz6700A_fuel, OpelBlitz36S, Grossdeutscher_Rundfunk, FW_190A5, JU_52_3MG4E, OpelKadett, JU_88A4, Flak18_37mm
Reading mission abbeville-05b.mis
Aircraft used: B_17F, FW_190A5, P_38J
Chiefs used: BMW_MGr
Stationaries used: GenericSpawnPointPlane, VW82t, OpelBlitz6700A_fuel, OpelBlitz36S, Grossdeutscher_Rundfunk, FW_190A5, JU_52_3MG4E, OpelKadett, JU_88A4, Flak18_37mm
Reading mission abbeville-06.mis
Aircraft used: FW_190A5, TYPHOON1B
Chiefs used: Germany_CargoFuelTrain, OpelBlitz6700A_fuel
Stationaries used: GenericSpawnPointPlane, VW82t, OpelBlitz6700A_fuel, OpelBlitz36S, Grossdeutscher_Rundfunk, FW_190A5, JU_52_3MG4E, OpelKadett, Flak18_37mm
Reading mission abbeville-06b.mis
Aircraft used: FW_190A5, SPITFIRE9C
Chiefs used: Germany_CargoFuelTrain, OpelBlitz6700A_fuel
Stationaries used: GenericSpawnPointPlane, VW82t, OpelBlitz6700A_fuel, OpelBlitz36S, Grossdeutscher_Rundfunk, FW_190A5, JU_52_3MG4E, OpelKadett, Flak18_37mm
Reading mission abbeville-07.mis
Aircraft used: A_20C, FW_190A5, SPITFIRE9C
Chiefs used:
Stationaries used: GenericSpawnPointPlane, VW82t, OpelBlitz6700A_fuel, OpelBlitz36S, Grossdeutscher_Rundfunk, FW_190A5, JU_52_3MG4E, OpelKadett, Motorcycle, Flak18_37mm
Reading mission abbeville-08.mis
Aircraft used: BF_109G6, B_25C25, Do217_K2, FW_190A5, SPITFIRE9C
Chiefs used: Ger_Staff_HT
Stationaries used: GenericSpawnPointPlane, VW82t, OpelBlitz6700A_fuel, DO_217_K2, OpelBlitz36S, Grossdeutscher_Rundfunk, FW_190A5, JU_52_3MG4E, OpelKadett, Flak18_37mm
Reading mission abbeville-09.mis
Aircraft used: B_17F, FW_190A5, P_47D10
Chiefs used: BMW_MGr
Stationaries used: GenericSpawnPointPlane, VW82t, OpelBlitz6700A_fuel, DO_217_K2, OpelBlitz36S, Grossdeutscher_Rundfunk, FW_190A5, JU_52_3MG4E, OpelKadett, Flak18_37mm
Reading mission abbeville-09b.mis
Aircraft used: B_17F, FW_190A5, P_47D10
Chiefs used: BMW_MGr
Stationaries used: GenericSpawnPointPlane, VW82t, OpelBlitz6700A_fuel, DO_217_K2, OpelBlitz36S, Grossdeutscher_Rundfunk, FW_190A5, JU_52_3MG4E, OpelKadett, Flak18_37mm
Reading mission abbeville-10.mis
Aircraft used: B_17F, FW_190A5, SPITFIRE9C
Chiefs used:
Stationaries used: GenericSpawnPointPlane, VW82t, OpelBlitz6700A_fuel, DO_217_K2, OpelBlitz36S, Grossdeutscher_Rundfunk, FW_190A5, JU_52_3MG4E, OpelKadett, Flak18_37mm
Reading mission abbeville-11.mis
Aircraft used: BF_109G6, B_17F, FW_190A5, P_47D10
Chiefs used: VW82t
Stationaries used: GenericSpawnPointPlane
###Stationary vehicles.artillery.Artillery$Flak38_Vierling not found!
Reading mission abbeville-11b.mis
Aircraft used: BF_109G6, B_17F, FW_190A5, P_38J, P_47D10
Chiefs used: VW82t
Stationaries used: GenericSpawnPointPlane
###Stationary vehicles.artillery.Artillery$Flak38_Vierling not found!
Reading mission abbeville-12.mis
Aircraft used: BF_109G6, B_17F, FW_190A5, P_47D10
Chiefs used: BMW_MGr
Stationaries used: GenericSpawnPointPlane
###Stationary vehicles.artillery.Artillery$Flak38_Vierling not found!
###Static object House$AirdromeMaskingnetBig not found!
Reading mission abbeville-13.mis
Aircraft used: B_25C25, Do217_K1, FW_190A5
Chiefs used: OpelBlitz6700A
###Chief OpelBlitz6700A not found!
Stationaries used: GenericSpawnPointPlane
###Stationary vehicles.artillery.Artillery$Flak38_Vierling not found!
Reading mission abbeville-13b.mis
Aircraft used: B_25C25, Do217_K1, FW_190A5, SPITFIRE9C
Chiefs used: OpelBlitz6700A
###Chief OpelBlitz6700A not found!
Stationaries used: GenericSpawnPointPlane
###Stationary vehicles.artillery.Artillery$Flak38_Vierling not found!
Reading mission abbeville-14.mis
Aircraft used: BF_109G6, B_17F, FW_190A5, P_47D10
Chiefs used:
Stationaries used: GenericSpawnPointPlane
###Stationary vehicles.artillery.Artillery$Flak38_Vierling not found!
###Static object House$AirdromeMaskingnetBig not found!
Reading mission abbeville-15.mis
Aircraft used: BF_109G6, B_25C25, FW_190A5, SPITFIRE9C
Chiefs used: 2-OpelBlitz6700A, S80
###Chief 2-OpelBlitz6700A not found!
Stationaries used: GenericSpawnPointPlane
###Stationary vehicles.artillery.Artillery$Flak38_Vierling not found!
###Static object House$AirdromeMaskingnetBig not found!
Reading mission abbeville-16.mis
Aircraft used: BF_109G6, BF_110G2, B_17F, FW_190A5, P_47D10
Chiefs used: Ger_Staff, OpelBlitz6700A
###Chief OpelBlitz6700A not found!
Stationaries used: GenericSpawnPointPlane
###Stationary vehicles.artillery.Artillery$Flak38_Vierling not found!
###Static object House$AirdromeMaskingnetBig not found!
-
Great idea - THANKS! As an avid FMB-er this will of course speed up things enormously! :)
-
Fantastic, thanks! Been racking my brains trying to create this myself!
-
Great idea - THANKS! As an avid FMB-er this will of course speed up things enormously! :)
I'm glad. Go and pester the CUP makers to add anything that's missing. I'm sure the community will have to figure out something to do about the CUP changes, pretty much every modded campaign I've tried has had some issues with missing or renamed aircraft or objects.
-
thanks, it works great except I had to disable the skin checking part. I get this error:
files = os.listdir(path)
NotADirectoryError: [WinError 267] The directory name is invalid: 'G:\\IL2_HSFX_6.17_Copy\\PaintSchemes\\Skins\\Thumbs.db'
Here is my path entry:
##Path to Il2 paintschemes/skins folder
skinPath = "G:\\IL2_HSFX_6.17_Copy\\PaintSchemes\\Skins"
There is no 'Thumbs.db' folder or file in my Skins directory
If I change the path to
skinPath = "G:\\IL2_HSFX_6.17_Copy\\PaintSchemes"
then the script runs but of course it reports all skins as not found
Any idea?
Regards,
Martin
-
thanks, it works great except I had to disable the skin checking part. I get this error:
files = os.listdir(path)
NotADirectoryError: [WinError 267] The directory name is invalid: 'G:\\IL2_HSFX_6.17_Copy\\PaintSchemes\\Skins\\Thumbs.db'
Here is my path entry:
##Path to Il2 paintschemes/skins folder
skinPath = "G:\\IL2_HSFX_6.17_Copy\\PaintSchemes\\Skins"
There is no 'Thumbs.db' folder or file in my Skins directory
If I change the path to
skinPath = "G:\\IL2_HSFX_6.17_Copy\\PaintSchemes"
then the script runs but of course it reports all skins as not found
Any idea?
Regards,
Martin
Oops, I just need to make a separate folder check. I'll post a fixed version this evening.
-
thanks, it works great except I had to disable the skin checking part. I get this error:
files = os.listdir(path)
NotADirectoryError: [WinError 267] The directory name is invalid: 'G:\\IL2_HSFX_6.17_Copy\\PaintSchemes\\Skins\\Thumbs.db'
Here is my path entry:
##Path to Il2 paintschemes/skins folder
skinPath = "G:\\IL2_HSFX_6.17_Copy\\PaintSchemes\\Skins"
There is no 'Thumbs.db' folder or file in my Skins directory
If I change the path to
skinPath = "G:\\IL2_HSFX_6.17_Copy\\PaintSchemes"
then the script runs but of course it reports all skins as not found
Any idea?
Regards,
Martin
Updated version available at the link up top, try that instead. Should fix the skin issue.
-
Thanks andqui, this is a very useful tool for retro-checking. ;D
-
Thanks Andqui, it works fine now!
One suggestion - could it be made to report on multiple campaign files i.e. search in subfolders for campaign.ini and run the script on each campaign file. I'm thinking of one large report which could be run on the whole il2/missions/campaign folder. It could put the campaign name at the head of each set of mission analyses.
I've also edited your code to provide an 'exception only' report i.e. only show the missing stuff as I have a lot of campaigns to check!
Thanks again for this very promising development
Regards,
Martin
-
That's a very good idea
Thank you
-
Thanks for sharing your script andqui.
Very handy.
-
Great utility. Thanks.
-
Hi thanks again for this, it's really useful. I found a problem though - the script uses the first column of air.ini as the skinfolder name when checking for skins. This air.ini name is not always the same name as the skin folder e.g.
Air.ini skinfolder
Bf-109E-4/B Bf-109E-4_B
Ju-52/3mg4e Ju-52_3mg4e
On the examples above it is the backslash that is not allowed in folder names. Sorry I don't know where the skinfolder name is defined. It's not in the aircraft classfile nor is it the classfile name
Not a huge problem as it only affects a few a/c but will explain some 'false positives' on missing skins.
Regards,
M
-
Hi thanks again for this, it's really useful. I found a problem though - the script uses the first column of air.ini as the skinfolder name when checking for skins. This air.ini name is not always the same name as the skin folder e.g.
Air.ini skinfolder
Bf-109E-4/B Bf-109E-4_B
Ju-52/3mg4e Ju-52_3mg4e
On the examples above it is the backslash that is not allowed in folder names. Sorry I don't know where the skinfolder name is defined. It's not in the aircraft classfile nor is it the classfile name
Not a huge problem as it only affects a few a/c but will explain some 'false positives' on missing skins.
Regards,
M
I was told that it used the first column when searching for skins in another post here, so that's what I went with. If anyone knows how to reliably get the information without having to dig around in the compressed, compiled class files, I'd appreciate it. It's an easy fix if I know what to look for instead.
-
andqui, I'm new to Python but I have installed 3.4.3 and modified the Main.py file. However, when I run Python.exe and type "python main.py" and hit enter, it says syntax error. What am I doing wrong?
-
andqui, I'm new to Python but I have installed 3.4.3 and modified the Main.py file. However, when I run Python.exe and type "python main.py" and hit enter, it says syntax error. What am I doing wrong?
This assumes a basic knowledge of CMD/command prompt (the windows console).
The "python" part of "python main.py" runs python, you don't need to start running python.exe beforehand.
1. After installing python, make sure python.exe is added to your path:
https://www.google.com/webhp?sourceid=chrome-instant&ion=1&espv=2&ie=UTF-8#q=windows+add+to+path
2. To test if it's installed correctly, open up cmd and type "python", which should start the python console. Type "quit()" to close it, as this was just a test and you don't need to do this to run the script.
3. Then, in the console, change the directory to wherever you have main.py stored. For example: "cd C:\EXAMPLE\FOLDER\PATH".
The "cd" command changes the current directory to the path that follows it. Then, entering "python main.py" should open python and run the script. Remember to change the paths at the top of the script to point it to the correct IL2 directories. If you don't cd to where you have main.py stored, the "python main.py" command won't be able to find it and will say that there is no such file.
-
andqui/anyone, I don't mean to be a pain but I just can't get this to work. I believe I have it installed and setup properly but I keep getting this:
Traceback (most recent call last):
File "Main.py", line 16, in (module)
for line in airIni:
File "C:\Python34\lib\encodings\cp1252.py", line 23, in decode
return codecs.charmap_decode(input,self.errors,decoding_table)[0]
UnicodeDecodeError: 'charmap' codec can't decode byte 0x81 in position 434: character maps to (undefined)
Any help would be appreciated...
-
andqui/anyone, I don't mean to be a pain but I just can't get this to work. I believe I have it installed and setup properly but I keep getting this:
Traceback (most recent call last):
File "Main.py", line 16, in (module)
for line in airIni:
File "C:\Python34\lib\encodings\cp1252.py", line 23, in decode
return codecs.charmap_decode(input,self.errors,decoding_table)[0]
UnicodeDecodeError: 'charmap' codec can't decode byte 0x81 in position 434: character maps to (undefined)
Any help would be appreciated...
First off all, that's a good sign that you're running the script correctly, so that's progress. The error you just gave happens when the script can't decode/understand some of the bytes in a file, which is usually because of non-standard characters.
Go to your air.ini, scroll down to the Japanese A6M section. You should see a few of the entries have an @ sign in the whitespace next to them. Delete that @ sign, as well as a big chunk of the whitespace around it; I think those entries were originally written in a Japanese-language OS, and the character's don't translate cleanly to unicode. That should fix the problem, let me know if you have any more problems.
-
Go to your air.ini, scroll down to the Japanese A6M section. You should see a few of the entries have an @ sign in the whitespace next to them. Delete that @ sign, as well as a big chunk of the whitespace around it; I think those entries were originally written in a Japanese-language OS, and the character's don't translate cleanly to unicode. That should fix the problem, let me know if you have any more problems.
It works now! Thank you for the help...
-
Thanks for the script andqui!
I've tested it but I get this error:
Traceback <most recent call last>:
File "Main.py", line 58, in <<module>
stationaries [lineData[1] = lineData[0]
IndexError: list index out of range
Any ideas why?
-
Dear Andqui,
I downloaded Main.py and Python 3.4.3. I can open Main.py with Notepad and get your example, but then I am stuck. When I command "Python" I get a small screen on which I have to type I don't know what.
I am lost.
Best regards.
-
tartenmuche, please follow this instruction by andqui
This assumes a basic knowledge of CMD/command prompt (the windows console).
The "python" part of "python main.py" runs python, you don't need to start running python.exe beforehand.
1. After installing python, make sure python.exe is added to your path:
https://www.google.com/webhp?sourceid=chrome-instant&ion=1&espv=2&ie=UTF-8#q=windows+add+to+path
2. To test if it's installed correctly, open up cmd and type "python", which should start the python console. Type "quit()" to close it, as this was just a test and you don't need to do this to run the script.
3. Then, in the console, change the directory to wherever you have main.py stored. For example: "cd C:\EXAMPLE\FOLDER\PATH".
The "cd" command changes the current directory to the path that follows it. Then, entering "python main.py" should open python and run the script. Remember to change the paths at the top of the script to point it to the correct IL2 directories. If you don't cd to where you have main.py stored, the "python main.py" command won't be able to find it and will say that there is no such file.
-
Dear vonOben,
it doesn't help me to just give me the same instructions as Andqui.
When I use the link you recommend I get 127 millions of answers. It is a litlle bit to many for me. I don't want to change something on my computer that I don't understand and without being sure that I can go the reverse way.
Best regards.
-
vonOben, :) thank you for your Python skills, much appreciated !
Here is how I use it which may help others:
I got Python 3.5.0 rc4 which comes with IDLE (integrated development environment).
After installing Python, on my Windows 10 machine, .py are associated with IDLE so that I can, in Windows Explorer, with a right click choose "Edit with IDLE".
This lets you change the paths at the top of the script. Hit save.
Then there is a menu entry in IDLE, with "Run | Run Module F5", hit that and the script will ... run in a separate window, the Python shell.
Copy the whole shell output with "Edit | Copy ..." and paste in your text editor for further treatment.
Mine is Notepad++ which has a function to sort all lines by alphabetical order.
After sorting the lines, those starting with "###..." will be at the top, indicating where the issues are.
My next step is with TextCrawler to find and replace in multiple files at the same time...
-
Dear vonOben,
it doesn't help me to just give me the same instructions as Andqui.
When I use the link you recommend I get 127 millions of answers. It is a litlle bit to many for me. I don't want to change something on my computer that I don't understand and without being sure that I can go the reverse way.
Best regards.
Ok, I thought it was a very clear instruction....
When you install Python 3.4.3 there is an option during the installation where you can check "add Python to path", or something similar.
That's what I did.
-
Thank you Zoran395, it works.
-
I've tested it but I get this error:
Traceback <most recent call last>:
File "Main.py", line 58, in <<module>
stationaries [lineData[1] = lineData[0]
IndexError: list index out of range
Any ideas why?
Any ideas please?
-
Dear Andqui,
I used your script on a campaign named " Nightfighter1941" because I experienced a very low 9 fps. I got two results:
1) an object ###stationary vehicles.stationary.CandC$FireUnit was missing, I checked in the folder stationary.ini and this object was actually missing, I tried to add it by hand but without succes. So I changed FireUnit into NavUnit and got a 30fps.
2) surprisingly weapons for some planes were also given as missing though present in the STD weapons file, but without reducing the fps.
Any idea?
Best regards and happy new year.
-
Dear Andqui,
as written above I could improve the fps of a campaign with the help of your script.
Since I meet low fps also in single missions I would like to use it for single.
I tried in vain.
Could you please tell me the way?
Best regards.
-
Dear Andqui,
I used your script on a campaign named " Nightfighter1941" because I experienced a very low 9 fps. I got two results:
1) an object ###stationary vehicles.stationary.CandC$FireUnit was missing, I checked in the folder stationary.ini and this object was actually missing, I tried to add it by hand but without succes. So I changed FireUnit into NavUnit and got a 30fps.
2) surprisingly weapons for some planes were also given as missing though present in the STD weapons file, but without reducing the fps.
Any idea?
Best regards and happy new year.
.........................................
Dear Andqui,
as written above I could improve the fps of a campaign with the help of your script.
Since I meet low fps also in single missions I would like to use it for single.
I tried in vain.
Could you please tell me the way?
Best regards.
There can be some false positives with the weapons names. Check in the mission builder to make sure those weapons work and are present, if so, don't worry about the false positive.
As for the second question, you could either:
1) Trick it by making a fake campaign using the single missions, or copy over and add the single missions into an existing campaign, and they will be scanned.
or
2) You can try editing the code. Relevant part is down at the bottom, where I've commented "###Read missions." If you have no coding experience or don't know python it's probably easier just to do option 1 and trick the script.
-
I've tested it but I get this error:
Traceback <most recent call last>:
File "Main.py", line 58, in <<module>
stationaries [lineData[1] = lineData[0]
IndexError: list index out of range
Any ideas please?
-
I've tested it but I get this error:
Traceback <most recent call last>:
File "Main.py", line 58, in <<module>
stationaries [lineData[1] = lineData[0]
IndexError: list index out of range
Any ideas please?
What type of IL2 install is this? The error is happening while reading stationaries.ini, trying to read a line that's supposed to be a comment or something like that. The way it works, it reads the object if the line isn't whitespace and doesn't start with "[" or "//", so it's possible there's some format I missed.
If you add
print(line)
right above line 58 in the script, it will print out the line that's causing the trouble.
-
It's a DBW 1.71 installation.
I added the line as advised and it was these text lines that caused the error:
# ADDED BY |ZUTI|
#-----------------------------------------------------------
//[SpawnPlaceholder]
//Spawnplaceholder vehicles.planes.Plane$Spawnplaceholder 0
#-----------------------------------------------------------
When I removed this text the script worked fine!
Is it possible to make the script also ignore rows starting with #?
-
this is going to be fantastic when the bugz are done
-
New version here:
https://www.sas1946.com/main/index.php/topic,65584.0.html
5 years late, I know.