From 5e9facef7d8d8a70c3d968d233ed8db07aed22e3 Mon Sep 17 00:00:00 2001 From: Kevin Turner <83819+keturn@users.noreply.github.com> Date: Sat, 24 Jul 2021 15:35:43 -0700 Subject: [PATCH] chore: set scenario properties in the Config Using config settings means we don't have to override and duplicate as much code in `createGameManifest`. In particular, this means we have one less place doing its own invocation of the module dependency resolver. --- .../TestingStateHeadlessSetup.java | 67 +++++++++++-------- 1 file changed, 38 insertions(+), 29 deletions(-) diff --git a/src/main/java/org/terasology/moduletestingenvironment/TestingStateHeadlessSetup.java b/src/main/java/org/terasology/moduletestingenvironment/TestingStateHeadlessSetup.java index 52bfd93..78a6a86 100644 --- a/src/main/java/org/terasology/moduletestingenvironment/TestingStateHeadlessSetup.java +++ b/src/main/java/org/terasology/moduletestingenvironment/TestingStateHeadlessSetup.java @@ -4,60 +4,69 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.terasology.engine.config.Config; +import org.terasology.engine.config.ModuleConfig; +import org.terasology.engine.config.WorldGenerationConfig; +import org.terasology.engine.core.GameEngine; import org.terasology.engine.core.SimpleUri; import org.terasology.engine.core.TerasologyConstants; -import org.terasology.engine.core.module.ModuleManager; +import org.terasology.engine.core.TerasologyEngine; import org.terasology.engine.core.subsystem.headless.mode.StateHeadlessSetup; import org.terasology.engine.game.GameManifest; -import org.terasology.engine.registry.CoreRegistry; -import org.terasology.engine.world.internal.WorldInfo; import org.terasology.engine.world.time.WorldTime; -import org.terasology.gestalt.module.dependencyresolution.DependencyResolver; -import org.terasology.gestalt.module.dependencyresolution.ResolutionResult; import org.terasology.gestalt.naming.Name; -import org.terasology.gestalt.module.Module; import java.util.Collection; import java.util.Set; import java.util.stream.Collectors; +import static com.google.common.base.Preconditions.checkArgument; + public class TestingStateHeadlessSetup extends StateHeadlessSetup { private static final Logger logger = LoggerFactory.getLogger(TestingStateHeadlessSetup.class); + + static final Name MTE_MODULE_NAME = new Name("ModuleTestingEnvironment"); + static final String WORLD_TITLE = "testworld"; + static final String DEFAULT_SEED = "seed"; + private final Collection dependencies; - private final String worldGeneratorUri; + private final SimpleUri worldGeneratorUri; public TestingStateHeadlessSetup(Collection dependencies, String worldGeneratorUri) { this.dependencies = dependencies; - this.worldGeneratorUri = worldGeneratorUri; + this.worldGeneratorUri = new SimpleUri(worldGeneratorUri); + checkArgument(this.worldGeneratorUri.isValid(), "Not a valid URI `%s`", worldGeneratorUri); } - @Override - public GameManifest createGameManifest() { - GameManifest gameManifest = new GameManifest(); - - gameManifest.setTitle("testworld"); - gameManifest.setSeed("seed"); - DependencyResolver resolver = new DependencyResolver(CoreRegistry.get(ModuleManager.class).getRegistry()); - + void configForTest(Config config) { Set dependencyNames = dependencies.stream().map(Name::new).collect(Collectors.toSet()); - logger.info("Building manifest for module dependencies: {}", dependencyNames); // Include the MTE module to provide world generators and suchlike. - dependencyNames.add(new Name("ModuleTestingEnvironment")); + dependencyNames.add(MTE_MODULE_NAME); - ResolutionResult result = resolver.resolve(dependencyNames); - if (!result.isSuccess()) { - logger.error("Unable to resolve modules: {}", dependencyNames); - } + ModuleConfig moduleSelection = config.getDefaultModSelection(); + moduleSelection.clear(); + dependencyNames.forEach(moduleSelection::addModule); - for (Module module : result.getModules()) { - logger.info("Loading module {} {}", module.getId(), module.getVersion()); - gameManifest.addModule(module.getId(), module.getVersion()); - } + WorldGenerationConfig worldGenerationConfig = config.getWorldGeneration(); + worldGenerationConfig.setDefaultGenerator(worldGeneratorUri); + worldGenerationConfig.setWorldTitle(WORLD_TITLE); + worldGenerationConfig.setDefaultSeed(DEFAULT_SEED); + } + + @Override + public GameManifest createGameManifest() { + GameManifest gameManifest = super.createGameManifest(); float timeOffset = 0.25f + 0.025f; // Time at dawn + little offset to spawn in a brighter env. - WorldInfo worldInfo = new WorldInfo(TerasologyConstants.MAIN_WORLD, gameManifest.getSeed(), - (long) (WorldTime.DAY_LENGTH * timeOffset), new SimpleUri(worldGeneratorUri)); - gameManifest.addWorld(worldInfo); + gameManifest.getWorldInfo(TerasologyConstants.MAIN_WORLD).setTime((long) (WorldTime.DAY_LENGTH * timeOffset)); return gameManifest; } + + @Override + public void init(GameEngine engine) { + // We want to modify Config before super.init calls createGameManifest, but the child context + // does not exist before we call super.init. + configForTest(((TerasologyEngine) engine).getFromEngineContext(Config.class)); + super.init(engine); + } }