/// <summary>
 ///  Creates a new PopulationData class that can be used to report data and
 ///  update a status LED.
 /// </summary>
 /// <param name="reportDirectory">A directory to write out reports to.</param>
 /// <param name="reportData">Should data be reported to the server.</param>
 /// <param name="led">An LED used to indicate status.</param>
 public PopulationData(string reportDirectory, Boolean reportData, TerrariumLed led)
 {
     this.reportDirectory = reportDirectory;
     this.reportDataToServer = reportData;
     this.led = led;
     ResetData();
 }
 internal TeleportWorkItem(NetworkEngine engine, string address, object state, int httpPort, int networkTimeoutMsec, TerrariumLed led)
 {
     this.engine = engine;
     this.address = address;
     this.state = state;
     this.httpPort = httpPort;
     this.peerConnectionLed = led;
     this.networkTimeoutMsec = networkTimeoutMsec;
 }
示例#3
0
 internal TeleportWorkItem(NetworkEngine engine, string address, object state, int httpPort,
                           int networkTimeoutMsec, TerrariumLed led)
 {
     _engine = engine;
     _address = address;
     _state = state;
     _httpPort = httpPort;
     _peerConnectionLed = led;
     _networkTimeoutMsec = networkTimeoutMsec;
 }
示例#4
0
        /// <summary>
        ///  Creates a new game engine that can be used for a Terrarium game.  Terrarium
        ///  games aren't networked and can load any creatures.
        /// </summary>
        /// <param name="dataPath">The path where the Terrarium game will be stored.</param>
        /// <param name="fileName">The path to the serialized Terrarium.</param>
        /// <param name="leds">A series of leds to be used for state reporting.</param>
        public static void NewTerrariumGame(string dataPath, string fileName, TerrariumLed[] leds)
        {
            if (_engine != null)
            {
                _engine.StopGame(false);
            }

            _engine = new GameEngine(dataPath, false, false, fileName, false, leds, true);
        }
示例#5
0
        /// <summary>
        ///  Creates a new game engine that can be used to play an EcoSystem game.
        /// </summary>
        /// <param name="dataPath">The path where the Terrarium game will be stored.</param>
        /// <param name="fileName">The path to the serialized Terrarium.</param>
        /// <param name="leds">A series of leds to be used for state reporting.</param>
        public static void NewEcosystemGame(string dataPath, string fileName, TerrariumLed[] leds)
        {
            if (_engine != null)
            {
                _engine.StopGame(false);
            }

            _engine = new GameEngine(dataPath, true, false, dataPath + fileName, true, leds, true);

            // Start the network after Current is set on GameEngine because the network
            // needs a current gameengine to receive teleportations
            if (_engine._usingNetwork)
            {
                _engine._networkEngine.InitializeNetwork("EcoSystem", leds);
            }

            _engine._ecosystemMode = true;
        }
示例#6
0
        /// <summary>
        ///  Constructs a new game engine.
        /// </summary>
        /// <param name="dataPath">The path to save game directory.</param>
        /// <param name="useNetwork">Controls the usage of the network engine.</param>
        /// <param name="deserializeState">Controls if the state is deserialized or not.</param>
        /// <param name="fileName">The path to the state file.</param>
        /// <param name="reportData">Determines if data should be reported.</param>
        /// <param name="leds">Provides a listing of game leds that can be used.</param>
        /// <param name="trackLastRun">Controls whether the PAC keeps track of the last run creature for blacklisting.</param>
        private GameEngine(string dataPath, bool useNetwork, bool deserializeState, string fileName, bool reportData,
            TerrariumLed[] leds, bool trackLastRun)
        {
            _ledIndicators = leds;
            _currentStateFileName = fileName;

            // test to make sure we're not violating any constraints by current
            // physics settings in the engine.
            EngineSettings.EngineSettingsAsserts();

            // Calculate quanta and worldsize if we haven't done so yet
            if (_reloadSettings)
                CalculateWorldSize();

            _pac = new PrivateAssemblyCache(dataPath, fileName, true, trackLastRun);

            // Reset the appdomain policy since we changed the location of the organism dlls
            // This must be done before any animals are loaded in any way.  Make sure this call stays
            // as soon as possible
            AppDomain.CurrentDomain.SetAppDomainPolicy(SecurityUtils.MakePolicyLevel(_pac.AssemblyDirectory));

            _usingNetwork = useNetwork;
            _populationData = new PopulationData(reportData, leds[(int) LedIndicators.ReportWebService]);

            // Should only happen if an exception prevented a previous attempt to start a game
            if (AppMgr.CurrentScheduler != null)
            {
                AppMgr.DestroyScheduler();
            }

            // Create a scheduler that manages giving the creatures timeslices
            _scheduler = AppMgr.CreateSameDomainScheduler(this);
            _scheduler.Quantum = _organismQuanta;

            if (useNetwork)
            {
                // Required to start up the network listeners
                _networkEngine = new NetworkEngine();
            }

            WorldState currentState;
            Boolean successfulDeserialization = false;
            if (deserializeState && File.Exists(fileName))
            {
                try
                {
                    if (_pac.LastRun.Length != 0)
                    {
                        // The process was killed while an organism was being run, blacklist it
                        // Since this potentially means the animal hung the game.
                        _pac.BlacklistAssemblies(new string[] {_pac.LastRun});
                    }
                    this.deserializeState(fileName);
                    currentState = CurrentVector.State;
                    _scheduler.CurrentState = currentState;
                    _scheduler.CompleteOrganismDeserialization();
                    successfulDeserialization = true;
                }
                catch (Exception e)
                {
                    ErrorLog.LogHandledException(e);
                }
            }

            if (successfulDeserialization) return;

            // Set up initial world state
            currentState = new WorldState(GridWidth, GridHeight);
            currentState.TickNumber = 0;
            currentState.StateGuid = Guid.NewGuid();
            currentState.Teleporter = new Teleporter(AnimalCount/EngineSettings.NumberOfAnimalsPerTeleporter);
            currentState.MakeImmutable();

            WorldVector vector = new WorldVector(currentState);
            CurrentVector = vector;
            _scheduler.CurrentState = currentState;
        }
示例#7
0
        internal void ShutdownNetwork()
        {
            if (announceThread != null)
            {
                announceThread.Abort();
            }

            // Stop Listening
            StopHttpNamespaceManager();

            _discoveryLed = null;
            _peerConnectionLed = null;
        }
示例#8
0
        internal void InitializeNetwork(string peerChannel, TerrariumLed[] leds)
        {
            // Set up the LEDs
            _discoveryLed = leds[(int) LedIndicators.DiscoveryWebService];
            _peerConnectionLed = leds[(int) LedIndicators.PeerConnection];
            _receivedPeerConnectionLed = leds[(int) LedIndicators.PeerReceivedConnection];

            // Start listening on HTTP
            _peerChannel = peerChannel;
            //GlobalProxySelection.Select = GlobalProxySelection.GetEmptyWebProxy();
            WebRequest.DefaultWebProxy = null;
            SetHostIPInformation();
            StartHttpNamespaceManager();

            // Start our announcement thread
            announceThread = new Thread(AnnounceAndRegisterPeer) {Name = "Peer Discovery Thread"};
            announceThread.Start();
        }
示例#9
0
        private DataTable _totalsTable; // One row per tick, One row per species, current population, min and max

        #endregion Fields

        #region Constructors

        /// <summary>
        ///  Creates a new PopulationData class that can be used to report data and
        ///  update a status LED.
        /// </summary>
        /// <param name="reportData">Should data be reported to the server.</param>
        /// <param name="led">An LED used to indicate status.</param>
        public PopulationData(bool reportData, TerrariumLed led)
        {
            _reportDataToServer = reportData;
            _led = led;
            ResetData();
        }