Exemple #1
0
        private static List <IncorrectDrinkDialogueOption> LoadIncorrectDrinkDialogueOptions(string file)
        {
            var path = Path.Combine("Dialogue", file);
            var data = CSVReader.Read(path);

            var options = new List <IncorrectDrinkDialogueOption>();

            for (var i = 0; i < data.Count; i++)
            {
                var datum = data[i];

                var dialogueLine       = data[i]["Line"] as string;
                var speciesTypeString  = data[i]["Species"] as string;
                var reasonString       = data[i]["Reason"] as string;
                var destroyDrinkString = data[i]["Destroy Drink"] as string;

                SpeciesType          species = speciesTypeString.Length == 0 ? species = SpeciesType.None : (SpeciesType)System.Enum.Parse(typeof(SpeciesType), data[i]["Species"] as string);
                IncorrectDrinkReason reason  = reasonString.Length == 0 ? reason = IncorrectDrinkReason.None : (IncorrectDrinkReason)System.Enum.Parse(typeof(IncorrectDrinkReason), data[i]["Reason"] as string);
                bool destroyDrink            = destroyDrinkString.Length == 0 ? false : destroyDrinkString == "Yes";

                options.Add(new IncorrectDrinkDialogueOption(dialogueLine, species, reason, destroyDrink));
            }

            return(options);
        }
        public void test_SpeciesType()
        {
            SpeciesType st = new SpeciesType(2, 4);

            assertEquals(true, st.hasRequiredElements());
            st = null;
        }
        public override void UpdateContent()
        {
            fGraph.Clear();
            if (fModel == null)
            {
                return;
            }

            IList <Inhabitant> records = fModel.QueryInhabitants();

            foreach (Inhabitant rec in records)
            {
                SpeciesType speciesType = fModel.GetSpeciesType(rec.SpeciesId);
                ItemType    itemType    = ALCore.GetItemType(speciesType);

                int      currAqmId = 0;
                DateTime inclusionDate, exclusionDate;
                fModel.GetInhabitantDates(rec.Id, itemType, out inclusionDate, out exclusionDate, out currAqmId);

                if (ALCore.IsZeroDate(inclusionDate))
                {
                    continue;
                }

                if (ALCore.IsZeroDate(exclusionDate))
                {
                    exclusionDate = DateTime.Now;
                }

                Color color = ALData.SpeciesTypes[(int)speciesType].Color;
                fGraph.AddEventFrame(new EventFrame(rec.Name, inclusionDate, exclusionDate, color));
            }
        }
Exemple #4
0
 public IncorrectDrinkDialogueOption(string line, SpeciesType species, IncorrectDrinkReason reason, bool destroyDrink)
 {
     this.line         = line;
     this.species      = species;
     this.reason       = reason;
     this.destroyDrink = destroyDrink;
 }
    public static SpeciesStability[] ComputeSpeciesStability(PopulationManager populationManager, LevelObjectiveData objective)
    {
        // Project the minimums of the species out several days
        SpeciesCount[] speciesCounts = ProjectNextSpeciesCount(populationManager);
        // Create the array to return
        SpeciesStability[] speciesStabilities = new SpeciesStability[speciesCounts.Length];

        // Compute the stability of each species based on the projected minimum
        for (int i = 0; i < speciesCounts.Length; i++)
        {
            SpeciesType species = speciesCounts[i].species;

            // Add up the target population for every data that has the same species
            int targetAmount = objective.survivalObjectiveDatas
                               .Where(data => data.targetSpecies.Species == species)
                               .Sum(data => data.targetPopulationSize);

            // Species is stable if the projected minimum
            // is bigger than or equal to the target amount
            speciesStabilities[i] = new SpeciesStability()
            {
                species  = species,
                isStable = speciesCounts[i].count >= targetAmount
            };
        }

        return(speciesStabilities);
    }
    public static SpeciesCount[] ProjectNextSpeciesCount(PopulationManager populationManager)
    {
        // Use a dictionary to easily store and look up the counts
        Dictionary <SpeciesType, SpeciesCount> counts = new Dictionary <SpeciesType, SpeciesCount>();

        // Update the counts for each population in the population manager
        foreach (Population population in populationManager.Populations)
        {
            // Assign the species for convenience
            SpeciesType species = population.species.Species;

            // If the dictionary does not yet contain the key
            // then add the key to the dictionary
            if (!counts.ContainsKey(species))
            {
                counts.Add(species, new SpeciesCount()
                {
                    species = population.species.Species,
                    count   = 0
                });
            }

            // Calculate the population's next size
            GrowthCalculator calculator = population.GrowthCalculator;
            counts[species].count += calculator.CalculateNextPopulationSize();
        }

        return(counts.Values.ToArray());
    }
        public void ChangeSelectedType()
        {
            SpeciesType type = fView.TypeCombo.GetSelectedTag <SpeciesType>();

            bool isFish         = (type == SpeciesType.Fish);
            bool isInvertebrate = (type == SpeciesType.Invertebrate);

            fView.AdultSizeField.Enabled   = isFish || isInvertebrate;
            fView.LifeSpanField.Enabled    = isFish || isInvertebrate;
            fView.SwimLevelCombo.Enabled   = isFish || isInvertebrate;
            fView.TemperamentCombo.Enabled = isFish || isInvertebrate;

            switch (type)
            {
            case SpeciesType.Fish:
                break;

            case SpeciesType.Invertebrate:
                break;

            case SpeciesType.Plant:
                break;

            case SpeciesType.Coral:
                break;
            }
        }
Exemple #8
0
        private static bool OptionIsValid(IncorrectDrinkDialogueOption option, SpeciesType species, IncorrectDrinkReason reason)
        {
            var speciesIsValid = option.species == SpeciesType.None || option.species == species;
            var reasonIsValid  = option.reason == IncorrectDrinkReason.None || option.reason == reason;

            return(speciesIsValid && reasonIsValid);
        }
Exemple #9
0
        private static List <DialogueOption> LoadOptions(string file)
        {
            var path = Path.Combine("Dialogue", file);
            var data = CSVReader.Read(path);

            var options = new List <DialogueOption>();

            for (var i = 0; i < data.Count; i++)
            {
                var datum = data[i];

                var dialogueLine            = data[i]["Line"] as string;
                var dialogueOutcomeString   = data[i]["Dialogue Outcome"] as string;
                var speciesTypeString       = data[i]["Species"] as string;
                var jobTypeString           = data[i]["Job"] as string;
                var alcoholicRequiredString = data[i]["Alcoholic"] as string;

                DialogueOutcome dialogueOutcome = dialogueOutcomeString.Length == 0 ? dialogueOutcome = DialogueOutcome.Default : (DialogueOutcome)System.Enum.Parse(typeof(DialogueOutcome), dialogueOutcomeString);
                SpeciesType     species         = speciesTypeString.Length == 0 ? species = SpeciesType.None : (SpeciesType)System.Enum.Parse(typeof(SpeciesType), data[i]["Species"] as string);
                JobType         job             = jobTypeString.Length == 0 ? job = JobType.None : (JobType)System.Enum.Parse(typeof(JobType), data[i]["Job"] as string);
                Required        alcoholRequired = alcoholicRequiredString.Length == 0 ? Required.None : (Required)System.Enum.Parse(typeof(Required), data[i]["Alcoholic"] as string);

                options.Add(new DialogueOption(dialogueLine, dialogueOutcome, species, job, alcoholRequired));
            }

            return(options);
        }
Exemple #10
0
 public DialogueOption(string line, DialogueOutcome outcome, SpeciesType species, JobType job, Required required)
 {
     this.line     = line;
     this.outcome  = outcome;
     this.species  = species;
     this.job      = job;
     this.required = required;
 }
Exemple #11
0
        private static bool OptionIsValid(DialogueOption option, SpeciesType species, JobType job, Required required)
        {
            var speciesIsValid  = option.species == SpeciesType.None || option.species == species;
            var jobIsValid      = option.job == JobType.None || option.job == job;
            var requiredIsValid = option.required == Required.None || option.required == required;

            return(speciesIsValid && jobIsValid && requiredIsValid);
        }
Exemple #12
0
        private LoadButtonClickedEventArgs OnLoadButtonClicked(int animalShelterId, SpeciesType speciesCode, int gender, DateTime foundDateFrom, DateTime foundDateTo)
        {
            LoadButtonClickedEventArgs args = new LoadButtonClickedEventArgs(animalShelterId, speciesCode, gender, foundDateFrom, foundDateTo);

            OnLoadButtonClicked(args);

            return(args);
        }
Exemple #13
0
 public LoadButtonClickedEventArgs(int animalShelterId, SpeciesType speciesCode, int gender, DateTime foundDateFrom, DateTime foundDateTo)
 {
     AnimalShelterId = animalShelterId;
     SpeciesCode     = speciesCode;
     Gender          = gender;
     FoundDateFrom   = foundDateFrom;
     FoundDateTo     = foundDateTo;
 }
Exemple #14
0
        public void test_Model_createSpeciesType()
        {
            SpeciesType c = M.createSpeciesType();

            assertTrue(c != null);
            assertTrue(M.getNumSpeciesTypes() == 1);
            assertEquals(M.getSpeciesType(0), c);
        }
Exemple #15
0
        public void test_SpeciesType()
        {
            SpeciesType st = new SpeciesType(2, 4);

            assertEquals(false, (st.hasRequiredAttributes()));
            st.setId("st");
            assertEquals(true, st.hasRequiredAttributes());
            st = null;
        }
Exemple #16
0
        public override void UpdateContent()
        {
            fRootItem.Items.Clear();

            var unkTax = fDataMap.Model.CreateItem(fRootItem, "Unknown Taxonomy", 0.0d);

            Dictionary <string, SpeciesItem> species = new Dictionary <string, SpeciesItem>();

            IList <Inhabitant> records = fModel.QueryInhabitants();

            foreach (Inhabitant rec in records)
            {
                Species spc = fModel.GetRecord <Species>(rec.SpeciesId);
                if (spc == null)
                {
                    continue;
                }

                SpeciesType speciesType = fModel.GetSpeciesType(rec.SpeciesId);
                ItemType    itemType    = ALCore.GetItemType(speciesType);
                int         quantity    = fModel.QueryInhabitantsCount(rec.Id, itemType);

                if (quantity != 0)
                {
                    string name = string.Format("{0} ({1})", spc.ScientificName, spc.Name);

                    SpeciesItem item;
                    if (!species.TryGetValue(name, out item))
                    {
                        item = new SpeciesItem(name, spc.BioFamily, quantity);
                        species.Add(name, item);
                    }
                    else
                    {
                        item.Quantity += quantity;
                    }
                }
            }

            foreach (var pair in species)
            {
                var item = pair.Value;
                var row  = SearchFamily(item.Family);
                if (row == null)
                {
                    fDataMap.Model.CreateItem(unkTax, item.Name, item.Quantity);
                }
                else
                {
                    var taxItem = GetTaxonomyItem(row);
                    fDataMap.Model.CreateItem(taxItem, item.Name, item.Quantity);
                }
            }

            fDataMap.UpdateView();
        }
 public void setUp()
 {
     CT = new  SpeciesType(2, 4);
     if (CT == null)
     {
         ;
     }
     {
     }
 }
        public void test_Model_createSpeciesType()
        {
            Model       m = new  Model(2, 2);
            SpeciesType p = m.createSpeciesType();

            assertTrue(m.getNumSpeciesTypes() == 1);
            assertTrue((p).getLevel() == 2);
            assertTrue((p).getVersion() == 2);
            m = null;
        }
        public void test_SpeciesType_parent_create()
        {
            Model       m  = new Model(2, 4);
            SpeciesType st = m.createSpeciesType();
            ListOf      lo = m.getListOfSpeciesTypes();

            assertTrue(lo == m.getSpeciesType(0).getParentSBMLObject());
            assertTrue(lo == st.getParentSBMLObject());
            assertTrue(m == lo.getParentSBMLObject());
        }
Exemple #20
0
 public void setUp()
 {
     ST = new  SpeciesType(2, 2);
     if (ST == null)
     {
         ;
     }
     {
     }
 }
        public void test_Model_addSpeciesType3()
        {
            Model       m  = new  Model(2, 2);
            SpeciesType st = null;
            int         i  = m.addSpeciesType(st);

            assertTrue(i == libsbml.LIBSBML_OPERATION_FAILED);
            assertTrue(m.getNumSpeciesTypes() == 0);
            m = null;
        }
Exemple #22
0
        public NpcTemplate(NPCName name, SpeciesType species, JobType job, FaceType face, HairType hair, ClothingTopType top, ClothingBottomType bottom) : this()
        {
            Name    = name;
            Species = species;
            Job     = job;

            Top    = top;
            Bottom = bottom;
            Hair   = hair;
            Face   = face;
        }
Exemple #23
0
        public void test_SpeciesType_copyConstructor()
        {
            SpeciesType o1 = new SpeciesType(2, 4);

            o1.setId("c");
            assertTrue(o1.getId() == "c");
            SpeciesType o2 = new SpeciesType(o1);

            assertTrue(o2.getId() == "c");
            assertTrue(o2.getParentSBMLObject() == o1.getParentSBMLObject());
            o2 = null;
            o1 = null;
        }
        public void test_Model_addSpeciesType2()
        {
            Model       m  = new  Model(2, 2);
            SpeciesType st = new  SpeciesType(2, 3);

            st.setId("st");
            int i = m.addSpeciesType(st);

            assertTrue(i == libsbml.LIBSBML_VERSION_MISMATCH);
            assertTrue(m.getNumSpeciesTypes() == 0);
            st = null;
            m  = null;
        }
        public void test_SpeciesType_parent_NULL()
        {
            SBMLDocument d  = new SBMLDocument(2, 4);
            Model        m  = d.createModel();
            SpeciesType  c  = m.createSpeciesType();
            SpeciesType  c1 = c.clone();

            d = null;
            assertTrue(c1.getAncestorOfType(libsbml.SBML_MODEL) == null);
            assertTrue(c1.getParentSBMLObject() == null);
            assertEquals(c1.getSBMLDocument(), null);
            c1 = null;
        }
        public void test_Model_addSpeciesType1()
        {
            Model       m  = new  Model(2, 2);
            SpeciesType st = new  SpeciesType(2, 2);
            int         i  = m.addSpeciesType(st);

            assertTrue(i == libsbml.LIBSBML_INVALID_OBJECT);
            st.setId("st");
            i = m.addSpeciesType(st);
            assertTrue(i == libsbml.LIBSBML_OPERATION_SUCCESS);
            assertTrue(m.getNumSpeciesTypes() == 1);
            st = null;
            m  = null;
        }
Exemple #27
0
        public void test_SpeciesType_assignmentOperator()
        {
            SpeciesType o1 = new SpeciesType(2, 4);

            o1.setId("c");
            assertTrue(o1.getId() == "c");
            SpeciesType o2 = new SpeciesType(2, 4);

            o2 = o1;
            assertTrue(o2.getId() == "c");
            assertTrue(o2.getParentSBMLObject() == o1.getParentSBMLObject());
            o2 = null;
            o1 = null;
        }
Exemple #28
0
        private void TransferHandler(object sender, EventArgs e)
        {
            var record = ListView.GetSelectedTag <Inhabitant>();

            if (record == null)
            {
                return;
            }

            SpeciesType speciesType = fModel.GetSpeciesType(record.SpeciesId);
            ItemType    itemType    = ALCore.GetItemType(speciesType);

            Browser.TransferItem(itemType, record.Id, this);
        }
        public void test_SpeciesType_parent_add()
        {
            SpeciesType ia = new SpeciesType(2, 4);

            ia.setId("s");
            Model m = new Model(2, 4);

            m.addSpeciesType(ia);
            ia = null;
            ListOf lo = m.getListOfSpeciesTypes();

            assertTrue(lo == m.getSpeciesType(0).getParentSBMLObject());
            assertTrue(m == lo.getParentSBMLObject());
        }
Exemple #30
0
        public static NpcTemplate GenerateAnon(SpeciesType species)
        {
            var job  = JobTypeUtil.GetRandomNonCrewJobType();
            var name = (NPCName)System.Enum.Parse(typeof(NPCName), job.ToString());

            return(new NpcTemplate
                   (
                       name: name,
                       species: species,
                       job: job,
                       face: FaceUtil.GetRandomFace(species),
                       hair: HairUtil.GetRandomHiar(species),
                       top: ClothingUtil.GetRandomTop(species),
                       bottom: ClothingUtil.GetRandomBottom(species)
                   ));
        }
Exemple #31
0
 public void SpeciesTypeElement(Hashtable attrs)
 {
     SpeciesType specType = new SpeciesType(this.model, attrs);
     this.model.listOfSpeciesTypes.Add(specType);
 }
Exemple #32
0
        /// <summary>
        /// Creates the class (one instance only) that parses a scenario and puts events on queues
        /// </summary>
        /// <param name="scenarioFile"></param>
        public ScenarioToQueues(string scenarioFile, string schemaFile)
        {

    

            TimerQueueClass timerQueue = new TimerQueueClass();
            // Extract fields from the XML file (and schema)
            // see http://weblogs.asp.net/dbrowning/articles/114561.aspx  
            // paths to xml/xsd
            // const string path = @"C:\Documents and Settings\dgeller\My Documents\Visual Studio 2005\Projects\";
            //const string scenarioFile = path + @"DDD\Scenario.xml";
            // const string xsdPath = path + @"XMLTrial\XMLTrial\ScenarioSchema.xsd";




            FileStream fs;
            Boolean returnVal;
//            ScenarioToQueues.schemaFile = schemaFile;

            //    try
            //  {
            returnVal = ValidateScenario(scenarioFile);
            // }
            /*    catch (System.Exception e)
                {

                    string message = "Failed to validate schema. " + e.Message;
                    Coordinator.debugLogger.LogException("Scenario Reader", message);
                    throw new ApplicationException(message, e);
                }*/

            if (!returnVal)
            {
                return;
            }


            try
            {
                fs = File.Open(scenarioFile, FileMode.Open);
            }
            catch (System.Exception e)
            {
                string message = "Could not open scenario file on pass 2." + e.Message;
                Coordinator.debugLogger.LogException("Scenario Reader", message);
                throw new ApplicationException(message, e);
            }

            /// XmlReader readerTwo;
            try
            {
                XmlSchemaSet sc = new XmlSchemaSet();
                sc.Add(null, ScenarioToQueues.namedSchemaFile);//+".xsd");
                XmlReaderSettings readerSettings = new XmlReaderSettings();

                // readerSettings.ValidationType = ValidationType.Schema;
                readerSettings.IgnoreWhitespace = true;
                // makes no difference ?!               readerSettings.IgnoreWhitespace = true;
                //   readerSettings.ValidationEventHandler += new ValidationEventHandler(SchemaValidationHandler);

                reader = XmlReader.Create(fs, readerSettings);
                parser.SetReader(reader);

            }
            catch (System.Exception e)
            {
                fs.Close();
                string message = "Could not open schema file. " + e.Message;
                Coordinator.debugLogger.LogException("Scenario Reader", message);
                throw new ApplicationException(message, e);

            }

            //Build reverse dictionary of commnds->stage
            //This lets us enforce moving through the commands in a prescribed order
            Dictionary<string, int> stages = new Dictionary<string, int>();
            string[][] stageMembers = parser.StageMembers();
            for (int level = 0; level < stageMembers.Length; level++)
            {
                for (int member = 0; member < stageMembers[level].Length; member++)
                {
                    stages[stageMembers[level][member]] = level;
                }
            }
            int currentStage = 0;
            string scenarioName = "";
            string description = "";


            reader.Read(); // opens, gets to xml declaration
            reader.Read();
            try
            {
                if ("Scenario" == reader.Name) // only Scenario can be top level
                {
                    reader.Read(); // pass by "Scenario"

                    while (!reader.EOF && !((XmlNodeType.EndElement == reader.NodeType) && ("Scenario" == reader.Name)))
                    {

                        //Coordinator.debugLogger.Writeline(".");

                        switch (reader.NodeType)
                        {

                            case XmlNodeType.Element:
                                Coordinator.debugLogger.Writeline("ScenarioToQueues", "ELEMENT " + reader.Name, "test");
                                if (stages.ContainsKey(reader.Name))
                                {
                                    if (stages[reader.Name] < currentStage) 
                                        throw new ApplicationException("Command " + reader.Name + " out of sequence.");
                                    currentStage = stages[reader.Name];
                                    //NB, if command is not found in stages it will be trapped in the switch's default
                                }
                                switch (reader.Name)
                                {

                                    case "ScenarioName":
                                        scenarioName = parser.pGetString();
                                        break;
                                    case "Description":
                                        description = parser.pGetString();
                                        break;
                                    case "ClientSideAssetTransfer":
                                        ClientSideAssetTransferType assetTransfers = new ClientSideAssetTransferType(parser.pGetBoolean());
                                        TimerQueueClass.SendBeforeStartup(assetTransfers);
                                        Coordinator.debugLogger.Writeline("ScenarioToQueues", " ClientSideAssetTransferType ", "test");
                                        break;
                                    case "ClientSideStartingLabelVisible":
                                        ClientSideStartingLabelVisibleType labelsVisible = new ClientSideStartingLabelVisibleType(parser.pGetBoolean());
                                        TimerQueueClass.SendBeforeStartup(labelsVisible);
                                        Coordinator.debugLogger.Writeline("ScenarioToQueues", " ClientSideStartingLabelVisibleType ", "test");
                                        break;
                                    case "ClientSideRangeRingVisibility":
                                        ClientSideRangeRingVisibilityType rangeRingVisibility = new ClientSideRangeRingVisibilityType(parser.pGetString());
                                        TimerQueueClass.SendBeforeStartup(rangeRingVisibility);
                                        Coordinator.debugLogger.Writeline("ScenarioToQueues", "ClientSideRangeRingVisibilityType", "test");
                                        break;
                                    case "Playfield":
                                        // except for the optional name/description
                                        // Playfield must be first scenario item sent
                                        // enforced by schema
                                        string errorText = string.Empty;
                                        string imgLibPath = string.Empty;
                                        string mapFilePath = string.Empty;
                                        string hostname = Aptima.Asim.DDD.CommonComponents.ServerOptionsTools.ServerOptions.HostName;
                                        pPlayfieldType pDefine = parser.pGetPlayfield();
                                        PlayfieldEventType playfield = new PlayfieldEventType(pDefine);
                                        playfield.ScenarioName = scenarioName;
                                        playfield.Description = description;
                                        if (playfield.IconLibrary.EndsWith(".dll"))
                                        {
                                            imgLibPath = String.Format(@"\\{0}\{1}", ServerOptions.DDDClientPath, playfield.IconLibrary); //icon library does include dll extension
                                        }
                                        else
                                        {
                                            imgLibPath = String.Format(@"\\{0}\{1}.dll", ServerOptions.DDDClientPath, playfield.IconLibrary); //icon library doesnt include dll extension
                                        }
                                        mapFilePath = String.Format(@"\\{0}\MapLib\{1}", ServerOptions.DDDClientPath, playfield.MapFileName); //map file includes file extension

                                        //check image library path
                                        if (!File.Exists(imgLibPath))
                                        {
                                            if (System.Windows.Forms.MessageBox.Show(String.Format("The server was not able to locate the image library in {0}.  There is a chance that clients connecting to this machine will have a similar issue locating this file.  If you'd still like to run the simulation, click Yes.  If you'd like to stop the server, click No.", imgLibPath), "File not found", System.Windows.Forms.MessageBoxButtons.YesNo, System.Windows.Forms.MessageBoxIcon.Information) == System.Windows.Forms.DialogResult.Yes)
                                            {//User wants to continue

                                            }
                                            else
                                            { //user wants to stop server
                                                throw new Exception("User Cancelled server process.  Server was unable to locate the image library at " + imgLibPath);
                                                return;
                                            }
                                        }

                                        //check map file path
                                        if (!File.Exists(mapFilePath))
                                        {
                                            if (System.Windows.Forms.MessageBox.Show(String.Format("The server was not able to locate the map file in {0}.  There is a chance that clients connecting to this machine will have a similar issue locating this file.  If you'd still like to run the simulation, click Yes.  If you'd like to stop the server, click No.", mapFilePath), "File not found", System.Windows.Forms.MessageBoxButtons.YesNo, System.Windows.Forms.MessageBoxIcon.Information) == System.Windows.Forms.DialogResult.Yes)
                                            {//User wants to continue

                                            }
                                            else
                                            { //user wants to stop server
                                                throw new Exception("User Cancelled server process.  Server was unable to locate the map file at " + mapFilePath);
                                                return;
                                            }
                                        }
                                        TimerQueueClass.SendBeforeStartup(playfield);
                                        Coordinator.debugLogger.Writeline("ScenarioToQueues", "Playfield", "test");
                                        
                                        TimerQueueClass.SendBeforeStartup(new RandomSeedType());
                                        break;
                                    case "LandRegion":
                                        pLandRegionType region = parser.pGetLandRegion();
                                        RegionEventType regionEvent = new RegionEventType(region);

                                        TimerQueueClass.SendBeforeStartup(regionEvent);
                                        Coordinator.debugLogger.Writeline("ScenarioToQueues", " LandRegion " + regionEvent.UnitID, "test");

                                        break;
                                    /*
                                case "ScoringRegion":
                                    pScoringRegionType regionS = parser.pGetScoringRegion();
                                    RegionEventType regionEventS = new RegionEventType(regionS);
                                    TimerQueueClass.SendBeforeStartup(regionEventS);
                                    Coordinator.debugLogger.Writeline("ScenarioToQueues", " ScoringRegion " + regionEventS.UnitID, "test");
                                    break;
                                    */
                                    case "ActiveRegion":
                                        pActiveRegionType regionA = parser.pGetActiveRegion();
                                        RegionEventType regionEventA = new RegionEventType(regionA);
                                        if (!NameLists.activeRegionNames.New(regionA.ID, regionEventA)) throw new ApplicationException("Duplicate active region name " + regionA.ID);
                                        TimerQueueClass.SendBeforeStartup(regionEventA);
                                        Coordinator.debugLogger.Writeline("ScenarioToQueues", " ActiveRegion " + regionEventA.UnitID, "test");
                                        break;
                                    case "Team":
                                        pTeamType team = parser.pGetTeam();
                                        TeamType teamEvent = new TeamType(team);
                                        for (int i = 0; i < teamEvent.Count(); i++)
                                        {
                                            UnitFacts.AddEnemy(teamEvent.Name, teamEvent.GetEnemy(i));

                                        }
                                        Coordinator.debugLogger.Writeline("ScenarioToQueues", " Team " + team.Name.ToString(), "test");
                                        if (!NameLists.teamNames.New(team.Name, teamEvent)) throw new ApplicationException("Duplicate team name " + team.Name);

                                        TimerQueueClass.SendBeforeStartup(teamEvent);
                                        break;
                                    case "DecisionMaker":
                                        DecisionMakerType decisionMaker = new DecisionMakerType(parser.pGetDecisionMaker());
                                        UnitFacts.AddDM(decisionMaker.Identifier, decisionMaker.Chroma, decisionMaker.Team);
                                        TimerQueueClass.SendBeforeStartup(decisionMaker);
                                        Coordinator.debugLogger.Writeline("ScenarioToQueues", "Decision Maker ", "test");
                                        break;
                                    case "Network":
                                        NetworkType network = new NetworkType(parser.pGetNetwork());
                                        NetworkTable.AddNetwork(network);
                                        TimerQueueClass.SendBeforeStartup(network);
                                        Coordinator.debugLogger.Writeline("ScenarioToQueues", "Network ", "test");
                                        break;


                                    case "Sensor":
                                        //sensor follows Playfield
                                        pSensor sen = parser.pGetSensor();
                                        // if Attribute is "all" there will be one cone; only extent is filled in from parser
                                        if (sen.Attribute == "All")
                                        {
                                            sen.Cones[0].Spread = 360;
                                            sen.Cones[0].Level = "Total";
                                        }
                                        SensorTable.Add(sen.Name, new SensorType(sen.Attribute, sen.IsEngram, sen.TypeIfEngram, sen.Cones));

                                        Coordinator.debugLogger.Writeline("ScenarioToQueues", " Sensor " + sen.Name.ToString(), "test");

                                        break;
                                    /*    case "TimeToRemove":
                                                Defaults.DefaultTimeToRemove = parser.pGetInt();
                                                break;
                                     */
                                    case "Classifications":
                                        ClassificationsType classifications = new ClassificationsType(parser.pGetClassifications());
                                        TimerQueueClass.SendBeforeStartup(classifications);
                                        Coordinator.debugLogger.Writeline("ScenarioToQueues", " Classifications ", "test");
                                        break;
                                    case "TimeToAttack":
                                        Defaults.DefaultTimeToAttack = parser.pGetInt()*1000;
                                        break;

                                    case "Genus":
                                        pGenusType g = parser.pGetGenus();
                                        if (!NameLists.speciesNames.New(g.Name, g))
                                            throw new ApplicationException("Duplicate use of genus name " + g.Name);
  
                                        Genealogy.Add(g.Name);


                                        Coordinator.debugLogger.Writeline("ScenarioToQueues", "Genus " + g.Name, "test");
                                        // StartupForUnits.Add(genus);
                                        break;

                                    case "Species":
                                        // Genus and species come after playfield


                                        pSpeciesType s = parser.pGetSpecies();
                                        SpeciesType species = new SpeciesType(s);
                                        if (!NameLists.speciesNames.New(species.Name, species))
                                            throw new ApplicationException("Duplicate use of species name " + species.Name);
                                        Genealogy.Add(species.Name, species.BasedOn);
                                        if (species.IsWeapon)
                                        {
                                            WeaponTable.Add(species.Name);
                                        }

                                        WorkStates.Clear();
                                        WorkStates.Add(species.States);
                                        StatesForUnits.AddStatesOf(species.Name, WorkStates.CollapseStates(species.Name, species.BasedOn));
                                        Coordinator.debugLogger.Writeline("ScenarioToQueues", "Species " + s.Name, "test");
                                        // StartupForUnits.Add(species);
                                        break;

                                    case "Create_Event":
                                        //string newId;
                                     //   Create_EventType platformCreate;//used for sub platforms
                                        pCreateType c = parser.pGetCreate();
                                        Create_EventType createEvent = new Create_EventType(c);
                                        Genealogy.Add(createEvent.UnitID, createEvent.UnitBase);
                                        createEvent.Genus = Genealogy.GetGenus(createEvent.UnitID);
                                        UnitFacts.AddUnit(createEvent.UnitID, createEvent.Owner,createEvent.UnitBase);
                                        createEvent.Parameters = new ObjectDictionary();

                                        SpeciesType speciesInfo = (SpeciesType)NameLists.speciesNames[createEvent.UnitBase];

                                        foreach (KeyValuePair<string, StateBody> kvp in StatesForUnits.StateTable[createEvent.UnitBase])
                                        {
                                            string stateName = kvp.Key;
                                            ExtendedStateBody extended = new ExtendedStateBody(kvp.Value);
                                            
                                            //end species dependent atts
                                            createEvent.Parameters.Add(stateName, (object)extended);
                                            //               EngramDependants.Add(createEvent.UnitID, extended);

                                           
                                        }

                                        


                                        //       TimerQueueClass.Add(1, createEvent);
                                        NameLists.unitNames.New(createEvent.UnitID, null);
                                        TimerQueueClass.SecondarySendBeforeStartup(createEvent);
                                        UnitFacts.CurrentUnitStates.Add(createEvent.UnitID, "");
                                        Coordinator.debugLogger.Writeline("ScenarioToQueues", "createEvent for " + createEvent.UnitID, "test");
                                  
                                        //for some reason this docs everyone at time 1.  this seems to be the heart of the bug
                                        /*
                                        for (int i = 0; i < createEvent.Subplatforms.Count;i++ )
                                   {
                                       SubplatformDockType dockNotice = new SubplatformDockType(createEvent.Subplatforms[i], createEvent.UnitID);
                                       dockNotice.Time = 1;
                                       TimerQueueClass.SecondarySendBeforeStartup(dockNotice);

                                   }
                                         */
                                   break;
                                    case "Reveal_Event":
                                        pRevealType r = parser.pGetReveal();
                                        Reveal_EventType revealEvent = new Reveal_EventType(r);
                                        revealEvent.Genus = Genealogy.GetGenus(revealEvent.UnitID);
                                        if (r.Time > 1)
                                        {
                                            TimerQueueClass.Add(r.Time, revealEvent);
                                        }
                                        else
                                        {
                                            TimerQueueClass.SecondarySendBeforeStartup(revealEvent);
                                        }
                                        Coordinator.debugLogger.Writeline("ScenarioToQueues", "revealEvent for  " + revealEvent.UnitID + " at time" + r.Time.ToString(), "test");
                                        RevealDocked(r.UnitID, r.Time);
                                        break;

                                    case "Move_Event":
                                        pMoveType m = parser.pGetMove();
                                        if (!UnitFacts.IsAUnit(m.UnitID)) throw new ApplicationException("Cannot move non-exsitant unit " + m.UnitID);
                                        Move_EventType moveEvent = new Move_EventType(m);
                                        TimerQueueClass.Add(moveEvent.Time, moveEvent);
                                        Coordinator.debugLogger.Writeline("ScenarioToQueues", " moveEvent for  " + moveEvent.UnitID, "test");
                                        break;
                                    case "Completion_Event":
                                        HappeningCompletionType completionType = new HappeningCompletionType(parser.pGetHappeningCompletion());
                                        HappeningList.Add(completionType);
                                        break;
                                    case "Species_Completion_Event":
                                        pSpeciesCompletionType sct = parser.pGetSpeciesCompletion();
                                        SpeciesCompletionType speciesCompletion = new SpeciesCompletionType(sct);
                                        SpeciesHappeningList.Add(speciesCompletion);
                                        break;
                                    case "Reiterate":
                                        ReiterateType reiterate = new ReiterateType(parser.pGetReiterate());
                                        Move_EventType mQueued = (Move_EventType)(reiterate.ReiterateList[0]);
                                        Move_EventType mQCopy = (Move_EventType)(reiterate.ReiterateList[0]);
                                        mQueued.Range = reiterate.Range;
                                        mQueued.Time = reiterate.Time;
                                        TimerQueueClass.Add(mQueued.Time, mQueued);

                                        Coordinator.debugLogger.Writeline("ScenarioToQueues", " moveEvent from reiterate for  " + mQueued.UnitID, "test");
                                        reiterate.ReiterateList.RemoveAt(0);
                                        reiterate.ReiterateList.Add(mQCopy);
                                        HappeningCompletionType envelope = new HappeningCompletionType(reiterate);
                                        HappeningList.Add(envelope);
                                        break;
                                    case "StateChange_Event":
                                        StateChangeEvent change = new StateChangeEvent(parser.pGetStateChange());
                                        if (!UnitFacts.IsAUnit(change.UnitID)) throw new ApplicationException("State change event references unknown unit " + change.UnitID);
                                        if (!StatesForUnits.UnitHasState(change.UnitID, change.NewState)) throw new ApplicationException("State chage for " + change.UnitID + " refers to unknwon state " + change.NewState);
                                        for (int i = 0; i < change.Except.Count; i++)
                                        {
                        //                    if (!StatesForUnits.UnitHasState(Genealogy.GetBase(change.UnitID), change.Except[i])) throw new ApplicationException("State change for " + change.UnitID + " refers to unknown state " + change.Except);
                                            if (!StatesForUnits.UnitHasState(change.UnitID, change.Except[i])) throw new ApplicationException("State change for " + change.UnitID + " refers to unknown state " + change.Except);
                            
                                        }
                                        for (int i = 0; i < change.From.Count; i++)
                                        {
                            //                if (!StatesForUnits.UnitHasState(Genealogy.GetBase(change.UnitID), change.From[i])) throw new ApplicationException("State change for " + change.UnitID + " refers to unknown state " + change.From);
                                            if (!StatesForUnits.UnitHasState(change.UnitID, change.From[i])) throw new ApplicationException("State change for " + change.UnitID + " refers to unknown state " + change.From);
                               
                                        }
                                        TimerQueueClass.Add(change.Time, change);
                                        break;
                                    case "Transfer_Event":
                                        TransferEvent t = new TransferEvent(parser.pGetTransfer());

                                        if (!UnitFacts.IsDM(t.From)) throw new ApplicationException("Transfer event references unknown DM (from) " + t.From);
                                        if (!UnitFacts.IsDM(t.To)) throw new ApplicationException("Transfer event references unknown DM (to) " + t.To);
                                        if (!UnitFacts.IsAUnit(t.UnitID)) throw new ApplicationException("Transfer event references unknown unit " + t.UnitID);
                                        TimerQueueClass.Add(t.Time, t);
                                        break;
                                    case "Launch_Event":
                                        LaunchEventType launch = new LaunchEventType(parser.pGetLaunch());
                                        if (!UnitFacts.IsAUnit(launch.UnitID)) throw new ApplicationException("Cannot launch from non-existent unit " + launch.UnitID);
                                        TimerQueueClass.Add(launch.Time, launch);


                                        break;
                                    case "WeaponLaunch_Event":

                                        WeaponLaunchEventType weaponLaunch = new WeaponLaunchEventType(parser.pGetWeaponLaunch());
                                        if (!UnitFacts.IsAUnit(weaponLaunch.UnitID)) throw new ApplicationException("Cannot launch from non-existent unit " + weaponLaunch.UnitID);
                                        TimerQueueClass.Add(weaponLaunch.Time, weaponLaunch);


                                        break;
                                    case "DefineEngram":
                                        pDefineEngramType defineEngram = parser.pGetDefineEngram();
                                        Engrams.Create(defineEngram.Name, defineEngram.EngramValue, defineEngram.Type);
                                        TimerQueueClass.SendBeforeStartup(new EngramSettingType(defineEngram.Name, "", defineEngram.EngramValue, defineEngram.Type));
                                        break;
                                    case "ChangeEngram":
                                        ChangeEngramType changeEngram = new ChangeEngramType(parser.pGetChangeEngram());
                                        if (!Engrams.ValidUpdate(changeEngram.Name, changeEngram.EngramValue))
                                            throw new ApplicationException("Illegal value " + changeEngram.EngramValue + " for engram " + changeEngram.Name);
                                        TimerQueueClass.Add(changeEngram.Time, changeEngram);
                                        //  Engrams.SendUpdate(changeEngram.Name);
                                        break;
                                    case "RemoveEngram":
                                        RemoveEngramEvent removeEngram = new RemoveEngramEvent(parser.pGetRemoveEngram());
                                        TimerQueueClass.Add(removeEngram.Time, removeEngram);
                                        break;
                                    //These chat commands are those from the scenario only;
                                    // thos from client are handled immediately
                                    case "OpenChatRoom":
                                        OpenChatRoomType openChatRoom = new OpenChatRoomType(parser.pGetOpenChatRoom());
                                        TimerQueueClass.Add(openChatRoom.Time, openChatRoom);
                                        break;
                                    case "CloseChatRoom":
                                        CloseChatRoomType closeChatRoom = new CloseChatRoomType(parser.pGetCloseChatRoom());

                                        TimerQueueClass.Add(closeChatRoom.Time, closeChatRoom);
                                        break;
                                    /* Not implemented yet 
                                       case "DropChatters":
                                           DropChattersType dropChatters = new DropChattersType(parser.pGetDropChatters());
                                           TimerQueueClass.Add(dropChatters.Time, dropChatters);
                                           break;
                                       case "AddChatters":
                                           AddChattersType addChatters = new AddChattersType(parser.pGetAddChatters());
                                           TimerQueueClass.Add(addChatters.Time, addChatters);
                                           break;

                                   */
                                    case "OpenWhiteboardRoom":
                                        OpenWhiteboardRoomType openWhiteboardRoom = new OpenWhiteboardRoomType(parser.pGetOpenWhiteboardRoom());
                                        TimerQueueClass.Add(openWhiteboardRoom.Time, openWhiteboardRoom);
                                        break;
                                    case "OpenVoiceChannel":
                                        OpenVoiceChannelType openVoiceChannel = new OpenVoiceChannelType(parser.pGetOpenVoiceChannel());
                                        TimerQueueClass.Add(openVoiceChannel.Time, openVoiceChannel);
                                        break;
                                    case "CloseVoiceChannel":
                                        CloseVoiceChannelType closeVoiceChannel = new CloseVoiceChannelType(parser.pGetCloseVoiceChannel());
                                        TimerQueueClass.Add(closeVoiceChannel.Time, closeVoiceChannel);
                                        break;
                                        /*
                                         //Removed before 4.1
                                    case "GrantVoiceChannelAccess":
                                        GrantVoiceAccessType grantVoiceChannelAccess = new GrantVoiceAccessType(parser.pGetGrantVoiceChannelAccess());
                                        TimerQueueClass.Add(grantVoiceChannelAccess.Time, grantVoiceChannelAccess);
                                        break;
                                    case "RemoveVoiceChannelAccess":
                                        RemoveVoiceAccessType removeVoiceChannelAccess = new RemoveVoiceAccessType(parser.pGetRemoveVoiceChannelAccess());
                                        TimerQueueClass.Add(removeVoiceChannelAccess.Time, removeVoiceChannelAccess);
                                        break;
                                        */
                                    case "Rule":
                                        pScoringRuleType srt = parser.pGetScoringRule();
                                        ScoringRuleType scoreRule = new ScoringRuleType(srt);
                                        if (!NameLists.ruleNames.New(srt.Name, scoreRule)) throw new ApplicationException("Duplicate scoring rule name " + srt.Name);
                                        ScoringRules.Add(scoreRule);
                                        break;
                                    case "Score":
                                        pScoreType pst = parser.pGetScore();
                                        ScoreType st = new ScoreType(pst);
                                        if (!NameLists.scoreNames.New(pst.Name, st)) throw new ApplicationException("Duplicate score name " + pst.Name);
                                        Scores.Register(st);
                                        break;

                                    case "FlushEvents":
                                        FlushEvents flush = new FlushEvents(parser.pGetFlushEventsType());
                                        TimerQueueClass.Add(flush.Time, flush);
                                        break;

                                    case "SendChatMessage":
                                        SendChatMessageType sendChat = new SendChatMessageType(parser.pGetSendChatMessage());
                                        if (!UnitFacts.IsDM(sendChat.Sender) && !("EXP" == sendChat.Sender))
                                            throw new ApplicationException("In SendChatMessage, '" + sendChat.Sender + "' is not a valid DM name.");
                            // Note: Can't validate chat room name at parse time; it might not have been created yet
                                        TimerQueueClass.Add(sendChat.Time,sendChat);
                                        break;
                                    case "Apply":
                                        ApplyType apply = new ApplyType(parser.pGetApply());
                                        //what does this do?
                                        TimerQueueClass.Add(apply.Time, apply);
                                        break;
                                    case "SendVoiceMessage":
                                        SendVoiceMessageType playVoiceMessage = new SendVoiceMessageType(parser.pGetSendVoiceMessage());
                                        //what does this do?
                                        TimerQueueClass.Add(playVoiceMessage.Time, playVoiceMessage);
                                        break;
                                    case "SendVoiceMessageToUser":
                                        SendVoiceMessageToUserType playVoiceMessageToUser = new SendVoiceMessageToUserType(parser.pGetSendVoiceMessageToUser());
                                        //what does this do?
                                        TimerQueueClass.Add(playVoiceMessageToUser.Time, playVoiceMessageToUser);
                                        break;
                                    default:
                                        throw new ApplicationException("ScenarioToQueues: Unknown Scenario Element is *" + reader.Name);


                                }//switch
                                break;
                            default:
                                Coordinator.debugLogger.Writeline("ScenarioToQueues", "Unhandled or out-of-sequence XML tag " + reader.Value, "test");
                                reader.Read();
                                break;



                        } //switch

                    } //while
                    // All of scenario processed. Now do last things

                    //verify that the Chat, Whiteboard, and Voice lists contain only DMs and make them symmetric.
                    List<string> allDMs = UnitFacts.GetAllDms();
                    for (int i = 0; i < allDMs.Count; i++)
                    {
                        DecisionMakerType thisDM = DecisionMakerType.GetDM(allDMs[i]);

                        for (int j = 0; j < thisDM.ChatPartners.Count; j++)
                        {
                            if (!allDMs.Contains(thisDM.ChatPartners[j]))
                                throw new ApplicationException("Unknown decision maker name '" + thisDM.ChatPartners[j] + "' found as chat partner of '" + allDMs[i] + "'");
                            DecisionMakerType partnerDM = DecisionMakerType.GetDM(thisDM.ChatPartners[j]);
                            if (!partnerDM.ChatPartners.Contains(allDMs[i]))
                                partnerDM.MayChatWith(allDMs[i]);
                        }

                        for (int j = 0; j < thisDM.WhiteboardPartners.Count; j++)
                        {
                            if (!allDMs.Contains(thisDM.WhiteboardPartners[j]))
                                throw new ApplicationException("Unknown decision maker name '" + thisDM.WhiteboardPartners[j] + "' found as whiteboard partner of '" + allDMs[i] + "'");
                            DecisionMakerType partnerDM = DecisionMakerType.GetDM(thisDM.WhiteboardPartners[j]);
                            if (!partnerDM.WhiteboardPartners.Contains(allDMs[i]))
                                partnerDM.MayWhiteboardWith(allDMs[i]);
                        }

                        for (int j = 0; j < thisDM.VoicePartners.Count; j++)
                        {
                            if (!allDMs.Contains(thisDM.ChatPartners[j]))
                                throw new ApplicationException("Unknown decision maker name '" + thisDM.VoicePartners[j] + "' found as voice partner of '" + allDMs[i] + "'");
                            DecisionMakerType partnerDM = DecisionMakerType.GetDM(thisDM.VoicePartners[j]);
                            if (!partnerDM.VoicePartners.Contains(allDMs[i]))
                                partnerDM.MaySpeakWith(allDMs[i]);
                        }

                    }

                    // Add networks for DMs that have none
                    List<string> dmList = UnitFacts.GetAllDms();
                    for (int nextDM = 0; nextDM < dmList.Count; nextDM++)
                    {
                        if (!NetworkTable.IsNetworkMember(dmList[nextDM]))
                        {
                            string netName = "Network-For-" + dmList[nextDM];
                            NetworkTable.AddMember(netName, dmList[nextDM]);
                            NetworkType newNet = new NetworkType(netName);
                            newNet.Add(dmList[nextDM]);
                            TimerQueueClass.SendBeforeStartup(newNet);
                            Coordinator.debugLogger.Writeline("ScenarioToQueues", "Network ", "test");

                        }
                    }
                    //AD: Don't create default chat room, user should have control of this
                    // Create the detault Broadcast chatroom
                    //OpenChatRoomType broadcastChatRoom = new OpenChatRoomType(1, "", "Broadcast", dmList);
                    //TimerQueueClass.SendBeforeStartup(broadcastChatRoom);

                }//if
            }
            catch (System.Exception e)
            {
                if (e.Message.StartsWith("User Cancelled"))
                {//This means a missing map or icon library, and the user wanted to stop the server.  Do not write to error log, just stop the server. 
                    throw e;
                }
                string message = "Failure in Parsing Control for next tag=" + reader.Name + " : " + e.Message;
                Coordinator.debugLogger.LogException("ScenarioReader", message);
                throw new ApplicationException(message, e);
            }
            finally
            {
                reader.Close();
                fs.Close();
                // Coordinator.debugLogger.Writeline("ScenarioToQueues", "Done", "general");
            }
        }//