private SimulationDefinition CreateDefinition()
    {
        SimulationDefinition definition = new SimulationDefinition();

        SimResource resourceWater = new SimResource();

        resourceWater.id = "Water";
        SimResource resourceGrass = new SimResource();

        resourceGrass.id = "Grass";

        definition.resourceTypes.Add(resourceWater.id, resourceWater);
        definition.resourceTypes.Add(resourceGrass.id, resourceGrass);

        //Add 2 of water every 10 ticks
        SimRuleValueMap valueMapWater = new SimRuleValueMap();

        valueMapWater.mapId = "Water";

        SimRuleCommandAdd commandAddWater = new SimRuleCommandAdd();

        commandAddWater.amount = 2;
        commandAddWater.target = valueMapWater;

        SimRuleMap ruleMapAddWater = new SimRuleMap();

        ruleMapAddWater.id                 = "AddWater";
        ruleMapAddWater.rate               = 10;
        ruleMapAddWater.randomTiles        = true;
        ruleMapAddWater.randomTilesPercent = 25;
        ruleMapAddWater.commands           = new SimRuleCommand[] {
            commandAddWater
        };

        //Water Map
        SimMapType mapTypeWater = new SimMapType();

        mapTypeWater.id       = "Water";
        mapTypeWater.color    = 0x0000FF;
        mapTypeWater.capacity = 100;
        mapTypeWater.rules    = new SimRuleMap[] {
            ruleMapAddWater
        };

        definition.mapTypes.Add(mapTypeWater.id, mapTypeWater);

        //Add grass every 7 ticks if there is 10 of water available
        SimRuleValueMap valueMapGrass = new SimRuleValueMap();

        valueMapGrass.mapId = "Grass";

        SimRuleCommandRemove commandRemoveWater = new SimRuleCommandRemove();

        commandRemoveWater.amount = 10;
        commandRemoveWater.target = valueMapWater;

        SimRuleCommandAdd commandAddGrass = new SimRuleCommandAdd();

        commandAddGrass.amount = 1;
        commandAddGrass.target = valueMapGrass;

        SimRuleMap ruleMapCreateGrass = new SimRuleMap();

        ruleMapCreateGrass.id       = "CreateGrass";
        ruleMapCreateGrass.rate     = 7;
        ruleMapCreateGrass.commands = new SimRuleCommand[] {
            commandRemoveWater,
            commandAddGrass
        };

        //Grass Map
        SimMapType mapTypeGrass = new SimMapType();

        mapTypeGrass.id       = "Grass";
        mapTypeGrass.color    = 0x00FF00;
        mapTypeGrass.capacity = 10;
        mapTypeGrass.rules    = new SimRuleMap[] {
            ruleMapCreateGrass
        };

        definition.mapTypes.Add(mapTypeGrass.id, mapTypeGrass);

        return(definition);
    }
    private SimRuleCommand ParseCommand(string line)
    {
        string[] lineSplit       = SplitLine(line);
        int      lineSplitOffset = 0;

        SimRuleCommand command = null;

        //Find target
        SimRuleValue target = null;

        switch (lineSplit[lineSplitOffset])
        {
        case "local":
            target = new SimRuleValueLocal();
            ((SimRuleValueLocal)target).resource = definition.GetResource(lineSplit[1]);
            lineSplitOffset += 2;
            break;

        case "global":
            target = new SimRuleValueGlobal();
            ((SimRuleValueGlobal)target).resource = definition.GetResource(lineSplit[1]);
            lineSplitOffset += 2;
            break;

        case "map":
            target = new SimRuleValueMap();
            ((SimRuleValueMap)target).mapId = lineSplit[1];
            lineSplitOffset += 2;
            break;

        case "agent":
            command = new SimRuleCommandAgent();
            ((SimRuleCommandAgent)command).agentType = definition.GetAgentType(lineSplit[1]);
            lineSplitOffset += 2;

            while (lineSplitOffset < lineSplit.Length)
            {
                switch (lineSplit[lineSplitOffset++])
                {
                case "to":
                    ((SimRuleCommandAgent)command).searchTarget = lineSplit[lineSplitOffset++];
                    break;

                case "add":
                    ((SimRuleCommandAgent)command).resources = ParseResourcesArray(lineSplit, ref lineSplitOffset);
                    break;

                default:
                    ThrowInvalidLine("ParseCommand() - Invalid agent parameter");
                    break;
                }
            }
            break;
        }

        if (target != null)
        {
            switch (lineSplit[lineSplitOffset])
            {
            case "add":
                command = new SimRuleCommandAdd();
                ((SimRuleCommandAdd)command).target = target;
                ((SimRuleCommandAdd)command).amount = ParseInt(lineSplit[lineSplitOffset + 1]);
                break;

            case "remove":
                command = new SimRuleCommandRemove();
                ((SimRuleCommandRemove)command).target = target;
                ((SimRuleCommandRemove)command).amount = ParseInt(lineSplit[lineSplitOffset + 1]);
                break;

            case "greater":
                command = new SimRuleCommandTest();
                ((SimRuleCommandTest)command).target     = target;
                ((SimRuleCommandTest)command).comparison = SimRuleCommandTest.Comparison.Greater;
                ((SimRuleCommandTest)command).amount     = ParseInt(lineSplit[lineSplitOffset + 1]);
                break;

            case "less":
                command = new SimRuleCommandTest();
                ((SimRuleCommandTest)command).target     = target;
                ((SimRuleCommandTest)command).comparison = SimRuleCommandTest.Comparison.Less;
                ((SimRuleCommandTest)command).amount     = ParseInt(lineSplit[lineSplitOffset + 1]);
                break;

            case "equals":
                command = new SimRuleCommandTest();
                ((SimRuleCommandTest)command).target     = target;
                ((SimRuleCommandTest)command).comparison = SimRuleCommandTest.Comparison.Equals;
                ((SimRuleCommandTest)command).amount     = ParseInt(lineSplit[lineSplitOffset + 1]);
                break;
            }
        }

        return(command);
    }