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;
}