protected override void _ActionPerform()
 {
     NewDroidType = new DroidDesign();
     ResultUnit.TypeBase = NewDroidType;
     NewDroidType.CopyDesign(OldDroidType);
     NewDroidType.UpdateAttachments();
 }
        protected override void ActionCondition()
        {
            base.ActionCondition();

            if ( Unit.TypeBase.Type == UnitType.PlayerDroid )
            {
                OldDroidType = (DroidDesign)Unit.TypeBase;
                ActionPerformed = !OldDroidType.IsTemplate;
            }
            else
            {
                OldDroidType = null;
                ActionPerformed = false;
            }
        }
Beispiel #3
0
 public void CopyDesign(DroidDesign DroidTypeToCopy)
 {
     TemplateDroidType = DroidTypeToCopy.TemplateDroidType;
     Body = DroidTypeToCopy.Body;
     Propulsion = DroidTypeToCopy.Propulsion;
     TurretCount = DroidTypeToCopy.TurretCount;
     Turret1 = DroidTypeToCopy.Turret1;
     Turret2 = DroidTypeToCopy.Turret2;
     Turret3 = DroidTypeToCopy.Turret3;
 }
Beispiel #4
0
        protected clsResult createWZObjects(List<WZBJOUnit> bjoUnits, List<IniStructure> iniStructures, List<IniDroid> iniDroids, List<IniFeature> iniFeatures)
        {
            var ReturnResult = new clsResult("Creating objects", false);
            logger.Info("Creating objects");

            var newUnit = default(clsUnit);
            UInt32 availableID = 0;
            var unitAdd = new clsUnitAdd();
            var a = 0;
            var b = 0;

            unitAdd.Map = map;

            availableID = 1U;
            foreach ( var bjoUnit in bjoUnits )
            {
                if ( bjoUnit.ID >= availableID )
                {
                    availableID = bjoUnit.ID + 1U;
                }
            }
            if ( iniStructures.Count > 0)
            {
                var structMaxId = iniStructures.Max(w => w.ID) + 10;
                if ( structMaxId > availableID )
                {
                    availableID = structMaxId;
                }
            }
            if ( iniFeatures.Count > 0 )
            {
                var featuresMaxId = iniFeatures.Max(w => w.ID) + 10;
                if ( featuresMaxId > availableID )
                {
                    availableID = featuresMaxId;
                }
            }
            if ( iniDroids.Count > 0 )
            {
                var droidsMaxId = iniDroids.Max(w => w.ID) + 10;
                if ( droidsMaxId > availableID )
                {
                    availableID += droidsMaxId;
                }
            }

            foreach ( var bjoUnit in bjoUnits )
            {
                newUnit = new clsUnit();
                newUnit.ID = bjoUnit.ID;
                newUnit.TypeBase = App.ObjectData.FindOrCreateUnitType(bjoUnit.Code, bjoUnit.ObjectType, -1);
                if ( newUnit.TypeBase == null )
                {
                    ReturnResult.ProblemAdd("Unable to create object type.");
                    return ReturnResult;
                }
                if ( bjoUnit.Player >= Constants.PlayerCountMax )
                {
                    newUnit.UnitGroup = map.ScavengerUnitGroup;
                }
                else
                {
                    newUnit.UnitGroup = map.UnitGroups[Convert.ToInt32(bjoUnit.Player)];
                }
                newUnit.Pos = bjoUnit.Pos;
                newUnit.Rotation = (int)(Math.Min(bjoUnit.Rotation, 359U));
                if ( bjoUnit.ID == 0U )
                {
                    bjoUnit.ID = availableID;
                    App.ZeroIDWarning(newUnit, bjoUnit.ID, ReturnResult);
                }
                unitAdd.NewUnit = newUnit;
                unitAdd.ID = bjoUnit.ID;
                unitAdd.Perform();
                App.ErrorIDChange(bjoUnit.ID, newUnit, "CreateWZObjects");
                if ( availableID == bjoUnit.ID )
                {
                    availableID = newUnit.ID + 1U;
                }
            }

            var structureTypeBase = default(StructureTypeBase);
            var droidType = default(DroidDesign);
            var featureTypeBase = default(FeatureTypeBase);
            var loadPartsArgs = new DroidDesign.sLoadPartsArgs();
            UnitTypeBase unitTypeBase = null;
            var errorCount = 0;
            var unknownDroidComponentCount = 0;
            var unknownDroidTypeCount = 0;
            var droidBadPositionCount = 0;
            var structureBadPositionCount = 0;
            var structureBadModulesCount = 0;
            var featureBadPositionCount = 0;
            var moduleLimit = 0;
            var zeroPos = new XYInt(0, 0);
            var moduleTypeBase = default(StructureTypeBase);
            var newModule = default(clsUnit);

            var factoryModule = App.ObjectData.FindFirstStructureType(StructureTypeBase.enumStructureType.FactoryModule);
            var researchModule = App.ObjectData.FindFirstStructureType(StructureTypeBase.enumStructureType.ResearchModule);
            var powerModule = App.ObjectData.FindFirstStructureType(StructureTypeBase.enumStructureType.PowerModule);

            if ( factoryModule == null )
            {
                ReturnResult.WarningAdd("No factory module loaded.");
            }
            if ( researchModule == null )
            {
                ReturnResult.WarningAdd("No research module loaded.");
            }
            if ( powerModule == null )
            {
                ReturnResult.WarningAdd("No power module loaded.");
            }

            foreach ( var iniStructure in iniStructures )
            {
                if ( iniStructure.Pos == null )
                {
                    logger.Debug("{0} pos was null", iniStructure.Code);
                    structureBadPositionCount++;
                }
                else if ( !App.PosIsWithinTileArea(iniStructure.Pos, zeroPos, map.Terrain.TileSize) )
                {
                    logger.Debug("{0} structure pos x{1} y{2}, is wrong.", iniStructure.Code, iniStructure.Pos.X,
                        iniStructure.Pos.Y);
                    structureBadPositionCount++;
                }
                else
                {
                    unitTypeBase = App.ObjectData.FindOrCreateUnitType(Convert.ToString(iniStructure.Code),
                        UnitType.PlayerStructure, iniStructure.WallType);
                    if ( unitTypeBase.Type == UnitType.PlayerStructure )
                    {
                        structureTypeBase = (StructureTypeBase)unitTypeBase;
                    }
                    else
                    {
                        structureTypeBase = null;
                    }
                    if ( structureTypeBase == null )
                    {
                        errorCount++;
                    }
                    else
                    {
                        newUnit = new clsUnit();
                        newUnit.TypeBase = structureTypeBase;
                        if ( iniStructure.UnitGroup == null )
                        {
                            newUnit.UnitGroup = map.ScavengerUnitGroup;
                        }
                        else
                        {
                            newUnit.UnitGroup = iniStructure.UnitGroup;
                        }
                        newUnit.Pos = new WorldPos(iniStructure.Pos, iniStructure.Pos.Z);
                        newUnit.Rotation = Convert.ToInt32(iniStructure.Rotation.Direction * 360.0D / Constants.INIRotationMax);
                        if ( newUnit.Rotation == 360 )
                        {
                            newUnit.Rotation = 0;
                        }
                        if ( iniStructure.HealthPercent >= 0 )
                        {
                            newUnit.Health = MathUtil.Clamp_dbl(iniStructure.HealthPercent / 100.0D, 0.01D, 1.0D);
                        }
                        if ( iniStructure.ID == 0U )
                        {
                            iniStructure.ID = availableID;
                            App.ZeroIDWarning(newUnit, iniStructure.ID, ReturnResult);
                        }
                        unitAdd.NewUnit = newUnit;
                        unitAdd.ID = iniStructure.ID;
                        unitAdd.Perform();
                        App.ErrorIDChange(iniStructure.ID, newUnit, "Load_WZ->INIStructures");
                        if ( availableID == iniStructure.ID )
                        {
                            availableID = newUnit.ID + 1U;
                        }
                        //create modules
                        switch ( structureTypeBase.StructureType )
                        {
                            case StructureTypeBase.enumStructureType.Factory:
                                moduleLimit = 2;
                                moduleTypeBase = factoryModule;
                                break;
                            case StructureTypeBase.enumStructureType.VTOLFactory:
                                moduleLimit = 2;
                                moduleTypeBase = factoryModule;
                                break;
                            case StructureTypeBase.enumStructureType.PowerGenerator:
                                moduleLimit = 1;
                                moduleTypeBase = powerModule;
                                break;
                            case StructureTypeBase.enumStructureType.Research:
                                moduleLimit = 1;
                                moduleTypeBase = researchModule;
                                break;
                            default:
                                moduleLimit = 0;
                                moduleTypeBase = null;
                                break;
                        }
                        if ( iniStructure.ModuleCount > moduleLimit )
                        {
                            iniStructure.ModuleCount = moduleLimit;
                            structureBadModulesCount++;
                        }
                        else if ( iniStructure.ModuleCount < 0 )
                        {
                            iniStructure.ModuleCount = 0;
                            structureBadModulesCount++;
                        }
                        if ( moduleTypeBase != null )
                        {
                            for ( b = 0; b <= iniStructure.ModuleCount - 1; b++ )
                            {
                                newModule = new clsUnit();
                                newModule.TypeBase = moduleTypeBase;
                                newModule.UnitGroup = newUnit.UnitGroup;
                                newModule.Pos = newUnit.Pos;
                                newModule.Rotation = newUnit.Rotation;
                                unitAdd.NewUnit = newModule;
                                unitAdd.ID = availableID;
                                unitAdd.Perform();
                                availableID = newModule.ID + 1U;
                            }
                        }
                    }
                }
            }
            if ( structureBadPositionCount > 0 )
            {
                ReturnResult.WarningAdd(structureBadPositionCount + " structures had an invalid position and were removed.");
            }
            if ( structureBadModulesCount > 0 )
            {
                ReturnResult.WarningAdd(structureBadModulesCount + " structures had an invalid number of modules.");
            }

            foreach ( var iniFeature in iniFeatures )
            {
                if ( iniFeature.Pos == null )
                {
                    featureBadPositionCount++;
                }
                else if ( !App.PosIsWithinTileArea(iniFeature.Pos, zeroPos, map.Terrain.TileSize) )
                {
                    featureBadPositionCount++;
                }
                else
                {
                    unitTypeBase = App.ObjectData.FindOrCreateUnitType(Convert.ToString(iniFeature.Code), UnitType.Feature, -1);
                    if ( unitTypeBase.Type == UnitType.Feature )
                    {
                        featureTypeBase = (FeatureTypeBase)unitTypeBase;
                    }
                    else
                    {
                        featureTypeBase = null;
                    }
                    if ( featureTypeBase == null )
                    {
                        errorCount++;
                    }
                    else
                    {
                        newUnit = new clsUnit();
                        newUnit.TypeBase = featureTypeBase;
                        newUnit.UnitGroup = map.ScavengerUnitGroup;
                        newUnit.Pos = new WorldPos(iniFeature.Pos, iniFeature.Pos.Z);
                        newUnit.Rotation = Convert.ToInt32(iniFeature.Rotation.Direction * 360.0D / Constants.INIRotationMax);
                        if ( newUnit.Rotation == 360 )
                        {
                            newUnit.Rotation = 0;
                        }
                        if ( iniFeature.HealthPercent >= 0 )
                        {
                            newUnit.Health = MathUtil.Clamp_dbl(iniFeature.HealthPercent / 100.0D, 0.01D, 1.0D);
                        }
                        if ( iniFeature.ID == 0U )
                        {
                            iniFeature.ID = availableID;
                            App.ZeroIDWarning(newUnit, iniFeature.ID, ReturnResult);
                        }
                        unitAdd.NewUnit = newUnit;
                        unitAdd.ID = iniFeature.ID;
                        unitAdd.Perform();
                        App.ErrorIDChange(iniFeature.ID, newUnit, "Load_WZ->INIFeatures");
                        if ( availableID == iniFeature.ID )
                        {
                            availableID = newUnit.ID + 1U;
                        }
                    }
                }
            }
            if ( featureBadPositionCount > 0 )
            {
                ReturnResult.WarningAdd(featureBadPositionCount + " features had an invalid position and were removed.");
            }

            foreach ( var iniDroid in iniDroids )
            {
                if ( iniDroid.Pos == null )
                {
                    droidBadPositionCount++;
                }
                else if ( !App.PosIsWithinTileArea(iniDroid.Pos, zeroPos, map.Terrain.TileSize) )
                {
                    droidBadPositionCount++;
                }
                else
                {
                    if ( iniDroid.Template == null || iniDroid.Template == "" )
                    {
                        droidType = new DroidDesign();
                        if ( !droidType.SetDroidType((enumDroidType)(iniDroid.DroidType)) )
                        {
                            unknownDroidTypeCount++;
                        }
                        loadPartsArgs.Body = App.ObjectData.FindOrCreateBody(iniDroid.Body);
                        if ( loadPartsArgs.Body == null )
                        {
                            unknownDroidComponentCount++;
                        }
                        else
                        {
                            if ( loadPartsArgs.Body.IsUnknown )
                            {
                                unknownDroidComponentCount++;
                            }
                        }
                        loadPartsArgs.Propulsion = App.ObjectData.FindOrCreatePropulsion(Convert.ToString(iniDroid.Propulsion));
                        if ( loadPartsArgs.Propulsion == null )
                        {
                            unknownDroidComponentCount++;
                        }
                        else
                        {
                            if ( loadPartsArgs.Propulsion.IsUnknown )
                            {
                                unknownDroidComponentCount++;
                            }
                        }
                        loadPartsArgs.Construct = App.ObjectData.FindOrCreateConstruct(Convert.ToString(iniDroid.Construct));
                        if ( loadPartsArgs.Construct == null )
                        {
                            unknownDroidComponentCount++;
                        }
                        else
                        {
                            if ( loadPartsArgs.Construct.IsUnknown )
                            {
                                unknownDroidComponentCount++;
                            }
                        }
                        loadPartsArgs.Repair = App.ObjectData.FindOrCreateRepair(iniDroid.Repair);
                        if ( loadPartsArgs.Repair == null )
                        {
                            unknownDroidComponentCount++;
                        }
                        else
                        {
                            if ( loadPartsArgs.Repair.IsUnknown )
                            {
                                unknownDroidComponentCount++;
                            }
                        }
                        loadPartsArgs.Sensor = App.ObjectData.FindOrCreateSensor(iniDroid.Sensor);
                        if ( loadPartsArgs.Sensor == null )
                        {
                            unknownDroidComponentCount++;
                        }
                        else
                        {
                            if ( loadPartsArgs.Sensor.IsUnknown )
                            {
                                unknownDroidComponentCount++;
                            }
                        }
                        loadPartsArgs.Brain = App.ObjectData.FindOrCreateBrain(iniDroid.Brain);
                        if ( loadPartsArgs.Brain == null )
                        {
                            unknownDroidComponentCount++;
                        }
                        else
                        {
                            if ( loadPartsArgs.Brain.IsUnknown )
                            {
                                unknownDroidComponentCount++;
                            }
                        }
                        loadPartsArgs.ECM = App.ObjectData.FindOrCreateECM(Convert.ToString(iniDroid.ECM));
                        if ( loadPartsArgs.ECM == null )
                        {
                            unknownDroidComponentCount++;
                        }
                        else
                        {
                            if ( loadPartsArgs.ECM.IsUnknown )
                            {
                                unknownDroidComponentCount++;
                            }
                        }
                        loadPartsArgs.Weapon1 = App.ObjectData.FindOrCreateWeapon(Convert.ToString(iniDroid.Weapons[0]));
                        if ( loadPartsArgs.Weapon1 == null )
                        {
                            unknownDroidComponentCount++;
                        }
                        else
                        {
                            if ( loadPartsArgs.Weapon1.IsUnknown )
                            {
                                unknownDroidComponentCount++;
                            }
                        }
                        loadPartsArgs.Weapon2 = App.ObjectData.FindOrCreateWeapon(Convert.ToString(iniDroid.Weapons[1]));
                        if ( loadPartsArgs.Weapon2 == null )
                        {
                            unknownDroidComponentCount++;
                        }
                        else
                        {
                            if ( loadPartsArgs.Weapon2.IsUnknown )
                            {
                                unknownDroidComponentCount++;
                            }
                        }
                        loadPartsArgs.Weapon3 = App.ObjectData.FindOrCreateWeapon(Convert.ToString(iniDroid.Weapons[2]));
                        if ( loadPartsArgs.Weapon3 == null )
                        {
                            unknownDroidComponentCount++;
                        }
                        else
                        {
                            if ( loadPartsArgs.Weapon3.IsUnknown )
                            {
                                unknownDroidComponentCount++;
                            }
                        }
                        droidType.LoadParts(loadPartsArgs);
                    }
                    else
                    {
                        unitTypeBase = App.ObjectData.FindOrCreateUnitType(iniDroid.Template, UnitType.PlayerDroid, -1);
                        if ( unitTypeBase == null )
                        {
                            droidType = null;
                        }
                        else
                        {
                            if ( unitTypeBase.Type == UnitType.PlayerDroid )
                            {
                                droidType = (DroidDesign)unitTypeBase;
                            }
                            else
                            {
                                droidType = null;
                            }
                        }
                    }
                    if ( droidType == null )
                    {
                        errorCount++;
                    }
                    else
                    {
                        newUnit = new clsUnit();
                        newUnit.TypeBase = droidType;
                        if ( iniDroid.UnitGroup == null )
                        {
                            newUnit.UnitGroup = map.ScavengerUnitGroup;
                        }
                        else
                        {
                            newUnit.UnitGroup = iniDroid.UnitGroup;
                        }
                        newUnit.Pos = new WorldPos(iniDroid.Pos, iniDroid.Pos.Z);
                        newUnit.Rotation = Convert.ToInt32(iniDroid.Rotation.Direction * 360.0D / Constants.INIRotationMax);
                        if ( newUnit.Rotation == 360 )
                        {
                            newUnit.Rotation = 0;
                        }
                        if ( iniDroid.HealthPercent >= 0 )
                        {
                            newUnit.Health = MathUtil.Clamp_dbl(iniDroid.HealthPercent / 100.0D, 0.01D, 1.0D);
                        }
                        if ( iniDroid.ID == 0U )
                        {
                            iniDroid.ID = availableID;
                            App.ZeroIDWarning(newUnit, iniDroid.ID, ReturnResult);
                        }
                        unitAdd.NewUnit = newUnit;
                        unitAdd.ID = iniDroid.ID;
                        unitAdd.Perform();
                        App.ErrorIDChange(iniDroid.ID, newUnit, "Load_WZ->INIDroids");
                        if ( availableID == iniDroid.ID )
                        {
                            availableID = newUnit.ID + 1U;
                        }
                    }
                }
            }
            if ( droidBadPositionCount > 0 )
            {
                ReturnResult.WarningAdd(droidBadPositionCount + " droids had an invalid position and were removed.");
            }
            if ( unknownDroidTypeCount > 0 )
            {
                ReturnResult.WarningAdd(unknownDroidTypeCount + " droid designs had an unrecognised droidType and were removed.");
            }
            if ( unknownDroidComponentCount > 0 )
            {
                ReturnResult.WarningAdd(unknownDroidComponentCount + " droid designs had components that are not loaded.");
            }

            if ( errorCount > 0 )
            {
                ReturnResult.WarningAdd("Object Create Error.");
            }

            return ReturnResult;
        }
Beispiel #5
0
        public static int TemplateDroidType_Add(DroidDesign.clsTemplateDroidType NewDroidType)
        {
            var ReturnResult = 0;

            Array.Resize(ref TemplateDroidTypes, TemplateDroidTypeCount + 1);
            TemplateDroidTypes[TemplateDroidTypeCount] = NewDroidType;
            ReturnResult = TemplateDroidTypeCount;
            TemplateDroidTypeCount++;

            return ReturnResult;
        }
Beispiel #6
0
        private clsResult read_FMap_Objects(string text)
        {
            var returnResult = new clsResult("Reading objects", false);
            logger.Info("Reading objects");

            var objectsINI = IniReader.ReadString(text);

            var droidComponentUnknownCount = 0;
            var objectTypeMissingCount = 0;
            var objectPlayerNumInvalidCount = 0;
            var objectPosInvalidCount = 0;
            var designTypeUnspecifiedCount = 0;
            var unknownUnitTypeCount = 0;
            var maxUnknownUnitTypeWarningCount = 16;

            var droidDesign = default(DroidDesign);
            var newObject = default(clsUnit);
            var unitAdd = new clsUnitAdd();
            var unitTypeBase = default(UnitTypeBase);
            var isDesign = default(bool);
            var unitGroup = default(clsUnitGroup);
            var zeroPos = new XYInt(0, 0);
            UInt32 availableID = 0;

            unitAdd.Map = map;

            INIObject iniObject = default(INIObject);
            var invalid = true;
            var iniObjects = new List<INIObject> ();

            foreach (var iniSection in objectsINI) {
                iniObject = new INIObject ();
                iniObject.Type = UnitType.Unspecified;
                iniObject.Health = 1.0D;
                iniObject.WallType = -1;
                iniObject.TurretCodes = new string[Constants.MaxDroidWeapons];
                iniObject.TurretTypes = new enumTurretType[Constants.MaxDroidWeapons];
                for (var i = 0; i < Constants.MaxDroidWeapons; i++) {
                    iniObject.TurretTypes [i] = enumTurretType.Unknown;
                    iniObject.TurretCodes [i] = "";
                }
                invalid = false;
                foreach (var iniToken in iniSection.Data) {
                    if (invalid)
                    {
                        break;
                    }

                    try {
                        switch (iniToken.Name.ToLower()) {
                        case "type":
                            var typeTokens = iniToken.Data.Split (new string[] { ", " }, StringSplitOptions.None);
                            if (typeTokens.Length < 1) {
                                invalid = true;
                                returnResult.WarningAdd (string.Format ("#{0} type \"{1}\" is not valid.", iniSection.Name, iniToken.Data));
                                logger.Warn ("#{0} type \"{1}\" is not valid.", iniSection.Name, iniToken.Data);
                                continue;
                            }
                            switch (typeTokens [0].ToLower ()) {
                            case "feature":
                                iniObject.Type = UnitType.Feature;
                                iniObject.Code = typeTokens [1];
                                break;
                            case "structure":
                                iniObject.Type = UnitType.PlayerStructure;
                                iniObject.Code = typeTokens [1];
                                break;
                            case "droidtemplate":
                                iniObject.Type = UnitType.PlayerDroid;
                                iniObject.IsTemplate = true;
                                iniObject.Code = typeTokens [1];
                                break;
                            case "droiddesign":
                                iniObject.Type = UnitType.PlayerDroid;
                                break;
                            default:
                                invalid = true;
                                returnResult.WarningAdd (string.Format ("#{0} {1} \"{2}\" is not valid.", iniSection.Name, iniToken.Name, iniToken.Data));
                                logger.Warn ("#{0} {1} \"{2}\" is not valid.", iniSection.Name, iniToken.Name, iniToken.Data);
                                continue;
                            }
                            break;
                        case "droidtype":
                            var droidType = App.GetTemplateDroidTypeFromTemplateCode (iniToken.Data);
                            if (droidType == null) {
                                invalid = true;
                                returnResult.WarningAdd (string.Format ("#{0} {1} \"{2}\" is not valid.", iniSection.Name, iniToken.Name, iniToken.Data));
                                logger.Warn ("#{0} {1} \"{2}\" is not valid.", iniSection.Name, iniToken.Name, iniToken.Data);
                                continue;
                            }
                            break;
                        case "body":
                            iniObject.BodyCode = iniToken.Data;
                            break;
                        case "propulsion":
                            iniObject.PropulsionCode = iniToken.Data;
                            break;
                        case "turrentcount":
                            iniObject.TurretCount = int.Parse(iniToken.Data);
                            if (iniObject.TurretCount < 0 || iniObject.TurretCount > Constants.MaxDroidWeapons) {
                                invalid = true;
                                returnResult.WarningAdd (string.Format ("#{0} {1} \"{2}\" is not valid.", iniSection.Name, iniToken.Name, iniToken.Data));
                                logger.Warn ("#{0} {1} \"{2}\" is not valid.", iniSection.Name, iniToken.Name, iniToken.Data);
                                continue;
                            }
                            break;
                        case "turret1":
                            var turret1Tokens = iniToken.Data.Split (new string[] { ", " }, StringSplitOptions.None);
                            if (turret1Tokens.Length < 2) {
                                invalid = true;
                                returnResult.WarningAdd (string.Format ("#{0} {1} \"{2}\" is not valid.", iniSection.Name, iniToken.Name, iniToken.Data));
                                logger.Warn ("#{0} {1} \"{2}\" is not valid.", iniSection.Name, iniToken.Name, iniToken.Data);
                                continue;
                            }
                            iniObject.TurretTypes[0] = App.GetTurretTypeFromName(turret1Tokens[0]);
                            iniObject.TurretCodes[1] = turret1Tokens[1];
                            break;
                        case "turret2":
                            var turret2Tokens = iniToken.Data.Split (new string[] { ", " }, StringSplitOptions.None);
                            if (turret2Tokens.Length < 2) {
                                invalid = true;
                                returnResult.WarningAdd (string.Format ("#{0} {1} \"{2}\" is not valid.", iniSection.Name, iniToken.Name, iniToken.Data));
                                logger.Warn ("#{0} {1} \"{2}\" is not valid.", iniSection.Name, iniToken.Name, iniToken.Data);
                                continue;
                            }
                            iniObject.TurretTypes[0] = App.GetTurretTypeFromName(turret2Tokens[0]);
                            iniObject.TurretCodes[1] = turret2Tokens[1];
                            break;
                        case "turret3":
                            var turret3Tokens = iniToken.Data.Split (new string[] { ", " }, StringSplitOptions.None);
                            if (turret3Tokens.Length < 2) {
                                invalid = true;
                                returnResult.WarningAdd (string.Format ("#{0} {1} \"{2}\" is not valid.", iniSection.Name, iniToken.Name, iniToken.Data));
                                logger.Warn ("#{0} {1} \"{2}\" is not valid.", iniSection.Name, iniToken.Name, iniToken.Data);
                                continue;
                            }
                            iniObject.TurretTypes[0] = App.GetTurretTypeFromName(turret3Tokens[0]);
                            iniObject.TurretCodes[1] = turret3Tokens[1];
                            break;
                        case "id":
                            iniObject.ID = uint.Parse(iniToken.Data);
                            break;
                        case "priority":
                            iniObject.Priority = int.Parse(iniToken.Data);
                            break;
                        case "pos":
                            iniObject.Pos = XYInt.FromString(iniToken.Data);
                            break;
                        case "heading":
                            if ( !IOUtil.InvariantParse(iniToken.Data, ref iniObject.Heading) )
                            {
                                invalid = true;
                                returnResult.WarningAdd (string.Format ("#{0} {1} \"{2}\" is not valid.", iniSection.Name, iniToken.Name, iniToken.Data));
                                logger.Warn ("#{0} {1} \"{2}\" is not valid.", iniSection.Name, iniToken.Name, iniToken.Data);
                                continue;
                            }
                            break;
                        case "unitgroup":
                            iniObject.UnitGroup = iniToken.Data;
                            break;
                        case "health":
                            if ( !IOUtil.InvariantParse(iniToken.Data, ref iniObject.Health) )
                            {
                                invalid = true;
                                returnResult.WarningAdd (string.Format ("#{0} {1} \"{2}\" is not valid.", iniSection.Name, iniToken.Name, iniToken.Data));
                                logger.Warn ("#{0} {1} \"{2}\" is not valid.", iniSection.Name, iniToken.Name, iniToken.Data);
                                continue;
                            }
                            break;
                        case "walltype":
                            if ( !IOUtil.InvariantParse(iniToken.Data, ref iniObject.WallType) )
                            {
                                invalid = true;
                                returnResult.WarningAdd (string.Format ("#{0} {1} \"{2}\" is not valid.", iniSection.Name, iniToken.Name, iniToken.Data));
                                logger.Warn ("#{0} {1} \"{2}\" is not valid.", iniSection.Name, iniToken.Name, iniToken.Data);
                                continue;
                            }
                            if (iniObject.WallType < 0 || iniObject.WallType > 3) {
                                iniObject.WallType = -1;
                            }
                            break;
                        case "scriptlabel":
                            iniObject.Label = iniToken.Data;
                            break;
                        default:
                            returnResult.WarningAdd(string.Format("Found an invalid key: {0} = {1}", iniToken.Name, iniToken.Data), false);
                            logger.Warn("Found an invalid key: {0} = {1}", iniToken.Name, iniToken.Data);
                            break;
                        }
                    }
                    catch (Exception ex) {
                        invalid = true;
                        returnResult.WarningAdd(
                            string.Format("#{0} invalid {2}: \"{3}\", got exception: {2}", iniSection.Name, iniToken.Name, iniToken.Data, ex.Message), false);
                        logger.WarnException(string.Format("#{0} invalid {2} \"{1}\"", iniSection.Name, iniToken.Name, iniToken.Data), ex);
                    }
                }

                if (!invalid) {
                    iniObjects.Add (iniObject);
                }
            }

            try {
                availableID = iniObjects.Max (w => w.ID) + 10;
                foreach (var iniObject2 in iniObjects)
                {
                    if ( iniObject2.Pos == null )
                    {
                        objectPosInvalidCount++;
                        continue;
                    }
                    else if ( !App.PosIsWithinTileArea(iniObject2.Pos, zeroPos, map.Terrain.TileSize) )
                    {
                        objectPosInvalidCount++;
                        continue;
                    }

                    unitTypeBase = null;
                    if ( iniObject2.Type != UnitType.Unspecified )
                    {
                        isDesign = false;
                        if ( iniObject2.Type == UnitType.PlayerDroid )
                        {
                            if ( !iniObject2.IsTemplate )
                            {
                                isDesign = true;
                            }
                        }
                        if ( isDesign )
                        {
                            droidDesign = new DroidDesign();
                            droidDesign.TemplateDroidType = iniObject2.TemplateDroidType;
                            if ( droidDesign.TemplateDroidType == null )
                            {
                                droidDesign.TemplateDroidType = App.TemplateDroidType_Droid;
                                designTypeUnspecifiedCount++;
                            }
                            if ( iniObject2.BodyCode != null )
                            {
                                droidDesign.Body = App.ObjectData.FindOrCreateBody(Convert.ToString(iniObject2.BodyCode));
                                if ( droidDesign.Body.IsUnknown )
                                {
                                    droidComponentUnknownCount++;
                                }
                            }
                            if ( iniObject2.PropulsionCode != null )
                            {
                                droidDesign.Propulsion = App.ObjectData.FindOrCreatePropulsion(iniObject2.PropulsionCode);
                                if ( droidDesign.Propulsion.IsUnknown )
                                {
                                    droidComponentUnknownCount++;
                                }
                            }
                            droidDesign.TurretCount = (byte)(iniObject2.TurretCount);
                            if ( iniObject2.TurretCodes[0] != "" )
                            {
                                droidDesign.Turret1 = App.ObjectData.FindOrCreateTurret(iniObject2.TurretTypes[0],
                                    Convert.ToString(iniObject2.TurretCodes[0]));
                                if ( droidDesign.Turret1.IsUnknown )
                                {
                                    droidComponentUnknownCount++;
                                }
                            }
                            if ( iniObject2.TurretCodes[1] != "" )
                            {
                                droidDesign.Turret2 = App.ObjectData.FindOrCreateTurret(iniObject2.TurretTypes[1],
                                    Convert.ToString(iniObject2.TurretCodes[1]));
                                if ( droidDesign.Turret2.IsUnknown )
                                {
                                    droidComponentUnknownCount++;
                                }
                            }
                            if ( iniObject2.TurretCodes[2] != "" )
                            {
                                droidDesign.Turret3 = App.ObjectData.FindOrCreateTurret(iniObject2.TurretTypes[2],
                                    Convert.ToString(iniObject2.TurretCodes[2]));
                                if ( droidDesign.Turret3.IsUnknown )
                                {
                                    droidComponentUnknownCount++;
                                }
                            }
                            droidDesign.UpdateAttachments();
                            unitTypeBase = droidDesign;
                        }
                        else
                        {
                            unitTypeBase = App.ObjectData.FindOrCreateUnitType(iniObject2.Code, iniObject2.Type, iniObject2.WallType);
                            if ( unitTypeBase.IsUnknown )
                            {
                                if ( unknownUnitTypeCount < maxUnknownUnitTypeWarningCount )
                                {
                                    returnResult.WarningAdd("\"{0}\" is not a loaded object.".Format2(iniObject2.Code));
                                }
                                unknownUnitTypeCount++;
                            }
                        }
                    }
                    if ( unitTypeBase == null )
                    {
                        objectTypeMissingCount++;
                        continue;
                    }

                    newObject = new clsUnit();
                    newObject.TypeBase = unitTypeBase;
                    newObject.Pos.Horizontal.X = iniObject2.Pos.X;
                    newObject.Pos.Horizontal.Y = iniObject2.Pos.Y;
                    newObject.Health = iniObject2.Health;
                    newObject.SavePriority = iniObject2.Priority;
                    newObject.Rotation = (int)(iniObject2.Heading);
                    if ( newObject.Rotation >= 360 )
                    {
                        newObject.Rotation -= 360;
                    }
                    if ( iniObject2.UnitGroup == null || iniObject2.UnitGroup == "" )
                    {
                        if ( iniObject2.Type != UnitType.Feature )
                        {
                            objectPlayerNumInvalidCount++;
                        }
                        newObject.UnitGroup = map.ScavengerUnitGroup;
                    }
                    else
                    {
                        if ( iniObject2.UnitGroup.ToLower() == "scavenger" )
                        {
                            newObject.UnitGroup = map.ScavengerUnitGroup;
                        }
                        else
                        {
                            UInt32 PlayerNum = 0;
                            try
                            {
                                if ( !IOUtil.InvariantParse(iniObject2.UnitGroup, ref PlayerNum) )
                                {
                                    throw (new Exception());
                                }
                                if ( PlayerNum < Constants.PlayerCountMax )
                                {
                                    unitGroup = map.UnitGroups[Convert.ToInt32(PlayerNum)];
                                }
                                else
                                {
                                    unitGroup = map.ScavengerUnitGroup;
                                    objectPlayerNumInvalidCount++;
                                }
                            }
                            catch ( Exception )
                            {
                                objectPlayerNumInvalidCount++;
                                unitGroup = map.ScavengerUnitGroup;
                            }
                            newObject.UnitGroup = unitGroup;
                        }
                    }
                    if ( iniObject2.ID == 0U )
                    {
                        // iniObject2.ID = availableID;
                        App.ZeroIDWarning(newObject, iniObject2.ID, returnResult);
                    }
                    unitAdd.NewUnit = newObject;
                    unitAdd.ID = iniObject2.ID;
                    unitAdd.Label = iniObject2.Label;
                    unitAdd.Perform();
                    App.ErrorIDChange(iniObject2.ID, newObject, "Read_FMap_Objects");
                    if ( availableID == iniObject2.ID )
                    {
                        availableID = newObject.ID + 1U;
                    }
                }

                if ( unknownUnitTypeCount > maxUnknownUnitTypeWarningCount )
                {
                    returnResult.WarningAdd (string.Format ("{0} objects were not in the loaded object data.", unknownUnitTypeCount));
                }
                if ( objectTypeMissingCount > 0 )
                {
                    returnResult.WarningAdd (string.Format ("{0} objects did not specify a type and were ignored.", objectTypeMissingCount));
                }
                if ( droidComponentUnknownCount > 0 )
                {
                    returnResult.WarningAdd (string.Format ("{0} components used by droids were loaded as unknowns.", droidComponentUnknownCount));
                }
                if ( objectPlayerNumInvalidCount > 0 )
                {
                    returnResult.WarningAdd (string.Format ("{0} objects had an invalid player number and were set to player 0.", objectPlayerNumInvalidCount));
                }
                if ( objectPosInvalidCount > 0 )
                {
                    returnResult.WarningAdd (string.Format ("{0} objects had a position that was off-map and were ignored.", objectPosInvalidCount));
                }
                if ( designTypeUnspecifiedCount > 0 )
                {
                    returnResult.WarningAdd (string.Format ("{0} designed droids did not specify a template droid type and were set to droid.", designTypeUnspecifiedCount));
                }
            }
            catch (Exception ex) {
                Debugger.Break ();
                returnResult.ProblemAdd (string.Format("Got a exeption: {0}", ex.Message));
                logger.ErrorException ("Got exception", ex);
            }

            return returnResult;
        }