static IEnumerable <Entity> Translate(IEnumerable <ScenarioEntity> e, Dictionary <string, Task <CSLogicProvider> > providerMap, Random random) { foreach (var se in e) { LogicInstantiation inst = new LogicInstantiation(se.logic); var provider = providerMap[inst.AssemblyName].Result; for (int i = 0; i < se.instances; i++) { Vec3 pos = Vec3.Zero; if (se.position.Length == 1) { pos = new Vec3(se.position[0], 0); } else if (se.position.Length == 2) { pos = random.NextVec3(Box.FromMinAndMax(new Vec3(se.position[0], 0), new Vec3(se.position[1], 0), Bool3.True)); } else { throw new Exception("Invalid position declaration: " + se.position); } #if STATE_ADV EntityAppearanceCollection appearances = new EntityAppearanceCollection(); #endif DynamicCSLogic logic = new DynamicCSLogic(provider, inst.LogicName, inst.Parameters); yield return(new Entity(new EntityID(pos), Vec3.Zero, logic #if STATE_ADV , appearances #endif )); } } }
private static void CreateScenario(string name) { ScenarioConfig scenario = JsonConvert.DeserializeObject <ScenarioConfig>(File.ReadAllText("scenario/" + name)); var providerMap = new Dictionary <string, Task <CSLogicProvider> >(); foreach (var e in scenario.entities) { LogicInstantiation inst = new LogicInstantiation(e.logic); Task <CSLogicProvider> prov; if (!providerMap.TryGetValue(inst.AssemblyName, out prov)) { string code = File.ReadAllText("scenario/Logic/" + inst.AssemblyName + ".cs"); prov = DB.PutCompiledLogicProviderAsync(inst.AssemblyName, code); providerMap[inst.AssemblyName] = prov; } } Random rng = new Random(1024); SetupScenario(new BaseDB.ConfigContainer() { extent = new Int3(scenario.worldSize[0], scenario.worldSize[1], scenario.worldSize[2]), m = scenario.M, r = scenario.R }, Translate(scenario.entities, providerMap, rng)); // GenerateEntities(1000)); }