C++ code to reverse engineer parties.txt file to Python code

Users who are viewing this thread

nath9091

Recruit
This code should reverse engineer most parties.txt files. If you experience any problems do say. If you find it useful or used it in creating your mod then it'd be great if you could say so here or in your mod acknowledgements list. The code isn't perfect and doubtless to proper coders will show lots of inefficiency, but I find it works. The original purpose of this code was to get the co-ordinates of towns from the map editor into Python, but use it for anything you want. Issues at the moment are that it won't recognise many troop types. To use place parties.txt file in the same folder as your code and then run. A new txt file called ModuleParties.txt should then appear.

Took about a day, but I'm an awful coder.

Code:
#include <iostream>
#include <fstream.h>

using namespace std;

int main()
{
    string partiestexttake, partiestext, ptest, retriever1,retriever2,module;
    char othernumbers;
    int x,y,z,length,startnumber,othernumber;
    y,z = 0;
 
   ifstream ifs ( "parties.txt" , ifstream::in );

  while (ifs.good())
  {
        partiestexttake= (char) ifs.get();
        partiestext=partiestext+partiestexttake;
}
  ifs.close();

length = partiestext.size();
cout << "Length of Parties Text is:" << length << "\n";
    startnumber = 0;
    module= "from header_common import *\nfrom header_parties import *\nfrom ID_troops import *\nfrom ID_factions import *\nfrom ID_party_templates import *\nfrom ID_map_icons import *\n\n####################################################################################################################\n";
    module=module+"#  Each party record contains the following fields:\n#  1) Party id: used for referencing parties in other files.\n#     The prefix p_ is automatically added before each party id.\n";
    module=module+"#  2) Party name.\n#  3) Party flags. See header_parties.py for a list of available flags\n#  4) Menu. ID of the menu to use when this party is met. The value 0 uses the default party encounter system.\n";
    module=module+"#  5) Party-template. ID of the party template this party belongs to. Use pt_none as the default value.\n#  6) Faction.\n#  7) Personality. See header_parties.py for an explanation of personality flags.\n";
    module=module+"#  8) Ai-behavior\n#  9) Ai-target party\n# 10) Initial coordinates.\n# 11) List of stacks. Each stack record is a triple that contains the following fields:\n";
    module=module+"#   11.1) Troop-id.\n#   11.2) Number of troops in this stack. \n#   11.3) Member flags. Use pmf_is_prisoner to note that this member is a prisoner.\n# 12) Party direction in degrees [optional]\n";
    module=module+"####################################################################################################################\n\n";
    module=module+"no_menu = 0\n#pf_town = pf_is_static|pf_always_visible|pf_hide_defenders|pf_show_faction\npf_town = pf_is_static|pf_always_visible|pf_show_faction|pf_label_large\n";
    module=module+"pf_castle = pf_is_static|pf_always_visible|pf_show_faction|pf_label_medium\npf_village = pf_is_static|pf_always_visible|pf_hide_defenders|pf_label_small\n\n#sample_party = [(trp_swadian_knight,1,0), (trp_swadian_peasant,10,0), (trp_swadian_crossbowman,1,0), (trp_swadian_man_at_arms, 1, 0), (trp_swadian_footman, 1, 0), (trp_swadian_militia,1,0)]\n\n";
    module=module+"# NEW TOWNS:\n# NORMANDY: Rouen, Caen, Bayeux, Coutances, Evreux, Avranches\n# Brittany: Rennes, Nantes,\n# Maine: Le Mans\n# Anjou: Angers\nparties = [\n";
startnumber=0;
while(startnumber<length)
{

if(z==0)
{
    for(startnumber=0; startnumber < length;)
    {
                ptest=partiestext.substr(startnumber,2);
                if(ptest == "p_")
                {
                         othernumber=startnumber;
                         break;
                }       
                startnumber++;
    }
    z=1;
}

if(z==1)
{
        
    for(startnumber=othernumber; startnumber < length;)
    {
                ptest=partiestext.substr(startnumber,2);
                if(ptest == "p_")
                {
                         module = module+"  (\"";
                         othernumber=startnumber;

                         break;
                }       
                startnumber++;
    }
}
    
    for(startnumber=othernumber+2; startnumber < length;)
    {
                       retriever1 = partiestext.substr(startnumber,1);    
                       ptest=partiestext.substr(startnumber,1);
                       if(ptest == " ")
                       {
                                module=module+retriever2;
                                module=module+"\",\"";
                                othernumber=startnumber;
                                retriever1,retriever2="";
                                break;
                                }
                       retriever2 = retriever2+retriever1;  
                       startnumber++;
    }
    
    for(startnumber=othernumber+1; startnumber < length;)
    {
    retriever1 = partiestext.substr(startnumber,1);
    if(retriever1==" ")
    {
                    module=module+retriever2;
                    module=module+"\",  ";
                    othernumber=startnumber;
                    retriever1,retriever2="";
                    break;
                    }
    retriever2 = retriever2+retriever1;
    startnumber++;
}

for(startnumber=othernumber+1; startnumber < length;)
{
                             retriever1 = partiestext.substr(startnumber,1);
                             if(retriever2=="256")
                             {
                                                      module=module+"pf_disabled, ";
                                                      othernumber=startnumber;
                                                      retriever1,retriever2="";
                                                      break;
                             }
                             if(retriever2=="4219916")
                             {
                                                      module=module+"icon_town|pf_town, ";
                                                      othernumber=startnumber;
                                                      retriever1,retriever2="";
                                                      break;
                             }
                             if(retriever2=="2114828")
                             {
                                                      module=module+"pf_disabled|icon_town|pf_is_static|pf_always_visible|pf_hide_defenders, ";
                                                      othernumber=startnumber;
                                                      retriever1,retriever2="";
                                                      break;
                             }
                             if(retriever2=="1048576")
                             {
                                                      module=module+"icon_player|pf_limit_members, ";
                                                      othernumber=startnumber;
                                                      retriever1,retriever2="";
                                                      break;
                             }
                             if(retriever2=="4219928")
                             {
                                                      module=module+"icon_town_snow|pf_town, ";
                                                      othernumber=startnumber;
                                                      retriever1,retriever2="";
                                                      break;
                             }
                             if(retriever2=="4219917")
                             {
                                                      module=module+"icon_town_steppe|pf_town, ";
                                                      othernumber=startnumber;
                                                      retriever1,retriever2="";
                                                      break;
                             }
                             if(retriever2=="4215828")
                             {
                                                      module=module+"icon_castle_a|pf_castle, ";
                                                      othernumber=startnumber;
                                                      retriever1,retriever2="";
                                                      break;
                             }
                             if(retriever2=="4215829")
                             {
                                                      module=module+"icon_castle_b|pf_castle, ";
                                                      othernumber=startnumber;
                                                      retriever1,retriever2="";
                                                      break;
                             }
                             if(retriever2=="4215830")
                             {
                                                      module=module+"icon_castle_c|pf_castle, ";
                                                      othernumber=startnumber;
                                                      retriever1,retriever2="";
                                                      break;
                             }
                             if(retriever2=="4215831")
                             {
                                                      module=module+"icon_castle_d|pf_castle, ";
                                                      othernumber=startnumber;
                                                      retriever1,retriever2="";
                                                      break;
                             }
                             if(retriever2=="4215836")
                             {
                                                      module=module+"icon_castle_snow_a|pf_castle, ";
                                                      othernumber=startnumber;
                                                      retriever1,retriever2="";
                                                      break;
                             }
                             if(retriever2=="2114574")
                             {
                                                      module=module+"icon_village_a|pf_village, ";
                                                      othernumber=startnumber;
                                                      retriever1,retriever2="";
                                                      break;
                             }
                             if(retriever2=="2114585")
                             {
                                                      module=module+"icon_village_snow_a|pf_village, ";
                                                      othernumber=startnumber;
                                                      retriever1,retriever2="";
                                                      break;
                             }
                             if(retriever2=="2114830")
                             {
                                                      module=module+"icon_village_a|pf_disabled|pf_is_static|pf_always_visible|pf_hide_defenders, ";
                                                      othernumber=startnumber;
                                                      retriever1,retriever2="";
                                                      break;
                             }
                             if(retriever2=="2639116")
                             {
                                                      module=module+"icon_town|pf_disabled|pf_is_static|pf_always_visible|pf_no_label|pf_hide_defenders, ";
                                                      othernumber=startnumber;
                                                      retriever1,retriever2="";
                                                      break;
                             }
                             if(retriever2=="2114848")
                             {
                                                      module=module+"pf_disabled|icon_training_ground|pf_hide_defenders|pf_is_static|pf_always_visible, ";
                                                      othernumber=startnumber;
                                                      retriever1,retriever2="";
                                                      break;
                             }
                             if(retriever2=="2118688")
                             {
                                                      module=module+"icon_training_ground|icon_training_ground|pf_hide_defenders|pf_is_static|pf_always_visible|pf_label_medium, ";
                                                      othernumber=startnumber;
                                                      retriever1,retriever2="";
                                                      break;
                             }
                             if(retriever2=="541729")
                             {
                                                      module=module+"icon_bridge_a|pf_is_static|pf_always_visible|pf_no_label, ";
                                                      othernumber=startnumber;
                                                      retriever1,retriever2="";
                                                      break;
                             }
                             if(retriever2=="541731")
                             {
                                                      module=module+"icon_bridge_snow_a|pf_is_static|pf_always_visible|pf_no_label, ";
                                                      othernumber=startnumber;
                                                      retriever1,retriever2="";
                                                      break;
                             }
                             if(retriever2=="541730")
                             {
                                                      module=module+"icon_bridge_b|pf_is_static|pf_always_visible|pf_no_label, ";
                                                      othernumber=startnumber;
                                                      retriever1,retriever2="";
                                                      break;
                             }
                             if(retriever2=="1280")
                             {
                                                      module=module+"pf_disabled|pf_is_static, ";
                                                      othernumber=startnumber;
                                                      retriever1,retriever2="";
                                                      break;
                             }
                             
                             retriever2 = retriever2+retriever1;
                             startnumber++;
}

for(startnumber=othernumber+1; startnumber < length;)
{
                             retriever1 = partiestext.substr(startnumber,1);
                             if(retriever1=="0")
                             {
                                                      module=module+"no_menu, ";
                                                      othernumber=startnumber;
                                                      retriever1,retriever2="";
                                                      break;
                             }
                             startnumber++;
}

for(startnumber=othernumber+1; startnumber < length;)
{
                             retriever1 = partiestext.substr(startnumber,1);
                             if(retriever1=="0")
                             {
                                                      module=module+"pt_none, ";
                                                      othernumber=startnumber;
                                                      retriever1,retriever2="";
                                                      break;
                             }
                             startnumber++;
}

for(startnumber=othernumber+1; startnumber < length;)
{
                             retriever1 = partiestext.substr(startnumber,2);
                             if(retriever1=="1 ")
                             {
                                                      module=module+"fac_commoners,0,ai_bhvr_hold,0,(";
                                                      othernumber=startnumber;
                                                      retriever1,retriever2="";
                                                      break;
                             }
                                                          if(retriever1=="2 ")
                             {
                                                      module=module+"fac_outlaws,0,ai_bhvr_hold,0,(";
                                                      othernumber=startnumber;
                                                      retriever1,retriever2="";
                                                      break;
                             }
                             if(retriever1=="3 ")
                             {
                                                      module=module+"fac_neutral,0,ai_bhvr_hold,0,(";
                                                      othernumber=startnumber;
                                                      retriever1,retriever2="";
                                                      break;
                             }
                             if(retriever1=="12")
                             {
                                                      module=module+"fac_player_faction,0,ai_bhvr_hold,0,(";
                                                      othernumber=startnumber+1;
                                                      retriever1,retriever2="";
                                                      break;
                             }
                             startnumber++;
}

for(startnumber=othernumber+12; startnumber < length;)
{
                             retriever1 = partiestext.substr(startnumber,1);
                             if(retriever1==" ")
                             {
                                                      module=module+retriever2+",";
                                                      othernumber=startnumber;
                                                      retriever1,retriever2="";
                                                      break;
                             }
                             retriever2 = retriever2+retriever1;
                             startnumber++;
}


for(startnumber=othernumber+1; startnumber < length;)
{
                             retriever1 = partiestext.substr(startnumber,1);
                             if(retriever1==" ")
                             {
                                                      module=module+retriever2+"),[";
                                                      othernumber=startnumber;
                                                      retriever1,retriever2="";
                                                      break;
                             }
                             retriever2 = retriever2+retriever1;
                             startnumber++;
                                                        
}

for(startnumber=othernumber+1; startnumber < length;)
{
                             retriever1 = partiestext.substr(startnumber,5);
                             if(retriever1=="0.0 1")
                             {
                                                      module=module+"(";
                                                      othernumber=startnumber;
                                                      retriever1,retriever2="";
                                                      break;
                             }
                             if(retriever1=="0.0 0")
                             {
                                                      module=module+"]),\n";
                                                      y=1;
                                                      othernumber=startnumber;
                                                      retriever1,retriever2="";
                                                      break;
                             }
                             retriever2 = retriever2+retriever1;
                             startnumber++;
}

for(startnumber=othernumber+5; startnumber < length;)
{
                               if(y==1)
                               {
                               startnumber=startnumber-5;
                               break;
                               }

                             retriever1 = partiestext.substr(startnumber,3);
                             if(retriever1==" 0 ")
                             {
                                                      module=module+"trp_player,";
                                                      othernumber=startnumber+1;
                                                      retriever1,retriever2="";
                                                      break;
                             }
                             if(retriever1==" 3 ")
                             {
                                                      module=module+"trp_unarmed_troop,";
                                                      othernumber=startnumber+1;
                                                      retriever1,retriever2="";
                                       
                                                      break;
                             }
                             if(retriever1=="116")
                             {
                                                      module=module+"trp_looter,";
                                                      othernumber=startnumber+2;
                                                      retriever1,retriever2="";
                                       
                                                      break;
                             }
                             retriever2 = retriever2+retriever1;
                             startnumber++;                                                        
}

for(startnumber=othernumber+2; startnumber < length;)
{
                               if(y==1)
                               {
                               startnumber=startnumber-2;
                               break;
                               }
                             retriever1 = partiestext.substr(startnumber,1);
                             if(retriever1==" ")
                             {
                                                      module=module+retriever2+",";
                                                      othernumber=startnumber;
                                                      retriever1,retriever2="";
                                                      break;
                             }
                             retriever2 = retriever2+retriever1;
                             startnumber++;
                                                        
}                                                     

for(startnumber=othernumber+1; startnumber < length;)
{                             
                              if(y==1)
                               {
                               startnumber=startnumber-1;
                               y=0;
                               break;
                               }
                             retriever1 = partiestext.substr(startnumber,1);
                             if(retriever1==" ")
                             {
                                                      module=module+retriever2+")]),\n";
                                                      startnumber=startnumber+12;
                                                      othernumber=startnumber;
                                                      retriever1,retriever2="";
                                                      y=0;
                                                      break;
                             }
                             retriever2 = retriever2+retriever1;
                             startnumber++;
                                                        
}      

}
module=module+"]";

ofstream f("ModuleParties.txt");
length = module.size();
cout << "Length of Module Text is:" << length << "\n";
f << module;
f.close();
cout << "Done";
cin >> x;
}
 
nice code, but you are duplicating work a bit.  :wink:  also, you should include an executable to download, since not everybody will have the ability to compile this.

This reverse engineers the parties.txt file to create python code, mine updates it (so comments are maintained, etc), so this is more similar to kt0's script actually.

Update Module Parties - http://forums.taleworlds.com/index.php/topic,45772.0.html
kt0's party script - http://forums.taleworlds.com/index.php/topic,61873.0.html
 
0_8fc3e_b202ff07_L.jpg
 
Back
Top Bottom