示例#1
0
        private void HandleAttributes(ref Attributes attributes, string[] data)
        {
            Attributes   attri        = Attributes.no_custom;
            LookUpTables lookUp       = new LookUpTables();
            bool         set_noCustom = false;

            attributes = attri;
            foreach (string str in data)
            {
                if (str != " ")
                {
                    Attributes obj;
                    if (Enum.TryParse <Attributes>(str.Trim(), out obj))
                    {
                        if ((Attributes)obj == Attributes.no_custom)
                        {
                            set_noCustom = true;
                        }
                        else
                        {
                            attributes |= obj;
                        }
                    }
                }
            }

            if (set_noCustom)
            {
                attributes |= Attributes.no_custom;
            }
            else
            {
                attributes &= ~Attributes.no_custom;
            }
        }
示例#2
0
        override public void Parse(string[] path, out int lineNumber, out string currentLine)
        {
            LookUpTables lt      = new LookUpTables();
            StreamReader sr      = new StreamReader(path[0]);
            string       line    = "";
            string       faction = "";

            lineNumber  = 0;
            currentLine = "";
            while ((line = sr.ReadLine()) != null)
            {
                lineNumber++;
                currentLine = line;
                if (line.StartsWith("faction"))
                {
                    string[] split = line.Split(' ');
                    faction = split[1].Trim();
                    names.Add(faction, new List <string>());
                }

                if (line.GetFirstWord() == "characters" && !line.StartsWith(";"))
                {
                    line = sr.ReadLine();
                    while (!line.Contains("women") && !line.Contains("faction") && !line.Contains("surnames"))
                    {
                        if (line.Trim() != "" && !line.Trim().Contains(";;") && !line.Trim().Contains(";") && CheckForNonASCII(line.Trim()))
                        {
                            names[faction].Add(line.Trim());
                        }
                        line = sr.ReadLine();
                    }
                }
            }
        }
示例#3
0
 private void M2TWHandleStatPri(ref M2StatWeapons stat_pri, string[] data)
 {
     if (data.Count() == 11)
     {
         LookUpTables lu = new LookUpTables();
         stat_pri.atk[0]      = Convert.ToInt32(data[0].Trim());
         stat_pri.atk[1]      = Convert.ToInt32(data[1].Trim());
         stat_pri.missAttr[0] = Convert.ToInt32(data[3].Trim());
         stat_pri.missAttr[1] = Convert.ToInt32(data[4].Trim());
         stat_pri.missType    = data[2].Trim();
         stat_pri.WepFlags    = lu.LookUpKey <WeaponType>(data[5].Trim());
         stat_pri.TechFlags   = (TechType)Enum.Parse(typeof(TechType), data[6].Trim());
         stat_pri.DmgFlags    = lu.LookUpKey <DamageType>(data[7].Trim());
         stat_pri.SoundFlags  = data[8].Trim();
         stat_pri.atkDly[0]   = Convert.ToInt32(data[9].Trim());
         stat_pri.atkDly[1]   = (float)Convert.ToDouble(data[10].Trim());
     }
     else if (data.Count() == 12)
     {
         LookUpTables lu = new LookUpTables();
         stat_pri.atk[0]          = Convert.ToInt32(data[0].Trim());
         stat_pri.atk[1]          = Convert.ToInt32(data[1].Trim());
         stat_pri.missAttr[0]     = Convert.ToInt32(data[3].Trim());
         stat_pri.missAttr[1]     = Convert.ToInt32(data[4].Trim());
         stat_pri.missType        = data[2].Trim();
         stat_pri.WepFlags        = lu.LookUpKey <WeaponType>(data[5].Trim());
         stat_pri.TechFlags       = (TechType)Enum.Parse(typeof(TechType), data[6].Trim());
         stat_pri.DmgFlags        = lu.LookUpKey <DamageType>(data[7].Trim());
         stat_pri.SoundFlags      = data[8].Trim();
         stat_pri.musket_shot_set = data[9].Trim();
         stat_pri.atkDly[0]       = Convert.ToInt32(data[10].Trim());
         stat_pri.atkDly[1]       = (float)Convert.ToDouble(data[11].Trim());
     }
 }
示例#4
0
        private void HandleMental(ref Mentality mental, string[] data)
        {
            LookUpTables lookUp = new LookUpTables();

            mental.morale     = Convert.ToInt32(data[0].Trim());
            mental.discipline = lookUp.LookUpKey <Statmental_discipline>(data[1].Trim());
            mental.training   = lookUp.LookUpKey <Statmental_training>(data[2].Trim());
        }
示例#5
0
        public async Task TestGetCompanyLookUp()
        {
            ILookUpTables test = new LookUpTables();

            var result = await test.GetCompanyLookUp();

            result.Should().HaveCount(28, "This is awesome");
        }
示例#6
0
        private void HandleOwnership(ref List <string> ownership, string[] data)
        {
            LookUpTables lookUp = new LookUpTables();

            foreach (string str in data)
            {
                //TODO add optional verification against smf file here
                ownership.Add(str.Trim());
            }
        }
示例#7
0
        override public void Parse(string[] paths, out int lineNumber, out string currentLine)
        {
            lineNumber  = 0;
            currentLine = "";
            if (!FileCheck(paths[0]))
            {
                DisplayLog();
                return;
            }
            LookUpTables lookUp = new LookUpTables();

            units.Clear();
            string txt_Output = "";
            string line       = "";
            int    counter    = -1;

            StreamReader edu = new StreamReader(paths[0]);

            while ((line = edu.ReadLine()) != null)
            {
                KeyValuePair <EDULineEnums, object> comment;
                currentLine = line;
                lineNumber++;
                ParseLine(line, ref counter, lineNumber, out comment);
                if (counter > -1 && comment.Value != null)
                {
                    if (units[counter].comments.ContainsKey(comment.Key))
                    {
                        if (units[counter].comments[comment.Key] is List <string> )
                        {
                            ((List <string>)units[counter].comments[comment.Key]).Add((string)comment.Value);
                        }
                        else
                        {
                            string temp = (string)units[counter].comments[comment.Key];
                            units[counter].comments[comment.Key] = new List <string>()
                            {
                                temp, (string)comment.Value
                            };
                        }
                    }
                    else
                    {
                        units[counter].comments.Add(comment.Key, comment.Value);
                    }
                }
            }
            txt_Output += ("\n" + units.Count + "Units loaded from EDU");

            edu.Close();
        }
示例#8
0
        public bool CheckUnitBelongsToFactionAndCulture(string faction, Unit unit)
        {
            LookUpTables lut = new LookUpTables();

            //TODO Add check against culture

            if (unit.ownership.Contains(faction))
            {
                return(true);
            }
            else
            {
                return(false);
            }
        }
示例#9
0
        private void HandleStatPriArmour <T>(ref T statPriArmour, string[] data)
        {
            LookUpTables lookUp = new LookUpTables();

            if (statPriArmour is StatPriArmour)
            {
                ((StatPriArmour)(object)statPriArmour).priArm[0] = Convert.ToInt32(data[0].Trim());
                ((StatPriArmour)(object)statPriArmour).priArm[1] = Convert.ToInt32(data[1].Trim());
                ((StatPriArmour)(object)statPriArmour).priArm[2] = Convert.ToInt32(data[2].Trim());
                ((StatPriArmour)(object)statPriArmour).armSound  = lookUp.LookUpKey <ArmourSound>(data[3].Trim());
            }
            else if (statPriArmour is StatSecArmour)
            {
                ((StatSecArmour)(object)statPriArmour).secArmour[0] = Convert.ToInt32(data[0].Trim());
                ((StatSecArmour)(object)statPriArmour).secArmour[1] = Convert.ToInt32(data[1].Trim());
                ((StatSecArmour)(object)statPriArmour).secArmSound  = lookUp.LookUpKey <ArmourSound>(data[2].Trim());
            }
        }
示例#10
0
        private void HandleStatPriAttr(ref Stat_pri_attr stat_Pri_, string[] data)
        {
            LookUpTables lu = new LookUpTables();

            Stat_pri_attr temp = Stat_pri_attr.no;

            stat_Pri_ = temp;

            if (data[0] == lu.LookUpString <Stat_pri_attr>(Stat_pri_attr.no))
            {
                return;
            }

            foreach (string str in data)
            {
                stat_Pri_ |= lu.LookUpKey <Stat_pri_attr>(str.Trim());
            }

            stat_Pri_ &= ~Stat_pri_attr.no;
        }
示例#11
0
        public List <Unit> FindUnitsByFaction(string faction)
        {
            LookUpTables lut = new LookUpTables();

            try
            {
                string[] removaltags = new string[] {
                    "non_combatant",
                    "ship",
                };

                //TODO add culture check

                List <Unit> unit       = units.FindAll(x => x.ownership.Contains(faction));
                List <Unit> removeUnit = new List <Unit>();
                foreach (Unit u in unit)
                {
                    foreach (string rem in removaltags)
                    {
                        if (u.category == rem)
                        {
                            removeUnit.Add(u);
                            break;
                        }
                    }
                }
                foreach (Unit u in removeUnit)
                {
                    unit.Remove(u);
                }

                return(unit);
            }
            catch (Exception ex)
            {
                Output(ex.ToString());
                Output("\r\nFaction is likely wrong");
            }
            return(new List <Unit>());
        }
示例#12
0
        private void HandleFormation(ref Formation formation, string[] data)
        {
            LookUpTables lookUp = new LookUpTables();


            int i = 0;
            int a = 0;
            int b = 0;

            foreach (string STRING in data)
            {
                if (i < 2)
                {
                    formation.FormationTight[i] = STRING.Trim().UniversalParse();
                }
                else if (a < 2)
                {
                    formation.FormationSparse[a] = STRING.Trim().UniversalParse();
                    a++;
                }
                else if (b < 1)
                {
                    formation.FormationRanks = Convert.ToInt32(STRING.Trim());
                    b++;
                }

                dynamic ft = lookUp.LookUpKey <FormationTypes>(STRING.Trim());

                if (ft != null)
                {
                    formation.FormationFlags |= ft;
                }

                i++;
            }
        }
示例#13
0
        override public void Parse(string[] filepath, out int lineNumber, out string currentLine)
        {
            lineNumber  = 0;
            currentLine = "";
            if (!FileCheck(filepath[0]))
            {
                DisplayLog();
                return;
            }
            LookUpTables tb = new LookUpTables();

            string PATH = filepath[0];
            string line;

            StreamReader  strat             = new StreamReader(PATH);
            string        faction           = "";
            M2Faction     newFaction        = new M2Faction();
            M2DSCharacter newCharacter      = new M2DSCharacter();
            bool          newfactionReady   = false;
            bool          newcharacterReady = false;

            //get factions

            while ((line = strat.ReadLine()) != null)
            {
                lineNumber++;
                currentLine = line;
                if (line.StartsWith("campaign") && !line.Contains("script"))
                {
                    string[] split = line.Split('\t');
                    campaign = split[2];
                }

                if (line.StartsWith("playable"))
                {
                    while ((line = this.ContinueParseAndCountLine(ref strat, ref lineNumber)).TrimEnd() != "end")
                    {
                        playableFactions.Add(line.Trim());
                    }
                }

                if (line.StartsWith("unlockable"))
                {
                    while ((line = this.ContinueParseAndCountLine(ref strat, ref lineNumber)).TrimEnd() != "end")
                    {
                        unlockableFactions.Add(line.Trim());
                    }
                }

                if (line.StartsWith("nonplayable"))
                {
                    while ((line = this.ContinueParseAndCountLine(ref strat, ref lineNumber)).TrimEnd() != "end")
                    {
                        campaignNonPlayable.Add(line.Trim());
                    }
                }

                if (line.StartsWith("start_date"))
                {
                    string temp = line.RemoveFirstWord('\t');
                    startDate = temp.Trim();
                }

                if (line.StartsWith("end_date"))
                {
                    string temp = line.RemoveFirstWord('\t');
                    endDate = temp.Trim();
                }

                if (line.StartsWith("timescale"))
                {
                    string temp = line.RemoveFirstWord('\t');
                    timescale = (float)Convert.ToDouble(temp.Trim());
                }

                if (line.StartsWith("brigand_spawn_value"))
                {
                    string temp = line.RemoveFirstWord();
                    brigand_spawn_value = Convert.ToInt32(temp.Trim());
                }

                if (line.StartsWith("pirate_spawn_value"))
                {
                    string temp = line.RemoveFirstWord();
                    pirate_spawn_value = Convert.ToInt32(temp.Trim());
                }

                if (line.StartsWith("landmark"))
                {
                    string[] split  = line.Split('\t');
                    string   name   = split[1].Trim();
                    string   x      = split[2].Replace(",", "").Trim();
                    int[]    coords = new int[] { Convert.ToInt32(x), Convert.ToInt32(split[3].Trim()) };
                    Landmark res    = new Landmark(name, coords);
                    landmarks.Add(res);
                }

                if (line.StartsWith("resource"))
                {
                    string[] split = line.Split('\t');
                    string   name  = split[1].Trim();
                    name = name.Replace(",", "");
                    string x = split[2].Replace(",", "").Trim();

                    int[]    coords = new int[] { Convert.ToInt32(x), Convert.ToInt32(split[3].Trim()) };
                    Resource res    = new Resource(name, coords);
                    resources.Add(res);
                }


                if (line.StartsWith("faction") && !line.StartsWith("faction_relationships") && !line.StartsWith("faction_standings"))
                {
                    if (newfactionReady)
                    { //catch final character
                        if (newCharacter.gender != null)
                        {
                            newFaction.characters.Add(new M2DSCharacter(newCharacter));
                        }

                        factions.Add(new M2Faction(newFaction));
                        newFaction        = new M2Faction();
                        newfactionReady   = false;
                        newCharacter      = new M2DSCharacter();
                        newcharacterReady = false;
                    }
                    newfactionReady = true;

                    newFaction.Clear();
                    string[] split = line.Split(',', ' ', '\t');
                    faction = split[1];

                    newFaction.name  = faction;
                    newFaction.ai[0] = split[3].Trim();
                    newFaction.ai[1] = split[4].Trim();
                    //FactionRosters.AddFactionKey(tb.LookUpKey<FactionOwnership>(split[1]));
                }

                if (line.StartsWith("superfaction"))
                {
                    string superfac = line.RemoveFirstWord();
                    newFaction.superFaction = superfac.Trim();
                }

                if (line.StartsWith("denari"))
                {
                    string[] den = line.Split('\t', ' ');
                    newFaction.denari = Convert.ToInt32(den[1].Trim());
                }

                if (line.StartsWith("denari_kings_purse"))
                {
                    string[] den = line.Split('\t', ' ').CleanStringArray();
                    newFaction.kings_purse = Convert.ToInt32(den[1].Trim());
                }

                if (line.StartsWith("dead_until_resurrected"))
                {
                    newFaction.isDeadUntilResurrected = true;
                }

                if (line.StartsWith("ai_label"))
                {
                    string[] den = line.Split('\t', ' ').CleanStringArray();
                    newFaction.ai_label = den[1].Trim();
                }

                if (line.StartsWith("settlement"))
                {
                    string[] typeCheck = line.Split(' '); //check for castle



                    M2Settlement      tempSettlement;
                    List <DSBuilding> b_types = new List <DSBuilding>();


                    string s_level = "", region = "", faction_creator = "", type = "";

                    if (typeCheck.Count() > 1)
                    {
                        type = typeCheck[1];
                    }


                    int yearFounded = 0, population = 100;

                    while ((line = this.ContinueParseAndCountLine(ref strat, ref lineNumber).TrimEnd()) != "}")
                    {
                        if (line.Trim().StartsWith("level"))
                        {
                            string trimmed = line.RemoveFirstWord();
                            trimmed = trimmed.Trim();

                            s_level = trimmed;
                        }

                        else if (line.Trim().StartsWith("region"))
                        {
                            string trimmed = line.RemoveFirstWord();
                            trimmed = trimmed.Trim();

                            region = trimmed;
                        }

                        else if (line.Trim().StartsWith("year_founded"))
                        {
                            string trimmed = line.RemoveFirstWord();
                            trimmed = trimmed.Trim();

                            yearFounded = Convert.ToInt32(trimmed);
                        }

                        else if (line.Trim().StartsWith("population"))
                        {
                            string trimmed = line.RemoveFirstWord();
                            trimmed = trimmed.Trim();

                            population = Convert.ToInt32(trimmed);
                        }

                        else if (line.Trim().StartsWith("faction_creator"))
                        {
                            string trimmed = line.RemoveFirstWord();
                            trimmed = trimmed.Trim();

                            faction_creator = trimmed;
                        }

                        else if (line.Trim().StartsWith("type"))
                        {
                            string trimmed = line.RemoveFirstWord();
                            trimmed = trimmed.Trim();

                            DSBuilding dsb   = new DSBuilding();
                            string[]   split = line.Split(' ');

                            dsb.type = split[1].Trim();
                            dsb.name = split[2].Trim();

                            b_types.Add(dsb);
                        }
                    }

                    //Output("\n" + "Added: " + region + "\n");
                    tempSettlement = new M2Settlement(s_level, region, faction_creator, b_types, yearFounded, population, type);
                    newFaction.settlements.Add(tempSettlement);
                }


                if (line.StartsWith("character") && !line.StartsWith("character_record"))
                {
                    if (newcharacterReady)
                    {
                        newFaction.characters.Add(newCharacter);
                        newcharacterReady = false;
                    }
                    newcharacterReady = true;

                    newCharacter = new M2DSCharacter();

                    string[] split = line.Split('\t', ',');

                    if (split.Count() == 7)
                    {
                        newCharacter.name   = split[1].Trim();
                        newCharacter.type   = split[2].Trim();
                        newCharacter.gender = split[3].Trim();
                        string[] ageSplit = split[4].Split(' ');
                        newCharacter.age = Convert.ToInt32(ageSplit[2].Trim());
                        string[] xsplit = split[5].Split(' ');
                        string[] ysplit = split[6].Split(' ');
                        newCharacter.coords[0] = Convert.ToInt32(xsplit[2].Trim());
                        newCharacter.coords[1] = Convert.ToInt32(ysplit[2].Trim());

                        line = this.ContinueParseAndCountLine(ref strat, ref lineNumber); //move to traits
                        string traits = line.RemoveFirstWord();
                        newCharacter.traits = traits.Trim();
                    }

                    else if (split.Count() == 8)
                    {
                        newCharacter.name   = split[1].Trim();
                        newCharacter.gender = split[3].Trim();
                        newCharacter.type   = split[2].Trim();
                        newCharacter.rank   = split[4].Trim();
                        string[] ageSplit = split[5].Split(' ');
                        newCharacter.age = Convert.ToInt32(ageSplit[2].Trim());
                        string[] xsplit = split[6].Split(' ');
                        string[] ysplit = split[7].Split(' ');
                        newCharacter.coords[0] = Convert.ToInt32(xsplit[2].Trim());
                        newCharacter.coords[1] = Convert.ToInt32(ysplit[2].Trim());
                    }
                }

                if (line.StartsWith("traits"))
                {
                    string traits = line.RemoveFirstWord();
                    newCharacter.traits = traits.Trim();
                }

                if (line.StartsWith("ancillaries"))
                {
                    string ancillaries = line.RemoveFirstWord();
                    newCharacter.ancillaries = ancillaries;
                }

                if (line.StartsWith("unit"))
                {
                    string[] army        = line.Split('\t', ' ');
                    bool     nameFetched = false;
                    string   name        = "";
                    int      exp         = 0;
                    int      weapon      = 0;
                    int      armour      = 0;
                    for (int i = 0; i < army.Length; i++)
                    {
                        if (army[i] == "armour")
                        {
                            nameFetched = true;
                            armour      = Convert.ToInt32(army[i + 1]);
                        }

                        if (army[i] == "weapon")
                        {
                            nameFetched = true;
                            weapon      = Convert.ToInt32(army[i + 1]);
                        }

                        if (army[i] == "exp")
                        {
                            nameFetched = true;
                            exp         = Convert.ToInt32(army[i + 1]);
                        }

                        if (army[i] != "unit" && !nameFetched)
                        {
                            name += army[i] + " ";
                        }
                    }

                    newCharacter.army.Add(new DSUnit(name.Trim(), exp, armour, weapon));
                }

                if (line.StartsWith("character_record"))
                {
                    string record = line.RemoveFirstWord('\t');//

                    M2CharacterRecord cr = new M2CharacterRecord();

                    string[] recordSplit = record.Split(',');
                    cr.name   = recordSplit[0].Trim();
                    cr.gender = recordSplit[1].Trim();

                    string[] age = recordSplit[2].Split(' ');
                    cr.age = Convert.ToInt32(age[2].Trim());

                    cr.status = recordSplit[3].Trim();
                    cr.leader = recordSplit[4].Trim();

                    newFaction.characterRecords.Add(new M2CharacterRecord(cr));
                }

                if (line.StartsWith("relative"))
                {
                    string relative = line.RemoveFirstWord('\t');
                    newFaction.relatives.Add(relative);
                }

                if (line.StartsWith("faction_standings"))
                {
                    string[] split = line.Split('\t', ',');

                    split = split.CleanStringArray();

                    int count = split.Count();
                    count -= 3; //amount of faction entries required

                    string fo = split[1];

                    Dictionary <object, List <string> > f_a = new Dictionary <object, List <string> >();
                    for (int i = 0; i < count; i++)
                    {
                        float  temp = (float)Convert.ToDouble(split[2]);
                        string f    = split[i + 3];
                        if (!f_a.ContainsKey(temp))
                        {
                            f_a.Add(temp, new List <string> {
                                f
                            });
                        }
                        else
                        {
                            f_a[temp].Add(f);
                        }
                    }

                    if (!m2twAttitudes.attitudes.ContainsKey(fo))
                    {
                        m2twAttitudes.attitudes.Add(fo, new Dictionary <object, List <string> >(f_a));
                    }

                    else
                    {
                        foreach (var cf in f_a)
                        {
                            foreach (var toAdd in cf.Value)
                            {
                                if (!m2twAttitudes.attitudes[fo].ContainsKey(cf.Key))
                                {
                                    m2twAttitudes.attitudes[fo].Add(cf.Key, new List <string> {
                                        toAdd
                                    });
                                }

                                else
                                {
                                    m2twAttitudes.attitudes[fo][cf.Key].Add(toAdd);
                                }
                            }
                        }
                    }
                }

                /* if (line.StartsWith("faction_relationships"))
                 * {
                 *   string[] split = line.Split('\t', ',');
                 *
                 *   split = Misc_Data.CleanStringArray(split);
                 *
                 *   int count = split.Count();
                 *   count -= 3; //amount of faction entries required
                 *
                 *   string fo = split[1];
                 *
                 *   Dictionary<int, List<string>> f_a = new Dictionary<int, List<string>>();
                 *   for (int i = 0; i < count; i++)
                 *   {
                 *       int temp = Convert.ToInt32(split[2]);
                 *       string f = split[i + 3];
                 *       if (!f_a.ContainsKey(temp))
                 *           f_a.Add(temp, new List<string> { f });
                 *       else f_a[temp].Add(f);
                 *   }
                 *
                 *   if (!factionRelationships.attitudes.ContainsKey(fo))
                 *   {
                 *       factionRelationships.attitudes.Add(fo, new Dictionary<int, List<string>>(f_a));
                 *   }
                 *
                 *   else
                 *   {
                 *       foreach (var cf in f_a)
                 *       {
                 *           foreach (var toAdd in cf.Value)
                 *           {
                 *               if (!factionRelationships.attitudes[fo].ContainsKey(cf.Key))
                 *               {
                 *                   factionRelationships.attitudes[fo].Add(cf.Key, new List<string> { toAdd });
                 *               }
                 *
                 *               else factionRelationships.attitudes[fo][cf.Key].Add(toAdd);
                 *
                 *           }
                 *       }
                 *   }
                 * };*/
            }

            if (newfactionReady) //catches final faction
            {                    //catch final character
                newFaction.characters.Add(newCharacter);
                factions.Add(new M2Faction(newFaction));
                newfactionReady   = false;
                newCharacter      = new M2DSCharacter();
                newcharacterReady = false;
            }

            strat.Close();

            //Descr_Strat ds = new Descr_Strat(settlementOwnership, settlements, ds_data);
        }
示例#14
0
        public virtual string unitOutput()
        {
            LookUpTables lookTables = new LookUpTables();
            string       unitString = "";

            bool            firstAttr        = false;
            Action <Action> setAndTagChanged = (action) =>
            {
                if (firstAttr == false)
                {
                    firstAttr = true;
                }
                else
                {
                    unitString += ", ";
                }
                action();
            };

            unitString += LineOutput(type,
                                     "type");
            unitString += LineOutput(dic,
                                     "dictionary");
            unitString += LineOutput(category,
                                     "category");
            unitString += LineOutput(uClass,
                                     "class");
            unitString += LineOutput(voice,
                                     "voice_type");

            unitString += SpecialOutput(new object[] { soldier.name, soldier.number,
                                                       soldier.extras, soldier.collMass.UniversalOutput() },
                                        "soldier");

            if (officer.Count > 0)
            {
                unitString += LineOutput(officer[0],
                                         "officer");
            }
            if (officer.Count > 1)
            {
                unitString += LineOutput(officer[1],
                                         "officer");
            }
            if (officer.Count > 2)
            {
                unitString += LineOutput(officer[2],
                                         "officer");
            }

            unitString += LineOutput(engine,
                                     "engine");
            unitString += LineOutput(animal,
                                     "animal");
            unitString += LineOutput(mount,
                                     "mount");


            if (mountEffect.mountType.Count() > 0)
            {
                unitString += "\r\nmount_effect" + identSpacing(identifierLength("mount_effect"));
                for (int i = 0; i < mountEffect.mountType.Count(); i++)
                {
                    if (mountEffect.modifier[i] < 0)
                    {
                        setAndTagChanged(() => unitString += (mountEffect.mountType[i]) + " " + mountEffect.modifier[i].ToString());
                    }
                    else
                    {
                        setAndTagChanged(() => unitString += (mountEffect.mountType[i]) + " +" + mountEffect.modifier[i].ToString());
                    }
                }
                unitString += "\r\n";
            }

            unitString += LineOutput(naval,
                                     "ship");
            unitString += LineOutput(EnumFlagsToString(attributes),
                                     "attributes");

            unitString += SpecialOutput(new object[] { formation.FormationTight[0].UniversalOutput(),
                                                       formation.FormationTight[1].UniversalOutput(),
                                                       formation.FormationSparse[0].UniversalOutput(), formation.FormationSparse[1].UniversalOutput(),
                                                       formation.FormationRanks, EnumFlagsToString(formation.FormationFlags) },
                                        "formation");


            unitString += ListOutput(health,
                                     "stat_health");

            unitString += SpecialOutput(new object[] { priWep.atk[0], priWep.atk[1],
                                                       priWep.missType, priWep.missAttr[0], priWep.missAttr[1],
                                                       priWep.WepFlags, priWep.TechFlags, priWep.DmgFlags,
                                                       priWep.SoundFlags, priWep.atkDly[0], priWep.atkDly[1] },
                                        "stat_pri");


            unitString += LineOutput(EnumFlagsToString(priAttri, false, new Dictionary <Enum, string>()
            {
                { Stat_pri_attr.thrown_ap, "thrown ap" }
            }),
                                     "stat_pri_attr");

            unitString += SpecialOutput(new object[] { secWep.atk[0], secWep.atk[1],
                                                       secWep.missType, secWep.missAttr[0], secWep.missAttr[1],
                                                       secWep.WepFlags, secWep.TechFlags, secWep.DmgFlags,
                                                       secWep.SoundFlags, secWep.atkDly[0], secWep.atkDly[1] },
                                        "stat_sec");

            unitString += LineOutput(EnumFlagsToString(secAttri, false, new Dictionary <Enum, string>()
            {
                { Stat_pri_attr.thrown_ap, "thrown ap" }
            }),
                                     "stat_sec_attr");

            unitString += SpecialOutput(new object[] { priArm.priArm[0], priArm.priArm[1],
                                                       priArm.priArm[2], priArm.armSound },
                                        "stat_pri_armour");

            unitString += SpecialOutput(new object[] { secArmr.secArmour[0], secArmr.secArmour[1],
                                                       secArmr.secArmSound },
                                        "stat_sec_armour");

            unitString += LineOutput(heat,
                                     "stat_heat");
            unitString += ListOutput(ground,
                                     "stat_ground");

            unitString += SpecialOutput(new object[] { mental.morale, mental.discipline,
                                                       mental.training }, "stat_mental");


            unitString += LineOutput(chargeDist,
                                     "stat_charge_dist");

            unitString += LineOutput(fireDelay,
                                     "stat_fire_delay");

            unitString += ListOutput(food, "stat_food");
            unitString += ListOutput(cost, "stat_cost");
            unitString += ListOutput(ownership.ToArray(), "ownership");

            string[] lines = unitString.Split('\r', '\n').CleanStringArray();
            Dictionary <EDULineEnums, int> multiple = new Dictionary <EDULineEnums, int>();

            for (int i = 0; i < lines.Count(); i++)
            {
                EDULineEnums identifier;
                bool         isIdentifier = Enum.TryParse <EDULineEnums>(lines[i].GetFirstWord().Capitalise(), out identifier);

                if (isIdentifier)
                {
                    if (comments[identifier] is string)
                    {
                        lines[i] += "\t\t" + comments[identifier];
                    }
                    else if (comments[identifier] is List <string> )
                    {
                        if (!multiple.ContainsKey(identifier))
                        {
                            multiple.Add(identifier, 0);
                        }
                        else
                        {
                            multiple[identifier] += 1;
                        }

                        lines[i] += "\t\t" + ((List <string>)comments[identifier])[multiple[identifier]];
                    }
                }
            }

            return(lines.ArrayToString(false, true) + "\r\n");
        }