Skip to content

Commit

Permalink
refactor: merge universe setup into world pregen screen (#5122)
Browse files Browse the repository at this point in the history
Merging UniverseSetupScreen and WorldPreGenerationScreen incl.
* merging .ui representations
* merging .java classes
* merge widget bindings and screen logic
* merge WorldSetupWrapper into UniverseWrapper
* using UniverseWrapper instead of local copies of target world and seed for persisting state
* binding UI widgets to persisted state
* use universe seed and properly randomize seed on re-roll
* remove worlds element in lower right screen section
* update preview on changing seed field content and when opening screen
* memorize modified (manually or via re-roll) seed field content (currently reset always to initial seed)

Co-authored-by: Tobias Nett <[email protected]>
jdrueckert and skaldarnar authored Nov 13, 2023

Verified

This commit was created on GitHub.com and signed with GitHub’s verified signature. The key has expired.
1 parent 1b286a6 commit c237660
Showing 15 changed files with 476 additions and 874 deletions.
Original file line number Diff line number Diff line change
@@ -103,7 +103,7 @@ public GameManifest createGameManifest() {

gameManifest.setTitle(worldGenConfig.getWorldTitle());
gameManifest.setSeed(worldGenConfig.getDefaultSeed());
WorldInfo worldInfo = new WorldInfo(TerasologyConstants.MAIN_WORLD, worldGenConfig.getWorldTitle(), gameManifest.getSeed(),
WorldInfo worldInfo = new WorldInfo(TerasologyConstants.MAIN_WORLD, gameManifest.getSeed(),
(long) (WorldTime.DAY_LENGTH * WorldTime.NOON_OFFSET), worldGeneratorUri);
gameManifest.addWorld(worldInfo);
return gameManifest;
Original file line number Diff line number Diff line change
@@ -2,7 +2,6 @@
// SPDX-License-Identifier: Apache-2.0
package org.terasology.engine.rendering.nui.layers.mainMenu;

import com.google.common.collect.Maps;
import org.codehaus.plexus.util.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -13,16 +12,14 @@
import org.terasology.engine.game.GameManifest;
import org.terasology.engine.registry.In;
import org.terasology.engine.rendering.nui.layers.mainMenu.savedGames.GameProvider;
import org.terasology.engine.rendering.world.WorldSetupWrapper;
import org.terasology.engine.world.generator.WorldConfigurator;
import org.terasology.engine.world.generator.WorldGenerator;
import org.terasology.engine.world.internal.WorldInfo;
import org.terasology.engine.world.time.WorldTime;
import org.terasology.gestalt.entitysystem.component.Component;
import org.terasology.gestalt.module.Module;
import org.terasology.gestalt.module.dependencyresolution.DependencyResolver;
import org.terasology.gestalt.module.dependencyresolution.ResolutionResult;

import java.util.Map;

/**
* Generates new games manifest according to input data.
*/
@@ -67,30 +64,25 @@ public static GameManifest createGameManifest(final UniverseWrapper universeWrap

SimpleUri uri;
String seed;
WorldSetupWrapper worldSetup = universeWrapper.getTargetWorld();
if (worldSetup != null) {
uri = worldSetup.getWorldGenerator().getUri();
seed = worldSetup.getWorldGenerator().getWorldSeed();
WorldGenerator worldGenerator = universeWrapper.getWorldGenerator();
if (worldGenerator != null) {
uri = worldGenerator.getUri();
seed = worldGenerator.getWorldSeed();
} else {
uri = config.getWorldGeneration().getDefaultGenerator();
seed = universeWrapper.getSeed();
}
gameManifest.setSeed(seed);

String targetWorldName = "";
Map<String, Component> worldConfig = Maps.newHashMap();
if (worldSetup != null) {
targetWorldName = worldSetup.getWorldName().toString();
if (worldSetup.getWorldConfigurator() != null) {

// horrible hack to get configs into manifest.
// config driven by CreateWorldEntity.
// world config set somewhere else as well no clear drive from config --> world
gameManifest.setModuleConfigs(uri, worldSetup.getWorldConfigurator().getProperties());
}
WorldConfigurator worldConfigurator = universeWrapper.getWorldConfigurator();
if (worldConfigurator != null) {
// horrible hack to get configs into manifest.
// config driven by CreateWorldEntity.
// world config set somewhere else as well no clear drive from config --> world
gameManifest.setModuleConfigs(uri, worldConfigurator.getProperties());
}
// This is multiplied by the number of seconds in a day (86400000) to determine the exact millisecond at which the game will start.
WorldInfo worldInfo = new WorldInfo(TerasologyConstants.MAIN_WORLD, targetWorldName, seed,
WorldInfo worldInfo = new WorldInfo(TerasologyConstants.MAIN_WORLD, seed,
(long) (WorldTime.DAY_LENGTH * WorldTime.SUNRISE_OFFSET), uri);

gameManifest.addWorld(worldInfo);
Original file line number Diff line number Diff line change
@@ -134,7 +134,7 @@ public String get() {
AdvancedGameSetupScreen advancedSetupGameScreen = getManager().createScreen(AdvancedGameSetupScreen.ASSET_URI, AdvancedGameSetupScreen.class);
WidgetUtil.trySubscribe(this, "advancedSetup", button -> {
universeWrapper.setGameName(gameName.getText());
advancedSetupGameScreen.setUniverseWrapper(universeWrapper);
advancedSetupGameScreen.setEnvironment(universeWrapper);
triggerForwardAnimation(advancedSetupGameScreen);
});

@@ -281,12 +281,10 @@ public void setUniverseWrapper(UniverseWrapper wrapper) {

@Override
public boolean onKeyEvent(NUIKeyEvent event) {
if (event.isDown() && event.getKey() == Keyboard.Key.ESCAPE) {
if (GameProvider.isSavesFolderEmpty()) {
// skip selectGameScreen and get back directly to main screen
getManager().pushScreen("engine:mainMenuScreen");
return true;
}
if (event.isDown() && event.getKey() == Keyboard.Key.ESCAPE && GameProvider.isSavesFolderEmpty()) {
// skip selectGameScreen and get back directly to main screen
getManager().pushScreen("engine:mainMenuScreen");
return true;
}
return super.onKeyEvent(event);
}

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
@@ -2,21 +2,23 @@
// SPDX-License-Identifier: Apache-2.0
package org.terasology.engine.rendering.nui.layers.mainMenu;

import org.terasology.engine.rendering.world.WorldSetupWrapper;
import org.terasology.engine.world.generator.WorldConfigurator;
import org.terasology.engine.world.generator.WorldGenerator;

/**
* A class which stores the universe level properties for a game like whether
* the game is single-player or multi-player, seed value and the game name.
*/
public class UniverseWrapper {

private String seed;
private String seed = "";
private boolean loadingAsServer;
private String gameName;
private WorldSetupWrapper targetWorld;
private WorldConfigurator worldConfigurator;
private WorldGenerator worldGenerator;

public void setSeed(String seed) {
this.seed = seed;
this.seed = seed == null ? "" : seed;
}

public String getSeed() {
@@ -39,11 +41,19 @@ public String getGameName() {
return gameName;
}

public void setTargetWorld(WorldSetupWrapper targetWorld) {
this.targetWorld = targetWorld;
public void setWorldConfigurator(WorldConfigurator worldConfigurator) {
this.worldConfigurator = worldConfigurator;
}

public WorldSetupWrapper getTargetWorld() {
return targetWorld;
public WorldConfigurator getWorldConfigurator() {
return worldConfigurator;
}

public void setWorldGenerator(WorldGenerator worldGenerator) {
this.worldGenerator = worldGenerator;
}

public WorldGenerator getWorldGenerator() {
return worldGenerator;
}
}

This file was deleted.

Original file line number Diff line number Diff line change
@@ -4,13 +4,11 @@

import org.terasology.engine.config.Config;
import org.terasology.engine.context.Context;
import org.terasology.engine.core.SimpleUri;
import org.terasology.engine.entitySystem.metadata.ComponentLibrary;
import org.terasology.engine.i18n.TranslationSystem;
import org.terasology.engine.registry.In;
import org.terasology.engine.rendering.nui.CoreScreenLayer;
import org.terasology.engine.rendering.nui.animation.MenuAnimationSystems;
import org.terasology.engine.rendering.world.WorldSetupWrapper;
import org.terasology.engine.world.generator.UnresolvedWorldGeneratorException;
import org.terasology.engine.world.generator.WorldConfigurator;
import org.terasology.engine.world.generator.WorldGenerator;
@@ -20,7 +18,6 @@
import org.terasology.gestalt.assets.ResourceUrn;
import org.terasology.gestalt.entitysystem.component.Component;
import org.terasology.gestalt.module.ModuleEnvironment;
import org.terasology.gestalt.naming.Name;
import org.terasology.nui.WidgetUtil;
import org.terasology.nui.databinding.Binding;
import org.terasology.nui.layouts.PropertyLayout;
@@ -29,7 +26,6 @@
import org.terasology.nui.properties.PropertyOrdering;
import org.terasology.nui.properties.PropertyProvider;
import org.terasology.nui.widgets.UILabel;
import org.terasology.nui.widgets.UIText;
import org.terasology.reflection.metadata.FieldMetadata;
import org.terasology.reflection.reflect.ReflectFactory;

@@ -54,82 +50,42 @@ public class WorldSetupScreen extends CoreScreenLayer {
private TranslationSystem translationSystem;

private WorldGenerator worldGenerator;
private WorldSetupWrapper world;
private UniverseWrapper universe;
private ModuleEnvironment environment;
private Context context;
private WorldConfigurator oldWorldConfig;
private Name newWorldName;

@Override
public void initialise() {
setAnimationSystem(MenuAnimationSystems.createDefaultSwipeAnimation());

WidgetUtil.trySubscribe(this, "close", button -> {
UIText customWorldName = find("customisedWorldName", UIText.class);

boolean goBack = false;

//sanity checks on world name
if (customWorldName.getText().isEmpty()) {
//name empty: display a popup, stay on the same screen
getManager().pushScreen(MessagePopup.ASSET_URI, MessagePopup.class)
.setMessage("Name Cannot Be Empty!", "Please add a name for the world");
} else if (customWorldName.getText().equalsIgnoreCase(world.getWorldName().toString())) {
//same name as before: go back to universe setup
goBack = true;
} else {
//no match found: go back to universe setup
goBack = true;
}
WidgetUtil.trySubscribe(this, "close", button -> {

if (goBack) {
newWorldName = new Name(customWorldName.getText());
world.setWorldName(newWorldName);
triggerBackAnimation();
}
triggerBackAnimation();
});
}

/**
* This method sets the world name in title as well as in UITextBox
*
* @param customWorldName
*/
private void setCustomWorldName(UIText customWorldName) {
customWorldName.setText(world.getWorldName().toString());
}

@Override
public void onOpened() {
super.onOpened();

UILabel subitle = find("subtitle", UILabel.class);
subitle.setText(translationSystem.translate("${engine:menu#world-setup}") + " for " + world.getWorldName().toString());
UIText customWorldName = find("customisedWorldName", UIText.class);
setCustomWorldName(customWorldName);
UILabel subtitle = find("subtitle", UILabel.class);
subtitle.setText(translationSystem.translate("${engine:menu#world-setup}") + " for " + universe.getGameName().toString());
}

/**
* This method sets the world whose properties are to be changed. This function is called before the screen comes
* to the forefront.
*
* @param subContext the new environment created in {@link UniverseSetupScreen}
* @param worldSelected the world whose configurations are to be changed.
* @param universe the universe whose world's configurations are to be changed.
* @throws UnresolvedWorldGeneratorException
*/
public void setWorld(Context subContext, WorldSetupWrapper worldSelected)
throws UnresolvedWorldGeneratorException {
world = worldSelected;
public void setWorld(Context subContext, UniverseWrapper universe) {
this.universe = universe;
context = subContext;
SimpleUri worldGenUri = worldSelected.getWorldGeneratorInfo().getUri();
environment = context.get(ModuleEnvironment.class);
context.put(WorldGeneratorPluginLibrary.class, new TempWorldGeneratorPluginLibrary(environment, context));
if (world.getWorldGenerator() == null) {
worldGenerator = WorldGeneratorManager.createWorldGenerator(worldGenUri, context, environment);
world.setWorldGenerator(worldGenerator);
} else {
worldGenerator = world.getWorldGenerator();
}
worldGenerator = universe.getWorldGenerator();
configureProperties();
}

@@ -143,11 +99,11 @@ private void configureProperties() {
propLayout.setOrdering(PropertyOrdering.byLabel());
propLayout.clear();
WorldConfigurator worldConfig;
if (world.getWorldConfigurator() != null) {
worldConfig = world.getWorldConfigurator();
if (universe.getWorldConfigurator() != null) {
worldConfig = universe.getWorldConfigurator();
} else {
worldConfig = worldGenerator.getConfigurator();
world.setWorldConfigurator(worldConfig);
universe.setWorldConfigurator(worldConfig);
}
oldWorldConfig = worldConfig;

Original file line number Diff line number Diff line change
@@ -14,6 +14,7 @@
import org.terasology.engine.config.Config;
import org.terasology.engine.config.ModuleConfig;
import org.terasology.engine.config.SelectModulesConfig;
import org.terasology.engine.context.Context;
import org.terasology.engine.core.GameEngine;
import org.terasology.engine.core.SimpleUri;
import org.terasology.engine.core.TerasologyConstants;
@@ -25,6 +26,7 @@
import org.terasology.engine.game.GameManifest;
import org.terasology.engine.i18n.TranslationSystem;
import org.terasology.engine.network.NetworkMode;
import org.terasology.engine.registry.CoreRegistry;
import org.terasology.engine.registry.In;
import org.terasology.engine.rendering.nui.CoreScreenLayer;
import org.terasology.engine.rendering.nui.animation.MenuAnimationSystems;
@@ -94,6 +96,8 @@ public class AdvancedGameSetupScreen extends CoreScreenLayer {
private TranslationSystem translationSystem;
@In
private GameEngine gameEngine;
@In
private Context context;

private Map<Name, ModuleSelectionInfo> modulesLookup;
private List<ModuleSelectionInfo> sortedModules;
@@ -103,7 +107,6 @@ public class AdvancedGameSetupScreen extends CoreScreenLayer {
private boolean needsUpdate = true;
private ResettableUIText moduleSearch;
private SelectModulesConfig selectModulesConfig;
private UniverseWrapper universeWrapper;

@Override
public void onOpened() {
@@ -117,6 +120,17 @@ public void onOpened() {
filterModules();
}

@Override
public void onScreenOpened() {
super.onScreenOpened();

final UIText seed = find("seed", UIText.class);
UniverseWrapper universeWrapper = CoreRegistry.get(UniverseWrapper.class);
if (universeWrapper != null && !universeWrapper.getSeed().isEmpty()) {
seed.setText(universeWrapper.getSeed());
}
}

@Override
public void initialise() {
setAnimationSystem(MenuAnimationSystems.createDefaultSwipeAnimation());
@@ -127,9 +141,7 @@ public void initialise() {
.build()).submit(moduleManager.getInstallManager().updateRemoteRegistry());

final UIText seed = find("seed", UIText.class);
if (seed != null) {
seed.setText(new FastRandom().nextString(32));
}
seed.setText(createRandomSeed());

// skip loading module configs, limit shown modules to locally present ones
selectModulesConfig = new SelectModulesConfig();
@@ -496,11 +508,11 @@ public Boolean get() {
}

WidgetUtil.trySubscribe(this, "createWorld", button -> {
context.get(UniverseWrapper.class).setSeed(seed.getText());
final UniverseSetupScreen universeSetupScreen = getManager()
.createScreen(UniverseSetupScreen.ASSET_URI, UniverseSetupScreen.class);
universeWrapper.setSeed(seed.getText());
saveConfiguration();
universeSetupScreen.setEnvironment(universeWrapper);
universeSetupScreen.setEnvironment();
triggerForwardAnimation(universeSetupScreen);
});

@@ -509,6 +521,7 @@ public Boolean get() {
getManager().createScreen(MessagePopup.ASSET_URI, MessagePopup.class).
setMessage("Error", "Game seed cannot be empty!");
} else {
UniverseWrapper universeWrapper = context.get(UniverseWrapper.class);
universeWrapper.setSeed(seed.getText());
saveConfiguration();
final GameManifest gameManifest = GameManifestProvider.createGameManifest(universeWrapper, moduleManager, config);
@@ -743,7 +756,6 @@ public boolean isLowerLayerVisible() {

private void select(ModuleSelectionInfo target) {
if (target.isValidToSelect() && !target.isExplicitSelection()) {
boolean previouslySelected = target.isSelected();
target.setExplicitSelection(true);
refreshSelection();
}
@@ -779,7 +791,18 @@ private void refreshSelection() {
updateValidToSelect();
}

public void setUniverseWrapper(UniverseWrapper wrapper) {
universeWrapper = wrapper;
private String createRandomSeed() {
return new FastRandom().nextString(32);
}

public void setEnvironment(UniverseWrapper wrapper) {
// Theoretically, the idea was to do the following:
// context.put(UniverseWrapper.class, wrapper);
// CoreRegistry.setContext(context);
// However, this does not work and leads to an NPE in UniverseSetupScreen.java:182
// when attempting to access UniverseWrapper from a context that it's not in.
// At this moment, it's unclear, why this does not work.
// TODO: Investigate the inconsistencies between context and core registry usage
CoreRegistry.put(UniverseWrapper.class, wrapper);
}
}
Original file line number Diff line number Diff line change
@@ -219,16 +219,12 @@ private void setUpGameWorlds() {
gameWorlds.setItemRenderer(new AbstractItemRenderer<WorldInfo>() {
@Override
public void draw(WorldInfo value, Canvas canvas) {
if (value.getCustomTitle().isEmpty()) {
canvas.drawText(value.getTitle());
} else {
canvas.drawText(value.getCustomTitle());
}
canvas.drawText(value.getTitle());
}

@Override
public Vector2i getPreferredSize(WorldInfo value, Canvas canvas) {
String text = value.getCustomTitle();
String text = value.getTitle();
return new Vector2i(
canvas.getCurrentStyle().getFont().getWidth(text),
canvas.getCurrentStyle().getFont().getLineHeight());
@@ -237,12 +233,7 @@ public Vector2i getPreferredSize(WorldInfo value, Canvas canvas) {
}

private String getWorldDescription(final WorldInfo worldInfo) {
String gameTitle;
if (worldInfo.getCustomTitle().isEmpty()) {
gameTitle = worldInfo.getTitle();
} else {
gameTitle = worldInfo.getCustomTitle();
}
String gameTitle = worldInfo.getTitle();
return translationSystem.translate("${engine:menu#game-details-game-title} ") + gameTitle
+ '\n' + '\n'
+ translationSystem.translate("${engine:menu#game-details-game-seed} ") + worldInfo.getSeed()

This file was deleted.

Original file line number Diff line number Diff line change
@@ -12,7 +12,6 @@
public class WorldInfo {

private String title = "";
private String customTitle = "";
private String seed = "";
private long time;
private SimpleUri worldGenerator = new SimpleUri();
@@ -21,14 +20,9 @@ public WorldInfo() {
}

public WorldInfo(String title, String seed, long time, SimpleUri worldGenerator) {
this(title, "", seed, time, worldGenerator);
}

public WorldInfo(String title, String customTitle, String seed, long time, SimpleUri worldGenerator) {
if (title != null) {
this.title = title;
}
this.customTitle = customTitle;
if (seed != null) {
this.seed = seed;
}
@@ -48,10 +42,6 @@ public void setTitle(String title) {
}
}

public String getCustomTitle() {
return customTitle;
}

public String getSeed() {
return seed;
}
Original file line number Diff line number Diff line change
@@ -48,7 +48,6 @@
public class WorldProviderCoreImpl implements WorldProviderCore {

private String title;
private String customTitle;
private String seed = "";
private SimpleUri worldGenerator;

@@ -63,10 +62,9 @@ public class WorldProviderCoreImpl implements WorldProviderCore {

private Block unloadedBlock;

public WorldProviderCoreImpl(String title, String customTitle, String seed, long time, SimpleUri worldGenerator,
public WorldProviderCoreImpl(String title, String seed, long time, SimpleUri worldGenerator,
ChunkProvider chunkProvider, Block unloadedBlock, Context context) {
this.title = (title == null) ? seed : title;
this.customTitle = customTitle;
this.seed = seed;
this.worldGenerator = worldGenerator;
this.chunkProvider = chunkProvider;
@@ -89,7 +87,7 @@ public WorldProviderCoreImpl(String title, String customTitle, String seed, long

public WorldProviderCoreImpl(WorldInfo info, ChunkProvider chunkProvider, Block unloadedBlock,
Context context) {
this(info.getTitle(), info.getCustomTitle(), info.getSeed(), info.getTime(), info.getWorldGenerator(),
this(info.getTitle(), info.getSeed(), info.getTime(), info.getWorldGenerator(),
chunkProvider,
unloadedBlock, context);
}
@@ -115,7 +113,7 @@ public String getSeed() {

@Override
public WorldInfo getWorldInfo() {
return new WorldInfo(title, customTitle, seed, worldTime.getMilliseconds(), worldGenerator);
return new WorldInfo(title, seed, worldTime.getMilliseconds(), worldGenerator);
}

@Override
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
{
"type": "UniverseSetupScreen",
"type": "engine:UniverseSetupScreen",
"skin": "engine:mainMenu",
"contents": {
"type": "relativeLayout",
@@ -8,7 +8,7 @@
"type": "UILabel",
"id": "title",
"family": "title",
"text": "${engine:menu#universe-setup}",
"text": "${engine:menu#world-pre-generation}",
"layoutInfo": {
"height": 48,
"position-horizontal-center": {},
@@ -20,51 +20,185 @@
},
{
"type": "UIBox",
"id": "mainBox",
"content": {
"type": "ColumnLayout",
"columns": 1,
"verticalSpacing": 4,
"horizontalSpacing": 4,
"contents": [
{
"type": "UILabel",
"text": "${engine:menu#universe-setup-description}"
},
{
"type": "UILabel",
"text": "${engine:menu#game-world-generators}:",
"family": "left-label"
},
{
"type": "RowLayout",
"horizontalSpacing": 4,
"contents": [
{
"type": "UIDropdownScrollable",
"id": "worldGenerators",
"layoutInfo": {
"relativeWidth": 1.00
}
"id": "container",
"layoutInfo": {
"width": 720,
"position-horizontal-center": {},
"position-top": {
"target": "TOP",
"offset": -16,
"widget": "generator"
},
"position-bottom": {
"target": "BOTTOM",
"offset": -16,
"widget": "coreLayout"
}
}
},
{
"type": "ColumnLayout",
"id": "generator",
"columns": 1,
"verticalSpacing": 4,
"horizontalSpacing": 4,
"contents": [
{
"type": "UILabel",
"text": "${engine:menu#universe-setup-description}"
},
{
"type": "UILabel",
"text": "${engine:menu#game-world-generators}:",
"family": "left-label"
},
{
"type": "RowLayout",
"horizontalSpacing": 4,
"contents": [
{
"type": "UIDropdownScrollable",
"id": "worldGenerators",
"layoutInfo": {
"relativeWidth": 1.00
}
]
},
{
"type": "UISpace",
"size": [
1,
8
]
}
]
},
}
]
},
{
"type": "UILabel",
"text": "${engine:menu#world-seed}:",
"family": "left-label"
},
{
"type": "UIText",
"id": "seed"
},
{
"type": "UISpace",
"size": [
1,
8
]
}
],
"layoutInfo": {
"width": 500,
"use-content-height": true,
"position-horizontal-center": {},
"position-vertical-center": {}
"position-bottom": {
"target": "TOP",
"offset": 16,
"widget": "coreLayout"
}
}
},
{
"type": "ColumnLayout",
"id": "coreLayout",
"columns": 2,
"horizontalSpacing": 8,
"column-widths": [
0.53,
0.47
],
"layoutInfo": {
"width": 704,
"use-content-height": true,
"position-horizontal-center": {},
"position-vertical-center": {}
},
"contents": [
{
"type": "UIImage",
"skin": "framed_image",
"id": "preview"
},
{
"type": "ColumnLayout",
"columns": 1,
"verticalSpacing": 4,
"contents": [
{
"type": "UILabel",
"text": "${engine:menu#pregeneration-description}"
},
{
"type": "UILabel",
"text": "${engine:menu#time-progression-during-pre-generation}:",
"id": "timeLabel",
"family": "left-label",
"enabled": false
},
{
"type": "UISlider",
"id": "timeSlider",
"minimum": 0.0,
"range": 9.0,
"increment": 1.0,
"precision": 0,
"value": 0.0,
"enabled": false,
"layoutInfo": {
"position-horizontal-center": {},
"position-top": {
"target": "BOTTOM",
"widget": "timeLabel",
"offset": 0
}
}
},
{
"type": "UILabel",
"text": "${engine:menu#preview-zoom-factor}:",
"id": "zoomLabel",
"family": "left-label",
"layoutInfo": {
"position-horizontal-center": {},
"position-top": {
"target": "BOTTOM",
"widget": "timeSlider",
"offset": 0
}
}
},
{
"type": "UISlider",
"id": "zoomSlider",
"minimum": 1.0,
"range": 7.0,
"increment": 1.0,
"precision": 0,
"layoutInfo": {
"use-content-height": true,
"position-horizontal-center": {},
"position-top": {
"target": "BOTTOM",
"widget": "zoomLabel"
}
}
},
{
"type": "RowLayout",
"id": "worldGenActions",
"horizontalSpacing": 4,
"contents": [
{
"type": "UIButton",
"text": "${engine:menu#re-roll}",
"id": "reRoll"
},
{
"type": "UIButton",
"text": "${engine:menu#config}",
"id": "config"
}
]
}
]
}
]
},
{
"type": "RowLayout",
"id": "actionsRow",
@@ -78,8 +212,7 @@
{
"type": "UIButton",
"text": "${engine:menu#start-playing}",
"id": "play",
"enabled": false
"id": "play"
}
],
"layoutInfo": {
@@ -88,43 +221,25 @@
"position-horizontal-center": {},
"position-top": {
"target": "BOTTOM",
"widget": "mainBox",
"widget": "container",
"offset": 16
}
}
},
{
"type": "UIButton",
"text": "${engine:menu#return-advanced-setup}",
"text": "${engine:menu#return-universe-setup}",
"id": "close",
"layoutInfo": {
"width": 120,
"height": 80,
"position-vertical-center": {
"target": "CENTER",
"widget": "mainBox"
"widget": "container"
},
"position-right": {
"target": "LEFT",
"offset": 16,
"widget": "mainBox"
}
}
},
{
"type": "UIButton",
"text": "${engine:menu#continue-pregeneration}",
"id": "continue",
"layoutInfo": {
"width": 120,
"height": 80,
"position-vertical-center": {
"target": "CENTER",
"widget": "mainBox"
},
"position-left": {
"target": "RIGHT",
"widget": "mainBox",
"widget": "container",
"offset": 16
}
}

This file was deleted.

Original file line number Diff line number Diff line change
@@ -60,28 +60,6 @@
"type": "RelativeLayout",
"family": "description",
"contents": [
{
"type": "RowLayout",
"id": "customNameWorld",
"layoutInfo": {
"use-content-height": true,
"position-horizontal-center": {},
"position-top": {
"target": "TOP"
}
},
"contents": [
{
"type": "UILabel",
"text": "${engine:menu#world-name}"
},
{
"type": "UIText",
"text": "",
"id": "customisedWorldName"
}
]
},
{
"type": "ScrollableArea",
"content": {
@@ -92,9 +70,7 @@
"layoutInfo": {
"position-horizontal-center": {},
"position-top": {
"target": "BOTTOM",
"offset": 8,
"widget": "customNameWorld"
"target": "TOP"
},
"position-bottom": {
"target": "TOP",

0 comments on commit c237660

Please sign in to comment.