From e2fc0ad1885d479b50138722f2274ed86808fc1a Mon Sep 17 00:00:00 2001 From: Michael Pollind Date: Sat, 27 Feb 2021 22:16:23 -0800 Subject: [PATCH 01/38] feat: expirmental work for gestalt-DI --- engine/build.gradle | 15 ++++-- .../java/org/destinationsol/CommonDrawer.java | 2 + .../org/destinationsol/ContextWrapper.java | 49 +++++++++++++++++++ .../destinationsol/ContextWrapperService.java | 29 +++++++++++ .../java/org/destinationsol/CoreService.java | 47 ++++++++++++++++++ .../java/org/destinationsol/GameOptions.java | 1 + .../org/destinationsol/SolApplication.java | 30 +++++++----- .../assets/emitters/package-info.java | 5 +- .../assets/fonts/package-info.java | 5 +- .../assets/json/package-info.java | 5 +- .../assets/music/OggMusicManager.java | 4 ++ .../destinationsol/assets/package-info.java | 5 +- .../assets/sound/OggSoundManager.java | 4 ++ .../assets/textures/package-info.java | 5 +- .../destinationsol/common/package-info.java | 5 +- .../entitysystem/ComponentSystemManager.java | 4 ++ .../entitysystem/package-info.java | 5 +- .../destinationsol/files/package-info.java | 5 +- .../org/destinationsol/game/SaveManager.java | 2 +- .../game/asteroid/package-info.java | 5 +- .../game/attributes/package-info.java | 5 +- .../game/chunk/package-info.java | 5 +- .../game/console/commands/package-info.java | 2 +- .../game/console/package-info.java | 2 +- .../game/drawables/package-info.java | 5 +- .../destinationsol/game/gun/package-info.java | 5 +- .../game/input/package-info.java | 5 +- .../game/item/package-info.java | 5 +- .../game/maze/package-info.java | 5 +- .../org/destinationsol/game/package-info.java | 5 +- .../game/particle/package-info.java | 5 +- .../game/planet/package-info.java | 5 +- .../game/projectile/package-info.java | 5 +- .../game/screens/package-info.java | 5 +- .../game/ship/hulls/package-info.java | 5 +- .../game/ship/package-info.java | 5 +- .../game/sound/package-info.java | 5 +- .../org/destinationsol/menu/package-info.java | 5 +- .../mercenary/package-info.java | 5 +- .../destinationsol/modules/ModuleManager.java | 2 + .../destinationsol/ui/SolInputManager.java | 4 ++ .../org/destinationsol/ui/SolLayouts.java | 5 ++ .../java/org/destinationsol/ui/UiDrawer.java | 4 ++ .../org/destinationsol/ui/package-info.java | 5 +- 44 files changed, 267 insertions(+), 74 deletions(-) create mode 100644 engine/src/main/java/org/destinationsol/ContextWrapper.java create mode 100644 engine/src/main/java/org/destinationsol/ContextWrapperService.java create mode 100644 engine/src/main/java/org/destinationsol/CoreService.java diff --git a/engine/build.gradle b/engine/build.gradle index 5571581bd..374588c96 100644 --- a/engine/build.gradle +++ b/engine/build.gradle @@ -31,7 +31,7 @@ buildscript { // HACK: Needed for NUI and gestalt entity-component reflections classpath group: 'org.terasology.nui', name: 'nui', version: '2.0.0-SNAPSHOT' classpath group: 'javax.servlet', name: 'javax.servlet-api', version: '3.0.1' - classpath group: 'org.terasology.gestalt', name: 'gestalt-entity-system', version: '7.0.6-SNAPSHOT' + classpath group: 'org.terasology.gestalt', name: 'gestalt-entity-system', version: '7.0.7-SNAPSHOT' } } @@ -40,10 +40,15 @@ dependencies { compile "com.badlogicgames.gdx:gdx-box2d:$gdxVersion" compile "com.badlogicgames.gdx:gdx-controllers:$gdxVersion" - compile(group: 'org.terasology.gestalt', name: 'gestalt-asset-core', version: '7.0.6-SNAPSHOT') - compile(group: 'org.terasology.gestalt', name: 'gestalt-entity-system', version: '7.0.6-SNAPSHOT') - compile(group: 'org.terasology.gestalt', name: 'gestalt-module', version: '7.0.6-SNAPSHOT') - compile(group: 'org.terasology.gestalt', name: 'gestalt-util', version: '7.0.6-SNAPSHOT') + compile(group: 'org.terasology.gestalt', name: 'gestalt-asset-core', version: '7.0.7-SNAPSHOT') + compile(group: 'org.terasology.gestalt', name: 'gestalt-entity-system', version: '7.0.7-SNAPSHOT') + compile(group: 'org.terasology.gestalt', name: 'gestalt-module', version: '7.0.7-SNAPSHOT') + compile(group: 'org.terasology.gestalt', name: 'gestalt-util', version: '7.0.7-SNAPSHOT') + + compile(group: 'org.terasology.gestalt', name: 'gestalt-di', version: '7.0.7-SNAPSHOT') + compile(group: 'org.terasology.gestalt', name: 'gestalt-inject', version: '7.0.7-SNAPSHOT') + annotationProcessor(group: 'org.terasology.gestalt', name: 'gestalt-inject-java', version: '7.0.7-SNAPSHOT') + compile group: 'org.terasology.nui', name: 'nui', version: '2.0.0' compile group: 'org.terasology.nui', name: 'nui-libgdx', version: '2.0.0' diff --git a/engine/src/main/java/org/destinationsol/CommonDrawer.java b/engine/src/main/java/org/destinationsol/CommonDrawer.java index 90d1bb6ce..244326ea6 100644 --- a/engine/src/main/java/org/destinationsol/CommonDrawer.java +++ b/engine/src/main/java/org/destinationsol/CommonDrawer.java @@ -33,7 +33,9 @@ import org.destinationsol.ui.DisplayDimensions; import org.destinationsol.ui.ResizeSubscriber; import org.destinationsol.ui.UiDrawer; +import org.terasology.context.annotation.Introspected; +@Introspected public class CommonDrawer implements ResizeSubscriber { private final SpriteBatch spriteBatch; private final BitmapFont font; diff --git a/engine/src/main/java/org/destinationsol/ContextWrapper.java b/engine/src/main/java/org/destinationsol/ContextWrapper.java new file mode 100644 index 000000000..dda305338 --- /dev/null +++ b/engine/src/main/java/org/destinationsol/ContextWrapper.java @@ -0,0 +1,49 @@ +/* + * Copyright 2020 The Terasology Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.destinationsol; + +import org.destinationsol.game.context.Context; +import org.terasology.context.annotation.Introspected; +import org.terasology.gestalt.di.BeanContext; +import sun.reflect.generics.reflectiveObjects.NotImplementedException; + +import javax.inject.Inject; + +@Introspected +public class ContextWrapper implements Context { + protected BeanContext context; + + @Inject + public ContextWrapper(BeanContext beanContext) { + this.context = beanContext; + } + + @Override + public T get(Class type) { + return (T) context.getBean(type).get(); + } + + @Override + public void put(Class type, U object) { + throw new NotImplementedException(); + } + + @Override + public void remove(Class type, U object) { + + throw new NotImplementedException(); + } +} diff --git a/engine/src/main/java/org/destinationsol/ContextWrapperService.java b/engine/src/main/java/org/destinationsol/ContextWrapperService.java new file mode 100644 index 000000000..86cbd75f9 --- /dev/null +++ b/engine/src/main/java/org/destinationsol/ContextWrapperService.java @@ -0,0 +1,29 @@ +/* + * Copyright 2020 The Terasology Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.destinationsol; + + +import org.destinationsol.game.context.Context; +import org.terasology.gestalt.di.Lifetime; +import org.terasology.gestalt.di.ServiceRegistry; + +public class ContextWrapperService extends ServiceRegistry { + public ContextWrapperService() { + this.with(Context.class) + .lifetime(Lifetime.Singleton) + .use(ContextWrapper.class); + } +} diff --git a/engine/src/main/java/org/destinationsol/CoreService.java b/engine/src/main/java/org/destinationsol/CoreService.java new file mode 100644 index 000000000..9945ec6a8 --- /dev/null +++ b/engine/src/main/java/org/destinationsol/CoreService.java @@ -0,0 +1,47 @@ +package org.destinationsol; + +import com.badlogic.gdx.Application; +import com.badlogic.gdx.Gdx; +import org.destinationsol.assets.AssetHelper; +import org.destinationsol.assets.music.OggMusicManager; +import org.destinationsol.assets.sound.OggSoundManager; +import org.destinationsol.entitysystem.ComponentSystemManager; +import org.destinationsol.game.DebugOptions; +import org.destinationsol.modules.ModuleManager; +import org.destinationsol.ui.DisplayDimensions; +import org.destinationsol.ui.SolInputManager; +import org.destinationsol.ui.SolLayouts; +import org.destinationsol.ui.UiDrawer; +import org.terasology.gestalt.di.Lifetime; +import org.terasology.gestalt.di.ServiceRegistry; +import org.terasology.gestalt.entitysystem.component.management.ComponentManager; +import org.terasology.gestalt.module.ModuleEnvironment; + +public class CoreService extends ServiceRegistry { + public CoreService(SolApplication application, ModuleManager moduleManager) { + this.with(SolApplication.class).lifetime(Lifetime.Singleton).use(() -> application); + this.with(CommonDrawer.class).lifetime(Lifetime.Singleton); + this.with(GameOptions.class).lifetime(Lifetime.Singleton).use(() -> { + boolean isMobile = Gdx.app.getType() == Application.ApplicationType.Android || Gdx.app.getType() == Application.ApplicationType.iOS; + if (application.isMobile()) { + DebugOptions.read(null); + } + return new GameOptions(isMobile, null); + }); + this.with(ModuleManager.class).lifetime(Lifetime.Singleton).use(() -> moduleManager); + this.with(ModuleEnvironment.class).lifetime(Lifetime.Singleton).use(moduleManager::getEnvironment); + this.with(ComponentSystemManager.class).lifetime(Lifetime.Singleton); + + this.with(OggMusicManager.class).lifetime(Lifetime.Singleton); + this.with(OggSoundManager.class).lifetime(Lifetime.Singleton); + this.with(SolInputManager.class).lifetime(Lifetime.Singleton); + + this.with(ComponentManager.class).lifetime(Lifetime.Singleton).use(ComponentManager::new); + this.with(AssetHelper.class).lifetime(Lifetime.Singleton).use(AssetHelper::new); + + this.with(DisplayDimensions.class).lifetime(Lifetime.Singleton).use(() -> new DisplayDimensions(Gdx.graphics.getWidth(), Gdx.graphics.getHeight())); + + this.with(UiDrawer.class).lifetime(Lifetime.Singleton); + this.with(SolLayouts.class); + } +} diff --git a/engine/src/main/java/org/destinationsol/GameOptions.java b/engine/src/main/java/org/destinationsol/GameOptions.java index 4f7c8388f..b498f34d4 100644 --- a/engine/src/main/java/org/destinationsol/GameOptions.java +++ b/engine/src/main/java/org/destinationsol/GameOptions.java @@ -20,6 +20,7 @@ import com.google.common.base.Enums; import org.destinationsol.menu.Resolution; import org.destinationsol.menu.ResolutionProvider; +import org.terasology.context.annotation.Introspected; import static java.util.Arrays.asList; diff --git a/engine/src/main/java/org/destinationsol/SolApplication.java b/engine/src/main/java/org/destinationsol/SolApplication.java index 79ca527e5..2d7f8b549 100644 --- a/engine/src/main/java/org/destinationsol/SolApplication.java +++ b/engine/src/main/java/org/destinationsol/SolApplication.java @@ -71,10 +71,12 @@ import org.destinationsol.util.InjectionHelper; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.terasology.context.annotation.API; +import org.terasology.gestalt.di.BeanContext; +import org.terasology.gestalt.di.DefaultBeanContext; import org.terasology.gestalt.entitysystem.component.Component; import org.terasology.gestalt.entitysystem.component.management.ComponentManager; import org.terasology.gestalt.entitysystem.entity.EntityRef; -import org.terasology.gestalt.module.sandbox.API; import java.io.PrintWriter; import java.io.StringWriter; @@ -118,6 +120,8 @@ public class SolApplication implements ApplicationListener { private ComponentManager componentManager; + private BeanContext beanContext; + // TODO: Make this non-static. private static Set resizeSubscribers; @@ -127,6 +131,8 @@ public SolApplication(ModuleManager moduleManager, float targetFPS) { this.moduleManager = moduleManager; this.targetFPS = targetFPS; resizeSubscribers = new HashSet<>(); + + this.beanContext = new DefaultBeanContext(new CoreService(this, moduleManager)); } @Override @@ -140,25 +146,25 @@ public void create() { } options = new GameOptions(isMobile(), null); - componentManager = new ComponentManager(); - AssetHelper helper = new AssetHelper(); + componentManager = beanContext.getBean(ComponentManager.class).get(); + AssetHelper helper = beanContext.getBean(AssetHelper.class).get(); helper.init(moduleManager.getEnvironment(), componentManager, isMobile); Assets.initialize(helper); - context.put(ComponentSystemManager.class, new ComponentSystemManager(moduleManager.getEnvironment(), context)); + context.put(ComponentSystemManager.class, beanContext.getBean(ComponentSystemManager.class).get()); logger.info("\n\n ------------------------------------------------------------ \n"); moduleManager.printAvailableModules(); - musicManager = new OggMusicManager(options); - soundManager = new OggSoundManager(context); - inputManager = new SolInputManager(soundManager, context); + musicManager = beanContext.getBean(OggMusicManager.class).get(); + soundManager = beanContext.getBean(OggSoundManager.class).get(); + inputManager = beanContext.getBean(SolInputManager.class).get(); musicManager.playMusic(OggMusicManager.MENU_MUSIC_SET, options); - displayDimensions = new DisplayDimensions(Gdx.graphics.getWidth(), Gdx.graphics.getHeight()); - commonDrawer = new CommonDrawer(); - uiDrawer = new UiDrawer(commonDrawer); - layouts = new SolLayouts(); + displayDimensions = beanContext.getBean(DisplayDimensions.class).get(); + commonDrawer = beanContext.getBean(CommonDrawer.class).get(); + uiDrawer = beanContext.getBean(UiDrawer.class).get(); + layouts = beanContext.getBean(SolLayouts.class).get(); menuBackgroundManager = new MenuBackgroundManager(displayDimensions); menuScreens = new MenuScreens(layouts, isMobile(), options); @@ -288,7 +294,7 @@ private void draw() { EntityRef entityRef = entitySystemManager.getEntityManager().createEntity(graphicsComponent, position, size, new Angle(), new Velocity(), new AsteroidMesh(), health, new DropsMoneyOnDestruction(), new CreatesRubbleOnDestruction()); - + entityRef.setComponent(new BodyLinked()); entityCreated = true; } diff --git a/engine/src/main/java/org/destinationsol/assets/emitters/package-info.java b/engine/src/main/java/org/destinationsol/assets/emitters/package-info.java index 2dd890bc9..3c9dc2169 100644 --- a/engine/src/main/java/org/destinationsol/assets/emitters/package-info.java +++ b/engine/src/main/java/org/destinationsol/assets/emitters/package-info.java @@ -13,6 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -@API package org.destinationsol.assets.emitters; +@API +package org.destinationsol.assets.emitters; -import org.terasology.gestalt.module.sandbox.API; \ No newline at end of file +import org.terasology.context.annotation.API; diff --git a/engine/src/main/java/org/destinationsol/assets/fonts/package-info.java b/engine/src/main/java/org/destinationsol/assets/fonts/package-info.java index 45eb0830d..08b74ec61 100644 --- a/engine/src/main/java/org/destinationsol/assets/fonts/package-info.java +++ b/engine/src/main/java/org/destinationsol/assets/fonts/package-info.java @@ -13,6 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -@API package org.destinationsol.assets.fonts; +@API +package org.destinationsol.assets.fonts; -import org.terasology.gestalt.module.sandbox.API; \ No newline at end of file +import org.terasology.context.annotation.API; diff --git a/engine/src/main/java/org/destinationsol/assets/json/package-info.java b/engine/src/main/java/org/destinationsol/assets/json/package-info.java index 8f4168900..e131f395d 100644 --- a/engine/src/main/java/org/destinationsol/assets/json/package-info.java +++ b/engine/src/main/java/org/destinationsol/assets/json/package-info.java @@ -13,6 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -@API package org.destinationsol.assets.json; +@API +package org.destinationsol.assets.json; -import org.terasology.gestalt.module.sandbox.API; +import org.terasology.context.annotation.API; diff --git a/engine/src/main/java/org/destinationsol/assets/music/OggMusicManager.java b/engine/src/main/java/org/destinationsol/assets/music/OggMusicManager.java index fb2cf173e..8f9f22099 100644 --- a/engine/src/main/java/org/destinationsol/assets/music/OggMusicManager.java +++ b/engine/src/main/java/org/destinationsol/assets/music/OggMusicManager.java @@ -23,8 +23,10 @@ import org.json.JSONObject; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.terasology.context.annotation.Introspected; import org.terasology.gestalt.assets.ResourceUrn; +import javax.inject.Inject; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -37,6 +39,7 @@ * This class does not rely on external updates; once a music set is set to be played, it will play, even looping, * until another is chosen. By default, music does not play concurrently. */ +@Introspected public class OggMusicManager { public static final String NO_MUSIC = ""; public static final String MENU_MUSIC_SET = "menu"; @@ -51,6 +54,7 @@ public class OggMusicManager { * Registers engine music. * TODO Make music registerable from modules, and then register this music through the new way. */ + @Inject public OggMusicManager(GameOptions options) { musicMap = new HashMap<>(); registerMusic(GAME_MUSIC_SET, "engine:cimmerianDawn"); diff --git a/engine/src/main/java/org/destinationsol/assets/package-info.java b/engine/src/main/java/org/destinationsol/assets/package-info.java index 823fce42a..5d6d23856 100644 --- a/engine/src/main/java/org/destinationsol/assets/package-info.java +++ b/engine/src/main/java/org/destinationsol/assets/package-info.java @@ -13,6 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -@API package org.destinationsol.assets; +@API +package org.destinationsol.assets; -import org.terasology.gestalt.module.sandbox.API; +import org.terasology.context.annotation.API; diff --git a/engine/src/main/java/org/destinationsol/assets/sound/OggSoundManager.java b/engine/src/main/java/org/destinationsol/assets/sound/OggSoundManager.java index 48969842d..f9e7538f2 100644 --- a/engine/src/main/java/org/destinationsol/assets/sound/OggSoundManager.java +++ b/engine/src/main/java/org/destinationsol/assets/sound/OggSoundManager.java @@ -32,7 +32,9 @@ import org.destinationsol.game.context.Context; import org.destinationsol.game.planet.Planet; import org.destinationsol.game.sound.DebugHintDrawer; +import org.terasology.context.annotation.Introspected; +import javax.inject.Inject; import java.util.HashMap; import java.util.Map; @@ -55,6 +57,7 @@ * sound will be accepted only when loopTime time units has passed since the beginning of the sound's prior playback, or * the request is from different object. */ +@Introspected public class OggSoundManager implements UpdateAwareSystem { /** * A container for all the sounds that have been so far loaded in the game. Sounds are loaded on as needed basis, @@ -84,6 +87,7 @@ public class OggSoundManager implements UpdateAwareSystem { private final SolApplication solApplication; + @Inject public OggSoundManager(Context context) { soundMap = new HashMap<>(); loopedSoundMap = new HashMap<>(); diff --git a/engine/src/main/java/org/destinationsol/assets/textures/package-info.java b/engine/src/main/java/org/destinationsol/assets/textures/package-info.java index e4ad3fc21..d7f0a40c0 100644 --- a/engine/src/main/java/org/destinationsol/assets/textures/package-info.java +++ b/engine/src/main/java/org/destinationsol/assets/textures/package-info.java @@ -13,6 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -@API package org.destinationsol.assets.textures; +@API +package org.destinationsol.assets.textures; -import org.terasology.gestalt.module.sandbox.API; \ No newline at end of file +import org.terasology.context.annotation.API; diff --git a/engine/src/main/java/org/destinationsol/common/package-info.java b/engine/src/main/java/org/destinationsol/common/package-info.java index 1bac4f05a..44b3168b9 100644 --- a/engine/src/main/java/org/destinationsol/common/package-info.java +++ b/engine/src/main/java/org/destinationsol/common/package-info.java @@ -13,6 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -@API package org.destinationsol.common; +@API +package org.destinationsol.common; -import org.terasology.gestalt.module.sandbox.API; +import org.terasology.context.annotation.API; diff --git a/engine/src/main/java/org/destinationsol/entitysystem/ComponentSystemManager.java b/engine/src/main/java/org/destinationsol/entitysystem/ComponentSystemManager.java index 5ee69d96b..c8ddf206b 100644 --- a/engine/src/main/java/org/destinationsol/entitysystem/ComponentSystemManager.java +++ b/engine/src/main/java/org/destinationsol/entitysystem/ComponentSystemManager.java @@ -18,14 +18,18 @@ import com.google.common.collect.Lists; import org.destinationsol.game.context.Context; import org.destinationsol.util.InjectionHelper; +import org.terasology.context.annotation.Introspected; import org.terasology.gestalt.module.ModuleEnvironment; +import javax.inject.Inject; import java.util.ArrayList; +@Introspected public class ComponentSystemManager { private ArrayList componentSystems = Lists.newArrayList(); + @Inject public ComponentSystemManager(ModuleEnvironment environment, Context context) { for (Class componentSystem : environment.getSubtypesOf(ComponentSystem.class)) { try { diff --git a/engine/src/main/java/org/destinationsol/entitysystem/package-info.java b/engine/src/main/java/org/destinationsol/entitysystem/package-info.java index c347c8ede..227b51a59 100644 --- a/engine/src/main/java/org/destinationsol/entitysystem/package-info.java +++ b/engine/src/main/java/org/destinationsol/entitysystem/package-info.java @@ -13,6 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -@API package org.destinationsol.entitysystem; +@API +package org.destinationsol.entitysystem; -import org.terasology.gestalt.module.sandbox.API; \ No newline at end of file +import org.terasology.context.annotation.API; diff --git a/engine/src/main/java/org/destinationsol/files/package-info.java b/engine/src/main/java/org/destinationsol/files/package-info.java index 9a32f1848..ed6ec3ff0 100644 --- a/engine/src/main/java/org/destinationsol/files/package-info.java +++ b/engine/src/main/java/org/destinationsol/files/package-info.java @@ -13,6 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -@API package org.destinationsol.files; +@API +package org.destinationsol.files; -import org.terasology.gestalt.module.sandbox.API; +import org.terasology.context.annotation.API; diff --git a/engine/src/main/java/org/destinationsol/game/SaveManager.java b/engine/src/main/java/org/destinationsol/game/SaveManager.java index 7972e6072..516af8173 100644 --- a/engine/src/main/java/org/destinationsol/game/SaveManager.java +++ b/engine/src/main/java/org/destinationsol/game/SaveManager.java @@ -37,7 +37,7 @@ import org.destinationsol.ui.Waypoint; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.terasology.gestalt.module.sandbox.API; +import org.terasology.context.annotation.API; import java.io.File; import java.io.FileNotFoundException; diff --git a/engine/src/main/java/org/destinationsol/game/asteroid/package-info.java b/engine/src/main/java/org/destinationsol/game/asteroid/package-info.java index 57950bd21..68e300f93 100644 --- a/engine/src/main/java/org/destinationsol/game/asteroid/package-info.java +++ b/engine/src/main/java/org/destinationsol/game/asteroid/package-info.java @@ -13,6 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -@API package org.destinationsol.game.asteroid; +@API +package org.destinationsol.game.asteroid; -import org.terasology.gestalt.module.sandbox.API; +import org.terasology.context.annotation.API; diff --git a/engine/src/main/java/org/destinationsol/game/attributes/package-info.java b/engine/src/main/java/org/destinationsol/game/attributes/package-info.java index 81e37edbb..dada39f1c 100644 --- a/engine/src/main/java/org/destinationsol/game/attributes/package-info.java +++ b/engine/src/main/java/org/destinationsol/game/attributes/package-info.java @@ -13,6 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -@API package org.destinationsol.game.attributes; +@API +package org.destinationsol.game.attributes; -import org.terasology.gestalt.module.sandbox.API; +import org.terasology.context.annotation.API; diff --git a/engine/src/main/java/org/destinationsol/game/chunk/package-info.java b/engine/src/main/java/org/destinationsol/game/chunk/package-info.java index 9d92c15a3..bb7c82172 100644 --- a/engine/src/main/java/org/destinationsol/game/chunk/package-info.java +++ b/engine/src/main/java/org/destinationsol/game/chunk/package-info.java @@ -13,6 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -@API package org.destinationsol.game.chunk; +@API +package org.destinationsol.game.chunk; -import org.terasology.gestalt.module.sandbox.API; +import org.terasology.context.annotation.API; diff --git a/engine/src/main/java/org/destinationsol/game/console/commands/package-info.java b/engine/src/main/java/org/destinationsol/game/console/commands/package-info.java index df43a05b6..3ac4d9bb9 100644 --- a/engine/src/main/java/org/destinationsol/game/console/commands/package-info.java +++ b/engine/src/main/java/org/destinationsol/game/console/commands/package-info.java @@ -16,4 +16,4 @@ @API package org.destinationsol.game.console.commands; -import org.terasology.gestalt.module.sandbox.API; +import org.terasology.context.annotation.API; diff --git a/engine/src/main/java/org/destinationsol/game/console/package-info.java b/engine/src/main/java/org/destinationsol/game/console/package-info.java index c8b9d6226..e7d2b6550 100644 --- a/engine/src/main/java/org/destinationsol/game/console/package-info.java +++ b/engine/src/main/java/org/destinationsol/game/console/package-info.java @@ -16,4 +16,4 @@ @API package org.destinationsol.game.console; -import org.terasology.gestalt.module.sandbox.API; +import org.terasology.context.annotation.API; diff --git a/engine/src/main/java/org/destinationsol/game/drawables/package-info.java b/engine/src/main/java/org/destinationsol/game/drawables/package-info.java index 2743f40f6..2d27d5d2b 100644 --- a/engine/src/main/java/org/destinationsol/game/drawables/package-info.java +++ b/engine/src/main/java/org/destinationsol/game/drawables/package-info.java @@ -13,6 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -@API package org.destinationsol.game.drawables; +@API +package org.destinationsol.game.drawables; -import org.terasology.gestalt.module.sandbox.API; +import org.terasology.context.annotation.API; diff --git a/engine/src/main/java/org/destinationsol/game/gun/package-info.java b/engine/src/main/java/org/destinationsol/game/gun/package-info.java index a963bec41..ec639fe5a 100644 --- a/engine/src/main/java/org/destinationsol/game/gun/package-info.java +++ b/engine/src/main/java/org/destinationsol/game/gun/package-info.java @@ -13,6 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -@API package org.destinationsol.game.gun; +@API +package org.destinationsol.game.gun; -import org.terasology.gestalt.module.sandbox.API; +import org.terasology.context.annotation.API; diff --git a/engine/src/main/java/org/destinationsol/game/input/package-info.java b/engine/src/main/java/org/destinationsol/game/input/package-info.java index 9fdc825a0..705a8f96b 100644 --- a/engine/src/main/java/org/destinationsol/game/input/package-info.java +++ b/engine/src/main/java/org/destinationsol/game/input/package-info.java @@ -13,6 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -@API package org.destinationsol.game.input; +@API +package org.destinationsol.game.input; -import org.terasology.gestalt.module.sandbox.API; +import org.terasology.context.annotation.API; diff --git a/engine/src/main/java/org/destinationsol/game/item/package-info.java b/engine/src/main/java/org/destinationsol/game/item/package-info.java index 6e7004259..8864c0613 100644 --- a/engine/src/main/java/org/destinationsol/game/item/package-info.java +++ b/engine/src/main/java/org/destinationsol/game/item/package-info.java @@ -13,6 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -@API package org.destinationsol.game.item; +@API +package org.destinationsol.game.item; -import org.terasology.gestalt.module.sandbox.API; +import org.terasology.context.annotation.API; diff --git a/engine/src/main/java/org/destinationsol/game/maze/package-info.java b/engine/src/main/java/org/destinationsol/game/maze/package-info.java index cd16ccad1..b8ced4a2e 100644 --- a/engine/src/main/java/org/destinationsol/game/maze/package-info.java +++ b/engine/src/main/java/org/destinationsol/game/maze/package-info.java @@ -13,6 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -@API package org.destinationsol.game.maze; +@API +package org.destinationsol.game.maze; -import org.terasology.gestalt.module.sandbox.API; +import org.terasology.context.annotation.API; diff --git a/engine/src/main/java/org/destinationsol/game/package-info.java b/engine/src/main/java/org/destinationsol/game/package-info.java index ce000bd67..873a888ad 100644 --- a/engine/src/main/java/org/destinationsol/game/package-info.java +++ b/engine/src/main/java/org/destinationsol/game/package-info.java @@ -13,6 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -@API package org.destinationsol.game; +@API +package org.destinationsol.game; -import org.terasology.gestalt.module.sandbox.API; +import org.terasology.context.annotation.API; diff --git a/engine/src/main/java/org/destinationsol/game/particle/package-info.java b/engine/src/main/java/org/destinationsol/game/particle/package-info.java index 953cd124f..58a54e69f 100644 --- a/engine/src/main/java/org/destinationsol/game/particle/package-info.java +++ b/engine/src/main/java/org/destinationsol/game/particle/package-info.java @@ -13,6 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -@API package org.destinationsol.game.particle; +@API +package org.destinationsol.game.particle; -import org.terasology.gestalt.module.sandbox.API; +import org.terasology.context.annotation.API; diff --git a/engine/src/main/java/org/destinationsol/game/planet/package-info.java b/engine/src/main/java/org/destinationsol/game/planet/package-info.java index 9741f3494..b871f6ed6 100644 --- a/engine/src/main/java/org/destinationsol/game/planet/package-info.java +++ b/engine/src/main/java/org/destinationsol/game/planet/package-info.java @@ -13,6 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -@API package org.destinationsol.game.planet; +@API +package org.destinationsol.game.planet; -import org.terasology.gestalt.module.sandbox.API; +import org.terasology.context.annotation.API; diff --git a/engine/src/main/java/org/destinationsol/game/projectile/package-info.java b/engine/src/main/java/org/destinationsol/game/projectile/package-info.java index ef7e067d4..7b003a1ef 100644 --- a/engine/src/main/java/org/destinationsol/game/projectile/package-info.java +++ b/engine/src/main/java/org/destinationsol/game/projectile/package-info.java @@ -13,6 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -@API package org.destinationsol.game.projectile; +@API +package org.destinationsol.game.projectile; -import org.terasology.gestalt.module.sandbox.API; +import org.terasology.context.annotation.API; diff --git a/engine/src/main/java/org/destinationsol/game/screens/package-info.java b/engine/src/main/java/org/destinationsol/game/screens/package-info.java index 6b362d071..bcef7604a 100644 --- a/engine/src/main/java/org/destinationsol/game/screens/package-info.java +++ b/engine/src/main/java/org/destinationsol/game/screens/package-info.java @@ -13,6 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -@API package org.destinationsol.game.screens; +@API +package org.destinationsol.game.screens; -import org.terasology.gestalt.module.sandbox.API; +import org.terasology.context.annotation.API; diff --git a/engine/src/main/java/org/destinationsol/game/ship/hulls/package-info.java b/engine/src/main/java/org/destinationsol/game/ship/hulls/package-info.java index 74e9e7d33..b7259cb19 100644 --- a/engine/src/main/java/org/destinationsol/game/ship/hulls/package-info.java +++ b/engine/src/main/java/org/destinationsol/game/ship/hulls/package-info.java @@ -13,6 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -@API package org.destinationsol.game.ship.hulls; +@API +package org.destinationsol.game.ship.hulls; -import org.terasology.gestalt.module.sandbox.API; +import org.terasology.context.annotation.API; diff --git a/engine/src/main/java/org/destinationsol/game/ship/package-info.java b/engine/src/main/java/org/destinationsol/game/ship/package-info.java index 790207adf..28a519951 100644 --- a/engine/src/main/java/org/destinationsol/game/ship/package-info.java +++ b/engine/src/main/java/org/destinationsol/game/ship/package-info.java @@ -13,6 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -@API package org.destinationsol.game.ship; +@API +package org.destinationsol.game.ship; -import org.terasology.gestalt.module.sandbox.API; +import org.terasology.context.annotation.API; diff --git a/engine/src/main/java/org/destinationsol/game/sound/package-info.java b/engine/src/main/java/org/destinationsol/game/sound/package-info.java index d6e8802bd..202f0479d 100644 --- a/engine/src/main/java/org/destinationsol/game/sound/package-info.java +++ b/engine/src/main/java/org/destinationsol/game/sound/package-info.java @@ -13,6 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -@API package org.destinationsol.game.sound; +@API +package org.destinationsol.game.sound; -import org.terasology.gestalt.module.sandbox.API; +import org.terasology.context.annotation.API; diff --git a/engine/src/main/java/org/destinationsol/menu/package-info.java b/engine/src/main/java/org/destinationsol/menu/package-info.java index bbe813b92..3d74e0866 100644 --- a/engine/src/main/java/org/destinationsol/menu/package-info.java +++ b/engine/src/main/java/org/destinationsol/menu/package-info.java @@ -13,6 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -@API package org.destinationsol.menu; +@API +package org.destinationsol.menu; -import org.terasology.gestalt.module.sandbox.API; +import org.terasology.context.annotation.API; diff --git a/engine/src/main/java/org/destinationsol/mercenary/package-info.java b/engine/src/main/java/org/destinationsol/mercenary/package-info.java index 452b50844..d33d7dba6 100644 --- a/engine/src/main/java/org/destinationsol/mercenary/package-info.java +++ b/engine/src/main/java/org/destinationsol/mercenary/package-info.java @@ -13,6 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -@API package org.destinationsol.mercenary; +@API +package org.destinationsol.mercenary; -import org.terasology.gestalt.module.sandbox.API; +import org.terasology.context.annotation.API; diff --git a/engine/src/main/java/org/destinationsol/modules/ModuleManager.java b/engine/src/main/java/org/destinationsol/modules/ModuleManager.java index 8740afff2..a34baa591 100644 --- a/engine/src/main/java/org/destinationsol/modules/ModuleManager.java +++ b/engine/src/main/java/org/destinationsol/modules/ModuleManager.java @@ -31,6 +31,7 @@ import org.reflections.util.ConfigurationBuilder; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.terasology.context.annotation.Introspected; import org.terasology.gestalt.assets.ResourceUrn; import org.terasology.gestalt.module.Module; import org.terasology.gestalt.module.ModuleEnvironment; @@ -59,6 +60,7 @@ /** * A class used for loading and managing modules in Destination Sol. */ +@Introspected public class ModuleManager { private static final Logger logger = LoggerFactory.getLogger(ModuleManager.class); // The API whitelist is based off Terasology's diff --git a/engine/src/main/java/org/destinationsol/ui/SolInputManager.java b/engine/src/main/java/org/destinationsol/ui/SolInputManager.java index fd61f2701..151fd6766 100644 --- a/engine/src/main/java/org/destinationsol/ui/SolInputManager.java +++ b/engine/src/main/java/org/destinationsol/ui/SolInputManager.java @@ -33,12 +33,15 @@ import org.destinationsol.common.SolMath; import org.destinationsol.game.SolGame; import org.destinationsol.game.context.Context; +import org.terasology.context.annotation.Introspected; +import javax.inject.Inject; import java.util.ArrayList; import java.util.List; import static com.badlogic.gdx.graphics.Pixmap.Format.RGBA8888; +@Introspected public class SolInputManager { private static final float CURSOR_SZ = .07f; private static final float WARN_PERC_GROWTH_TIME = 1f; @@ -70,6 +73,7 @@ public class SolInputManager { private Boolean scrolledUp; public boolean touchDragged; + @Inject public SolInputManager(OggSoundManager soundManager, Context context) { this.context = context; inputPointers = new InputPointer[POINTER_COUNT]; diff --git a/engine/src/main/java/org/destinationsol/ui/SolLayouts.java b/engine/src/main/java/org/destinationsol/ui/SolLayouts.java index 556afd68a..f4f9d3217 100644 --- a/engine/src/main/java/org/destinationsol/ui/SolLayouts.java +++ b/engine/src/main/java/org/destinationsol/ui/SolLayouts.java @@ -17,11 +17,16 @@ import org.destinationsol.game.screens.RightPaneLayout; import org.destinationsol.menu.MenuLayout; +import org.terasology.context.annotation.Introspected; +import javax.inject.Inject; + +@Introspected public class SolLayouts { public final RightPaneLayout rightPaneLayout; public final MenuLayout menuLayout; + @Inject public SolLayouts() { rightPaneLayout = new RightPaneLayout(); menuLayout = new MenuLayout(); diff --git a/engine/src/main/java/org/destinationsol/ui/UiDrawer.java b/engine/src/main/java/org/destinationsol/ui/UiDrawer.java index 78872be4b..ba27cdea2 100644 --- a/engine/src/main/java/org/destinationsol/ui/UiDrawer.java +++ b/engine/src/main/java/org/destinationsol/ui/UiDrawer.java @@ -23,10 +23,13 @@ import org.destinationsol.CommonDrawer; import org.destinationsol.SolApplication; import org.destinationsol.assets.Assets; +import org.terasology.context.annotation.Introspected; +import javax.inject.Inject; import java.util.HashMap; import java.util.Map; +@Introspected public class UiDrawer implements ResizeSubscriber { public enum TextAlignment { LEFT, @@ -49,6 +52,7 @@ public enum TextAlignment { public static Map positions = new HashMap<>(); + @Inject public UiDrawer(CommonDrawer commonDrawer) { displayDimensions = SolApplication.displayDimensions; drawer = commonDrawer; diff --git a/engine/src/main/java/org/destinationsol/ui/package-info.java b/engine/src/main/java/org/destinationsol/ui/package-info.java index 6d278d2ab..01662bf67 100644 --- a/engine/src/main/java/org/destinationsol/ui/package-info.java +++ b/engine/src/main/java/org/destinationsol/ui/package-info.java @@ -13,6 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -@API package org.destinationsol.ui; +@API +package org.destinationsol.ui; -import org.terasology.gestalt.module.sandbox.API; +import org.terasology.context.annotation.API; From ea7a02b1994150baf815ea83bca9223b93f19d92 Mon Sep 17 00:00:00 2001 From: Michael Pollind Date: Sun, 28 Feb 2021 19:40:41 -0800 Subject: [PATCH 02/38] tweak implementation --- desktop/build.gradle | 1 + engine/build.gradle | 16 ++++---- .../org/destinationsol/ContextWrapper.java | 2 +- .../java/org/destinationsol/CoreService.java | 2 + .../org/destinationsol/SolApplication.java | 40 +++++++++++++------ 5 files changed, 39 insertions(+), 22 deletions(-) diff --git a/desktop/build.gradle b/desktop/build.gradle index 584f97b2c..d980dab53 100644 --- a/desktop/build.gradle +++ b/desktop/build.gradle @@ -32,6 +32,7 @@ dependencies { compile group: 'org.terasology.crashreporter', name: 'cr-destsol', version: '4.0.0' compile group: 'org.slf4j', name: 'slf4j-log4j12', version: '1.7.25' + } task run(type: JavaExec) { diff --git a/engine/build.gradle b/engine/build.gradle index 374588c96..3c95f4f48 100644 --- a/engine/build.gradle +++ b/engine/build.gradle @@ -31,7 +31,7 @@ buildscript { // HACK: Needed for NUI and gestalt entity-component reflections classpath group: 'org.terasology.nui', name: 'nui', version: '2.0.0-SNAPSHOT' classpath group: 'javax.servlet', name: 'javax.servlet-api', version: '3.0.1' - classpath group: 'org.terasology.gestalt', name: 'gestalt-entity-system', version: '7.0.7-SNAPSHOT' + classpath group: 'org.terasology.gestalt', name: 'gestalt-entity-system', version: '7.0.6-SNAPSHOT' } } @@ -40,14 +40,14 @@ dependencies { compile "com.badlogicgames.gdx:gdx-box2d:$gdxVersion" compile "com.badlogicgames.gdx:gdx-controllers:$gdxVersion" - compile(group: 'org.terasology.gestalt', name: 'gestalt-asset-core', version: '7.0.7-SNAPSHOT') - compile(group: 'org.terasology.gestalt', name: 'gestalt-entity-system', version: '7.0.7-SNAPSHOT') - compile(group: 'org.terasology.gestalt', name: 'gestalt-module', version: '7.0.7-SNAPSHOT') - compile(group: 'org.terasology.gestalt', name: 'gestalt-util', version: '7.0.7-SNAPSHOT') + compile(group: 'org.terasology.gestalt', name: 'gestalt-asset-core', version: '7.0.6-SNAPSHOT') + compile(group: 'org.terasology.gestalt', name: 'gestalt-entity-system', version: '7.0.6-SNAPSHOT') + compile(group: 'org.terasology.gestalt', name: 'gestalt-module', version: '7.0.6-SNAPSHOT') + compile(group: 'org.terasology.gestalt', name: 'gestalt-util', version: '7.0.6-SNAPSHOT') - compile(group: 'org.terasology.gestalt', name: 'gestalt-di', version: '7.0.7-SNAPSHOT') - compile(group: 'org.terasology.gestalt', name: 'gestalt-inject', version: '7.0.7-SNAPSHOT') - annotationProcessor(group: 'org.terasology.gestalt', name: 'gestalt-inject-java', version: '7.0.7-SNAPSHOT') + compile(group: 'org.terasology.gestalt', name: 'gestalt-di', version: '7.0.6-SNAPSHOT') + compile(group: 'org.terasology.gestalt', name: 'gestalt-inject', version: '7.0.6-SNAPSHOT') + annotationProcessor(group: 'org.terasology.gestalt', name: 'gestalt-inject-java', version: '7.0.6-SNAPSHOT') compile group: 'org.terasology.nui', name: 'nui', version: '2.0.0' compile group: 'org.terasology.nui', name: 'nui-libgdx', version: '2.0.0' diff --git a/engine/src/main/java/org/destinationsol/ContextWrapper.java b/engine/src/main/java/org/destinationsol/ContextWrapper.java index dda305338..ab19a0c41 100644 --- a/engine/src/main/java/org/destinationsol/ContextWrapper.java +++ b/engine/src/main/java/org/destinationsol/ContextWrapper.java @@ -33,7 +33,7 @@ public ContextWrapper(BeanContext beanContext) { @Override public T get(Class type) { - return (T) context.getBean(type).get(); + return (T) context.getBean(type); } @Override diff --git a/engine/src/main/java/org/destinationsol/CoreService.java b/engine/src/main/java/org/destinationsol/CoreService.java index 9945ec6a8..e9c0a8e74 100644 --- a/engine/src/main/java/org/destinationsol/CoreService.java +++ b/engine/src/main/java/org/destinationsol/CoreService.java @@ -7,6 +7,7 @@ import org.destinationsol.assets.sound.OggSoundManager; import org.destinationsol.entitysystem.ComponentSystemManager; import org.destinationsol.game.DebugOptions; +import org.destinationsol.game.context.Context; import org.destinationsol.modules.ModuleManager; import org.destinationsol.ui.DisplayDimensions; import org.destinationsol.ui.SolInputManager; @@ -42,6 +43,7 @@ public CoreService(SolApplication application, ModuleManager moduleManager) { this.with(DisplayDimensions.class).lifetime(Lifetime.Singleton).use(() -> new DisplayDimensions(Gdx.graphics.getWidth(), Gdx.graphics.getHeight())); this.with(UiDrawer.class).lifetime(Lifetime.Singleton); + this.with(Context.class).use(ContextWrapper.class).lifetime(Lifetime.Singleton); this.with(SolLayouts.class); } } diff --git a/engine/src/main/java/org/destinationsol/SolApplication.java b/engine/src/main/java/org/destinationsol/SolApplication.java index 2d7f8b549..2d847b7bc 100644 --- a/engine/src/main/java/org/destinationsol/SolApplication.java +++ b/engine/src/main/java/org/destinationsol/SolApplication.java @@ -72,12 +72,15 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.terasology.context.annotation.API; +import org.terasology.context.annotation.Introspected; import org.terasology.gestalt.di.BeanContext; import org.terasology.gestalt.di.DefaultBeanContext; import org.terasology.gestalt.entitysystem.component.Component; import org.terasology.gestalt.entitysystem.component.management.ComponentManager; import org.terasology.gestalt.entitysystem.entity.EntityRef; +import sun.reflect.generics.reflectiveObjects.NotImplementedException; +import javax.inject.Inject; import java.io.PrintWriter; import java.io.StringWriter; import java.util.HashSet; @@ -85,6 +88,7 @@ import java.util.Set; @API +@Introspected public class SolApplication implements ApplicationListener { private static final Logger logger = LoggerFactory.getLogger(SolApplication.class); @@ -94,9 +98,13 @@ public class SolApplication implements ApplicationListener { private final ModuleManager moduleManager; private EntitySystemManager entitySystemManager; - private OggMusicManager musicManager; - private OggSoundManager soundManager; - private SolInputManager inputManager; + @Inject + protected OggMusicManager musicManager; + @Inject + protected OggSoundManager soundManager; + @Inject + protected SolInputManager inputManager; + private MenuBackgroundManager menuBackgroundManager; private UiDrawer uiDrawer; @@ -125,6 +133,10 @@ public class SolApplication implements ApplicationListener { // TODO: Make this non-static. private static Set resizeSubscribers; + protected SolApplication() { + throw new NotImplementedException(); + } + public SolApplication(ModuleManager moduleManager, float targetFPS) { // Initiate Box2D to make sure natives are loaded early enough Box2D.init(); @@ -146,25 +158,27 @@ public void create() { } options = new GameOptions(isMobile(), null); - componentManager = beanContext.getBean(ComponentManager.class).get(); - AssetHelper helper = beanContext.getBean(AssetHelper.class).get(); + componentManager = beanContext.getBean(ComponentManager.class); + AssetHelper helper = beanContext.getBean(AssetHelper.class); helper.init(moduleManager.getEnvironment(), componentManager, isMobile); Assets.initialize(helper); - context.put(ComponentSystemManager.class, beanContext.getBean(ComponentSystemManager.class).get()); + context.put(ComponentSystemManager.class, beanContext.getBean(ComponentSystemManager.class)); logger.info("\n\n ------------------------------------------------------------ \n"); moduleManager.printAvailableModules(); - musicManager = beanContext.getBean(OggMusicManager.class).get(); - soundManager = beanContext.getBean(OggSoundManager.class).get(); - inputManager = beanContext.getBean(SolInputManager.class).get(); + beanContext.inject(this); + +// musicManager = beanContext.getBean(OggMusicManager.class); +// soundManager = beanContext.getBean(OggSoundManager.class); +// inputManager = beanContext.getBean(SolInputManager.class); musicManager.playMusic(OggMusicManager.MENU_MUSIC_SET, options); - displayDimensions = beanContext.getBean(DisplayDimensions.class).get(); - commonDrawer = beanContext.getBean(CommonDrawer.class).get(); - uiDrawer = beanContext.getBean(UiDrawer.class).get(); - layouts = beanContext.getBean(SolLayouts.class).get(); + displayDimensions = beanContext.getBean(DisplayDimensions.class); + commonDrawer = beanContext.getBean(CommonDrawer.class); + uiDrawer = beanContext.getBean(UiDrawer.class); + layouts = beanContext.getBean(SolLayouts.class); menuBackgroundManager = new MenuBackgroundManager(displayDimensions); menuScreens = new MenuScreens(layouts, isMobile(), options); From 735bd6a7b3388673df0f2260b677a755df19aced Mon Sep 17 00:00:00 2001 From: Michael Pollind Date: Sun, 28 Feb 2021 22:21:59 -0800 Subject: [PATCH 03/38] start basic implementation for SolGame --- .../destinationsol/ContextWrapperService.java | 4 +- .../java/org/destinationsol/CoreService.java | 2 - .../org/destinationsol/SolApplication.java | 101 +++++----- .../SolGameServiceRegistry.java | 82 ++++++++ .../assets/sound/SpecialSounds.java | 4 + .../entitysystem/EntitySystemManager.java | 4 + .../files/HullConfigManager.java | 4 + .../destinationsol/game/BeaconHandler.java | 4 + .../destinationsol/game/FactionManager.java | 4 + .../org/destinationsol/game/GalaxyFiller.java | 4 + .../org/destinationsol/game/GameColors.java | 4 + .../org/destinationsol/game/GridDrawer.java | 9 + .../org/destinationsol/game/MapDrawer.java | 4 + .../game/MountDetectDrawer.java | 6 + .../destinationsol/game/RubbleBuilder.java | 4 + .../game/SolContactListener.java | 9 +- .../java/org/destinationsol/game/SolGame.java | 184 +++++++++++------- .../org/destinationsol/game/StarPort.java | 4 + .../game/asteroid/AsteroidBuilder.java | 4 + .../game/chunk/ChunkManager.java | 4 + .../game/drawables/DrawableDebugger.java | 4 + .../game/drawables/DrawableManager.java | 4 + .../game/farBg/FarBackgroundManagerOld.java | 4 + .../destinationsol/game/item/ItemManager.java | 4 + .../destinationsol/game/item/LootBuilder.java | 4 + .../game/particle/EffectTypes.java | 5 + .../destinationsol/game/particle/PartMan.java | 5 + .../game/particle/SpecialEffects.java | 4 + .../game/planet/PlanetManager.java | 4 + .../destinationsol/game/ship/ShipBuilder.java | 4 + .../destinationsol/ui/TutorialManager.java | 2 + 31 files changed, 358 insertions(+), 131 deletions(-) create mode 100644 engine/src/main/java/org/destinationsol/SolGameServiceRegistry.java diff --git a/engine/src/main/java/org/destinationsol/ContextWrapperService.java b/engine/src/main/java/org/destinationsol/ContextWrapperService.java index 86cbd75f9..b0ecb0ae1 100644 --- a/engine/src/main/java/org/destinationsol/ContextWrapperService.java +++ b/engine/src/main/java/org/destinationsol/ContextWrapperService.java @@ -22,8 +22,6 @@ public class ContextWrapperService extends ServiceRegistry { public ContextWrapperService() { - this.with(Context.class) - .lifetime(Lifetime.Singleton) - .use(ContextWrapper.class); + this.with(Context.class).use(ContextWrapper.class).lifetime(Lifetime.Singleton); } } diff --git a/engine/src/main/java/org/destinationsol/CoreService.java b/engine/src/main/java/org/destinationsol/CoreService.java index e9c0a8e74..9945ec6a8 100644 --- a/engine/src/main/java/org/destinationsol/CoreService.java +++ b/engine/src/main/java/org/destinationsol/CoreService.java @@ -7,7 +7,6 @@ import org.destinationsol.assets.sound.OggSoundManager; import org.destinationsol.entitysystem.ComponentSystemManager; import org.destinationsol.game.DebugOptions; -import org.destinationsol.game.context.Context; import org.destinationsol.modules.ModuleManager; import org.destinationsol.ui.DisplayDimensions; import org.destinationsol.ui.SolInputManager; @@ -43,7 +42,6 @@ public CoreService(SolApplication application, ModuleManager moduleManager) { this.with(DisplayDimensions.class).lifetime(Lifetime.Singleton).use(() -> new DisplayDimensions(Gdx.graphics.getWidth(), Gdx.graphics.getHeight())); this.with(UiDrawer.class).lifetime(Lifetime.Singleton); - this.with(Context.class).use(ContextWrapper.class).lifetime(Lifetime.Singleton); this.with(SolLayouts.class); } } diff --git a/engine/src/main/java/org/destinationsol/SolApplication.java b/engine/src/main/java/org/destinationsol/SolApplication.java index 2d847b7bc..568209135 100644 --- a/engine/src/main/java/org/destinationsol/SolApplication.java +++ b/engine/src/main/java/org/destinationsol/SolApplication.java @@ -31,32 +31,29 @@ import org.destinationsol.common.SolColor; import org.destinationsol.common.SolMath; import org.destinationsol.common.SolRandom; +import org.destinationsol.entitysystem.ComponentSystemManager; +import org.destinationsol.entitysystem.EntitySystemManager; +import org.destinationsol.entitysystem.SerialisationManager; import org.destinationsol.game.DebugOptions; -import org.destinationsol.game.ObjectManager; import org.destinationsol.game.SaveManager; import org.destinationsol.game.SolGame; import org.destinationsol.game.SolNames; import org.destinationsol.game.WorldConfig; +import org.destinationsol.game.console.adapter.ParameterAdapterManager; +import org.destinationsol.game.context.Context; +import org.destinationsol.game.context.internal.ContextImpl; import org.destinationsol.game.drawables.DrawableLevel; import org.destinationsol.health.components.Health; import org.destinationsol.location.components.Angle; +import org.destinationsol.location.components.Position; import org.destinationsol.location.components.Velocity; +import org.destinationsol.menu.MenuScreens; +import org.destinationsol.menu.background.MenuBackgroundManager; +import org.destinationsol.modules.ModuleManager; import org.destinationsol.moneyDropping.components.DropsMoneyOnDestruction; import org.destinationsol.rendering.RenderableElement; import org.destinationsol.rendering.components.Renderable; import org.destinationsol.rendering.events.RenderEvent; -import org.destinationsol.entitysystem.ComponentSystemManager; -import org.destinationsol.entitysystem.EntitySystemManager; -import org.destinationsol.entitysystem.SerialisationManager; -import org.destinationsol.game.console.adapter.ParameterAdapterManager; -import org.destinationsol.game.context.Context; -import org.destinationsol.game.context.internal.ContextImpl; -import org.destinationsol.game.item.ItemManager; -import org.destinationsol.game.item.LootBuilder; -import org.destinationsol.location.components.Position; -import org.destinationsol.menu.MenuScreens; -import org.destinationsol.menu.background.MenuBackgroundManager; -import org.destinationsol.modules.ModuleManager; import org.destinationsol.rubble.components.CreatesRubbleOnDestruction; import org.destinationsol.size.components.Size; import org.destinationsol.ui.DebugCollector; @@ -68,7 +65,6 @@ import org.destinationsol.ui.UiDrawer; import org.destinationsol.ui.nui.NUIManager; import org.destinationsol.util.FramerateLimiter; -import org.destinationsol.util.InjectionHelper; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.terasology.context.annotation.API; @@ -104,22 +100,26 @@ public class SolApplication implements ApplicationListener { protected OggSoundManager soundManager; @Inject protected SolInputManager inputManager; + @Inject + protected UiDrawer uiDrawer; + @Inject + protected CommonDrawer commonDrawer; + @Inject + protected SolLayouts layouts; private MenuBackgroundManager menuBackgroundManager; - private UiDrawer uiDrawer; private FactionDisplay factionDisplay; private MenuScreens menuScreens; - private SolLayouts layouts; private GameOptions options; - private CommonDrawer commonDrawer; private String fatalErrorMsg; private String fatalErrorTrace; private SolGame solGame; private ParameterAdapterManager parameterAdapterManager; private NUIManager nuiManager; - private Context context; +// private Context context; + // TODO: Make this non-static. public static DisplayDimensions displayDimensions; @@ -128,7 +128,8 @@ public class SolApplication implements ApplicationListener { private ComponentManager componentManager; - private BeanContext beanContext; + private BeanContext appContext; + private BeanContext gameContext; // TODO: Make this non-static. private static Set resizeSubscribers; @@ -144,41 +145,35 @@ public SolApplication(ModuleManager moduleManager, float targetFPS) { this.targetFPS = targetFPS; resizeSubscribers = new HashSet<>(); - this.beanContext = new DefaultBeanContext(new CoreService(this, moduleManager)); + this.appContext = new DefaultBeanContext( + new CoreService(this, moduleManager), + new ContextWrapperService()); } @Override public void create() { - context = new ContextImpl(); - context.put(SolApplication.class, this); - context.put(ModuleManager.class, moduleManager); +// context = new ContextImpl(); +// context.put(SolApplication.class, this); +// context.put(ModuleManager.class, moduleManager); isMobile = Gdx.app.getType() == Application.ApplicationType.Android || Gdx.app.getType() == Application.ApplicationType.iOS; if (isMobile) { DebugOptions.read(null); } options = new GameOptions(isMobile(), null); - componentManager = beanContext.getBean(ComponentManager.class); - AssetHelper helper = beanContext.getBean(AssetHelper.class); + componentManager = appContext.getBean(ComponentManager.class); + AssetHelper helper = appContext.getBean(AssetHelper.class); helper.init(moduleManager.getEnvironment(), componentManager, isMobile); Assets.initialize(helper); - context.put(ComponentSystemManager.class, beanContext.getBean(ComponentSystemManager.class)); +// context.put(ComponentSystemManager.class, appContext.getBean(ComponentSystemManager.class)); logger.info("\n\n ------------------------------------------------------------ \n"); moduleManager.printAvailableModules(); - beanContext.inject(this); - -// musicManager = beanContext.getBean(OggMusicManager.class); -// soundManager = beanContext.getBean(OggSoundManager.class); -// inputManager = beanContext.getBean(SolInputManager.class); + appContext.inject(this); musicManager.playMusic(OggMusicManager.MENU_MUSIC_SET, options); - - displayDimensions = beanContext.getBean(DisplayDimensions.class); - commonDrawer = beanContext.getBean(CommonDrawer.class); - uiDrawer = beanContext.getBean(UiDrawer.class); - layouts = beanContext.getBean(SolLayouts.class); + displayDimensions = appContext.getBean(DisplayDimensions.class); menuBackgroundManager = new MenuBackgroundManager(displayDimensions); menuScreens = new MenuScreens(layouts, isMobile(), options); @@ -186,7 +181,7 @@ public void create() { inputManager.setScreen(this, menuScreens.main); parameterAdapterManager = ParameterAdapterManager.createCore(this); - nuiManager = new NUIManager(this, context, commonDrawer, options); + nuiManager = new NUIManager(this, appContext.getBean(Context.class), commonDrawer, options); } @Override @@ -336,20 +331,25 @@ private void draw() { public void play(boolean tut, String shipName, boolean isNewGame, WorldConfig worldConfig) { - context.get(ComponentSystemManager.class).preBegin(); - solGame = new SolGame(shipName, tut, isNewGame, commonDrawer, context, worldConfig); - context.put(SolGame.class, solGame); + gameContext = appContext.getNestedContainer(new SolGameServiceRegistry(isNewGame), new ContextWrapperService()); + appContext.getBean(ComponentSystemManager.class).preBegin(); + SolGame game = gameContext.getBean(SolGame.class); + gameContext.getBean(ComponentSystemManager.class).preBegin(); + entitySystemManager = gameContext.getBean(EntitySystemManager.class); - context.put(LootBuilder.class, solGame.getLootBuilder()); - context.put(ItemManager.class, solGame.getItemMan()); - context.put(ObjectManager.class, solGame.getObjectManager()); - entitySystemManager = new EntitySystemManager(moduleManager.getEnvironment(), componentManager, context); +// solGame = new SolGame(shipName, tut, isNewGame, commonDrawer, context, worldConfig); +// context.put(SolGame.class, solGame); +// +// context.put(LootBuilder.class, solGame.getLootBuilder()); +// context.put(ItemManager.class, solGame.getItemMan()); +// context.put(ObjectManager.class, solGame.getObjectManager()); - InjectionHelper.inject(solGame.getContactListener(), context); +// entitySystemManager = new EntitySystemManager(moduleManager.getEnvironment(), componentManager, context); - solGame.createUpdateSystems(context); +// InjectionHelper.inject(solGame.getContactListener(), context); + solGame.createUpdateSystems(gameContext.getBean(Context.class)); solGame.startGame(shipName, isNewGame, worldConfig, new SolNames(), entitySystemManager); // Big, fat, ugly HACK to get a working classloader @@ -359,11 +359,11 @@ public void play(boolean tut, String shipName, boolean isNewGame, WorldConfig wo SerialisationManager serialisationManager = new SerialisationManager( SaveManager.getResourcePath("entity_store.dat"), entitySystemManager.getEntityManager(), componentClasses.hasNext() ? componentClasses.next().getClassLoader() : null); - context.put(SerialisationManager.class, serialisationManager); +// context.put(SerialisationManager.class, serialisationManager); // TODO: add a way to add singleton bean to the live context if (!isNewGame) { try { - context.get(SerialisationManager.class).deserialise(); +// context.get(SerialisationManager.class).deserialise(); } catch (Exception e) { e.printStackTrace(); } @@ -385,7 +385,7 @@ public void dispose() { commonDrawer.dispose(); if (solGame != null) { - solGame.onGameEnd(context); + solGame.onGameEnd(gameContext.getBean(Context.class)); } inputManager.dispose(); @@ -404,9 +404,10 @@ public SolLayouts getLayouts() { } public void finishGame() { - solGame.onGameEnd(context); + solGame.onGameEnd(gameContext.getBean(Context.class)); solGame = null; inputManager.setScreen(this, menuScreens.main); + } public boolean isMobile() { diff --git a/engine/src/main/java/org/destinationsol/SolGameServiceRegistry.java b/engine/src/main/java/org/destinationsol/SolGameServiceRegistry.java new file mode 100644 index 000000000..f47ef9e84 --- /dev/null +++ b/engine/src/main/java/org/destinationsol/SolGameServiceRegistry.java @@ -0,0 +1,82 @@ +/* + * Copyright 2020 The Terasology Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.destinationsol; + +import org.destinationsol.assets.sound.SpecialSounds; +import org.destinationsol.entitysystem.EntitySystemManager; +import org.destinationsol.files.HullConfigManager; +import org.destinationsol.game.BeaconHandler; +import org.destinationsol.game.FactionManager; +import org.destinationsol.game.GalaxyFiller; +import org.destinationsol.game.GameColors; +import org.destinationsol.game.GridDrawer; +import org.destinationsol.game.MapDrawer; +import org.destinationsol.game.MountDetectDrawer; +import org.destinationsol.game.RubbleBuilder; +import org.destinationsol.game.SolContactListener; +import org.destinationsol.game.SolGame; +import org.destinationsol.game.StarPort; +import org.destinationsol.game.asteroid.AsteroidBuilder; +import org.destinationsol.game.chunk.ChunkManager; +import org.destinationsol.game.drawables.DrawableDebugger; +import org.destinationsol.game.drawables.DrawableManager; +import org.destinationsol.game.farBg.FarBackgroundManagerOld; +import org.destinationsol.game.item.ItemManager; +import org.destinationsol.game.item.LootBuilder; +import org.destinationsol.game.particle.EffectTypes; +import org.destinationsol.game.particle.PartMan; +import org.destinationsol.game.particle.SpecialEffects; +import org.destinationsol.game.planet.PlanetManager; +import org.destinationsol.game.ship.ShipBuilder; +import org.destinationsol.ui.TutorialManager; +import org.terasology.gestalt.di.BeanContext; +import org.terasology.gestalt.di.Lifetime; +import org.terasology.gestalt.di.ServiceRegistry; + +public class SolGameServiceRegistry extends ServiceRegistry { + + public SolGameServiceRegistry(boolean isTutorial) { + this.with(SolGame.class).lifetime(Lifetime.Singleton).use(() -> new SolGame(isTutorial)); + + this.with(EntitySystemManager.class); + + this.with(DrawableManager.class).lifetime(Lifetime.Singleton); + this.with(PlanetManager.class).lifetime(Lifetime.Singleton); + this.with(ChunkManager.class).lifetime(Lifetime.Singleton); + this.with(PartMan.class).lifetime(Lifetime.Singleton); + this.with(AsteroidBuilder.class).lifetime(Lifetime.Singleton); + this.with(LootBuilder.class).lifetime(Lifetime.Singleton); + this.with(ShipBuilder.class).lifetime(Lifetime.Singleton); + this.with(HullConfigManager.class).lifetime(Lifetime.Singleton); + this.with(GridDrawer.class).lifetime(Lifetime.Singleton); + this.with(FarBackgroundManagerOld.class).lifetime(Lifetime.Singleton); + this.with(FactionManager.class).lifetime(Lifetime.Singleton); + this.with(MapDrawer.class).lifetime(Lifetime.Singleton); + this.with(RubbleBuilder.class).lifetime(Lifetime.Singleton); + this.with(ItemManager.class).lifetime(Lifetime.Singleton); + this.with(EffectTypes.class).lifetime(Lifetime.Singleton); + this.with(StarPort.Builder.class).lifetime(Lifetime.Singleton); + this.with(DrawableDebugger.class).lifetime(Lifetime.Singleton); + this.with(SpecialSounds.class).lifetime(Lifetime.Singleton); + this.with(SpecialEffects.class).lifetime(Lifetime.Singleton); + this.with(GameColors.class).lifetime(Lifetime.Singleton); + this.with(BeaconHandler.class).lifetime(Lifetime.Singleton); + this.with(MountDetectDrawer.class).lifetime(Lifetime.Singleton); + this.with(TutorialManager.class).lifetime(Lifetime.Singleton); + this.with(GalaxyFiller.class).lifetime(Lifetime.Singleton); + this.with(SolContactListener.class).lifetime(Lifetime.Singleton); + } +} diff --git a/engine/src/main/java/org/destinationsol/assets/sound/SpecialSounds.java b/engine/src/main/java/org/destinationsol/assets/sound/SpecialSounds.java index c9638d5d1..99c267390 100644 --- a/engine/src/main/java/org/destinationsol/assets/sound/SpecialSounds.java +++ b/engine/src/main/java/org/destinationsol/assets/sound/SpecialSounds.java @@ -20,9 +20,12 @@ import org.destinationsol.game.DmgType; import org.destinationsol.game.SolGame; import org.destinationsol.game.SolObject; +import org.terasology.context.annotation.Introspected; +import javax.inject.Inject; import java.util.Arrays; +@Introspected public class SpecialSounds { public final PlayableSound metalColl; @@ -46,6 +49,7 @@ public class SpecialSounds { public final PlayableSound burning; public final PlayableSound transcendentMove; + @Inject public SpecialSounds(OggSoundManager soundManager) { // OggSound metalColl = soundManager.getSound("core:metalCollision"); diff --git a/engine/src/main/java/org/destinationsol/entitysystem/EntitySystemManager.java b/engine/src/main/java/org/destinationsol/entitysystem/EntitySystemManager.java index 1b7c72786..11d9c97a7 100644 --- a/engine/src/main/java/org/destinationsol/entitysystem/EntitySystemManager.java +++ b/engine/src/main/java/org/destinationsol/entitysystem/EntitySystemManager.java @@ -18,6 +18,7 @@ import com.google.common.collect.Lists; import org.destinationsol.game.context.Context; import org.destinationsol.util.InjectionHelper; +import org.terasology.context.annotation.Introspected; import org.terasology.gestalt.entitysystem.component.Component; import org.terasology.gestalt.entitysystem.component.management.ComponentManager; import org.terasology.gestalt.entitysystem.component.store.ArrayComponentStore; @@ -34,15 +35,18 @@ import org.terasology.gestalt.entitysystem.prefab.GeneratedFromRecipeComponent; import org.terasology.gestalt.module.ModuleEnvironment; +import javax.inject.Inject; import java.lang.reflect.Modifier; import java.util.List; +@Introspected public class EntitySystemManager { private static EntityManager entityManager; private final EventSystem eventSystem = new EventSystemImpl(); private static final EventReceiverMethodSupport eventReceiverMethodSupport = new EventReceiverMethodSupport(); + @Inject public EntitySystemManager(ModuleEnvironment environment, ComponentManager componentManager, Context context) { context.put(EntitySystemManager.class, this); diff --git a/engine/src/main/java/org/destinationsol/files/HullConfigManager.java b/engine/src/main/java/org/destinationsol/files/HullConfigManager.java index e37acc4f4..992154c9e 100644 --- a/engine/src/main/java/org/destinationsol/files/HullConfigManager.java +++ b/engine/src/main/java/org/destinationsol/files/HullConfigManager.java @@ -30,7 +30,9 @@ import org.destinationsol.modules.ModuleManager; import org.json.JSONArray; import org.json.JSONObject; +import org.terasology.context.annotation.Introspected; +import javax.inject.Inject; import java.lang.reflect.Method; import java.util.ArrayList; import java.util.HashMap; @@ -38,6 +40,7 @@ import java.util.Locale; import java.util.Map; +@Introspected public final class HullConfigManager { private final ItemManager itemManager; private final AbilityCommonConfigs abilityCommonConfigs; @@ -57,6 +60,7 @@ public final class HullConfigManager { } } + @Inject public HullConfigManager(ItemManager itemManager, AbilityCommonConfigs abilityCommonConfigs) { this.itemManager = itemManager; this.abilityCommonConfigs = abilityCommonConfigs; diff --git a/engine/src/main/java/org/destinationsol/game/BeaconHandler.java b/engine/src/main/java/org/destinationsol/game/BeaconHandler.java index f14bb16ae..a196bb077 100644 --- a/engine/src/main/java/org/destinationsol/game/BeaconHandler.java +++ b/engine/src/main/java/org/destinationsol/game/BeaconHandler.java @@ -30,10 +30,13 @@ import org.destinationsol.game.planet.PlanetBind; import org.destinationsol.game.ship.FarShip; import org.destinationsol.game.ship.SolShip; +import org.terasology.context.annotation.Introspected; +import javax.inject.Inject; import java.util.ArrayList; import java.util.List; +@Introspected public class BeaconHandler implements UpdateAwareSystem { private static final float TEX_SZ = .5f; private static final float ROT_SPD = 30f; @@ -57,6 +60,7 @@ public class BeaconHandler implements UpdateAwareSystem { private Vector2 velocity; private boolean isInitialized; + @Inject public BeaconHandler() { attackSprite = SpriteManager.createSprite(ATTACK_SPRITE_NAME, TEX_SZ, 0, 0, new Vector2(), DrawableLevel.PART_FG_0, 0, ROT_SPD, new Color(1, 1, 1, 0), true); followSprite = SpriteManager.createSprite(FOLLOW_SPRITE_NAME, TEX_SZ, 0, 0, new Vector2(), DrawableLevel.PART_FG_0, 0, ROT_SPD, new Color(1, 1, 1, 0), true); diff --git a/engine/src/main/java/org/destinationsol/game/FactionManager.java b/engine/src/main/java/org/destinationsol/game/FactionManager.java index 4d4d980e7..d12549b90 100644 --- a/engine/src/main/java/org/destinationsol/game/FactionManager.java +++ b/engine/src/main/java/org/destinationsol/game/FactionManager.java @@ -21,13 +21,17 @@ import org.destinationsol.game.input.Pilot; import org.destinationsol.game.projectile.Projectile; import org.destinationsol.game.ship.SolShip; +import org.terasology.context.annotation.Introspected; +import javax.inject.Inject; import java.util.List; +@Introspected public class FactionManager { private final MyRayBack myRayBack; + @Inject public FactionManager() { myRayBack = new MyRayBack(); } diff --git a/engine/src/main/java/org/destinationsol/game/GalaxyFiller.java b/engine/src/main/java/org/destinationsol/game/GalaxyFiller.java index 8f6c2e855..39d54b2da 100644 --- a/engine/src/main/java/org/destinationsol/game/GalaxyFiller.java +++ b/engine/src/main/java/org/destinationsol/game/GalaxyFiller.java @@ -39,15 +39,19 @@ import org.destinationsol.game.ship.FarShip; import org.destinationsol.game.ship.hulls.HullConfig; import org.json.JSONObject; +import org.terasology.context.annotation.Introspected; +import javax.inject.Inject; import java.util.ArrayList; +@Introspected public class GalaxyFiller { private static final float STATION_CONSUME_SECTOR = 45f; private final HullConfigManager hullConfigManager; private Vector2 mainStationPos = new Vector2(); private HullConfig mainStationHc; + @Inject public GalaxyFiller(HullConfigManager hullConfigManager) { this.hullConfigManager = hullConfigManager; } diff --git a/engine/src/main/java/org/destinationsol/game/GameColors.java b/engine/src/main/java/org/destinationsol/game/GameColors.java index f4c533b87..7c220b52b 100644 --- a/engine/src/main/java/org/destinationsol/game/GameColors.java +++ b/engine/src/main/java/org/destinationsol/game/GameColors.java @@ -19,10 +19,13 @@ import org.destinationsol.assets.json.Validator; import org.destinationsol.common.SolColorUtil; import org.json.JSONObject; +import org.terasology.context.annotation.Introspected; +import javax.inject.Inject; import java.util.HashMap; import java.util.Map; +@Introspected public class GameColors { public final Color fire; @@ -31,6 +34,7 @@ public class GameColors { private final Map colors = new HashMap<>(); + @Inject public GameColors() { JSONObject rootNode = Validator.getValidatedJSON("core:colorsConfig", "engine:schemaColorsConfig"); diff --git a/engine/src/main/java/org/destinationsol/game/GridDrawer.java b/engine/src/main/java/org/destinationsol/game/GridDrawer.java index 4ddb11399..9d49dd4de 100644 --- a/engine/src/main/java/org/destinationsol/game/GridDrawer.java +++ b/engine/src/main/java/org/destinationsol/game/GridDrawer.java @@ -19,8 +19,17 @@ import com.badlogic.gdx.graphics.g2d.TextureAtlas; import com.badlogic.gdx.math.Vector2; import org.destinationsol.common.SolColor; +import org.terasology.context.annotation.Introspected; +import javax.inject.Inject; + +@Introspected public class GridDrawer { + @Inject + public GridDrawer() { + + } + public void draw(GameDrawer drawer, SolGame game, float gridSz, TextureAtlas.AtlasRegion tex) { SolCam cam = game.getCam(); float lw = 4 * cam.getRealLineWidth(); diff --git a/engine/src/main/java/org/destinationsol/game/MapDrawer.java b/engine/src/main/java/org/destinationsol/game/MapDrawer.java index 192de3941..5526ce7bf 100644 --- a/engine/src/main/java/org/destinationsol/game/MapDrawer.java +++ b/engine/src/main/java/org/destinationsol/game/MapDrawer.java @@ -42,10 +42,13 @@ import org.destinationsol.ui.DisplayDimensions; import org.destinationsol.ui.UiDrawer; import org.destinationsol.ui.Waypoint; +import org.terasology.context.annotation.Introspected; +import javax.inject.Inject; import java.util.ArrayList; import java.util.List; +@Introspected public class MapDrawer implements UpdateAwareSystem{ public static final float MIN_ZOOM = 8f; private static final float MUL_FACTOR = 2f; @@ -86,6 +89,7 @@ public class MapDrawer implements UpdateAwareSystem{ private final Vector2 mapDrawPositionAdditive = new Vector2(); + @Inject MapDrawer() { DisplayDimensions displayDimensions = SolApplication.displayDimensions; diff --git a/engine/src/main/java/org/destinationsol/game/MountDetectDrawer.java b/engine/src/main/java/org/destinationsol/game/MountDetectDrawer.java index 8d189ce14..810964a7d 100644 --- a/engine/src/main/java/org/destinationsol/game/MountDetectDrawer.java +++ b/engine/src/main/java/org/destinationsol/game/MountDetectDrawer.java @@ -18,9 +18,14 @@ import com.badlogic.gdx.graphics.g2d.TextureAtlas; import com.badlogic.gdx.math.Vector2; import org.destinationsol.assets.Assets; +import org.destinationsol.common.In; import org.destinationsol.common.SolColor; import org.destinationsol.game.ship.SolShip; +import org.terasology.context.annotation.Introspected; +import javax.inject.Inject; + +@Introspected public class MountDetectDrawer implements UpdateAwareSystem { private final Vector2 myNePos; private final TextureAtlas.AtlasRegion myTexture; @@ -30,6 +35,7 @@ public class MountDetectDrawer implements UpdateAwareSystem { private float myAnimPercentage; private float myAngle; + @Inject public MountDetectDrawer() { myNePos = new Vector2(); myTexture = Assets.getAtlasRegion("engine:targetDetected"); diff --git a/engine/src/main/java/org/destinationsol/game/RubbleBuilder.java b/engine/src/main/java/org/destinationsol/game/RubbleBuilder.java index 8c5fb04b1..1932f61a0 100644 --- a/engine/src/main/java/org/destinationsol/game/RubbleBuilder.java +++ b/engine/src/main/java/org/destinationsol/game/RubbleBuilder.java @@ -25,10 +25,13 @@ import org.destinationsol.game.drawables.Drawable; import org.destinationsol.game.drawables.DrawableLevel; import org.destinationsol.game.ship.ShipBuilder; +import org.terasology.context.annotation.Introspected; +import javax.inject.Inject; import java.util.ArrayList; import java.util.List; +@Introspected public class RubbleBuilder { public static final float MIN_SCALE = .07f; public static final float MAX_SCALE = .12f; @@ -38,6 +41,7 @@ public class RubbleBuilder { private final CollisionMeshLoader myCollisionMeshLoader; private final List myTextures; + @Inject public RubbleBuilder() { myCollisionMeshLoader = new CollisionMeshLoader("engine:miscCollisionMeshes"); myTextures = Assets.listTexturesMatching("engine:shard_.*"); diff --git a/engine/src/main/java/org/destinationsol/game/SolContactListener.java b/engine/src/main/java/org/destinationsol/game/SolContactListener.java index 6a4618fab..df5f32080 100644 --- a/engine/src/main/java/org/destinationsol/game/SolContactListener.java +++ b/engine/src/main/java/org/destinationsol/game/SolContactListener.java @@ -27,15 +27,20 @@ import org.destinationsol.force.events.ContactEvent; import org.destinationsol.force.events.ImpulseEvent; import org.destinationsol.game.projectile.Projectile; +import org.terasology.context.annotation.Introspected; import org.terasology.gestalt.entitysystem.entity.EntityRef; +import javax.inject.Inject; + +@Introspected public class SolContactListener implements ContactListener { - @In - private EntitySystemManager entitySystemManager; + @Inject + protected EntitySystemManager entitySystemManager; private final SolGame myGame; + @Inject public SolContactListener(SolGame game) { myGame = game; } diff --git a/engine/src/main/java/org/destinationsol/game/SolGame.java b/engine/src/main/java/org/destinationsol/game/SolGame.java index 153483357..17eb418ea 100644 --- a/engine/src/main/java/org/destinationsol/game/SolGame.java +++ b/engine/src/main/java/org/destinationsol/game/SolGame.java @@ -62,45 +62,78 @@ import org.destinationsol.ui.UiDrawer; import org.destinationsol.ui.Waypoint; import org.destinationsol.util.InjectionHelper; +import org.terasology.context.annotation.Introspected; import org.terasology.gestalt.entitysystem.entity.EntityRef; +import javax.inject.Inject; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.SortedMap; import java.util.TreeMap; +@Introspected public class SolGame { - private final GameScreens gameScreens; - private final SolCam camera; - private final ObjectManager objectManager; - private final boolean isTutorial; - private final SolApplication solApplication; - private final DrawableManager drawableManager; - private final PlanetManager planetManager; - private final ChunkManager chunkManager; - private final PartMan partMan; - private final AsteroidBuilder asteroidBuilder; - private final LootBuilder lootBuilder; - private final ShipBuilder shipBuilder; - private final HullConfigManager hullConfigManager; - private final GridDrawer gridDrawer; - private final FarBackgroundManagerOld farBackgroundManagerOld; - private final FactionManager factionManager; - private final MapDrawer mapDrawer; - private final RubbleBuilder rubbleBuilder; - private final ItemManager itemManager; - private final StarPort.Builder starPortBuilder; - private final OggSoundManager soundManager; - private final DrawableDebugger drawableDebugger; - private final SpecialSounds specialSounds; - private final SpecialEffects specialEffects; - private final GameColors gameColors; - private final BeaconHandler beaconHandler; - private final MountDetectDrawer mountDetectDrawer; - private final TutorialManager tutorialManager; - private final GalaxyFiller galaxyFiller; - private final SolContactListener contactListener; + protected boolean isTutorial; + @Inject + protected GameScreens gameScreens; + @Inject + protected SolCam camera; + @Inject + protected ObjectManager objectManager; + @Inject + protected SolApplication solApplication; + @Inject + protected DrawableManager drawableManager; + @Inject + protected PlanetManager planetManager; + @Inject + protected ChunkManager chunkManager; + @Inject + protected PartMan partMan; + @Inject + protected AsteroidBuilder asteroidBuilder; + @Inject + protected LootBuilder lootBuilder; + @Inject + protected ShipBuilder shipBuilder; + @Inject + protected HullConfigManager hullConfigManager; + @Inject + protected GridDrawer gridDrawer; + @Inject + protected FarBackgroundManagerOld farBackgroundManagerOld; + @Inject + protected FactionManager factionManager; + @Inject + protected MapDrawer mapDrawer; + @Inject + protected RubbleBuilder rubbleBuilder; + @Inject + protected ItemManager itemManager; + @Inject + protected StarPort.Builder starPortBuilder; + @Inject + protected OggSoundManager soundManager; + @Inject + protected DrawableDebugger drawableDebugger; + @Inject + protected SpecialSounds specialSounds; + @Inject + protected SpecialEffects specialEffects; + @Inject + protected GameColors gameColors; + @Inject + protected BeaconHandler beaconHandler; + @Inject + protected MountDetectDrawer mountDetectDrawer; + @Inject + protected GalaxyFiller galaxyFiller; + @Inject + protected SolContactListener contactListener; + + protected TutorialManager tutorialManager; + private Hero hero; private float timeStep; private float time; @@ -112,53 +145,56 @@ public class SolGame { private EntitySystemManager entitySystemManager; - public SolGame(String shipName, boolean isTutorial, boolean isNewGame, CommonDrawer commonDrawer, Context context, - WorldConfig worldConfig) { + public SolGame() { + this(false); + } + + public SolGame(boolean isTutorial) { // TODO: make this non-static FactionInfo.init(); - this.isTutorial = isTutorial; - solApplication = context.get(SolApplication.class); - ModuleManager moduleManager = context.get(ModuleManager.class); - GameDrawer drawer = new GameDrawer(commonDrawer); - context.put(GameDrawer.class, drawer); - gameColors = new GameColors(); - soundManager = solApplication.getSoundManager(); - specialSounds = new SpecialSounds(soundManager); - drawableManager = new DrawableManager(drawer); - camera = new SolCam(); - gameScreens = new GameScreens(solApplication, context); - if (isTutorial) { - tutorialManager = new TutorialManager(gameScreens, solApplication.isMobile(), solApplication.getOptions(), this); - context.put(TutorialManager.class, tutorialManager); - } else { - tutorialManager = null; - } - farBackgroundManagerOld = new FarBackgroundManagerOld(); - shipBuilder = new ShipBuilder(); - EffectTypes effectTypes = new EffectTypes(); - specialEffects = new SpecialEffects(effectTypes, gameColors); - itemManager = new ItemManager(soundManager, effectTypes, gameColors); - AbilityCommonConfigs abilityCommonConfigs = new AbilityCommonConfigs(effectTypes, gameColors, soundManager); - hullConfigManager = new HullConfigManager(itemManager, abilityCommonConfigs); - planetManager = new PlanetManager(hullConfigManager, gameColors, itemManager); - contactListener = new SolContactListener(this); - factionManager = new FactionManager(); - objectManager = new ObjectManager(contactListener, factionManager); - context.put(World.class, objectManager.getWorld()); - gridDrawer = new GridDrawer(); - chunkManager = new ChunkManager(); - partMan = new PartMan(); - asteroidBuilder = new AsteroidBuilder(); - lootBuilder = new LootBuilder(); - mapDrawer = new MapDrawer(); - rubbleBuilder = new RubbleBuilder(); - context.put(RubbleBuilder.class, rubbleBuilder); - galaxyFiller = new GalaxyFiller(hullConfigManager); - starPortBuilder = new StarPort.Builder(); - drawableDebugger = new DrawableDebugger(); - mountDetectDrawer = new MountDetectDrawer(); - beaconHandler = new BeaconHandler(); +// this.isTutorial = isTutorial; +// solApplication = context.get(SolApplication.class); +// ModuleManager moduleManager = context.get(ModuleManager.class); +// GameDrawer drawer = new GameDrawer(commonDrawer); +// context.put(GameDrawer.class, drawer); +// gameColors = new GameColors(); +// soundManager = solApplication.getSoundManager(); +// specialSounds = new SpecialSounds(soundManager); +// drawableManager = new DrawableManager(drawer); +// camera = new SolCam(); +// gameScreens = new GameScreens(solApplication, context); +// if (isTutorial) { +// tutorialManager = new TutorialManager(gameScreens, solApplication.isMobile(), solApplication.getOptions(), this); +// context.put(TutorialManager.class, tutorialManager); +// } else { +// tutorialManager = null; +// } +// farBackgroundManagerOld = new FarBackgroundManagerOld(); +// shipBuilder = new ShipBuilder(); +// EffectTypes effectTypes = new EffectTypes(); +// specialEffects = new SpecialEffects(effectTypes, gameColors); +// itemManager = new ItemManager(soundManager, effectTypes, gameColors); +// AbilityCommonConfigs abilityCommonConfigs = new AbilityCommonConfigs(effectTypes, gameColors, soundManager); +// hullConfigManager = new HullConfigManager(itemManager, abilityCommonConfigs); +// planetManager = new PlanetManager(hullConfigManager, gameColors, itemManager); +// contactListener = new SolContactListener(this); +// factionManager = new FactionManager(); +// objectManager = new ObjectManager(contactListener, factionManager); +// context.put(World.class, objectManager.getWorld()); +// gridDrawer = new GridDrawer(); +// chunkManager = new ChunkManager(); +// partMan = new PartMan(); +// asteroidBuilder = new AsteroidBuilder(); +// lootBuilder = new LootBuilder(); +// mapDrawer = new MapDrawer(); +// rubbleBuilder = new RubbleBuilder(); +// context.put(RubbleBuilder.class, rubbleBuilder); +// galaxyFiller = new GalaxyFiller(hullConfigManager); +// starPortBuilder = new StarPort.Builder(); +// drawableDebugger = new DrawableDebugger(); +// mountDetectDrawer = new MountDetectDrawer(); +// beaconHandler = new BeaconHandler(); timeFactor = 1; } diff --git a/engine/src/main/java/org/destinationsol/game/StarPort.java b/engine/src/main/java/org/destinationsol/game/StarPort.java index 0d602b617..05628bfde 100644 --- a/engine/src/main/java/org/destinationsol/game/StarPort.java +++ b/engine/src/main/java/org/destinationsol/game/StarPort.java @@ -37,7 +37,9 @@ import org.destinationsol.game.ship.FarShip; import org.destinationsol.game.ship.ForceBeacon; import org.destinationsol.game.ship.SolShip; +import org.terasology.context.annotation.Introspected; +import javax.inject.Inject; import java.util.ArrayList; import java.util.List; @@ -226,10 +228,12 @@ public Planet getToPlanet() { return toPlanet; } + @Introspected public static class Builder { public static final float FLOW_DIST = .26f * SIZE; private final CollisionMeshLoader myLoader; + @Inject Builder() { myLoader = new CollisionMeshLoader("engine:miscCollisionMeshes"); } diff --git a/engine/src/main/java/org/destinationsol/game/asteroid/AsteroidBuilder.java b/engine/src/main/java/org/destinationsol/game/asteroid/AsteroidBuilder.java index 304ec7af4..99a916c32 100644 --- a/engine/src/main/java/org/destinationsol/game/asteroid/AsteroidBuilder.java +++ b/engine/src/main/java/org/destinationsol/game/asteroid/AsteroidBuilder.java @@ -33,10 +33,13 @@ import org.destinationsol.game.drawables.DrawableLevel; import org.destinationsol.game.drawables.RectSprite; import org.destinationsol.game.drawables.SpriteManager; +import org.terasology.context.annotation.Introspected; +import javax.inject.Inject; import java.util.ArrayList; import java.util.List; +@Introspected public class AsteroidBuilder { private static final float DENSITY = 10f; private static final float MAX_A_ROT_SPD = .5f; @@ -44,6 +47,7 @@ public class AsteroidBuilder { private final CollisionMeshLoader collisionMeshLoader; private final List textures; + @Inject public AsteroidBuilder() { collisionMeshLoader = new CollisionMeshLoader("engine:asteroids"); textures = Assets.listTexturesMatching("engine:asteroid_.*"); diff --git a/engine/src/main/java/org/destinationsol/game/chunk/ChunkManager.java b/engine/src/main/java/org/destinationsol/game/chunk/ChunkManager.java index e28fed8a2..9734f94b1 100644 --- a/engine/src/main/java/org/destinationsol/game/chunk/ChunkManager.java +++ b/engine/src/main/java/org/destinationsol/game/chunk/ChunkManager.java @@ -22,10 +22,13 @@ import org.destinationsol.game.RemoveController; import org.destinationsol.game.SolGame; import org.destinationsol.game.UpdateAwareSystem; +import org.terasology.context.annotation.Introspected; +import javax.inject.Inject; import java.util.HashSet; import java.util.Set; +@Introspected public class ChunkManager implements UpdateAwareSystem { private static final int MAX_FILL_DIST = 1; private static final int MIN_REMOVE_DIST = MAX_FILL_DIST + 2; @@ -41,6 +44,7 @@ public class ChunkManager implements UpdateAwareSystem { private int x; private int y; + @Inject public ChunkManager() { filledChunks = new HashSet<>(); backgroundFilledChunks = new HashSet<>(); diff --git a/engine/src/main/java/org/destinationsol/game/drawables/DrawableDebugger.java b/engine/src/main/java/org/destinationsol/game/drawables/DrawableDebugger.java index b4e9f2100..78e61b5f0 100644 --- a/engine/src/main/java/org/destinationsol/game/drawables/DrawableDebugger.java +++ b/engine/src/main/java/org/destinationsol/game/drawables/DrawableDebugger.java @@ -25,15 +25,19 @@ import org.destinationsol.game.UpdateAwareSystem; import org.destinationsol.ui.FontSize; import org.destinationsol.ui.UiDrawer; +import org.terasology.context.annotation.Introspected; +import javax.inject.Inject; import java.util.HashSet; import java.util.Set; +@Introspected public class DrawableDebugger implements UpdateAwareSystem { private static final float TEX_SZ = 0.1f; private static final float GAP = 0.01f; private final Set textures; + @Inject public DrawableDebugger() { textures = new HashSet<>(); } diff --git a/engine/src/main/java/org/destinationsol/game/drawables/DrawableManager.java b/engine/src/main/java/org/destinationsol/game/drawables/DrawableManager.java index 57b125c46..33f29c86e 100644 --- a/engine/src/main/java/org/destinationsol/game/drawables/DrawableManager.java +++ b/engine/src/main/java/org/destinationsol/game/drawables/DrawableManager.java @@ -30,19 +30,23 @@ import org.destinationsol.game.SolCam; import org.destinationsol.game.SolGame; import org.destinationsol.game.SolObject; +import org.terasology.context.annotation.Introspected; +import javax.inject.Inject; import java.util.ArrayList; import java.util.Collection; import java.util.HashSet; import java.util.List; import java.util.Set; +@Introspected public class DrawableManager { private final DrawableLevel[] drawableLevels; private final ArrayList>> drawables; private final Set visibleDrawables = new HashSet<>(); private final GameDrawer drawer; + @Inject public DrawableManager(GameDrawer drawer) { drawableLevels = DrawableLevel.values(); this.drawer = drawer; diff --git a/engine/src/main/java/org/destinationsol/game/farBg/FarBackgroundManagerOld.java b/engine/src/main/java/org/destinationsol/game/farBg/FarBackgroundManagerOld.java index 7fbb2521a..1826b0693 100644 --- a/engine/src/main/java/org/destinationsol/game/farBg/FarBackgroundManagerOld.java +++ b/engine/src/main/java/org/destinationsol/game/farBg/FarBackgroundManagerOld.java @@ -29,15 +29,19 @@ import org.destinationsol.game.SolCam; import org.destinationsol.game.SolGame; import org.destinationsol.game.planet.Planet; +import org.terasology.context.annotation.Introspected; +import javax.inject.Inject; import java.util.ArrayList; +@Introspected public class FarBackgroundManagerOld { private final TextureAtlas.AtlasRegion nebulaTexture; private final ArrayList stars = new ArrayList<>(); private final float nebulaAngle; private final Color nebulaTint; + @Inject public FarBackgroundManagerOld() { nebulaTexture = Assets.getAtlasRegion("engine:farBgNebulae"); if (SolRandom.test(.5f)) { diff --git a/engine/src/main/java/org/destinationsol/game/item/ItemManager.java b/engine/src/main/java/org/destinationsol/game/item/ItemManager.java index 35388b6ff..be5363a2d 100644 --- a/engine/src/main/java/org/destinationsol/game/item/ItemManager.java +++ b/engine/src/main/java/org/destinationsol/game/item/ItemManager.java @@ -23,11 +23,14 @@ import org.destinationsol.game.GameColors; import org.destinationsol.game.particle.EffectTypes; import org.destinationsol.game.projectile.ProjectileConfigs; +import org.terasology.context.annotation.Introspected; +import javax.inject.Inject; import java.util.ArrayList; import java.util.HashMap; import java.util.List; +@Introspected public class ItemManager { public final ProjectileConfigs projConfigs; public final TextureAtlas.AtlasRegion moneyIcon; @@ -44,6 +47,7 @@ public class ItemManager { private final EffectTypes effectTypes; private final GameColors gameColors; + @Inject public ItemManager(OggSoundManager soundManager, EffectTypes effectTypes, GameColors gameColors) { this.soundManager = soundManager; this.effectTypes = effectTypes; diff --git a/engine/src/main/java/org/destinationsol/game/item/LootBuilder.java b/engine/src/main/java/org/destinationsol/game/item/LootBuilder.java index e04a2ddf1..7dab538dc 100644 --- a/engine/src/main/java/org/destinationsol/game/item/LootBuilder.java +++ b/engine/src/main/java/org/destinationsol/game/item/LootBuilder.java @@ -30,12 +30,16 @@ import org.destinationsol.game.drawables.SpriteManager; import org.destinationsol.game.particle.LightSource; import org.destinationsol.game.ship.SolShip; +import org.terasology.context.annotation.Introspected; +import javax.inject.Inject; import java.util.ArrayList; import java.util.List; +@Introspected public class LootBuilder { + @Inject public LootBuilder() { } diff --git a/engine/src/main/java/org/destinationsol/game/particle/EffectTypes.java b/engine/src/main/java/org/destinationsol/game/particle/EffectTypes.java index 4bfda9b8a..87a17c1cf 100644 --- a/engine/src/main/java/org/destinationsol/game/particle/EffectTypes.java +++ b/engine/src/main/java/org/destinationsol/game/particle/EffectTypes.java @@ -15,12 +15,17 @@ */ package org.destinationsol.game.particle; +import org.terasology.context.annotation.Introspected; + +import javax.inject.Inject; import java.util.HashMap; import java.util.Map; +@Introspected public class EffectTypes { private final Map types; + @Inject public EffectTypes() { types = new HashMap<>(); } diff --git a/engine/src/main/java/org/destinationsol/game/particle/PartMan.java b/engine/src/main/java/org/destinationsol/game/particle/PartMan.java index af120895c..921983b93 100644 --- a/engine/src/main/java/org/destinationsol/game/particle/PartMan.java +++ b/engine/src/main/java/org/destinationsol/game/particle/PartMan.java @@ -17,6 +17,7 @@ import com.badlogic.gdx.graphics.g2d.TextureAtlas; import com.badlogic.gdx.math.Vector2; +import org.destinationsol.common.In; import org.destinationsol.common.SolColor; import org.destinationsol.common.SolMath; import org.destinationsol.common.SolRandom; @@ -29,14 +30,18 @@ import org.destinationsol.game.item.Shield; import org.destinationsol.game.ship.SolShip; import org.destinationsol.game.ship.hulls.Hull; +import org.terasology.context.annotation.Introspected; +import javax.inject.Inject; import java.util.ArrayList; +@Introspected public class PartMan { public static final float EXPL_LIGHT_MAX_SZ = .4f; public static final float EXPL_LIGHT_MAX_FADE_TIME = .8f; public static final float SZ_TO_BLINK_COUNT = 18f; + @Inject public PartMan() { } diff --git a/engine/src/main/java/org/destinationsol/game/particle/SpecialEffects.java b/engine/src/main/java/org/destinationsol/game/particle/SpecialEffects.java index 2fba24887..9663ffa15 100644 --- a/engine/src/main/java/org/destinationsol/game/particle/SpecialEffects.java +++ b/engine/src/main/java/org/destinationsol/game/particle/SpecialEffects.java @@ -21,10 +21,13 @@ import org.destinationsol.game.SolGame; import org.destinationsol.game.drawables.DrawableLevel; import org.json.JSONObject; +import org.terasology.context.annotation.Introspected; +import javax.inject.Inject; import java.util.ArrayList; import java.util.List; +@Introspected public class SpecialEffects { public final EffectConfig starPortFlow; @@ -37,6 +40,7 @@ public class SpecialEffects { private final EffectConfig asteroidDust; private final EffectConfig forceBeacon; + @Inject public SpecialEffects(EffectTypes effectTypes, GameColors colours) { JSONObject rootNode = Validator.getValidatedJSON("core:specialEffectsConfig", "engine:schemaSpecialEffectsConfig"); diff --git a/engine/src/main/java/org/destinationsol/game/planet/PlanetManager.java b/engine/src/main/java/org/destinationsol/game/planet/PlanetManager.java index f416da09d..2da0c6024 100644 --- a/engine/src/main/java/org/destinationsol/game/planet/PlanetManager.java +++ b/engine/src/main/java/org/destinationsol/game/planet/PlanetManager.java @@ -36,10 +36,13 @@ import org.destinationsol.game.ship.SolShip; import org.destinationsol.game.ship.hulls.Hull; import org.destinationsol.game.ship.hulls.HullConfig; +import org.terasology.context.annotation.Introspected; +import javax.inject.Inject; import java.util.ArrayList; import java.util.List; +@Introspected public class PlanetManager implements UpdateAwareSystem { private final ArrayList systems; private final ArrayList planets; @@ -53,6 +56,7 @@ public class PlanetManager implements UpdateAwareSystem { private final PlanetCoreSingleton planetCoreSingleton; private Planet nearestPlanet; + @Inject public PlanetManager(HullConfigManager hullConfigs, GameColors cols, ItemManager itemManager) { planetConfigs = new PlanetConfigs(hullConfigs, cols, itemManager); diff --git a/engine/src/main/java/org/destinationsol/game/ship/ShipBuilder.java b/engine/src/main/java/org/destinationsol/game/ship/ShipBuilder.java index 8a5969b7d..bfc8b8b02 100644 --- a/engine/src/main/java/org/destinationsol/game/ship/ShipBuilder.java +++ b/engine/src/main/java/org/destinationsol/game/ship/ShipBuilder.java @@ -55,10 +55,13 @@ import org.destinationsol.game.ship.hulls.Hull; import org.destinationsol.game.ship.hulls.HullConfig; import org.json.JSONObject; +import org.terasology.context.annotation.Introspected; +import javax.inject.Inject; import java.util.ArrayList; import java.util.List; +@Introspected public class ShipBuilder { public static final float SHIP_DENSITY = 3f; public static final float AVG_BATTLE_TIME = 30f; @@ -66,6 +69,7 @@ public class ShipBuilder { private final CollisionMeshLoader myCollisionMeshLoader; + @Inject public ShipBuilder() { myCollisionMeshLoader = new CollisionMeshLoader(); } diff --git a/engine/src/main/java/org/destinationsol/ui/TutorialManager.java b/engine/src/main/java/org/destinationsol/ui/TutorialManager.java index 8e3548811..d6e0b99ca 100644 --- a/engine/src/main/java/org/destinationsol/ui/TutorialManager.java +++ b/engine/src/main/java/org/destinationsol/ui/TutorialManager.java @@ -27,7 +27,9 @@ import org.destinationsol.game.screens.MainGameScreen; import org.destinationsol.game.screens.ShipKbControl; import org.destinationsol.game.screens.ShipMixedControl; +import org.terasology.context.annotation.Introspected; +import javax.inject.Inject; import java.util.ArrayList; import java.util.List; From 3729443f6b2cc67728ed00cb0b2ee0c8c7b1b8d9 Mon Sep 17 00:00:00 2001 From: DarkWeird Date: Tue, 2 Mar 2021 16:20:51 +0300 Subject: [PATCH 04/38] fix(DI): resolve Circular reference between `OggSoundManager` and `SolApplication` with `Provider` --- .../destinationsol/assets/sound/OggSoundManager.java | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/engine/src/main/java/org/destinationsol/assets/sound/OggSoundManager.java b/engine/src/main/java/org/destinationsol/assets/sound/OggSoundManager.java index f9e7538f2..3186250ca 100644 --- a/engine/src/main/java/org/destinationsol/assets/sound/OggSoundManager.java +++ b/engine/src/main/java/org/destinationsol/assets/sound/OggSoundManager.java @@ -29,12 +29,12 @@ import org.destinationsol.game.SolGame; import org.destinationsol.game.SolObject; import org.destinationsol.game.UpdateAwareSystem; -import org.destinationsol.game.context.Context; import org.destinationsol.game.planet.Planet; import org.destinationsol.game.sound.DebugHintDrawer; import org.terasology.context.annotation.Introspected; import javax.inject.Inject; +import javax.inject.Provider; import java.util.HashMap; import java.util.Map; @@ -84,16 +84,15 @@ public class OggSoundManager implements UpdateAwareSystem { * "Do the operations now". */ private float myLoopAwait; - private final SolApplication solApplication; + private final Provider applicationProvider; @Inject - public OggSoundManager(Context context) { + public OggSoundManager(Provider applicationProvider) { soundMap = new HashMap<>(); loopedSoundMap = new HashMap<>(); debugHintDrawer = new DebugHintDrawer(); - solApplication = context.get(SolApplication.class); - + this.applicationProvider = applicationProvider; } /** @@ -205,7 +204,7 @@ public void play(SolGame game, PlayableSound playableSound, @Nullable Vector2 po * @return Volume the sound should play at. */ private float getVolume(SolGame game, Vector2 position, float volumeMultiplier, OggSound sound) { - float globalVolumeMultiplier = solApplication.getOptions().sfxVolume.getVolume(); + float globalVolumeMultiplier = applicationProvider.get().getOptions().sfxVolume.getVolume(); Vector2 cameraPosition = game.getCam().getPosition(); Planet nearestPlanet = game.getPlanetManager().getNearestPlanet(); From c38a3c92c0d705b13a10d3416fe0733c5917a519 Mon Sep 17 00:00:00 2001 From: DarkWeird Date: Wed, 3 Mar 2021 15:53:22 +0300 Subject: [PATCH 05/38] fix(DI): inject `DisplayDimensions` in some classes. main menu works. --- .../java/org/destinationsol/CommonDrawer.java | 7 +++-- .../java/org/destinationsol/CoreService.java | 5 +++ .../game/screens/RightPaneLayout.java | 10 +++--- .../org/destinationsol/menu/MenuLayout.java | 9 ++++-- .../java/org/destinationsol/ui/Position.java | 8 ++--- .../org/destinationsol/ui/SolLayouts.java | 6 ++-- .../java/org/destinationsol/ui/UiDrawer.java | 31 ++++++++++--------- 7 files changed, 44 insertions(+), 32 deletions(-) diff --git a/engine/src/main/java/org/destinationsol/CommonDrawer.java b/engine/src/main/java/org/destinationsol/CommonDrawer.java index 244326ea6..2bcf27c3a 100644 --- a/engine/src/main/java/org/destinationsol/CommonDrawer.java +++ b/engine/src/main/java/org/destinationsol/CommonDrawer.java @@ -35,6 +35,8 @@ import org.destinationsol.ui.UiDrawer; import org.terasology.context.annotation.Introspected; +import javax.inject.Inject; + @Introspected public class CommonDrawer implements ResizeSubscriber { private final SpriteBatch spriteBatch; @@ -46,8 +48,9 @@ public class CommonDrawer implements ResizeSubscriber { private DisplayDimensions displayDimensions; - CommonDrawer() { - displayDimensions = SolApplication.displayDimensions; + @Inject + CommonDrawer(DisplayDimensions displayDimensions) { + this.displayDimensions = displayDimensions; spriteBatch = new SpriteBatch(); diff --git a/engine/src/main/java/org/destinationsol/CoreService.java b/engine/src/main/java/org/destinationsol/CoreService.java index 9945ec6a8..727f1cf2a 100644 --- a/engine/src/main/java/org/destinationsol/CoreService.java +++ b/engine/src/main/java/org/destinationsol/CoreService.java @@ -7,6 +7,8 @@ import org.destinationsol.assets.sound.OggSoundManager; import org.destinationsol.entitysystem.ComponentSystemManager; import org.destinationsol.game.DebugOptions; +import org.destinationsol.game.screens.RightPaneLayout; +import org.destinationsol.menu.MenuLayout; import org.destinationsol.modules.ModuleManager; import org.destinationsol.ui.DisplayDimensions; import org.destinationsol.ui.SolInputManager; @@ -14,6 +16,7 @@ import org.destinationsol.ui.UiDrawer; import org.terasology.gestalt.di.Lifetime; import org.terasology.gestalt.di.ServiceRegistry; +import org.terasology.gestalt.di.scanners.StandardScanner; import org.terasology.gestalt.entitysystem.component.management.ComponentManager; import org.terasology.gestalt.module.ModuleEnvironment; @@ -43,5 +46,7 @@ public CoreService(SolApplication application, ModuleManager moduleManager) { this.with(UiDrawer.class).lifetime(Lifetime.Singleton); this.with(SolLayouts.class); + this.with(RightPaneLayout.class); + this.with(MenuLayout.class); } } diff --git a/engine/src/main/java/org/destinationsol/game/screens/RightPaneLayout.java b/engine/src/main/java/org/destinationsol/game/screens/RightPaneLayout.java index fd8f1addc..de0c88fc1 100644 --- a/engine/src/main/java/org/destinationsol/game/screens/RightPaneLayout.java +++ b/engine/src/main/java/org/destinationsol/game/screens/RightPaneLayout.java @@ -16,9 +16,12 @@ package org.destinationsol.game.screens; import com.badlogic.gdx.math.Rectangle; -import org.destinationsol.SolApplication; import org.destinationsol.ui.DisplayDimensions; +import org.terasology.context.annotation.Introspected; +import javax.inject.Inject; + +@Introspected public class RightPaneLayout { private final float btnH; private final float btnW; @@ -26,9 +29,8 @@ public class RightPaneLayout { private final float rowH; private final float col0; - public RightPaneLayout() { - DisplayDimensions displayDimensions = SolApplication.displayDimensions; - + @Inject + public RightPaneLayout(DisplayDimensions displayDimensions) { btnH = .07f; rowH = 1.1f * btnH; row0 = .1f; diff --git a/engine/src/main/java/org/destinationsol/menu/MenuLayout.java b/engine/src/main/java/org/destinationsol/menu/MenuLayout.java index e489ae26a..01ba91102 100644 --- a/engine/src/main/java/org/destinationsol/menu/MenuLayout.java +++ b/engine/src/main/java/org/destinationsol/menu/MenuLayout.java @@ -17,9 +17,12 @@ package org.destinationsol.menu; import com.badlogic.gdx.math.Rectangle; -import org.destinationsol.SolApplication; import org.destinationsol.ui.DisplayDimensions; +import org.terasology.context.annotation.Introspected; +import javax.inject.Inject; + +@Introspected public class MenuLayout { public static final float BG_BORDER = .03f; private static final int numberOfRowsTotal = 5; @@ -30,8 +33,8 @@ public class MenuLayout { private final float rowH; private final float myPad; - public MenuLayout() { - DisplayDimensions displayDimensions = SolApplication.displayDimensions; + @Inject + public MenuLayout(DisplayDimensions displayDimensions) { btnW = .40f * displayDimensions.getRatio(); btnH = .1f; diff --git a/engine/src/main/java/org/destinationsol/ui/Position.java b/engine/src/main/java/org/destinationsol/ui/Position.java index e77f80a67..3320dc4a4 100644 --- a/engine/src/main/java/org/destinationsol/ui/Position.java +++ b/engine/src/main/java/org/destinationsol/ui/Position.java @@ -15,16 +15,14 @@ */ package org.destinationsol.ui; -import org.destinationsol.SolApplication; - public class Position { - private DisplayDimensions displayDimensions; + private final DisplayDimensions displayDimensions; private float xNormalized; private float yNormalized; - public Position(float xNormalized, float yNormalized) { - displayDimensions = SolApplication.displayDimensions; + public Position(DisplayDimensions displayDimensions, float xNormalized, float yNormalized) { + this.displayDimensions = displayDimensions; set(xNormalized, yNormalized); } diff --git a/engine/src/main/java/org/destinationsol/ui/SolLayouts.java b/engine/src/main/java/org/destinationsol/ui/SolLayouts.java index f4f9d3217..346e1a8b7 100644 --- a/engine/src/main/java/org/destinationsol/ui/SolLayouts.java +++ b/engine/src/main/java/org/destinationsol/ui/SolLayouts.java @@ -27,8 +27,8 @@ public class SolLayouts { public final MenuLayout menuLayout; @Inject - public SolLayouts() { - rightPaneLayout = new RightPaneLayout(); - menuLayout = new MenuLayout(); + public SolLayouts(RightPaneLayout rightPaneLayout, MenuLayout menuLayout) { + this.rightPaneLayout = rightPaneLayout; + this.menuLayout = menuLayout; } } diff --git a/engine/src/main/java/org/destinationsol/ui/UiDrawer.java b/engine/src/main/java/org/destinationsol/ui/UiDrawer.java index ba27cdea2..e5054427e 100644 --- a/engine/src/main/java/org/destinationsol/ui/UiDrawer.java +++ b/engine/src/main/java/org/destinationsol/ui/UiDrawer.java @@ -48,31 +48,32 @@ public enum TextAlignment { //TODO WTF is `isTextMode` for? discuss and potentially (=probably) remove private Boolean isTextMode; - private DisplayDimensions displayDimensions; + @Inject + DisplayDimensions displayDimensions; public static Map positions = new HashMap<>(); @Inject - public UiDrawer(CommonDrawer commonDrawer) { - displayDimensions = SolApplication.displayDimensions; + public UiDrawer(CommonDrawer commonDrawer, DisplayDimensions displayDimensions) { + this.displayDimensions = displayDimensions; drawer = commonDrawer; - uiLineWidth = 1.0f / displayDimensions.getHeight(); + uiLineWidth = 1.0f / this.displayDimensions.getHeight(); recomputeStraightMtx(); drawer.setMatrix(straightMtx); - filler = new Rectangle(0, 0, displayDimensions.getRatio(), 1); - - positions.put("top", new Position(0.5f, 0)); - positions.put("topRight", new Position(1, 0)); - positions.put("right", new Position(1, 0.5f)); - positions.put("bottomRight", new Position(1, 1)); - positions.put("bottom", new Position(0.5f, 1)); - positions.put("bottomLeft", new Position(0, 1)); - positions.put("left", new Position(0, 0.5f)); - positions.put("topLeft", new Position(0, 0)); - positions.put("center", new Position(0.5f, 0.5f)); + filler = new Rectangle(0, 0, this.displayDimensions.getRatio(), 1); + + positions.put("top", new Position(displayDimensions, 0.5f, 0)); + positions.put("topRight", new Position(displayDimensions, 1, 0)); + positions.put("right", new Position(displayDimensions, 1, 0.5f)); + positions.put("bottomRight", new Position(displayDimensions, 1, 1)); + positions.put("bottom", new Position(displayDimensions, 0.5f, 1)); + positions.put("bottomLeft", new Position(displayDimensions, 0, 1)); + positions.put("left", new Position(displayDimensions, 0, 0.5f)); + positions.put("topLeft", new Position(displayDimensions, 0, 0)); + positions.put("center", new Position(displayDimensions, 0.5f, 0.5f)); SolApplication.addResizeSubscriber(this); } From fde7aa96dbb2cb15bf32406fabce4c2f7fa93485 Mon Sep 17 00:00:00 2001 From: DarkWeird Date: Wed, 3 Mar 2021 17:01:31 +0300 Subject: [PATCH 06/38] fix(DI): fix running game. --- .../org/destinationsol/ContextWrapper.java | 12 +++++++++++- .../java/org/destinationsol/CoreService.java | 12 ++++++++++++ .../org/destinationsol/SolApplication.java | 2 +- .../systems/AsteroidBodyCreationSystem.java | 11 +++++++---- .../body/systems/BodyHandlerSystem.java | 7 +++++-- .../java/org/destinationsol/common/In.java | 1 + .../entitysystem/EntitySystemManager.java | 15 +++------------ .../force/systems/ImpulseHandlingSystem.java | 8 ++++++-- .../game/AbilityCommonConfigs.java | 4 ++++ .../org/destinationsol/game/GameDrawer.java | 5 +++++ .../destinationsol/game/ObjectManager.java | 4 ++++ .../java/org/destinationsol/game/SolCam.java | 9 +++++++-- .../game/SolContactListener.java | 15 ++++++++------- .../game/screens/GameScreens.java | 5 +++++ .../health/systems/DamageSystem.java | 8 ++++++-- .../location/systems/LocationSystem.java | 2 ++ .../systems/MoneyDroppingSystem.java | 19 +++++++++++-------- .../systems/DestroyOnZeroHealthSystem.java | 8 ++++++-- .../removal/systems/DestructionSystem.java | 2 ++ .../rendering/systems/RenderingSystem.java | 12 ++++++++---- .../rubble/systems/RubbleCreationSystem.java | 12 ++++++++---- 21 files changed, 122 insertions(+), 51 deletions(-) diff --git a/engine/src/main/java/org/destinationsol/ContextWrapper.java b/engine/src/main/java/org/destinationsol/ContextWrapper.java index ab19a0c41..a126cec40 100644 --- a/engine/src/main/java/org/destinationsol/ContextWrapper.java +++ b/engine/src/main/java/org/destinationsol/ContextWrapper.java @@ -16,14 +16,19 @@ package org.destinationsol; import org.destinationsol.game.context.Context; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.terasology.context.annotation.Introspected; import org.terasology.gestalt.di.BeanContext; +import org.terasology.gestalt.di.exceptions.BeanResolutionException; import sun.reflect.generics.reflectiveObjects.NotImplementedException; import javax.inject.Inject; @Introspected public class ContextWrapper implements Context { + + private static final Logger logger = LoggerFactory.getLogger(ContextWrapper.class); protected BeanContext context; @Inject @@ -33,7 +38,12 @@ public ContextWrapper(BeanContext beanContext) { @Override public T get(Class type) { - return (T) context.getBean(type); + try { + return (T) context.getBean(type); + } catch (BeanResolutionException e){ + logger.warn("Bean [{}] no found",type); + return null; + } } @Override diff --git a/engine/src/main/java/org/destinationsol/CoreService.java b/engine/src/main/java/org/destinationsol/CoreService.java index 727f1cf2a..3773558a1 100644 --- a/engine/src/main/java/org/destinationsol/CoreService.java +++ b/engine/src/main/java/org/destinationsol/CoreService.java @@ -6,7 +6,12 @@ import org.destinationsol.assets.music.OggMusicManager; import org.destinationsol.assets.sound.OggSoundManager; import org.destinationsol.entitysystem.ComponentSystemManager; +import org.destinationsol.game.AbilityCommonConfigs; import org.destinationsol.game.DebugOptions; +import org.destinationsol.game.GameDrawer; +import org.destinationsol.game.ObjectManager; +import org.destinationsol.game.SolCam; +import org.destinationsol.game.screens.GameScreens; import org.destinationsol.game.screens.RightPaneLayout; import org.destinationsol.menu.MenuLayout; import org.destinationsol.modules.ModuleManager; @@ -48,5 +53,12 @@ public CoreService(SolApplication application, ModuleManager moduleManager) { this.with(SolLayouts.class); this.with(RightPaneLayout.class); this.with(MenuLayout.class); + + // Screens + this.with(GameScreens.class); + this.with(SolCam.class); + this.with(ObjectManager.class); + this.with(GameDrawer.class); + this.with(AbilityCommonConfigs.class); } } diff --git a/engine/src/main/java/org/destinationsol/SolApplication.java b/engine/src/main/java/org/destinationsol/SolApplication.java index 568209135..ae5e2b931 100644 --- a/engine/src/main/java/org/destinationsol/SolApplication.java +++ b/engine/src/main/java/org/destinationsol/SolApplication.java @@ -333,7 +333,7 @@ public void play(boolean tut, String shipName, boolean isNewGame, WorldConfig wo gameContext = appContext.getNestedContainer(new SolGameServiceRegistry(isNewGame), new ContextWrapperService()); appContext.getBean(ComponentSystemManager.class).preBegin(); - SolGame game = gameContext.getBean(SolGame.class); + solGame = gameContext.getBean(SolGame.class); gameContext.getBean(ComponentSystemManager.class).preBegin(); entitySystemManager = gameContext.getBean(EntitySystemManager.class); diff --git a/engine/src/main/java/org/destinationsol/asteroids/systems/AsteroidBodyCreationSystem.java b/engine/src/main/java/org/destinationsol/asteroids/systems/AsteroidBodyCreationSystem.java index 7b8c5b18c..2d23e4faa 100644 --- a/engine/src/main/java/org/destinationsol/asteroids/systems/AsteroidBodyCreationSystem.java +++ b/engine/src/main/java/org/destinationsol/asteroids/systems/AsteroidBodyCreationSystem.java @@ -35,10 +35,12 @@ import org.destinationsol.rendering.RenderableElement; import org.destinationsol.rendering.components.Renderable; import org.destinationsol.size.components.Size; +import org.terasology.context.annotation.Introspected; import org.terasology.gestalt.entitysystem.entity.EntityRef; import org.terasology.gestalt.entitysystem.event.EventResult; import org.terasology.gestalt.entitysystem.event.ReceiveEvent; +import javax.inject.Inject; import java.util.ArrayList; /** @@ -51,15 +53,16 @@ * Bodies should only be created during an update sent by an {@link UpdateAwareSystem}. Attempting to create a body at * any other time may cause the game to crash. */ +@Introspected public class AsteroidBodyCreationSystem implements EventReceiver { private static final float DENSITY = 10f; - @In - private EntitySystemManager entitySystemManager; + @Inject + EntitySystemManager entitySystemManager; - @In - private World world; + @Inject + World world; private final CollisionMeshLoader collisionMeshLoader = new CollisionMeshLoader("engine:asteroids"); diff --git a/engine/src/main/java/org/destinationsol/body/systems/BodyHandlerSystem.java b/engine/src/main/java/org/destinationsol/body/systems/BodyHandlerSystem.java index 5e88cd26f..73d73e48f 100644 --- a/engine/src/main/java/org/destinationsol/body/systems/BodyHandlerSystem.java +++ b/engine/src/main/java/org/destinationsol/body/systems/BodyHandlerSystem.java @@ -34,11 +34,13 @@ import org.destinationsol.location.events.VelocityUpdateEvent; import org.destinationsol.removal.events.DeletionEvent; import org.destinationsol.removal.systems.DestructionSystem; +import org.terasology.context.annotation.Introspected; import org.terasology.gestalt.entitysystem.entity.EntityRef; import org.terasology.gestalt.entitysystem.event.Before; import org.terasology.gestalt.entitysystem.event.EventResult; import org.terasology.gestalt.entitysystem.event.ReceiveEvent; +import javax.inject.Inject; import java.util.HashMap; /** @@ -49,10 +51,11 @@ * Bodies should only be created during an update sent by an {@link UpdateAwareSystem}. Attempting to create a body at * any other time may cause the game to crash. */ +@Introspected public class BodyHandlerSystem implements EventReceiver { - @In - private EntitySystemManager entitySystemManager; + @Inject + EntitySystemManager entitySystemManager; private HashMap referenceToBodyObjects = new HashMap<>(); diff --git a/engine/src/main/java/org/destinationsol/common/In.java b/engine/src/main/java/org/destinationsol/common/In.java index 70f497cd7..990016d67 100644 --- a/engine/src/main/java/org/destinationsol/common/In.java +++ b/engine/src/main/java/org/destinationsol/common/In.java @@ -15,6 +15,7 @@ */ package org.destinationsol.common; +import javax.inject.Inject; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; diff --git a/engine/src/main/java/org/destinationsol/entitysystem/EntitySystemManager.java b/engine/src/main/java/org/destinationsol/entitysystem/EntitySystemManager.java index 11d9c97a7..09aa13c2f 100644 --- a/engine/src/main/java/org/destinationsol/entitysystem/EntitySystemManager.java +++ b/engine/src/main/java/org/destinationsol/entitysystem/EntitySystemManager.java @@ -47,10 +47,7 @@ public class EntitySystemManager { private static final EventReceiverMethodSupport eventReceiverMethodSupport = new EventReceiverMethodSupport(); @Inject - public EntitySystemManager(ModuleEnvironment environment, ComponentManager componentManager, Context context) { - - context.put(EntitySystemManager.class, this); - + public EntitySystemManager(ModuleEnvironment environment, ComponentManager componentManager, List eventReceivers) { List> stores = Lists.newArrayList(); for (Class componentType : environment.getSubtypesOf(Component.class)) { //This filters out abstract components, which would create exceptions @@ -64,14 +61,8 @@ public EntitySystemManager(ModuleEnvironment environment, ComponentManager compo entityManager = new CoreEntityManager(stores); - for (Class eventReceiver : environment.getSubtypesOf(EventReceiver.class)) { - try { - EventReceiver receiver = eventReceiver.newInstance(); - InjectionHelper.inject(receiver, context); - eventReceiverMethodSupport.register(receiver, eventSystem); - } catch (Exception e) { - e.printStackTrace(); - } + for (EventReceiver eventReceiver : eventReceivers) { + eventReceiverMethodSupport.register(eventReceiver, eventSystem); } } diff --git a/engine/src/main/java/org/destinationsol/force/systems/ImpulseHandlingSystem.java b/engine/src/main/java/org/destinationsol/force/systems/ImpulseHandlingSystem.java index 6257a5a07..7c381d8b0 100644 --- a/engine/src/main/java/org/destinationsol/force/systems/ImpulseHandlingSystem.java +++ b/engine/src/main/java/org/destinationsol/force/systems/ImpulseHandlingSystem.java @@ -23,18 +23,22 @@ import org.destinationsol.force.events.ImpulseEvent; import org.destinationsol.health.components.Health; import org.destinationsol.health.events.DamageEvent; +import org.terasology.context.annotation.Introspected; import org.terasology.gestalt.entitysystem.entity.EntityRef; import org.terasology.gestalt.entitysystem.event.EventResult; import org.terasology.gestalt.entitysystem.event.ReceiveEvent; +import javax.inject.Inject; + /** * When this receives an {@link ImpulseEvent}, it sends a {@link DamageEvent} to the entity that is scaled according to * the entity's mass and durability. */ +@Introspected public class ImpulseHandlingSystem implements EventReceiver { - @In - private EntitySystemManager entitySystemManager; + @Inject + EntitySystemManager entitySystemManager; @ReceiveEvent(components = {Health.class, BodyLinked.class}) public EventResult onImpulse(ImpulseEvent event, EntityRef entity) { diff --git a/engine/src/main/java/org/destinationsol/game/AbilityCommonConfigs.java b/engine/src/main/java/org/destinationsol/game/AbilityCommonConfigs.java index 3c6d4bcd8..15265da0e 100644 --- a/engine/src/main/java/org/destinationsol/game/AbilityCommonConfigs.java +++ b/engine/src/main/java/org/destinationsol/game/AbilityCommonConfigs.java @@ -21,15 +21,19 @@ import org.destinationsol.assets.json.Validator; import org.destinationsol.game.particle.EffectTypes; import org.json.JSONObject; +import org.terasology.context.annotation.Introspected; import org.terasology.gestalt.assets.ResourceUrn; +import javax.inject.Inject; import java.util.HashMap; import java.util.Locale; import java.util.Map; +@Introspected public class AbilityCommonConfigs { public final Map abilityConfigs; + @Inject public AbilityCommonConfigs(EffectTypes effectTypes, GameColors cols, OggSoundManager soundManager) { abilityConfigs = new HashMap<>(); diff --git a/engine/src/main/java/org/destinationsol/game/GameDrawer.java b/engine/src/main/java/org/destinationsol/game/GameDrawer.java index e3a8bde39..0c212c1d2 100644 --- a/engine/src/main/java/org/destinationsol/game/GameDrawer.java +++ b/engine/src/main/java/org/destinationsol/game/GameDrawer.java @@ -22,13 +22,18 @@ import com.badlogic.gdx.math.Vector2; import org.destinationsol.CommonDrawer; import org.destinationsol.assets.Assets; +import org.terasology.context.annotation.Introspected; +import javax.inject.Inject; + +@Introspected public class GameDrawer { public final TextureAtlas.AtlasRegion debugWhiteTexture; private final CommonDrawer myDrawer; private boolean myCurrAdditive; + @Inject public GameDrawer(CommonDrawer commonDrawer) { myDrawer = commonDrawer; debugWhiteTexture = Assets.getAtlasRegion("engine:uiWhiteTex"); diff --git a/engine/src/main/java/org/destinationsol/game/ObjectManager.java b/engine/src/main/java/org/destinationsol/game/ObjectManager.java index 8a015f978..e7f05ee43 100644 --- a/engine/src/main/java/org/destinationsol/game/ObjectManager.java +++ b/engine/src/main/java/org/destinationsol/game/ObjectManager.java @@ -26,13 +26,16 @@ import org.destinationsol.game.drawables.DrawableManager; import org.destinationsol.game.drawables.FarDrawable; import org.destinationsol.game.ship.FarShip; +import org.terasology.context.annotation.Introspected; +import javax.inject.Inject; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.function.Consumer; +@Introspected public class ObjectManager implements UpdateAwareSystem { private static final float MAX_RADIUS_RECALC_AWAIT = 1f; private final List myObjs; @@ -49,6 +52,7 @@ public class ObjectManager implements UpdateAwareSystem { private float myFarBeginDist; private float myRadiusRecalcAwait; + @Inject public ObjectManager(SolContactListener contactListener, FactionManager factionManager) { myObjs = new ArrayList<>(); myToRemove = new ArrayList<>(); diff --git a/engine/src/main/java/org/destinationsol/game/SolCam.java b/engine/src/main/java/org/destinationsol/game/SolCam.java index 4e2e173b6..52a658ea8 100644 --- a/engine/src/main/java/org/destinationsol/game/SolCam.java +++ b/engine/src/main/java/org/destinationsol/game/SolCam.java @@ -31,7 +31,11 @@ import org.destinationsol.game.ship.SolShip; import org.destinationsol.game.ship.hulls.Hull; import org.destinationsol.ui.DisplayDimensions; +import org.terasology.context.annotation.Introspected; +import javax.inject.Inject; + +@Introspected public class SolCam implements UpdateAwareSystem { public static final float CAM_ROT_SPD = 90f; private static final float VIEWPORT_HEIGHT = 5f; @@ -55,8 +59,9 @@ public class SolCam implements UpdateAwareSystem { private Vector2 position; private DisplayDimensions displayDimensions; - public SolCam() { - displayDimensions = SolApplication.displayDimensions; + @Inject + public SolCam(DisplayDimensions displayDimensions) { + this.displayDimensions = displayDimensions; myCamRotStrategy = new CamRotStrategy.ToPlanet(); myCam = new OrthographicCamera(VIEWPORT_HEIGHT * displayDimensions.getRatio(), -VIEWPORT_HEIGHT); viewport = new ScreenViewport(myCam); diff --git a/engine/src/main/java/org/destinationsol/game/SolContactListener.java b/engine/src/main/java/org/destinationsol/game/SolContactListener.java index df5f32080..3df4de3d3 100644 --- a/engine/src/main/java/org/destinationsol/game/SolContactListener.java +++ b/engine/src/main/java/org/destinationsol/game/SolContactListener.java @@ -31,6 +31,7 @@ import org.terasology.gestalt.entitysystem.entity.EntityRef; import javax.inject.Inject; +import javax.inject.Provider; @Introspected public class SolContactListener implements ContactListener { @@ -38,10 +39,10 @@ public class SolContactListener implements ContactListener { @Inject protected EntitySystemManager entitySystemManager; - private final SolGame myGame; + private final Provider myGame; @Inject - public SolContactListener(SolGame game) { + public SolContactListener(Provider game) { myGame = game; } @@ -76,7 +77,7 @@ public void beginContact(Contact contact) { } Projectile projectile = (Projectile) (firstSolObjectIsProjectile ? firstSolObject : secondSolObject); SolObject solObject = firstSolObjectIsProjectile ? secondSolObject : firstSolObject; - projectile.setObstacle(solObject, myGame); + projectile.setObstacle(solObject, myGame.get()); } @Override @@ -122,10 +123,10 @@ public void postSolve(Contact contact, ContactImpulse impulse) { if (secondSolObject instanceof Projectile && ((Projectile) secondSolObject).getConfig().density <= 0) { return; } - firstSolObject.handleContact(secondSolObject, absImpulse, myGame, collPos); - secondSolObject.handleContact(firstSolObject, absImpulse, myGame, collPos); - myGame.getSpecialSounds().playColl(myGame, absImpulse, firstSolObject, collPos); - myGame.getSpecialSounds().playColl(myGame, absImpulse, secondSolObject, collPos); + firstSolObject.handleContact(secondSolObject, absImpulse, myGame.get(), collPos); + secondSolObject.handleContact(firstSolObject, absImpulse, myGame.get(), collPos); + myGame.get().getSpecialSounds().playColl(myGame.get(), absImpulse, firstSolObject, collPos); + myGame.get().getSpecialSounds().playColl(myGame.get(), absImpulse, secondSolObject, collPos); } diff --git a/engine/src/main/java/org/destinationsol/game/screens/GameScreens.java b/engine/src/main/java/org/destinationsol/game/screens/GameScreens.java index 026a76319..7abab5776 100644 --- a/engine/src/main/java/org/destinationsol/game/screens/GameScreens.java +++ b/engine/src/main/java/org/destinationsol/game/screens/GameScreens.java @@ -18,7 +18,11 @@ import org.destinationsol.SolApplication; import org.destinationsol.game.context.Context; import org.destinationsol.ui.SolLayouts; +import org.terasology.context.annotation.Introspected; +import javax.inject.Inject; + +@Introspected public class GameScreens { public final MainGameScreen mainGameScreen; public final MapScreen mapScreen; @@ -28,6 +32,7 @@ public class GameScreens { public final WaypointCreationScreen waypointCreationScreen; public final ConsoleScreen consoleScreen; + @Inject public GameScreens(SolApplication cmp, Context context) { SolLayouts layouts = cmp.getLayouts(); RightPaneLayout rightPaneLayout = layouts.rightPaneLayout; diff --git a/engine/src/main/java/org/destinationsol/health/systems/DamageSystem.java b/engine/src/main/java/org/destinationsol/health/systems/DamageSystem.java index 9a0d25030..e79719bb7 100644 --- a/engine/src/main/java/org/destinationsol/health/systems/DamageSystem.java +++ b/engine/src/main/java/org/destinationsol/health/systems/DamageSystem.java @@ -21,19 +21,23 @@ import org.destinationsol.entitysystem.EventReceiver; import org.destinationsol.health.events.DamageEvent; import org.destinationsol.removal.events.ZeroHealthEvent; +import org.terasology.context.annotation.Introspected; import org.terasology.gestalt.entitysystem.entity.EntityRef; import org.terasology.gestalt.entitysystem.event.EventResult; import org.terasology.gestalt.entitysystem.event.ReceiveEvent; +import javax.inject.Inject; + /** * When a damage event happens to an entity with a health component, this system reads the damage from that event and * lowers its health by that amount. If it would lower the health to less than zero, it's reduced to zero instead. If * the damage is a negative amount, nothing happens. */ +@Introspected public class DamageSystem implements EventReceiver { - @In - private EntitySystemManager entitySystemManager; + @Inject + EntitySystemManager entitySystemManager; /** * Handles a damage event done to an entity with a Health component. diff --git a/engine/src/main/java/org/destinationsol/location/systems/LocationSystem.java b/engine/src/main/java/org/destinationsol/location/systems/LocationSystem.java index 35d941188..453d88ac6 100644 --- a/engine/src/main/java/org/destinationsol/location/systems/LocationSystem.java +++ b/engine/src/main/java/org/destinationsol/location/systems/LocationSystem.java @@ -22,6 +22,7 @@ import org.destinationsol.location.events.AngleUpdateEvent; import org.destinationsol.location.events.PositionUpdateEvent; import org.destinationsol.location.events.VelocityUpdateEvent; +import org.terasology.context.annotation.Introspected; import org.terasology.gestalt.entitysystem.entity.EntityRef; import org.terasology.gestalt.entitysystem.event.EventResult; import org.terasology.gestalt.entitysystem.event.ReceiveEvent; @@ -30,6 +31,7 @@ * This system updates the location of an entity with a {@link Position}, {@link Angle}, or {@link Velocity} component * when it receives a {@link PositionUpdateEvent}, {@link AngleUpdateEvent}, or {@link VelocityUpdateEvent}, respectively. */ +@Introspected public class LocationSystem implements EventReceiver { @ReceiveEvent(components = Position.class) diff --git a/engine/src/main/java/org/destinationsol/moneyDropping/systems/MoneyDroppingSystem.java b/engine/src/main/java/org/destinationsol/moneyDropping/systems/MoneyDroppingSystem.java index 11da23150..d443b4364 100644 --- a/engine/src/main/java/org/destinationsol/moneyDropping/systems/MoneyDroppingSystem.java +++ b/engine/src/main/java/org/destinationsol/moneyDropping/systems/MoneyDroppingSystem.java @@ -32,33 +32,36 @@ import org.destinationsol.removal.events.DeletionEvent; import org.destinationsol.removal.systems.DestructionSystem; import org.destinationsol.size.components.Size; +import org.terasology.context.annotation.Introspected; import org.terasology.gestalt.entitysystem.entity.EntityRef; import org.terasology.gestalt.entitysystem.event.Before; import org.terasology.gestalt.entitysystem.event.EventResult; import org.terasology.gestalt.entitysystem.event.ReceiveEvent; +import javax.inject.Inject; import java.util.List; /** * When an entity with a {@link DropsMoneyOnDestruction} component is destroyed, this system creates an amount of money based * on its {@link Size}. */ +@Introspected public class MoneyDroppingSystem implements EventReceiver { private final float MIN_MULTIPLIER = 12f; private final float MAX_MULTIPLIER = 40f; - @In - private SolGame game; + @Inject + SolGame game; - @In - private LootBuilder lootBuilder; + @Inject + LootBuilder lootBuilder; - @In - private ItemManager itemManager; + @Inject + ItemManager itemManager; - @In - private ObjectManager objectManager; + @Inject + ObjectManager objectManager; @ReceiveEvent(components = {DropsMoneyOnDestruction.class, Position.class, Velocity.class, Size.class}) @Before(DestructionSystem.class) diff --git a/engine/src/main/java/org/destinationsol/removal/systems/DestroyOnZeroHealthSystem.java b/engine/src/main/java/org/destinationsol/removal/systems/DestroyOnZeroHealthSystem.java index 0911f450b..e47d840f2 100644 --- a/engine/src/main/java/org/destinationsol/removal/systems/DestroyOnZeroHealthSystem.java +++ b/engine/src/main/java/org/destinationsol/removal/systems/DestroyOnZeroHealthSystem.java @@ -21,16 +21,20 @@ import org.destinationsol.health.components.Health; import org.destinationsol.removal.events.ShouldBeDestroyedEvent; import org.destinationsol.removal.events.ZeroHealthEvent; +import org.terasology.context.annotation.Introspected; import org.terasology.gestalt.entitysystem.entity.EntityRef; import org.terasology.gestalt.entitysystem.event.ReceiveEvent; +import javax.inject.Inject; + /** * When an entity's {@link Health} drops to zero, this system destroys that entity. */ +@Introspected public class DestroyOnZeroHealthSystem implements EventReceiver { - @In - private EntitySystemManager entitySystemManager; + @Inject + EntitySystemManager entitySystemManager; @ReceiveEvent public void onZeroHealth(ZeroHealthEvent event, EntityRef entity) { diff --git a/engine/src/main/java/org/destinationsol/removal/systems/DestructionSystem.java b/engine/src/main/java/org/destinationsol/removal/systems/DestructionSystem.java index fb5a196a3..26b160587 100644 --- a/engine/src/main/java/org/destinationsol/removal/systems/DestructionSystem.java +++ b/engine/src/main/java/org/destinationsol/removal/systems/DestructionSystem.java @@ -20,6 +20,7 @@ import org.destinationsol.removal.events.DeletionEvent; import org.destinationsol.removal.events.ShouldBeDestroyedEvent; import org.destinationsol.removal.events.RemovalForOptimizationEvent; +import org.terasology.context.annotation.Introspected; import org.terasology.gestalt.entitysystem.entity.EntityRef; import org.terasology.gestalt.entitysystem.event.EventResult; import org.terasology.gestalt.entitysystem.event.ReceiveEvent; @@ -34,6 +35,7 @@ * Every tick, the {@link DeletionUpdateSystem} sends a {@link DeletionEvent} to each entity with a SlatedForDeletion * component. When that happens, this system deletes those entities. */ +@Introspected public class DestructionSystem implements EventReceiver { /** diff --git a/engine/src/main/java/org/destinationsol/rendering/systems/RenderingSystem.java b/engine/src/main/java/org/destinationsol/rendering/systems/RenderingSystem.java index c2746fe73..cd4d15522 100644 --- a/engine/src/main/java/org/destinationsol/rendering/systems/RenderingSystem.java +++ b/engine/src/main/java/org/destinationsol/rendering/systems/RenderingSystem.java @@ -26,20 +26,24 @@ import org.destinationsol.location.components.Angle; import org.destinationsol.location.components.Position; import org.destinationsol.size.components.Size; +import org.terasology.context.annotation.Introspected; import org.terasology.gestalt.entitysystem.entity.EntityRef; import org.terasology.gestalt.entitysystem.event.EventResult; import org.terasology.gestalt.entitysystem.event.ReceiveEvent; +import javax.inject.Inject; + /** * This handles the drawing of each entity with a {@link Renderable} component. */ +@Introspected public class RenderingSystem implements EventReceiver { - @In - private EntitySystemManager entitySystemManager; + @Inject + EntitySystemManager entitySystemManager; - @In - private GameDrawer drawer; + @Inject + GameDrawer drawer; @ReceiveEvent(components = {Renderable.class, Position.class, Size.class}) public EventResult onRender(RenderEvent event, EntityRef entity) { diff --git a/engine/src/main/java/org/destinationsol/rubble/systems/RubbleCreationSystem.java b/engine/src/main/java/org/destinationsol/rubble/systems/RubbleCreationSystem.java index b0567cfd1..e43ae3152 100644 --- a/engine/src/main/java/org/destinationsol/rubble/systems/RubbleCreationSystem.java +++ b/engine/src/main/java/org/destinationsol/rubble/systems/RubbleCreationSystem.java @@ -28,22 +28,26 @@ import org.destinationsol.rubble.components.CreatesRubbleOnDestruction; import org.destinationsol.size.components.Size; import org.destinationsol.stasis.components.Stasis; +import org.terasology.context.annotation.Introspected; import org.terasology.gestalt.entitysystem.entity.EntityRef; import org.terasology.gestalt.entitysystem.event.Before; import org.terasology.gestalt.entitysystem.event.EventResult; import org.terasology.gestalt.entitysystem.event.ReceiveEvent; +import javax.inject.Inject; + /** * When an entity with a {@link CreatesRubbleOnDestruction} component is destroyed, this system creates {@link Rubble}s * where the entity was. */ +@Introspected public class RubbleCreationSystem implements EventReceiver { - @In - private RubbleBuilder rubbleBuilder; + @Inject + RubbleBuilder rubbleBuilder; - @In - private SolGame solGame; + @Inject + SolGame solGame; //TODO once Shards are entities, this needs to be refactored to replace ShardBuilder From fcef6ae0467d6729d840522cc989767d9900f6e7 Mon Sep 17 00:00:00 2001 From: DarkWeird Date: Thu, 4 Mar 2021 08:55:36 +0300 Subject: [PATCH 07/38] refactor(DI): move Game services to `SolGameServiceRegistry` --- .../src/main/java/org/destinationsol/CoreService.java | 7 ------- .../org/destinationsol/SolGameServiceRegistry.java | 10 ++++++++++ 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/engine/src/main/java/org/destinationsol/CoreService.java b/engine/src/main/java/org/destinationsol/CoreService.java index 3773558a1..66cf959b9 100644 --- a/engine/src/main/java/org/destinationsol/CoreService.java +++ b/engine/src/main/java/org/destinationsol/CoreService.java @@ -53,12 +53,5 @@ public CoreService(SolApplication application, ModuleManager moduleManager) { this.with(SolLayouts.class); this.with(RightPaneLayout.class); this.with(MenuLayout.class); - - // Screens - this.with(GameScreens.class); - this.with(SolCam.class); - this.with(ObjectManager.class); - this.with(GameDrawer.class); - this.with(AbilityCommonConfigs.class); } } diff --git a/engine/src/main/java/org/destinationsol/SolGameServiceRegistry.java b/engine/src/main/java/org/destinationsol/SolGameServiceRegistry.java index f47ef9e84..4823c28f1 100644 --- a/engine/src/main/java/org/destinationsol/SolGameServiceRegistry.java +++ b/engine/src/main/java/org/destinationsol/SolGameServiceRegistry.java @@ -18,14 +18,18 @@ import org.destinationsol.assets.sound.SpecialSounds; import org.destinationsol.entitysystem.EntitySystemManager; import org.destinationsol.files.HullConfigManager; +import org.destinationsol.game.AbilityCommonConfigs; import org.destinationsol.game.BeaconHandler; import org.destinationsol.game.FactionManager; import org.destinationsol.game.GalaxyFiller; import org.destinationsol.game.GameColors; +import org.destinationsol.game.GameDrawer; import org.destinationsol.game.GridDrawer; import org.destinationsol.game.MapDrawer; import org.destinationsol.game.MountDetectDrawer; +import org.destinationsol.game.ObjectManager; import org.destinationsol.game.RubbleBuilder; +import org.destinationsol.game.SolCam; import org.destinationsol.game.SolContactListener; import org.destinationsol.game.SolGame; import org.destinationsol.game.StarPort; @@ -40,6 +44,7 @@ import org.destinationsol.game.particle.PartMan; import org.destinationsol.game.particle.SpecialEffects; import org.destinationsol.game.planet.PlanetManager; +import org.destinationsol.game.screens.GameScreens; import org.destinationsol.game.ship.ShipBuilder; import org.destinationsol.ui.TutorialManager; import org.terasology.gestalt.di.BeanContext; @@ -78,5 +83,10 @@ public SolGameServiceRegistry(boolean isTutorial) { this.with(TutorialManager.class).lifetime(Lifetime.Singleton); this.with(GalaxyFiller.class).lifetime(Lifetime.Singleton); this.with(SolContactListener.class).lifetime(Lifetime.Singleton); + this.with(GameScreens.class).lifetime(Lifetime.Singleton); + this.with(SolCam.class).lifetime(Lifetime.Singleton); + this.with(ObjectManager.class).lifetime(Lifetime.Singleton); + this.with(GameDrawer.class).lifetime(Lifetime.Singleton); + this.with(AbilityCommonConfigs.class).lifetime(Lifetime.Singleton); } } From 818c5c66cadf9f89ca2d12ee33dd47e1cbc4a11a Mon Sep 17 00:00:00 2001 From: DarkWeird Date: Thu, 4 Mar 2021 12:17:58 +0300 Subject: [PATCH 08/38] fix(DI): fix game savings. Make `SerialisationManager` as normal service. --- .../java/org/destinationsol/CoreService.java | 6 ++--- .../org/destinationsol/SolApplication.java | 23 +--------------- .../SolGameServiceRegistry.java | 3 +++ .../entitysystem/SerialisationManager.java | 26 ++++++++++++------- 4 files changed, 23 insertions(+), 35 deletions(-) diff --git a/engine/src/main/java/org/destinationsol/CoreService.java b/engine/src/main/java/org/destinationsol/CoreService.java index 66cf959b9..cd7cd82a4 100644 --- a/engine/src/main/java/org/destinationsol/CoreService.java +++ b/engine/src/main/java/org/destinationsol/CoreService.java @@ -50,8 +50,8 @@ public CoreService(SolApplication application, ModuleManager moduleManager) { this.with(DisplayDimensions.class).lifetime(Lifetime.Singleton).use(() -> new DisplayDimensions(Gdx.graphics.getWidth(), Gdx.graphics.getHeight())); this.with(UiDrawer.class).lifetime(Lifetime.Singleton); - this.with(SolLayouts.class); - this.with(RightPaneLayout.class); - this.with(MenuLayout.class); + this.with(SolLayouts.class).lifetime(Lifetime.Singleton); + this.with(RightPaneLayout.class).lifetime(Lifetime.Singleton); + this.with(MenuLayout.class).lifetime(Lifetime.Singleton); } } diff --git a/engine/src/main/java/org/destinationsol/SolApplication.java b/engine/src/main/java/org/destinationsol/SolApplication.java index ae5e2b931..ba0a281b0 100644 --- a/engine/src/main/java/org/destinationsol/SolApplication.java +++ b/engine/src/main/java/org/destinationsol/SolApplication.java @@ -337,33 +337,12 @@ public void play(boolean tut, String shipName, boolean isNewGame, WorldConfig wo gameContext.getBean(ComponentSystemManager.class).preBegin(); entitySystemManager = gameContext.getBean(EntitySystemManager.class); - -// solGame = new SolGame(shipName, tut, isNewGame, commonDrawer, context, worldConfig); -// context.put(SolGame.class, solGame); -// -// context.put(LootBuilder.class, solGame.getLootBuilder()); -// context.put(ItemManager.class, solGame.getItemMan()); -// context.put(ObjectManager.class, solGame.getObjectManager()); - -// entitySystemManager = new EntitySystemManager(moduleManager.getEnvironment(), componentManager, context); - -// InjectionHelper.inject(solGame.getContactListener(), context); - solGame.createUpdateSystems(gameContext.getBean(Context.class)); solGame.startGame(shipName, isNewGame, worldConfig, new SolNames(), entitySystemManager); - // Big, fat, ugly HACK to get a working classloader - // Serialisation and thus a classloader is not needed when there are no components - Iterator> componentClasses = - moduleManager.getEnvironment().getSubtypesOf(Component.class).iterator(); - SerialisationManager serialisationManager = new SerialisationManager( - SaveManager.getResourcePath("entity_store.dat"), entitySystemManager.getEntityManager(), - componentClasses.hasNext() ? componentClasses.next().getClassLoader() : null); -// context.put(SerialisationManager.class, serialisationManager); // TODO: add a way to add singleton bean to the live context - if (!isNewGame) { try { -// context.get(SerialisationManager.class).deserialise(); + gameContext.getBean(SerialisationManager.class).deserialise(); } catch (Exception e) { e.printStackTrace(); } diff --git a/engine/src/main/java/org/destinationsol/SolGameServiceRegistry.java b/engine/src/main/java/org/destinationsol/SolGameServiceRegistry.java index 4823c28f1..116c87163 100644 --- a/engine/src/main/java/org/destinationsol/SolGameServiceRegistry.java +++ b/engine/src/main/java/org/destinationsol/SolGameServiceRegistry.java @@ -17,6 +17,7 @@ import org.destinationsol.assets.sound.SpecialSounds; import org.destinationsol.entitysystem.EntitySystemManager; +import org.destinationsol.entitysystem.SerialisationManager; import org.destinationsol.files.HullConfigManager; import org.destinationsol.game.AbilityCommonConfigs; import org.destinationsol.game.BeaconHandler; @@ -57,6 +58,8 @@ public SolGameServiceRegistry(boolean isTutorial) { this.with(SolGame.class).lifetime(Lifetime.Singleton).use(() -> new SolGame(isTutorial)); this.with(EntitySystemManager.class); + this.with(SerialisationManager.class).lifetime(Lifetime.Singleton); + this.with(DrawableManager.class).lifetime(Lifetime.Singleton); this.with(PlanetManager.class).lifetime(Lifetime.Singleton); diff --git a/engine/src/main/java/org/destinationsol/entitysystem/SerialisationManager.java b/engine/src/main/java/org/destinationsol/entitysystem/SerialisationManager.java index b14fa610c..3d5a86e56 100644 --- a/engine/src/main/java/org/destinationsol/entitysystem/SerialisationManager.java +++ b/engine/src/main/java/org/destinationsol/entitysystem/SerialisationManager.java @@ -21,29 +21,40 @@ import java.io.IOException; import java.lang.reflect.Field; import java.util.Collection; +import java.util.HashMap; +import java.util.Map; import com.google.common.collect.Lists; import com.google.protobuf.ByteString; +import org.destinationsol.game.SaveManager; +import org.destinationsol.modules.ModuleManager; import org.destinationsol.protobuf.EntityData; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.terasology.context.annotation.Introspected; import org.terasology.gestalt.assets.ResourceUrn; import org.terasology.gestalt.entitysystem.component.Component; import org.terasology.gestalt.entitysystem.entity.EntityManager; import org.terasology.gestalt.entitysystem.entity.EntityRef; +import javax.inject.Inject; +@Introspected public final class SerialisationManager { private static final Logger logger = LoggerFactory.getLogger(SerialisationManager.class); + private File file; private EntityManager entityManager; - private ClassLoader classLoader; + private Map> classLookup = new HashMap<>(); - public SerialisationManager(String path, EntityManager entityManager, ClassLoader classLoader) { - file = new File(path); + @Inject + public SerialisationManager(EntityManager entityManager, ModuleManager moduleManager) { + file = new File(SaveManager.getResourcePath("entity_store.dat")); this.entityManager = entityManager; - this.classLoader = classLoader; + for(Class componentClass: moduleManager.getEnvironment().getSubtypesOf(Component.class)) { + classLookup.put(componentClass.getName(), componentClass); + } } public void serialise() throws IllegalArgumentException, IllegalAccessException, IOException { @@ -108,11 +119,6 @@ public void serialise() throws IllegalArgumentException, IllegalAccessException, public void deserialise() throws IOException, ClassNotFoundException, InstantiationException, IllegalAccessException, NoSuchFieldException { - if (classLoader == null) { - logger.warn("Trying to deserialise with Null classloader. Aborting"); - return; - } - FileInputStream input = new FileInputStream(file); EntityData.EntityStore store = EntityData.EntityStore.parseFrom(input); input.close(); @@ -121,7 +127,7 @@ public void deserialise() throws IOException, ClassNotFoundException, Instantiat Collection componentsToAdd = Lists.newArrayList(); for (EntityData.Component component : entity.getComponentList()) { - Class componentClass = Class.forName(component.getTypeName(), true, classLoader); + Class componentClass = classLookup.get(component.getTypeName()); Component componentObject = (Component) componentClass.newInstance(); for (EntityData.Field field : component.getFieldList()) { From 50cf9c9b73c3832164e29a9cad3184acc8d26b98 Mon Sep 17 00:00:00 2001 From: DarkWeird Date: Thu, 4 Mar 2021 14:36:55 +0300 Subject: [PATCH 09/38] fix(DI): Minor fix resolving deps for `SerialisationManager` --- .../org/destinationsol/entitysystem/SerialisationManager.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/engine/src/main/java/org/destinationsol/entitysystem/SerialisationManager.java b/engine/src/main/java/org/destinationsol/entitysystem/SerialisationManager.java index 3d5a86e56..d5a2e4ad6 100644 --- a/engine/src/main/java/org/destinationsol/entitysystem/SerialisationManager.java +++ b/engine/src/main/java/org/destinationsol/entitysystem/SerialisationManager.java @@ -49,9 +49,9 @@ public final class SerialisationManager { private Map> classLookup = new HashMap<>(); @Inject - public SerialisationManager(EntityManager entityManager, ModuleManager moduleManager) { + public SerialisationManager(EntitySystemManager entitySystemManager, ModuleManager moduleManager) { file = new File(SaveManager.getResourcePath("entity_store.dat")); - this.entityManager = entityManager; + this.entityManager = entitySystemManager.getEntityManager(); for(Class componentClass: moduleManager.getEnvironment().getSubtypesOf(Component.class)) { classLookup.put(componentClass.getName(), componentClass); } From 65c694d5785b9f323c4cc1d736a75b942d60e795 Mon Sep 17 00:00:00 2001 From: DarkWeird Date: Thu, 4 Mar 2021 17:29:43 +0300 Subject: [PATCH 10/38] fix(DI): Remove unused store --- .../org/destinationsol/entitysystem/EntitySystemManager.java | 4 ---- 1 file changed, 4 deletions(-) diff --git a/engine/src/main/java/org/destinationsol/entitysystem/EntitySystemManager.java b/engine/src/main/java/org/destinationsol/entitysystem/EntitySystemManager.java index 09aa13c2f..afbdeef1c 100644 --- a/engine/src/main/java/org/destinationsol/entitysystem/EntitySystemManager.java +++ b/engine/src/main/java/org/destinationsol/entitysystem/EntitySystemManager.java @@ -32,7 +32,6 @@ import org.terasology.gestalt.entitysystem.event.EventSystem; import org.terasology.gestalt.entitysystem.event.impl.EventReceiverMethodSupport; import org.terasology.gestalt.entitysystem.event.impl.EventSystemImpl; -import org.terasology.gestalt.entitysystem.prefab.GeneratedFromRecipeComponent; import org.terasology.gestalt.module.ModuleEnvironment; import javax.inject.Inject; @@ -56,9 +55,6 @@ public EntitySystemManager(ModuleEnvironment environment, ComponentManager compo new ConcurrentComponentStore<>(new ArrayComponentStore<>(componentManager.getType(componentType)))); } } - stores.add(new ConcurrentComponentStore<>( - new ArrayComponentStore<>(componentManager.getType(GeneratedFromRecipeComponent.class)))); - entityManager = new CoreEntityManager(stores); for (EventReceiver eventReceiver : eventReceivers) { From e36b67bbc4e9c9be4d4205c99a075538c3c28432 Mon Sep 17 00:00:00 2001 From: Michael Pollind Date: Fri, 12 Mar 2021 20:36:55 -0800 Subject: [PATCH 11/38] remove intrpsection since beandefintioins are now driven by the presence of @Inject --- .../java/org/destinationsol/CommonDrawer.java | 2 -- .../org/destinationsol/ContextWrapper.java | 2 -- .../java/org/destinationsol/GameOptions.java | 1 - .../org/destinationsol/SolApplication.java | 7 +------ .../assets/music/OggMusicManager.java | 2 -- .../assets/sound/OggSoundManager.java | 2 -- .../assets/sound/SpecialSounds.java | 2 -- .../systems/AsteroidBodyCreationSystem.java | 8 ++++--- .../body/systems/BodyHandlerSystem.java | 7 ++++--- .../entitysystem/ComponentSystemManager.java | 2 -- .../entitysystem/EntitySystemManager.java | 4 ---- .../entitysystem/SerialisationManager.java | 21 ++++++++----------- .../files/HullConfigManager.java | 2 -- .../force/systems/ImpulseHandlingSystem.java | 8 ++++--- .../game/AbilityCommonConfigs.java | 4 +--- .../destinationsol/game/BeaconHandler.java | 4 ---- .../destinationsol/game/FactionManager.java | 2 -- .../org/destinationsol/game/GalaxyFiller.java | 2 -- .../org/destinationsol/game/GameColors.java | 2 -- .../org/destinationsol/game/GameDrawer.java | 2 -- .../org/destinationsol/game/GridDrawer.java | 2 -- .../org/destinationsol/game/MapDrawer.java | 2 -- .../game/MountDetectDrawer.java | 3 --- .../destinationsol/game/ObjectManager.java | 2 -- .../destinationsol/game/RubbleBuilder.java | 2 -- .../java/org/destinationsol/game/SolCam.java | 3 --- .../game/SolContactListener.java | 4 ---- .../java/org/destinationsol/game/SolGame.java | 6 +----- .../org/destinationsol/game/StarPort.java | 2 -- .../game/asteroid/AsteroidBuilder.java | 2 -- .../game/chunk/ChunkManager.java | 2 -- .../game/drawables/DrawableDebugger.java | 2 -- .../game/drawables/DrawableManager.java | 2 -- .../game/farBg/FarBackgroundManagerOld.java | 2 -- .../destinationsol/game/item/ItemManager.java | 2 -- .../destinationsol/game/item/LootBuilder.java | 2 -- .../game/particle/EffectTypes.java | 3 --- .../destinationsol/game/particle/PartMan.java | 3 --- .../game/particle/SpecialEffects.java | 2 -- .../game/planet/PlanetManager.java | 2 -- .../game/screens/GameScreens.java | 2 -- .../game/screens/RightPaneLayout.java | 2 -- .../destinationsol/game/ship/ShipBuilder.java | 2 -- .../health/systems/DamageSystem.java | 10 +++++---- .../location/systems/LocationSystem.java | 9 ++++++-- .../org/destinationsol/menu/MenuLayout.java | 2 -- .../destinationsol/modules/ModuleManager.java | 9 ++++---- .../systems/MoneyDroppingSystem.java | 8 ++++--- .../systems/DestroyOnZeroHealthSystem.java | 7 ++++--- .../removal/systems/DestructionSystem.java | 10 +++++---- .../rendering/systems/RenderingSystem.java | 14 +++++++------ .../rubble/systems/RubbleCreationSystem.java | 8 ++++--- .../destinationsol/ui/SolInputManager.java | 2 -- .../org/destinationsol/ui/SolLayouts.java | 2 -- .../destinationsol/ui/TutorialManager.java | 2 -- .../java/org/destinationsol/ui/UiDrawer.java | 2 -- 56 files changed, 71 insertions(+), 156 deletions(-) diff --git a/engine/src/main/java/org/destinationsol/CommonDrawer.java b/engine/src/main/java/org/destinationsol/CommonDrawer.java index 2bcf27c3a..b9a7c473b 100644 --- a/engine/src/main/java/org/destinationsol/CommonDrawer.java +++ b/engine/src/main/java/org/destinationsol/CommonDrawer.java @@ -33,11 +33,9 @@ import org.destinationsol.ui.DisplayDimensions; import org.destinationsol.ui.ResizeSubscriber; import org.destinationsol.ui.UiDrawer; -import org.terasology.context.annotation.Introspected; import javax.inject.Inject; -@Introspected public class CommonDrawer implements ResizeSubscriber { private final SpriteBatch spriteBatch; private final BitmapFont font; diff --git a/engine/src/main/java/org/destinationsol/ContextWrapper.java b/engine/src/main/java/org/destinationsol/ContextWrapper.java index a126cec40..ad993e805 100644 --- a/engine/src/main/java/org/destinationsol/ContextWrapper.java +++ b/engine/src/main/java/org/destinationsol/ContextWrapper.java @@ -18,14 +18,12 @@ import org.destinationsol.game.context.Context; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.terasology.context.annotation.Introspected; import org.terasology.gestalt.di.BeanContext; import org.terasology.gestalt.di.exceptions.BeanResolutionException; import sun.reflect.generics.reflectiveObjects.NotImplementedException; import javax.inject.Inject; -@Introspected public class ContextWrapper implements Context { private static final Logger logger = LoggerFactory.getLogger(ContextWrapper.class); diff --git a/engine/src/main/java/org/destinationsol/GameOptions.java b/engine/src/main/java/org/destinationsol/GameOptions.java index b498f34d4..4f7c8388f 100644 --- a/engine/src/main/java/org/destinationsol/GameOptions.java +++ b/engine/src/main/java/org/destinationsol/GameOptions.java @@ -20,7 +20,6 @@ import com.google.common.base.Enums; import org.destinationsol.menu.Resolution; import org.destinationsol.menu.ResolutionProvider; -import org.terasology.context.annotation.Introspected; import static java.util.Arrays.asList; diff --git a/engine/src/main/java/org/destinationsol/SolApplication.java b/engine/src/main/java/org/destinationsol/SolApplication.java index ba0a281b0..35e72d573 100644 --- a/engine/src/main/java/org/destinationsol/SolApplication.java +++ b/engine/src/main/java/org/destinationsol/SolApplication.java @@ -35,13 +35,11 @@ import org.destinationsol.entitysystem.EntitySystemManager; import org.destinationsol.entitysystem.SerialisationManager; import org.destinationsol.game.DebugOptions; -import org.destinationsol.game.SaveManager; import org.destinationsol.game.SolGame; import org.destinationsol.game.SolNames; import org.destinationsol.game.WorldConfig; import org.destinationsol.game.console.adapter.ParameterAdapterManager; import org.destinationsol.game.context.Context; -import org.destinationsol.game.context.internal.ContextImpl; import org.destinationsol.game.drawables.DrawableLevel; import org.destinationsol.health.components.Health; import org.destinationsol.location.components.Angle; @@ -68,10 +66,8 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.terasology.context.annotation.API; -import org.terasology.context.annotation.Introspected; import org.terasology.gestalt.di.BeanContext; import org.terasology.gestalt.di.DefaultBeanContext; -import org.terasology.gestalt.entitysystem.component.Component; import org.terasology.gestalt.entitysystem.component.management.ComponentManager; import org.terasology.gestalt.entitysystem.entity.EntityRef; import sun.reflect.generics.reflectiveObjects.NotImplementedException; @@ -80,11 +76,9 @@ import java.io.PrintWriter; import java.io.StringWriter; import java.util.HashSet; -import java.util.Iterator; import java.util.Set; @API -@Introspected public class SolApplication implements ApplicationListener { private static final Logger logger = LoggerFactory.getLogger(SolApplication.class); @@ -134,6 +128,7 @@ public class SolApplication implements ApplicationListener { // TODO: Make this non-static. private static Set resizeSubscribers; + @Inject protected SolApplication() { throw new NotImplementedException(); } diff --git a/engine/src/main/java/org/destinationsol/assets/music/OggMusicManager.java b/engine/src/main/java/org/destinationsol/assets/music/OggMusicManager.java index 8f9f22099..47cdd02e9 100644 --- a/engine/src/main/java/org/destinationsol/assets/music/OggMusicManager.java +++ b/engine/src/main/java/org/destinationsol/assets/music/OggMusicManager.java @@ -23,7 +23,6 @@ import org.json.JSONObject; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.terasology.context.annotation.Introspected; import org.terasology.gestalt.assets.ResourceUrn; import javax.inject.Inject; @@ -39,7 +38,6 @@ * This class does not rely on external updates; once a music set is set to be played, it will play, even looping, * until another is chosen. By default, music does not play concurrently. */ -@Introspected public class OggMusicManager { public static final String NO_MUSIC = ""; public static final String MENU_MUSIC_SET = "menu"; diff --git a/engine/src/main/java/org/destinationsol/assets/sound/OggSoundManager.java b/engine/src/main/java/org/destinationsol/assets/sound/OggSoundManager.java index 3186250ca..104c406b3 100644 --- a/engine/src/main/java/org/destinationsol/assets/sound/OggSoundManager.java +++ b/engine/src/main/java/org/destinationsol/assets/sound/OggSoundManager.java @@ -31,7 +31,6 @@ import org.destinationsol.game.UpdateAwareSystem; import org.destinationsol.game.planet.Planet; import org.destinationsol.game.sound.DebugHintDrawer; -import org.terasology.context.annotation.Introspected; import javax.inject.Inject; import javax.inject.Provider; @@ -57,7 +56,6 @@ * sound will be accepted only when loopTime time units has passed since the beginning of the sound's prior playback, or * the request is from different object. */ -@Introspected public class OggSoundManager implements UpdateAwareSystem { /** * A container for all the sounds that have been so far loaded in the game. Sounds are loaded on as needed basis, diff --git a/engine/src/main/java/org/destinationsol/assets/sound/SpecialSounds.java b/engine/src/main/java/org/destinationsol/assets/sound/SpecialSounds.java index 99c267390..0508b2a73 100644 --- a/engine/src/main/java/org/destinationsol/assets/sound/SpecialSounds.java +++ b/engine/src/main/java/org/destinationsol/assets/sound/SpecialSounds.java @@ -20,12 +20,10 @@ import org.destinationsol.game.DmgType; import org.destinationsol.game.SolGame; import org.destinationsol.game.SolObject; -import org.terasology.context.annotation.Introspected; import javax.inject.Inject; import java.util.Arrays; -@Introspected public class SpecialSounds { public final PlayableSound metalColl; diff --git a/engine/src/main/java/org/destinationsol/asteroids/systems/AsteroidBodyCreationSystem.java b/engine/src/main/java/org/destinationsol/asteroids/systems/AsteroidBodyCreationSystem.java index 2d23e4faa..1274c7901 100644 --- a/engine/src/main/java/org/destinationsol/asteroids/systems/AsteroidBodyCreationSystem.java +++ b/engine/src/main/java/org/destinationsol/asteroids/systems/AsteroidBodyCreationSystem.java @@ -25,7 +25,6 @@ import org.destinationsol.asteroids.components.AsteroidMesh; import org.destinationsol.body.events.BodyCreatedEvent; import org.destinationsol.body.events.GenerateBodyEvent; -import org.destinationsol.common.In; import org.destinationsol.entitysystem.EntitySystemManager; import org.destinationsol.entitysystem.EventReceiver; import org.destinationsol.game.CollisionMeshLoader; @@ -35,7 +34,6 @@ import org.destinationsol.rendering.RenderableElement; import org.destinationsol.rendering.components.Renderable; import org.destinationsol.size.components.Size; -import org.terasology.context.annotation.Introspected; import org.terasology.gestalt.entitysystem.entity.EntityRef; import org.terasology.gestalt.entitysystem.event.EventResult; import org.terasology.gestalt.entitysystem.event.ReceiveEvent; @@ -53,7 +51,6 @@ * Bodies should only be created during an update sent by an {@link UpdateAwareSystem}. Attempting to create a body at * any other time may cause the game to crash. */ -@Introspected public class AsteroidBodyCreationSystem implements EventReceiver { private static final float DENSITY = 10f; @@ -66,6 +63,11 @@ public class AsteroidBodyCreationSystem implements EventReceiver { private final CollisionMeshLoader collisionMeshLoader = new CollisionMeshLoader("engine:asteroids"); + @Inject + public AsteroidBodyCreationSystem(){ + + } + @ReceiveEvent(components = {AsteroidMesh.class, Size.class, Position.class, Angle.class, Renderable.class}) public EventResult onGenerateBody(GenerateBodyEvent event, EntityRef entity) { diff --git a/engine/src/main/java/org/destinationsol/body/systems/BodyHandlerSystem.java b/engine/src/main/java/org/destinationsol/body/systems/BodyHandlerSystem.java index 73d73e48f..7802db1a9 100644 --- a/engine/src/main/java/org/destinationsol/body/systems/BodyHandlerSystem.java +++ b/engine/src/main/java/org/destinationsol/body/systems/BodyHandlerSystem.java @@ -20,7 +20,6 @@ import org.destinationsol.body.events.BodyCreatedEvent; import org.destinationsol.body.events.BodyUpdateEvent; import org.destinationsol.body.events.GenerateBodyEvent; -import org.destinationsol.common.In; import org.destinationsol.entitysystem.EntitySystemManager; import org.destinationsol.entitysystem.EventReceiver; import org.destinationsol.force.components.ImmuneToForce; @@ -34,7 +33,6 @@ import org.destinationsol.location.events.VelocityUpdateEvent; import org.destinationsol.removal.events.DeletionEvent; import org.destinationsol.removal.systems.DestructionSystem; -import org.terasology.context.annotation.Introspected; import org.terasology.gestalt.entitysystem.entity.EntityRef; import org.terasology.gestalt.entitysystem.event.Before; import org.terasology.gestalt.entitysystem.event.EventResult; @@ -51,12 +49,15 @@ * Bodies should only be created during an update sent by an {@link UpdateAwareSystem}. Attempting to create a body at * any other time may cause the game to crash. */ -@Introspected public class BodyHandlerSystem implements EventReceiver { @Inject EntitySystemManager entitySystemManager; + @Inject + public BodyHandlerSystem() { + } + private HashMap referenceToBodyObjects = new HashMap<>(); /** diff --git a/engine/src/main/java/org/destinationsol/entitysystem/ComponentSystemManager.java b/engine/src/main/java/org/destinationsol/entitysystem/ComponentSystemManager.java index c8ddf206b..6b92cc43e 100644 --- a/engine/src/main/java/org/destinationsol/entitysystem/ComponentSystemManager.java +++ b/engine/src/main/java/org/destinationsol/entitysystem/ComponentSystemManager.java @@ -18,13 +18,11 @@ import com.google.common.collect.Lists; import org.destinationsol.game.context.Context; import org.destinationsol.util.InjectionHelper; -import org.terasology.context.annotation.Introspected; import org.terasology.gestalt.module.ModuleEnvironment; import javax.inject.Inject; import java.util.ArrayList; -@Introspected public class ComponentSystemManager { private ArrayList componentSystems = Lists.newArrayList(); diff --git a/engine/src/main/java/org/destinationsol/entitysystem/EntitySystemManager.java b/engine/src/main/java/org/destinationsol/entitysystem/EntitySystemManager.java index afbdeef1c..25801b5d4 100644 --- a/engine/src/main/java/org/destinationsol/entitysystem/EntitySystemManager.java +++ b/engine/src/main/java/org/destinationsol/entitysystem/EntitySystemManager.java @@ -16,9 +16,6 @@ package org.destinationsol.entitysystem; import com.google.common.collect.Lists; -import org.destinationsol.game.context.Context; -import org.destinationsol.util.InjectionHelper; -import org.terasology.context.annotation.Introspected; import org.terasology.gestalt.entitysystem.component.Component; import org.terasology.gestalt.entitysystem.component.management.ComponentManager; import org.terasology.gestalt.entitysystem.component.store.ArrayComponentStore; @@ -38,7 +35,6 @@ import java.lang.reflect.Modifier; import java.util.List; -@Introspected public class EntitySystemManager { private static EntityManager entityManager; diff --git a/engine/src/main/java/org/destinationsol/entitysystem/SerialisationManager.java b/engine/src/main/java/org/destinationsol/entitysystem/SerialisationManager.java index d5a2e4ad6..f66494f14 100644 --- a/engine/src/main/java/org/destinationsol/entitysystem/SerialisationManager.java +++ b/engine/src/main/java/org/destinationsol/entitysystem/SerialisationManager.java @@ -15,31 +15,28 @@ */ package org.destinationsol.entitysystem; -import java.io.File; -import java.io.FileInputStream; -import java.io.FileOutputStream; -import java.io.IOException; -import java.lang.reflect.Field; -import java.util.Collection; -import java.util.HashMap; -import java.util.Map; - import com.google.common.collect.Lists; import com.google.protobuf.ByteString; - import org.destinationsol.game.SaveManager; import org.destinationsol.modules.ModuleManager; import org.destinationsol.protobuf.EntityData; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.terasology.context.annotation.Introspected; import org.terasology.gestalt.assets.ResourceUrn; import org.terasology.gestalt.entitysystem.component.Component; import org.terasology.gestalt.entitysystem.entity.EntityManager; import org.terasology.gestalt.entitysystem.entity.EntityRef; + import javax.inject.Inject; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; +import java.lang.reflect.Field; +import java.util.Collection; +import java.util.HashMap; +import java.util.Map; -@Introspected public final class SerialisationManager { private static final Logger logger = LoggerFactory.getLogger(SerialisationManager.class); diff --git a/engine/src/main/java/org/destinationsol/files/HullConfigManager.java b/engine/src/main/java/org/destinationsol/files/HullConfigManager.java index 992154c9e..a653fe79d 100644 --- a/engine/src/main/java/org/destinationsol/files/HullConfigManager.java +++ b/engine/src/main/java/org/destinationsol/files/HullConfigManager.java @@ -30,7 +30,6 @@ import org.destinationsol.modules.ModuleManager; import org.json.JSONArray; import org.json.JSONObject; -import org.terasology.context.annotation.Introspected; import javax.inject.Inject; import java.lang.reflect.Method; @@ -40,7 +39,6 @@ import java.util.Locale; import java.util.Map; -@Introspected public final class HullConfigManager { private final ItemManager itemManager; private final AbilityCommonConfigs abilityCommonConfigs; diff --git a/engine/src/main/java/org/destinationsol/force/systems/ImpulseHandlingSystem.java b/engine/src/main/java/org/destinationsol/force/systems/ImpulseHandlingSystem.java index 7c381d8b0..943268e47 100644 --- a/engine/src/main/java/org/destinationsol/force/systems/ImpulseHandlingSystem.java +++ b/engine/src/main/java/org/destinationsol/force/systems/ImpulseHandlingSystem.java @@ -16,14 +16,12 @@ package org.destinationsol.force.systems; import org.destinationsol.body.components.BodyLinked; -import org.destinationsol.common.In; import org.destinationsol.entitysystem.EntitySystemManager; import org.destinationsol.entitysystem.EventReceiver; import org.destinationsol.force.components.Durability; import org.destinationsol.force.events.ImpulseEvent; import org.destinationsol.health.components.Health; import org.destinationsol.health.events.DamageEvent; -import org.terasology.context.annotation.Introspected; import org.terasology.gestalt.entitysystem.entity.EntityRef; import org.terasology.gestalt.entitysystem.event.EventResult; import org.terasology.gestalt.entitysystem.event.ReceiveEvent; @@ -34,12 +32,16 @@ * When this receives an {@link ImpulseEvent}, it sends a {@link DamageEvent} to the entity that is scaled according to * the entity's mass and durability. */ -@Introspected public class ImpulseHandlingSystem implements EventReceiver { @Inject EntitySystemManager entitySystemManager; + @Inject + public ImpulseHandlingSystem() { + + } + @ReceiveEvent(components = {Health.class, BodyLinked.class}) public EventResult onImpulse(ImpulseEvent event, EntityRef entity) { diff --git a/engine/src/main/java/org/destinationsol/game/AbilityCommonConfigs.java b/engine/src/main/java/org/destinationsol/game/AbilityCommonConfigs.java index 15265da0e..58de95e12 100644 --- a/engine/src/main/java/org/destinationsol/game/AbilityCommonConfigs.java +++ b/engine/src/main/java/org/destinationsol/game/AbilityCommonConfigs.java @@ -16,12 +16,11 @@ package org.destinationsol.game; import org.destinationsol.assets.Assets; -import org.destinationsol.assets.sound.OggSoundManager; import org.destinationsol.assets.json.Json; import org.destinationsol.assets.json.Validator; +import org.destinationsol.assets.sound.OggSoundManager; import org.destinationsol.game.particle.EffectTypes; import org.json.JSONObject; -import org.terasology.context.annotation.Introspected; import org.terasology.gestalt.assets.ResourceUrn; import javax.inject.Inject; @@ -29,7 +28,6 @@ import java.util.Locale; import java.util.Map; -@Introspected public class AbilityCommonConfigs { public final Map abilityConfigs; diff --git a/engine/src/main/java/org/destinationsol/game/BeaconHandler.java b/engine/src/main/java/org/destinationsol/game/BeaconHandler.java index a196bb077..e390da7ae 100644 --- a/engine/src/main/java/org/destinationsol/game/BeaconHandler.java +++ b/engine/src/main/java/org/destinationsol/game/BeaconHandler.java @@ -16,9 +16,7 @@ package org.destinationsol.game; import com.badlogic.gdx.graphics.Color; -import com.badlogic.gdx.graphics.g2d.TextureAtlas; import com.badlogic.gdx.math.Vector2; -import org.destinationsol.assets.Assets; import org.destinationsol.common.SolMath; import org.destinationsol.game.drawables.Drawable; import org.destinationsol.game.drawables.DrawableLevel; @@ -30,13 +28,11 @@ import org.destinationsol.game.planet.PlanetBind; import org.destinationsol.game.ship.FarShip; import org.destinationsol.game.ship.SolShip; -import org.terasology.context.annotation.Introspected; import javax.inject.Inject; import java.util.ArrayList; import java.util.List; -@Introspected public class BeaconHandler implements UpdateAwareSystem { private static final float TEX_SZ = .5f; private static final float ROT_SPD = 30f; diff --git a/engine/src/main/java/org/destinationsol/game/FactionManager.java b/engine/src/main/java/org/destinationsol/game/FactionManager.java index d12549b90..886a04f99 100644 --- a/engine/src/main/java/org/destinationsol/game/FactionManager.java +++ b/engine/src/main/java/org/destinationsol/game/FactionManager.java @@ -21,12 +21,10 @@ import org.destinationsol.game.input.Pilot; import org.destinationsol.game.projectile.Projectile; import org.destinationsol.game.ship.SolShip; -import org.terasology.context.annotation.Introspected; import javax.inject.Inject; import java.util.List; -@Introspected public class FactionManager { private final MyRayBack myRayBack; diff --git a/engine/src/main/java/org/destinationsol/game/GalaxyFiller.java b/engine/src/main/java/org/destinationsol/game/GalaxyFiller.java index 39d54b2da..307cbcbef 100644 --- a/engine/src/main/java/org/destinationsol/game/GalaxyFiller.java +++ b/engine/src/main/java/org/destinationsol/game/GalaxyFiller.java @@ -39,12 +39,10 @@ import org.destinationsol.game.ship.FarShip; import org.destinationsol.game.ship.hulls.HullConfig; import org.json.JSONObject; -import org.terasology.context.annotation.Introspected; import javax.inject.Inject; import java.util.ArrayList; -@Introspected public class GalaxyFiller { private static final float STATION_CONSUME_SECTOR = 45f; private final HullConfigManager hullConfigManager; diff --git a/engine/src/main/java/org/destinationsol/game/GameColors.java b/engine/src/main/java/org/destinationsol/game/GameColors.java index 7c220b52b..9ab562f93 100644 --- a/engine/src/main/java/org/destinationsol/game/GameColors.java +++ b/engine/src/main/java/org/destinationsol/game/GameColors.java @@ -19,13 +19,11 @@ import org.destinationsol.assets.json.Validator; import org.destinationsol.common.SolColorUtil; import org.json.JSONObject; -import org.terasology.context.annotation.Introspected; import javax.inject.Inject; import java.util.HashMap; import java.util.Map; -@Introspected public class GameColors { public final Color fire; diff --git a/engine/src/main/java/org/destinationsol/game/GameDrawer.java b/engine/src/main/java/org/destinationsol/game/GameDrawer.java index 0c212c1d2..57935e747 100644 --- a/engine/src/main/java/org/destinationsol/game/GameDrawer.java +++ b/engine/src/main/java/org/destinationsol/game/GameDrawer.java @@ -22,11 +22,9 @@ import com.badlogic.gdx.math.Vector2; import org.destinationsol.CommonDrawer; import org.destinationsol.assets.Assets; -import org.terasology.context.annotation.Introspected; import javax.inject.Inject; -@Introspected public class GameDrawer { public final TextureAtlas.AtlasRegion debugWhiteTexture; private final CommonDrawer myDrawer; diff --git a/engine/src/main/java/org/destinationsol/game/GridDrawer.java b/engine/src/main/java/org/destinationsol/game/GridDrawer.java index 9d49dd4de..02942d77f 100644 --- a/engine/src/main/java/org/destinationsol/game/GridDrawer.java +++ b/engine/src/main/java/org/destinationsol/game/GridDrawer.java @@ -19,11 +19,9 @@ import com.badlogic.gdx.graphics.g2d.TextureAtlas; import com.badlogic.gdx.math.Vector2; import org.destinationsol.common.SolColor; -import org.terasology.context.annotation.Introspected; import javax.inject.Inject; -@Introspected public class GridDrawer { @Inject public GridDrawer() { diff --git a/engine/src/main/java/org/destinationsol/game/MapDrawer.java b/engine/src/main/java/org/destinationsol/game/MapDrawer.java index 5526ce7bf..8650ff6be 100644 --- a/engine/src/main/java/org/destinationsol/game/MapDrawer.java +++ b/engine/src/main/java/org/destinationsol/game/MapDrawer.java @@ -42,13 +42,11 @@ import org.destinationsol.ui.DisplayDimensions; import org.destinationsol.ui.UiDrawer; import org.destinationsol.ui.Waypoint; -import org.terasology.context.annotation.Introspected; import javax.inject.Inject; import java.util.ArrayList; import java.util.List; -@Introspected public class MapDrawer implements UpdateAwareSystem{ public static final float MIN_ZOOM = 8f; private static final float MUL_FACTOR = 2f; diff --git a/engine/src/main/java/org/destinationsol/game/MountDetectDrawer.java b/engine/src/main/java/org/destinationsol/game/MountDetectDrawer.java index 810964a7d..8840bb37f 100644 --- a/engine/src/main/java/org/destinationsol/game/MountDetectDrawer.java +++ b/engine/src/main/java/org/destinationsol/game/MountDetectDrawer.java @@ -18,14 +18,11 @@ import com.badlogic.gdx.graphics.g2d.TextureAtlas; import com.badlogic.gdx.math.Vector2; import org.destinationsol.assets.Assets; -import org.destinationsol.common.In; import org.destinationsol.common.SolColor; import org.destinationsol.game.ship.SolShip; -import org.terasology.context.annotation.Introspected; import javax.inject.Inject; -@Introspected public class MountDetectDrawer implements UpdateAwareSystem { private final Vector2 myNePos; private final TextureAtlas.AtlasRegion myTexture; diff --git a/engine/src/main/java/org/destinationsol/game/ObjectManager.java b/engine/src/main/java/org/destinationsol/game/ObjectManager.java index e7f05ee43..dfa7174c0 100644 --- a/engine/src/main/java/org/destinationsol/game/ObjectManager.java +++ b/engine/src/main/java/org/destinationsol/game/ObjectManager.java @@ -26,7 +26,6 @@ import org.destinationsol.game.drawables.DrawableManager; import org.destinationsol.game.drawables.FarDrawable; import org.destinationsol.game.ship.FarShip; -import org.terasology.context.annotation.Introspected; import javax.inject.Inject; import java.util.ArrayList; @@ -35,7 +34,6 @@ import java.util.List; import java.util.function.Consumer; -@Introspected public class ObjectManager implements UpdateAwareSystem { private static final float MAX_RADIUS_RECALC_AWAIT = 1f; private final List myObjs; diff --git a/engine/src/main/java/org/destinationsol/game/RubbleBuilder.java b/engine/src/main/java/org/destinationsol/game/RubbleBuilder.java index 1932f61a0..50ab30910 100644 --- a/engine/src/main/java/org/destinationsol/game/RubbleBuilder.java +++ b/engine/src/main/java/org/destinationsol/game/RubbleBuilder.java @@ -25,13 +25,11 @@ import org.destinationsol.game.drawables.Drawable; import org.destinationsol.game.drawables.DrawableLevel; import org.destinationsol.game.ship.ShipBuilder; -import org.terasology.context.annotation.Introspected; import javax.inject.Inject; import java.util.ArrayList; import java.util.List; -@Introspected public class RubbleBuilder { public static final float MIN_SCALE = .07f; public static final float MAX_SCALE = .12f; diff --git a/engine/src/main/java/org/destinationsol/game/SolCam.java b/engine/src/main/java/org/destinationsol/game/SolCam.java index 52a658ea8..55211335c 100644 --- a/engine/src/main/java/org/destinationsol/game/SolCam.java +++ b/engine/src/main/java/org/destinationsol/game/SolCam.java @@ -22,7 +22,6 @@ import com.badlogic.gdx.math.Vector3; import com.badlogic.gdx.utils.viewport.ScreenViewport; import org.destinationsol.Const; -import org.destinationsol.SolApplication; import org.destinationsol.common.SolColor; import org.destinationsol.common.SolMath; import org.destinationsol.common.SolRandom; @@ -31,11 +30,9 @@ import org.destinationsol.game.ship.SolShip; import org.destinationsol.game.ship.hulls.Hull; import org.destinationsol.ui.DisplayDimensions; -import org.terasology.context.annotation.Introspected; import javax.inject.Inject; -@Introspected public class SolCam implements UpdateAwareSystem { public static final float CAM_ROT_SPD = 90f; private static final float VIEWPORT_HEIGHT = 5f; diff --git a/engine/src/main/java/org/destinationsol/game/SolContactListener.java b/engine/src/main/java/org/destinationsol/game/SolContactListener.java index 3df4de3d3..208ce01a7 100644 --- a/engine/src/main/java/org/destinationsol/game/SolContactListener.java +++ b/engine/src/main/java/org/destinationsol/game/SolContactListener.java @@ -20,20 +20,16 @@ import com.badlogic.gdx.physics.box2d.ContactImpulse; import com.badlogic.gdx.physics.box2d.ContactListener; import com.badlogic.gdx.physics.box2d.Manifold; -import org.destinationsol.common.Immutable; -import org.destinationsol.common.In; import org.destinationsol.common.SolMath; import org.destinationsol.entitysystem.EntitySystemManager; import org.destinationsol.force.events.ContactEvent; import org.destinationsol.force.events.ImpulseEvent; import org.destinationsol.game.projectile.Projectile; -import org.terasology.context.annotation.Introspected; import org.terasology.gestalt.entitysystem.entity.EntityRef; import javax.inject.Inject; import javax.inject.Provider; -@Introspected public class SolContactListener implements ContactListener { @Inject diff --git a/engine/src/main/java/org/destinationsol/game/SolGame.java b/engine/src/main/java/org/destinationsol/game/SolGame.java index 17eb418ea..9f04e3db2 100644 --- a/engine/src/main/java/org/destinationsol/game/SolGame.java +++ b/engine/src/main/java/org/destinationsol/game/SolGame.java @@ -17,9 +17,7 @@ import com.badlogic.gdx.graphics.Color; import com.badlogic.gdx.math.Vector2; -import com.badlogic.gdx.physics.box2d.World; import com.badlogic.gdx.utils.Timer; -import org.destinationsol.CommonDrawer; import org.destinationsol.Const; import org.destinationsol.GameOptions; import org.destinationsol.SolApplication; @@ -43,7 +41,6 @@ import org.destinationsol.game.item.LootBuilder; import org.destinationsol.game.item.MercItem; import org.destinationsol.game.item.SolItem; -import org.destinationsol.game.particle.EffectTypes; import org.destinationsol.game.particle.PartMan; import org.destinationsol.game.particle.SpecialEffects; import org.destinationsol.game.planet.Planet; @@ -62,7 +59,6 @@ import org.destinationsol.ui.UiDrawer; import org.destinationsol.ui.Waypoint; import org.destinationsol.util.InjectionHelper; -import org.terasology.context.annotation.Introspected; import org.terasology.gestalt.entitysystem.entity.EntityRef; import javax.inject.Inject; @@ -72,7 +68,6 @@ import java.util.SortedMap; import java.util.TreeMap; -@Introspected public class SolGame { protected boolean isTutorial; @Inject @@ -145,6 +140,7 @@ public class SolGame { private EntitySystemManager entitySystemManager; + @Inject public SolGame() { this(false); } diff --git a/engine/src/main/java/org/destinationsol/game/StarPort.java b/engine/src/main/java/org/destinationsol/game/StarPort.java index 05628bfde..0b98990fc 100644 --- a/engine/src/main/java/org/destinationsol/game/StarPort.java +++ b/engine/src/main/java/org/destinationsol/game/StarPort.java @@ -37,7 +37,6 @@ import org.destinationsol.game.ship.FarShip; import org.destinationsol.game.ship.ForceBeacon; import org.destinationsol.game.ship.SolShip; -import org.terasology.context.annotation.Introspected; import javax.inject.Inject; import java.util.ArrayList; @@ -228,7 +227,6 @@ public Planet getToPlanet() { return toPlanet; } - @Introspected public static class Builder { public static final float FLOW_DIST = .26f * SIZE; private final CollisionMeshLoader myLoader; diff --git a/engine/src/main/java/org/destinationsol/game/asteroid/AsteroidBuilder.java b/engine/src/main/java/org/destinationsol/game/asteroid/AsteroidBuilder.java index 99a916c32..d4c10fec0 100644 --- a/engine/src/main/java/org/destinationsol/game/asteroid/AsteroidBuilder.java +++ b/engine/src/main/java/org/destinationsol/game/asteroid/AsteroidBuilder.java @@ -33,13 +33,11 @@ import org.destinationsol.game.drawables.DrawableLevel; import org.destinationsol.game.drawables.RectSprite; import org.destinationsol.game.drawables.SpriteManager; -import org.terasology.context.annotation.Introspected; import javax.inject.Inject; import java.util.ArrayList; import java.util.List; -@Introspected public class AsteroidBuilder { private static final float DENSITY = 10f; private static final float MAX_A_ROT_SPD = .5f; diff --git a/engine/src/main/java/org/destinationsol/game/chunk/ChunkManager.java b/engine/src/main/java/org/destinationsol/game/chunk/ChunkManager.java index 9734f94b1..2a1afc7e2 100644 --- a/engine/src/main/java/org/destinationsol/game/chunk/ChunkManager.java +++ b/engine/src/main/java/org/destinationsol/game/chunk/ChunkManager.java @@ -22,13 +22,11 @@ import org.destinationsol.game.RemoveController; import org.destinationsol.game.SolGame; import org.destinationsol.game.UpdateAwareSystem; -import org.terasology.context.annotation.Introspected; import javax.inject.Inject; import java.util.HashSet; import java.util.Set; -@Introspected public class ChunkManager implements UpdateAwareSystem { private static final int MAX_FILL_DIST = 1; private static final int MIN_REMOVE_DIST = MAX_FILL_DIST + 2; diff --git a/engine/src/main/java/org/destinationsol/game/drawables/DrawableDebugger.java b/engine/src/main/java/org/destinationsol/game/drawables/DrawableDebugger.java index 78e61b5f0..7af33ad1b 100644 --- a/engine/src/main/java/org/destinationsol/game/drawables/DrawableDebugger.java +++ b/engine/src/main/java/org/destinationsol/game/drawables/DrawableDebugger.java @@ -25,13 +25,11 @@ import org.destinationsol.game.UpdateAwareSystem; import org.destinationsol.ui.FontSize; import org.destinationsol.ui.UiDrawer; -import org.terasology.context.annotation.Introspected; import javax.inject.Inject; import java.util.HashSet; import java.util.Set; -@Introspected public class DrawableDebugger implements UpdateAwareSystem { private static final float TEX_SZ = 0.1f; private static final float GAP = 0.01f; diff --git a/engine/src/main/java/org/destinationsol/game/drawables/DrawableManager.java b/engine/src/main/java/org/destinationsol/game/drawables/DrawableManager.java index 33f29c86e..c2ee699d5 100644 --- a/engine/src/main/java/org/destinationsol/game/drawables/DrawableManager.java +++ b/engine/src/main/java/org/destinationsol/game/drawables/DrawableManager.java @@ -30,7 +30,6 @@ import org.destinationsol.game.SolCam; import org.destinationsol.game.SolGame; import org.destinationsol.game.SolObject; -import org.terasology.context.annotation.Introspected; import javax.inject.Inject; import java.util.ArrayList; @@ -39,7 +38,6 @@ import java.util.List; import java.util.Set; -@Introspected public class DrawableManager { private final DrawableLevel[] drawableLevels; private final ArrayList>> drawables; diff --git a/engine/src/main/java/org/destinationsol/game/farBg/FarBackgroundManagerOld.java b/engine/src/main/java/org/destinationsol/game/farBg/FarBackgroundManagerOld.java index 1826b0693..c74e4a889 100644 --- a/engine/src/main/java/org/destinationsol/game/farBg/FarBackgroundManagerOld.java +++ b/engine/src/main/java/org/destinationsol/game/farBg/FarBackgroundManagerOld.java @@ -29,12 +29,10 @@ import org.destinationsol.game.SolCam; import org.destinationsol.game.SolGame; import org.destinationsol.game.planet.Planet; -import org.terasology.context.annotation.Introspected; import javax.inject.Inject; import java.util.ArrayList; -@Introspected public class FarBackgroundManagerOld { private final TextureAtlas.AtlasRegion nebulaTexture; private final ArrayList stars = new ArrayList<>(); diff --git a/engine/src/main/java/org/destinationsol/game/item/ItemManager.java b/engine/src/main/java/org/destinationsol/game/item/ItemManager.java index be5363a2d..caf4ff912 100644 --- a/engine/src/main/java/org/destinationsol/game/item/ItemManager.java +++ b/engine/src/main/java/org/destinationsol/game/item/ItemManager.java @@ -23,14 +23,12 @@ import org.destinationsol.game.GameColors; import org.destinationsol.game.particle.EffectTypes; import org.destinationsol.game.projectile.ProjectileConfigs; -import org.terasology.context.annotation.Introspected; import javax.inject.Inject; import java.util.ArrayList; import java.util.HashMap; import java.util.List; -@Introspected public class ItemManager { public final ProjectileConfigs projConfigs; public final TextureAtlas.AtlasRegion moneyIcon; diff --git a/engine/src/main/java/org/destinationsol/game/item/LootBuilder.java b/engine/src/main/java/org/destinationsol/game/item/LootBuilder.java index 7dab538dc..60eb9d148 100644 --- a/engine/src/main/java/org/destinationsol/game/item/LootBuilder.java +++ b/engine/src/main/java/org/destinationsol/game/item/LootBuilder.java @@ -30,13 +30,11 @@ import org.destinationsol.game.drawables.SpriteManager; import org.destinationsol.game.particle.LightSource; import org.destinationsol.game.ship.SolShip; -import org.terasology.context.annotation.Introspected; import javax.inject.Inject; import java.util.ArrayList; import java.util.List; -@Introspected public class LootBuilder { @Inject diff --git a/engine/src/main/java/org/destinationsol/game/particle/EffectTypes.java b/engine/src/main/java/org/destinationsol/game/particle/EffectTypes.java index 87a17c1cf..d6159d7d0 100644 --- a/engine/src/main/java/org/destinationsol/game/particle/EffectTypes.java +++ b/engine/src/main/java/org/destinationsol/game/particle/EffectTypes.java @@ -15,13 +15,10 @@ */ package org.destinationsol.game.particle; -import org.terasology.context.annotation.Introspected; - import javax.inject.Inject; import java.util.HashMap; import java.util.Map; -@Introspected public class EffectTypes { private final Map types; diff --git a/engine/src/main/java/org/destinationsol/game/particle/PartMan.java b/engine/src/main/java/org/destinationsol/game/particle/PartMan.java index 921983b93..f41caa3c6 100644 --- a/engine/src/main/java/org/destinationsol/game/particle/PartMan.java +++ b/engine/src/main/java/org/destinationsol/game/particle/PartMan.java @@ -17,7 +17,6 @@ import com.badlogic.gdx.graphics.g2d.TextureAtlas; import com.badlogic.gdx.math.Vector2; -import org.destinationsol.common.In; import org.destinationsol.common.SolColor; import org.destinationsol.common.SolMath; import org.destinationsol.common.SolRandom; @@ -30,12 +29,10 @@ import org.destinationsol.game.item.Shield; import org.destinationsol.game.ship.SolShip; import org.destinationsol.game.ship.hulls.Hull; -import org.terasology.context.annotation.Introspected; import javax.inject.Inject; import java.util.ArrayList; -@Introspected public class PartMan { public static final float EXPL_LIGHT_MAX_SZ = .4f; public static final float EXPL_LIGHT_MAX_FADE_TIME = .8f; diff --git a/engine/src/main/java/org/destinationsol/game/particle/SpecialEffects.java b/engine/src/main/java/org/destinationsol/game/particle/SpecialEffects.java index 9663ffa15..1f6d2a7e9 100644 --- a/engine/src/main/java/org/destinationsol/game/particle/SpecialEffects.java +++ b/engine/src/main/java/org/destinationsol/game/particle/SpecialEffects.java @@ -21,13 +21,11 @@ import org.destinationsol.game.SolGame; import org.destinationsol.game.drawables.DrawableLevel; import org.json.JSONObject; -import org.terasology.context.annotation.Introspected; import javax.inject.Inject; import java.util.ArrayList; import java.util.List; -@Introspected public class SpecialEffects { public final EffectConfig starPortFlow; diff --git a/engine/src/main/java/org/destinationsol/game/planet/PlanetManager.java b/engine/src/main/java/org/destinationsol/game/planet/PlanetManager.java index 2da0c6024..c30c6b99f 100644 --- a/engine/src/main/java/org/destinationsol/game/planet/PlanetManager.java +++ b/engine/src/main/java/org/destinationsol/game/planet/PlanetManager.java @@ -36,13 +36,11 @@ import org.destinationsol.game.ship.SolShip; import org.destinationsol.game.ship.hulls.Hull; import org.destinationsol.game.ship.hulls.HullConfig; -import org.terasology.context.annotation.Introspected; import javax.inject.Inject; import java.util.ArrayList; import java.util.List; -@Introspected public class PlanetManager implements UpdateAwareSystem { private final ArrayList systems; private final ArrayList planets; diff --git a/engine/src/main/java/org/destinationsol/game/screens/GameScreens.java b/engine/src/main/java/org/destinationsol/game/screens/GameScreens.java index 7abab5776..27c3069da 100644 --- a/engine/src/main/java/org/destinationsol/game/screens/GameScreens.java +++ b/engine/src/main/java/org/destinationsol/game/screens/GameScreens.java @@ -18,11 +18,9 @@ import org.destinationsol.SolApplication; import org.destinationsol.game.context.Context; import org.destinationsol.ui.SolLayouts; -import org.terasology.context.annotation.Introspected; import javax.inject.Inject; -@Introspected public class GameScreens { public final MainGameScreen mainGameScreen; public final MapScreen mapScreen; diff --git a/engine/src/main/java/org/destinationsol/game/screens/RightPaneLayout.java b/engine/src/main/java/org/destinationsol/game/screens/RightPaneLayout.java index de0c88fc1..b6a5433a4 100644 --- a/engine/src/main/java/org/destinationsol/game/screens/RightPaneLayout.java +++ b/engine/src/main/java/org/destinationsol/game/screens/RightPaneLayout.java @@ -17,11 +17,9 @@ import com.badlogic.gdx.math.Rectangle; import org.destinationsol.ui.DisplayDimensions; -import org.terasology.context.annotation.Introspected; import javax.inject.Inject; -@Introspected public class RightPaneLayout { private final float btnH; private final float btnW; diff --git a/engine/src/main/java/org/destinationsol/game/ship/ShipBuilder.java b/engine/src/main/java/org/destinationsol/game/ship/ShipBuilder.java index bfc8b8b02..521493e37 100644 --- a/engine/src/main/java/org/destinationsol/game/ship/ShipBuilder.java +++ b/engine/src/main/java/org/destinationsol/game/ship/ShipBuilder.java @@ -55,13 +55,11 @@ import org.destinationsol.game.ship.hulls.Hull; import org.destinationsol.game.ship.hulls.HullConfig; import org.json.JSONObject; -import org.terasology.context.annotation.Introspected; import javax.inject.Inject; import java.util.ArrayList; import java.util.List; -@Introspected public class ShipBuilder { public static final float SHIP_DENSITY = 3f; public static final float AVG_BATTLE_TIME = 30f; diff --git a/engine/src/main/java/org/destinationsol/health/systems/DamageSystem.java b/engine/src/main/java/org/destinationsol/health/systems/DamageSystem.java index e79719bb7..c31af895e 100644 --- a/engine/src/main/java/org/destinationsol/health/systems/DamageSystem.java +++ b/engine/src/main/java/org/destinationsol/health/systems/DamageSystem.java @@ -15,13 +15,11 @@ */ package org.destinationsol.health.systems; -import org.destinationsol.common.In; import org.destinationsol.entitysystem.EntitySystemManager; -import org.destinationsol.health.components.Health; import org.destinationsol.entitysystem.EventReceiver; +import org.destinationsol.health.components.Health; import org.destinationsol.health.events.DamageEvent; import org.destinationsol.removal.events.ZeroHealthEvent; -import org.terasology.context.annotation.Introspected; import org.terasology.gestalt.entitysystem.entity.EntityRef; import org.terasology.gestalt.entitysystem.event.EventResult; import org.terasology.gestalt.entitysystem.event.ReceiveEvent; @@ -33,12 +31,16 @@ * lowers its health by that amount. If it would lower the health to less than zero, it's reduced to zero instead. If * the damage is a negative amount, nothing happens. */ -@Introspected public class DamageSystem implements EventReceiver { @Inject EntitySystemManager entitySystemManager; + @Inject + public DamageSystem() { + + } + /** * Handles a damage event done to an entity with a Health component. * diff --git a/engine/src/main/java/org/destinationsol/location/systems/LocationSystem.java b/engine/src/main/java/org/destinationsol/location/systems/LocationSystem.java index 453d88ac6..b697c0051 100644 --- a/engine/src/main/java/org/destinationsol/location/systems/LocationSystem.java +++ b/engine/src/main/java/org/destinationsol/location/systems/LocationSystem.java @@ -22,18 +22,23 @@ import org.destinationsol.location.events.AngleUpdateEvent; import org.destinationsol.location.events.PositionUpdateEvent; import org.destinationsol.location.events.VelocityUpdateEvent; -import org.terasology.context.annotation.Introspected; import org.terasology.gestalt.entitysystem.entity.EntityRef; import org.terasology.gestalt.entitysystem.event.EventResult; import org.terasology.gestalt.entitysystem.event.ReceiveEvent; +import javax.inject.Inject; + /** * This system updates the location of an entity with a {@link Position}, {@link Angle}, or {@link Velocity} component * when it receives a {@link PositionUpdateEvent}, {@link AngleUpdateEvent}, or {@link VelocityUpdateEvent}, respectively. */ -@Introspected public class LocationSystem implements EventReceiver { + @Inject + public LocationSystem() { + + } + @ReceiveEvent(components = Position.class) public EventResult onPositionUpdate(PositionUpdateEvent event, EntityRef entity) { if (entity.hasComponent(Position.class)) { diff --git a/engine/src/main/java/org/destinationsol/menu/MenuLayout.java b/engine/src/main/java/org/destinationsol/menu/MenuLayout.java index 01ba91102..66392e098 100644 --- a/engine/src/main/java/org/destinationsol/menu/MenuLayout.java +++ b/engine/src/main/java/org/destinationsol/menu/MenuLayout.java @@ -18,11 +18,9 @@ import com.badlogic.gdx.math.Rectangle; import org.destinationsol.ui.DisplayDimensions; -import org.terasology.context.annotation.Introspected; import javax.inject.Inject; -@Introspected public class MenuLayout { public static final float BG_BORDER = .03f; private static final int numberOfRowsTotal = 5; diff --git a/engine/src/main/java/org/destinationsol/modules/ModuleManager.java b/engine/src/main/java/org/destinationsol/modules/ModuleManager.java index a34baa591..8ba5d4fa0 100644 --- a/engine/src/main/java/org/destinationsol/modules/ModuleManager.java +++ b/engine/src/main/java/org/destinationsol/modules/ModuleManager.java @@ -19,10 +19,10 @@ import com.google.common.reflect.Reflection; import org.destinationsol.assets.AssetHelper; import org.destinationsol.assets.Assets; -import org.destinationsol.assets.music.OggMusic; -import org.destinationsol.assets.sound.OggSound; import org.destinationsol.assets.emitters.Emitter; import org.destinationsol.assets.json.Json; +import org.destinationsol.assets.music.OggMusic; +import org.destinationsol.assets.sound.OggSound; import org.destinationsol.assets.textures.DSTexture; import org.reflections.Reflections; import org.reflections.scanners.SubTypesScanner; @@ -31,7 +31,6 @@ import org.reflections.util.ConfigurationBuilder; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.terasology.context.annotation.Introspected; import org.terasology.gestalt.assets.ResourceUrn; import org.terasology.gestalt.module.Module; import org.terasology.gestalt.module.ModuleEnvironment; @@ -47,8 +46,8 @@ import org.terasology.gestalt.module.sandbox.StandardPermissionProviderFactory; import org.terasology.gestalt.naming.Name; import org.terasology.gestalt.naming.Version; -import org.terasology.nui.UIWidget; +import javax.inject.Inject; import java.io.File; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.ReflectPermission; @@ -60,7 +59,6 @@ /** * A class used for loading and managing modules in Destination Sol. */ -@Introspected public class ModuleManager { private static final Logger logger = LoggerFactory.getLogger(ModuleManager.class); // The API whitelist is based off Terasology's @@ -180,6 +178,7 @@ public class ModuleManager { protected ModuleRegistry registry; protected Module engineModule; + @Inject public ModuleManager() { } diff --git a/engine/src/main/java/org/destinationsol/moneyDropping/systems/MoneyDroppingSystem.java b/engine/src/main/java/org/destinationsol/moneyDropping/systems/MoneyDroppingSystem.java index d443b4364..a3c25e5fd 100644 --- a/engine/src/main/java/org/destinationsol/moneyDropping/systems/MoneyDroppingSystem.java +++ b/engine/src/main/java/org/destinationsol/moneyDropping/systems/MoneyDroppingSystem.java @@ -16,7 +16,6 @@ package org.destinationsol.moneyDropping.systems; import com.badlogic.gdx.math.Vector2; -import org.destinationsol.common.In; import org.destinationsol.common.SolMath; import org.destinationsol.common.SolRandom; import org.destinationsol.entitysystem.EventReceiver; @@ -32,7 +31,6 @@ import org.destinationsol.removal.events.DeletionEvent; import org.destinationsol.removal.systems.DestructionSystem; import org.destinationsol.size.components.Size; -import org.terasology.context.annotation.Introspected; import org.terasology.gestalt.entitysystem.entity.EntityRef; import org.terasology.gestalt.entitysystem.event.Before; import org.terasology.gestalt.entitysystem.event.EventResult; @@ -45,7 +43,6 @@ * When an entity with a {@link DropsMoneyOnDestruction} component is destroyed, this system creates an amount of money based * on its {@link Size}. */ -@Introspected public class MoneyDroppingSystem implements EventReceiver { private final float MIN_MULTIPLIER = 12f; @@ -63,6 +60,11 @@ public class MoneyDroppingSystem implements EventReceiver { @Inject ObjectManager objectManager; + @Inject + public MoneyDroppingSystem() { + + } + @ReceiveEvent(components = {DropsMoneyOnDestruction.class, Position.class, Velocity.class, Size.class}) @Before(DestructionSystem.class) public EventResult onDeletion(DeletionEvent event, EntityRef entity) { diff --git a/engine/src/main/java/org/destinationsol/removal/systems/DestroyOnZeroHealthSystem.java b/engine/src/main/java/org/destinationsol/removal/systems/DestroyOnZeroHealthSystem.java index e47d840f2..b1e5e43f3 100644 --- a/engine/src/main/java/org/destinationsol/removal/systems/DestroyOnZeroHealthSystem.java +++ b/engine/src/main/java/org/destinationsol/removal/systems/DestroyOnZeroHealthSystem.java @@ -15,13 +15,11 @@ */ package org.destinationsol.removal.systems; -import org.destinationsol.common.In; import org.destinationsol.entitysystem.EntitySystemManager; import org.destinationsol.entitysystem.EventReceiver; import org.destinationsol.health.components.Health; import org.destinationsol.removal.events.ShouldBeDestroyedEvent; import org.destinationsol.removal.events.ZeroHealthEvent; -import org.terasology.context.annotation.Introspected; import org.terasology.gestalt.entitysystem.entity.EntityRef; import org.terasology.gestalt.entitysystem.event.ReceiveEvent; @@ -30,12 +28,15 @@ /** * When an entity's {@link Health} drops to zero, this system destroys that entity. */ -@Introspected public class DestroyOnZeroHealthSystem implements EventReceiver { @Inject EntitySystemManager entitySystemManager; + @Inject + public DestroyOnZeroHealthSystem() { + } + @ReceiveEvent public void onZeroHealth(ZeroHealthEvent event, EntityRef entity) { entitySystemManager.sendEvent(new ShouldBeDestroyedEvent(), entity); diff --git a/engine/src/main/java/org/destinationsol/removal/systems/DestructionSystem.java b/engine/src/main/java/org/destinationsol/removal/systems/DestructionSystem.java index 26b160587..506b208df 100644 --- a/engine/src/main/java/org/destinationsol/removal/systems/DestructionSystem.java +++ b/engine/src/main/java/org/destinationsol/removal/systems/DestructionSystem.java @@ -18,14 +18,13 @@ import org.destinationsol.entitysystem.EventReceiver; import org.destinationsol.removal.components.SlatedForDeletion; import org.destinationsol.removal.events.DeletionEvent; -import org.destinationsol.removal.events.ShouldBeDestroyedEvent; import org.destinationsol.removal.events.RemovalForOptimizationEvent; -import org.terasology.context.annotation.Introspected; +import org.destinationsol.removal.events.ShouldBeDestroyedEvent; import org.terasology.gestalt.entitysystem.entity.EntityRef; import org.terasology.gestalt.entitysystem.event.EventResult; import org.terasology.gestalt.entitysystem.event.ReceiveEvent; -import java.util.HashSet; +import javax.inject.Inject; /** * When an entity receives a {@link ShouldBeDestroyedEvent} or a {@link RemovalForOptimizationEvent}, this system adds a @@ -35,9 +34,12 @@ * Every tick, the {@link DeletionUpdateSystem} sends a {@link DeletionEvent} to each entity with a SlatedForDeletion * component. When that happens, this system deletes those entities. */ -@Introspected public class DestructionSystem implements EventReceiver { + @Inject + public DestructionSystem(){ + } + /** * Adds a {@link SlatedForDeletion} component to an entity. That entity will be destroyed on the next tick. */ diff --git a/engine/src/main/java/org/destinationsol/rendering/systems/RenderingSystem.java b/engine/src/main/java/org/destinationsol/rendering/systems/RenderingSystem.java index cd4d15522..d9d1afd14 100644 --- a/engine/src/main/java/org/destinationsol/rendering/systems/RenderingSystem.java +++ b/engine/src/main/java/org/destinationsol/rendering/systems/RenderingSystem.java @@ -16,17 +16,15 @@ package org.destinationsol.rendering.systems; import com.badlogic.gdx.math.Vector2; -import org.destinationsol.common.In; -import org.destinationsol.rendering.RenderableElement; -import org.destinationsol.rendering.components.Renderable; -import org.destinationsol.rendering.events.RenderEvent; import org.destinationsol.entitysystem.EntitySystemManager; import org.destinationsol.entitysystem.EventReceiver; import org.destinationsol.game.GameDrawer; import org.destinationsol.location.components.Angle; import org.destinationsol.location.components.Position; +import org.destinationsol.rendering.RenderableElement; +import org.destinationsol.rendering.components.Renderable; +import org.destinationsol.rendering.events.RenderEvent; import org.destinationsol.size.components.Size; -import org.terasology.context.annotation.Introspected; import org.terasology.gestalt.entitysystem.entity.EntityRef; import org.terasology.gestalt.entitysystem.event.EventResult; import org.terasology.gestalt.entitysystem.event.ReceiveEvent; @@ -36,7 +34,6 @@ /** * This handles the drawing of each entity with a {@link Renderable} component. */ -@Introspected public class RenderingSystem implements EventReceiver { @Inject @@ -45,6 +42,11 @@ public class RenderingSystem implements EventReceiver { @Inject GameDrawer drawer; + @Inject + public RenderingSystem() { + + } + @ReceiveEvent(components = {Renderable.class, Position.class, Size.class}) public EventResult onRender(RenderEvent event, EntityRef entity) { diff --git a/engine/src/main/java/org/destinationsol/rubble/systems/RubbleCreationSystem.java b/engine/src/main/java/org/destinationsol/rubble/systems/RubbleCreationSystem.java index e43ae3152..d57caab47 100644 --- a/engine/src/main/java/org/destinationsol/rubble/systems/RubbleCreationSystem.java +++ b/engine/src/main/java/org/destinationsol/rubble/systems/RubbleCreationSystem.java @@ -16,7 +16,6 @@ package org.destinationsol.rubble.systems; import com.badlogic.gdx.math.Vector2; -import org.destinationsol.common.In; import org.destinationsol.entitysystem.EventReceiver; import org.destinationsol.game.Rubble; import org.destinationsol.game.RubbleBuilder; @@ -28,7 +27,6 @@ import org.destinationsol.rubble.components.CreatesRubbleOnDestruction; import org.destinationsol.size.components.Size; import org.destinationsol.stasis.components.Stasis; -import org.terasology.context.annotation.Introspected; import org.terasology.gestalt.entitysystem.entity.EntityRef; import org.terasology.gestalt.entitysystem.event.Before; import org.terasology.gestalt.entitysystem.event.EventResult; @@ -40,7 +38,6 @@ * When an entity with a {@link CreatesRubbleOnDestruction} component is destroyed, this system creates {@link Rubble}s * where the entity was. */ -@Introspected public class RubbleCreationSystem implements EventReceiver { @Inject @@ -49,6 +46,11 @@ public class RubbleCreationSystem implements EventReceiver { @Inject SolGame solGame; + @Inject + public RubbleCreationSystem() { + + } + //TODO once Shards are entities, this needs to be refactored to replace ShardBuilder /** diff --git a/engine/src/main/java/org/destinationsol/ui/SolInputManager.java b/engine/src/main/java/org/destinationsol/ui/SolInputManager.java index 151fd6766..4ecf64078 100644 --- a/engine/src/main/java/org/destinationsol/ui/SolInputManager.java +++ b/engine/src/main/java/org/destinationsol/ui/SolInputManager.java @@ -33,7 +33,6 @@ import org.destinationsol.common.SolMath; import org.destinationsol.game.SolGame; import org.destinationsol.game.context.Context; -import org.terasology.context.annotation.Introspected; import javax.inject.Inject; import java.util.ArrayList; @@ -41,7 +40,6 @@ import static com.badlogic.gdx.graphics.Pixmap.Format.RGBA8888; -@Introspected public class SolInputManager { private static final float CURSOR_SZ = .07f; private static final float WARN_PERC_GROWTH_TIME = 1f; diff --git a/engine/src/main/java/org/destinationsol/ui/SolLayouts.java b/engine/src/main/java/org/destinationsol/ui/SolLayouts.java index 346e1a8b7..8f70777c0 100644 --- a/engine/src/main/java/org/destinationsol/ui/SolLayouts.java +++ b/engine/src/main/java/org/destinationsol/ui/SolLayouts.java @@ -17,11 +17,9 @@ import org.destinationsol.game.screens.RightPaneLayout; import org.destinationsol.menu.MenuLayout; -import org.terasology.context.annotation.Introspected; import javax.inject.Inject; -@Introspected public class SolLayouts { public final RightPaneLayout rightPaneLayout; public final MenuLayout menuLayout; diff --git a/engine/src/main/java/org/destinationsol/ui/TutorialManager.java b/engine/src/main/java/org/destinationsol/ui/TutorialManager.java index d6e0b99ca..8e3548811 100644 --- a/engine/src/main/java/org/destinationsol/ui/TutorialManager.java +++ b/engine/src/main/java/org/destinationsol/ui/TutorialManager.java @@ -27,9 +27,7 @@ import org.destinationsol.game.screens.MainGameScreen; import org.destinationsol.game.screens.ShipKbControl; import org.destinationsol.game.screens.ShipMixedControl; -import org.terasology.context.annotation.Introspected; -import javax.inject.Inject; import java.util.ArrayList; import java.util.List; diff --git a/engine/src/main/java/org/destinationsol/ui/UiDrawer.java b/engine/src/main/java/org/destinationsol/ui/UiDrawer.java index e5054427e..637a5b8be 100644 --- a/engine/src/main/java/org/destinationsol/ui/UiDrawer.java +++ b/engine/src/main/java/org/destinationsol/ui/UiDrawer.java @@ -23,13 +23,11 @@ import org.destinationsol.CommonDrawer; import org.destinationsol.SolApplication; import org.destinationsol.assets.Assets; -import org.terasology.context.annotation.Introspected; import javax.inject.Inject; import java.util.HashMap; import java.util.Map; -@Introspected public class UiDrawer implements ResizeSubscriber { public enum TextAlignment { LEFT, From 217003ac3a48a04bebaabaa4ab7bd549e0a367d8 Mon Sep 17 00:00:00 2001 From: DarkWeird Date: Fri, 19 Mar 2021 14:39:25 +0300 Subject: [PATCH 12/38] fix(DI): Integrate `gestalt-di` with `gestalt-module` and removes `Reflections` --- .../destinationsol/desktop/SolDesktop.java | 22 +--------- engine/build.gradle | 44 ++++++------------- .../org/destinationsol/ContextWrapper.java | 2 +- .../java/org/destinationsol/CoreService.java | 5 +-- .../org/destinationsol/SolApplication.java | 22 ++++++---- .../entitysystem/ComponentSystem.java | 4 ++ .../entitysystem/ComponentSystemManager.java | 16 +++---- .../entitysystem/EntitySystemManager.java | 5 ++- .../game/console/MethodCommand.java | 13 ++++-- .../console/annotations/RegisterCommands.java | 2 + .../destinationsol/modules/ModuleManager.java | 39 ++++++---------- .../destinationsol/util/InjectionHelper.java | 18 ++++++-- templates/build.gradle | 43 +++++------------- 13 files changed, 95 insertions(+), 140 deletions(-) diff --git a/desktop/src/main/java/org/destinationsol/desktop/SolDesktop.java b/desktop/src/main/java/org/destinationsol/desktop/SolDesktop.java index ef036e347..e66474e5e 100644 --- a/desktop/src/main/java/org/destinationsol/desktop/SolDesktop.java +++ b/desktop/src/main/java/org/destinationsol/desktop/SolDesktop.java @@ -57,8 +57,6 @@ public final class SolDesktop { private static Logger logger = LoggerFactory.getLogger(SolDesktop.class); - private static boolean initFinished; - private static ModuleManager moduleManager; /** * Specifies the commandline option to pass to the application for it to generate no crash reports. @@ -119,31 +117,13 @@ public static void main(String[] argv) { } handleCrashReporting(argv); - new Thread(new Runnable() { - @Override - public void run() { - try { - moduleManager = new ModuleManager(); - moduleManager.init(); - } catch (Exception ignore) { - } - initFinished = true; - } - }).start(); - while (!initFinished) { - try { - Thread.sleep(100); - } catch (Exception e) { - e.printStackTrace(); - } - } if (useSplash) { splash.close(); } // Everything is set up correctly, launch the application - SolApplication application = new SolApplication(moduleManager, 100); + SolApplication application = new SolApplication(100); SolApplication.addResizeSubscriber(new SolDesktop.FullScreenWindowPositionAdjustment(!options.fullscreen)); // Everything is set up correctly, launch the application new Lwjgl3Application(application, applicationConfig); diff --git a/engine/build.gradle b/engine/build.gradle index ed7c73194..8291268ed 100644 --- a/engine/build.gradle +++ b/engine/build.gradle @@ -2,12 +2,6 @@ apply from: '../config/gradle/common.gradle' apply plugin: 'java-library' [compileJava, compileTestJava]*.options*.encoding = 'UTF-8' -import org.reflections.Reflections; -import org.reflections.scanners.SubTypesScanner; -import org.reflections.scanners.TypeAnnotationsScanner; -import org.reflections.util.ConfigurationBuilder; -import org.reflections.util.ClasspathHelper; - // Dependencies needed for what our Gradle scripts themselves use. It cannot be included via an external Gradle file :-( buildscript { repositories { @@ -24,8 +18,6 @@ buildscript { } dependencies { - // Needed for caching reflected data during builds - classpath 'org.reflections:reflections:0.9.12' classpath 'dom4j:dom4j:1.6.1' // HACK: Needed for NUI and gestalt entity-component reflections @@ -39,6 +31,7 @@ dependencies { api group: 'org.slf4j', name: 'slf4j-api', version: '1.7.25' api group: 'com.google.code.gson', name: 'gson', version: '2.6.2' + api group: 'com.google.guava', name: 'guava', version: '30.1-jre' api "com.badlogicgames.gdx:gdx:$gdxVersion" api "com.badlogicgames.gdx:gdx-box2d:$gdxVersion" @@ -55,8 +48,8 @@ dependencies { implementation "net.jcip:jcip-annotations:1.0" - api group: 'org.terasology.nui', name: 'nui', version: '2.0.0' - api group: 'org.terasology.nui', name: 'nui-libgdx', version: '2.0.0' + api group: 'org.terasology.nui', name: 'nui', version: '2.1.0-SNAPSHOT' + api group: 'org.terasology.nui', name: 'nui-libgdx', version: '2.1.0-SNAPSHOT' implementation group: 'com.google.protobuf', name: 'protobuf-java', version: '3.4.0' @@ -83,29 +76,20 @@ dependencies { testCompile group: 'org.assertj', name: 'assertj-core', version: '3.9.0' } -task cacheReflections { - description = 'Caches reflection output to make regular startup faster. May go stale and need cleanup at times.' - inputs.files sourceSets.main.output.classesDirs, - // getClassesDir from all sourceSets (for any jvm (seems) language) - configurations."${sourceSets.main.runtimeClasspathConfigurationName}" - - outputs.upToDateWhen {classes.state.upToDate} - outputs.file("$buildDir/classes/reflections.cache") - dependsOn classes - - doLast { - // Without the .mkdirs() we might hit a scenario where the classes dir doesn't exist yet - Reflections reflections = new Reflections(new ConfigurationBuilder() - .addUrls(inputs.files.collect { it.toURI().toURL() }) - .setScanners(new TypeAnnotationsScanner(), new SubTypesScanner())) - reflections.save("$buildDir/classes/reflections.cache") - } + +// Adds Resources as parameter for AnnotationProcessor (gather ResourceIndex, +// also add resource as input for compilejava, for re-gathering ResourceIndex, when resource was changed. +compileJava { + inputs.files sourceSets.main.resources.srcDirs + options.compilerArgs = ["-Aresource=${sourceSets.main.resources.srcDirs.join(File.pathSeparator)}"] +} +compileTestJava { + inputs.files sourceSets.test.resources.srcDirs + options.compilerArgs = ["-Aresource=${sourceSets.test.resources.srcDirs.join(File.pathSeparator)}"] } -jar { - // This prevents the assets from being scanned as code files - dependsOn cacheReflections +jar { archiveName = "sol.jar" doFirst { diff --git a/engine/src/main/java/org/destinationsol/ContextWrapper.java b/engine/src/main/java/org/destinationsol/ContextWrapper.java index 062f83c06..ebc8b9b0f 100644 --- a/engine/src/main/java/org/destinationsol/ContextWrapper.java +++ b/engine/src/main/java/org/destinationsol/ContextWrapper.java @@ -1,5 +1,5 @@ /* - * Copyright 2020 The Terasology Foundation + * Copyright 2021 The Terasology Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/engine/src/main/java/org/destinationsol/CoreService.java b/engine/src/main/java/org/destinationsol/CoreService.java index fa3655f39..eedee8114 100644 --- a/engine/src/main/java/org/destinationsol/CoreService.java +++ b/engine/src/main/java/org/destinationsol/CoreService.java @@ -20,7 +20,7 @@ import org.terasology.gestalt.module.ModuleEnvironment; public class CoreService extends ServiceRegistry { - public CoreService(SolApplication application, ModuleManager moduleManager) { + public CoreService(SolApplication application) { this.with(SolApplication.class).lifetime(Lifetime.Singleton).use(() -> application); this.with(CommonDrawer.class).lifetime(Lifetime.Singleton); this.with(GameOptions.class).lifetime(Lifetime.Singleton).use(() -> { @@ -30,8 +30,7 @@ public CoreService(SolApplication application, ModuleManager moduleManager) { } return new GameOptions(isMobile, null); }); - this.with(ModuleManager.class).lifetime(Lifetime.Singleton).use(() -> moduleManager); - this.with(ModuleEnvironment.class).lifetime(Lifetime.Singleton).use(moduleManager::getEnvironment); + this.with(ModuleManager.class).lifetime(Lifetime.Singleton); this.with(ComponentSystemManager.class).lifetime(Lifetime.Singleton); this.with(OggMusicManager.class).lifetime(Lifetime.Singleton); diff --git a/engine/src/main/java/org/destinationsol/SolApplication.java b/engine/src/main/java/org/destinationsol/SolApplication.java index 31dcbb5dd..7e4aefb93 100644 --- a/engine/src/main/java/org/destinationsol/SolApplication.java +++ b/engine/src/main/java/org/destinationsol/SolApplication.java @@ -70,8 +70,12 @@ import org.terasology.context.annotation.API; import org.terasology.gestalt.di.BeanContext; import org.terasology.gestalt.di.DefaultBeanContext; +import org.terasology.gestalt.di.ServiceRegistry; import org.terasology.gestalt.entitysystem.component.management.ComponentManager; import org.terasology.gestalt.entitysystem.entity.EntityRef; +import org.terasology.gestalt.module.ModuleEnvironment; +import org.terasology.gestalt.module.ModuleServiceRegistry; +import org.terasology.gestalt.module.sandbox.StandardPermissionProviderFactory; import javax.inject.Inject; import java.io.PrintWriter; @@ -85,8 +89,6 @@ public class SolApplication implements ApplicationListener { private final float targetFPS; - @SuppressWarnings("FieldCanBeLocal") - private final ModuleManager moduleManager; private EntitySystemManager entitySystemManager; @Inject @@ -134,15 +136,15 @@ protected SolApplication() { throw new RuntimeException("Unimplemented"); } - public SolApplication(ModuleManager moduleManager, float targetFPS) { + public SolApplication(float targetFPS) { // Initiate Box2D to make sure natives are loaded early enough Box2D.init(); - this.moduleManager = moduleManager; this.targetFPS = targetFPS; resizeSubscribers = new HashSet<>(); this.appContext = new DefaultBeanContext( - new CoreService(this, moduleManager), + new ModuleServiceRegistry(new StandardPermissionProviderFactory()), + new CoreService(this), new ContextWrapperService()); } @@ -158,13 +160,17 @@ public void create() { options = new GameOptions(isMobile(), null); componentManager = appContext.getBean(ComponentManager.class); + try { + appContext.getBean(ModuleManager.class).init(); + } catch (Exception e) { + logger.error("Cannot initialize modules"); + } AssetHelper helper = appContext.getBean(AssetHelper.class); - helper.init(moduleManager.getEnvironment(), componentManager, isMobile); + helper.init(appContext.getBean(ModuleManager.class).getEnvironment(), componentManager, isMobile); Assets.initialize(helper); -// context.put(ComponentSystemManager.class, appContext.getBean(ComponentSystemManager.class)); logger.info("\n\n ------------------------------------------------------------ \n"); - moduleManager.printAvailableModules(); + appContext.getBean(ModuleManager.class).printAvailableModules(); appContext.inject(this); diff --git a/engine/src/main/java/org/destinationsol/entitysystem/ComponentSystem.java b/engine/src/main/java/org/destinationsol/entitysystem/ComponentSystem.java index 24cc09cb3..ab24848fb 100644 --- a/engine/src/main/java/org/destinationsol/entitysystem/ComponentSystem.java +++ b/engine/src/main/java/org/destinationsol/entitysystem/ComponentSystem.java @@ -15,6 +15,10 @@ */ package org.destinationsol.entitysystem; +/** + * This is System part of ECS pattern. + *

Don't forget make constructor and mark it with `@Inject`(empty contrutor too) - this is enable class to discover it via DI.

+ */ public class ComponentSystem { //TODO: Use this stuff diff --git a/engine/src/main/java/org/destinationsol/entitysystem/ComponentSystemManager.java b/engine/src/main/java/org/destinationsol/entitysystem/ComponentSystemManager.java index 6b92cc43e..59ad64894 100644 --- a/engine/src/main/java/org/destinationsol/entitysystem/ComponentSystemManager.java +++ b/engine/src/main/java/org/destinationsol/entitysystem/ComponentSystemManager.java @@ -17,27 +17,21 @@ import com.google.common.collect.Lists; import org.destinationsol.game.context.Context; +import org.destinationsol.modules.ModuleManager; import org.destinationsol.util.InjectionHelper; import org.terasology.gestalt.module.ModuleEnvironment; import javax.inject.Inject; import java.util.ArrayList; +import java.util.List; public class ComponentSystemManager { - private ArrayList componentSystems = Lists.newArrayList(); + private final List componentSystems; @Inject - public ComponentSystemManager(ModuleEnvironment environment, Context context) { - for (Class componentSystem : environment.getSubtypesOf(ComponentSystem.class)) { - try { - ComponentSystem system = componentSystem.newInstance(); - InjectionHelper.inject(system, context); - componentSystems.add(system); - } catch (Exception e) { - e.printStackTrace(); - } - } + public ComponentSystemManager(List componentSystems) { + this.componentSystems = componentSystems; } public void preBegin() { diff --git a/engine/src/main/java/org/destinationsol/entitysystem/EntitySystemManager.java b/engine/src/main/java/org/destinationsol/entitysystem/EntitySystemManager.java index 25801b5d4..14d287ecc 100644 --- a/engine/src/main/java/org/destinationsol/entitysystem/EntitySystemManager.java +++ b/engine/src/main/java/org/destinationsol/entitysystem/EntitySystemManager.java @@ -16,6 +16,7 @@ package org.destinationsol.entitysystem; import com.google.common.collect.Lists; +import org.destinationsol.modules.ModuleManager; import org.terasology.gestalt.entitysystem.component.Component; import org.terasology.gestalt.entitysystem.component.management.ComponentManager; import org.terasology.gestalt.entitysystem.component.store.ArrayComponentStore; @@ -42,9 +43,9 @@ public class EntitySystemManager { private static final EventReceiverMethodSupport eventReceiverMethodSupport = new EventReceiverMethodSupport(); @Inject - public EntitySystemManager(ModuleEnvironment environment, ComponentManager componentManager, List eventReceivers) { + public EntitySystemManager(ModuleManager moduleManager, ComponentManager componentManager, List eventReceivers) { List> stores = Lists.newArrayList(); - for (Class componentType : environment.getSubtypesOf(Component.class)) { + for (Class componentType : moduleManager.getEnvironment().getSubtypesOf(Component.class)) { //This filters out abstract components, which would create exceptions if (!Modifier.isAbstract(componentType.getModifiers())) { stores.add( diff --git a/engine/src/main/java/org/destinationsol/game/console/MethodCommand.java b/engine/src/main/java/org/destinationsol/game/console/MethodCommand.java index 1a43b49ee..99f250d18 100644 --- a/engine/src/main/java/org/destinationsol/game/console/MethodCommand.java +++ b/engine/src/main/java/org/destinationsol/game/console/MethodCommand.java @@ -19,6 +19,7 @@ import com.google.common.base.Predicate; import com.google.common.base.Predicates; import com.google.common.collect.Lists; +import com.google.common.collect.Sets; import org.destinationsol.game.SolGame; import org.destinationsol.game.console.annotations.Command; import org.destinationsol.game.console.annotations.CommandParam; @@ -26,11 +27,11 @@ import org.destinationsol.game.context.Context; import org.destinationsol.util.InjectionHelper; import org.destinationsol.util.SpecificAccessibleObject; -import org.reflections.ReflectionUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.lang.annotation.Annotation; +import java.lang.reflect.Field; import java.lang.reflect.Method; import java.lang.reflect.Modifier; import java.util.List; @@ -46,7 +47,7 @@ private MethodCommand(String name, String description, String helpText, /** * Creates a new {@code ReferencedCommand} to a specific method - * annotated with {@link + * annotated with {@link Command} * * @param specificMethod The method to reference to * @return The command reference object created @@ -77,8 +78,12 @@ public static MethodCommand referringTo(SpecificAccessibleObject specifi * Registers all available command methods annotated with {@link */ public static void registerAvailable(Object provider, Console console, SolGame game, Context context) { - Predicate predicate = Predicates.and(ReflectionUtils.withModifier(Modifier.PUBLIC), ReflectionUtils.withAnnotation(Command.class)); - Set commandMethods = ReflectionUtils.getAllMethods(provider.getClass(), predicate); + Set commandMethods = Sets.newHashSet(); // TODO replace with gestalt-di's impl + for (Method method : provider.getClass().getDeclaredMethods()) { + if((method.getModifiers() & Modifier.PUBLIC) == 1 && method.getAnnotation(Command.class) != null){ + commandMethods.add(method); + } + } for (Method method : commandMethods) { if (!hasSenderAnnotation(method)) { logger.error("Command {} provided by {} contains a EntityRef without @Sender annotation, may cause a NullPointerException", method.getName(), provider.getClass().getSimpleName()); diff --git a/engine/src/main/java/org/destinationsol/game/console/annotations/RegisterCommands.java b/engine/src/main/java/org/destinationsol/game/console/annotations/RegisterCommands.java index a4d9b8c24..97e2a824f 100644 --- a/engine/src/main/java/org/destinationsol/game/console/annotations/RegisterCommands.java +++ b/engine/src/main/java/org/destinationsol/game/console/annotations/RegisterCommands.java @@ -19,8 +19,10 @@ import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; +import org.terasology.context.annotation.Index; @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.TYPE) +@Index public @interface RegisterCommands { } diff --git a/engine/src/main/java/org/destinationsol/modules/ModuleManager.java b/engine/src/main/java/org/destinationsol/modules/ModuleManager.java index 8ba5d4fa0..14e1ce8f6 100644 --- a/engine/src/main/java/org/destinationsol/modules/ModuleManager.java +++ b/engine/src/main/java/org/destinationsol/modules/ModuleManager.java @@ -24,14 +24,10 @@ import org.destinationsol.assets.music.OggMusic; import org.destinationsol.assets.sound.OggSound; import org.destinationsol.assets.textures.DSTexture; -import org.reflections.Reflections; -import org.reflections.scanners.SubTypesScanner; -import org.reflections.scanners.TypeAnnotationsScanner; -import org.reflections.util.ClasspathHelper; -import org.reflections.util.ConfigurationBuilder; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.terasology.gestalt.assets.ResourceUrn; +import org.terasology.gestalt.di.BeanContext; import org.terasology.gestalt.module.Module; import org.terasology.gestalt.module.ModuleEnvironment; import org.terasology.gestalt.module.ModuleFactory; @@ -175,30 +171,27 @@ public class ModuleManager { }; protected static ModuleEnvironment environment; + private final ModuleFactory moduleFactory; + private final ModulePathScanner scanner; + private final BeanContext beanContext; protected ModuleRegistry registry; protected Module engineModule; @Inject - public ModuleManager() { + public ModuleManager(BeanContext beanContext, ModuleFactory moduleFactory, ModuleRegistry moduleRegistry, ModulePathScanner scanner) { + this.moduleFactory = moduleFactory; + this.registry = moduleRegistry; + this.scanner = scanner; + this.beanContext = beanContext; } public void init() throws Exception { try { - ModuleFactory moduleFactory = new ModuleFactory(); engineModule = moduleFactory.createPackageModule("org.destinationsol"); - // In order for the NUI widgets to be detected, they first need to be found and cached. The build script - // reflects over the NUI jar and saves a list of all the widgets within the engine's reflections.cache. - // TODO: Find a better way to do this. - Module nuiModule = new Module(new ModuleMetadata(new Name("nui"), new Version("2.0.0")), new EmptyFileSource(), - Collections.emptyList(), new Reflections("org.terasology.nui"), x -> { - String classPackageName = Reflection.getPackageName(x); - return "org.terasology.nui".equals(classPackageName) || classPackageName.startsWith("org.terasology.nui."); - }); + Module nuiModule = moduleFactory.createPackageModule(new ModuleMetadata(new Name("nui"), new Version("2.0.0")),"org.terasology.nui"); // scan for all standard modules - registry = new TableModuleRegistry(); File modulesRoot = Paths.get(".").resolve("modules").toFile(); - ModulePathScanner scanner = new ModulePathScanner(moduleFactory); scanner.scan(registry, modulesRoot); Set requiredModules = Sets.newHashSet(); @@ -229,17 +222,13 @@ public void loadEnvironment(Set modules) { permissionFactory.getBasePermissionSet().grantPermission("com.google.gson", RuntimePermission.class); permissionFactory.getBasePermissionSet().grantPermission("com.google.gson.internal", RuntimePermission.class); - ConfigurationBuilder config = new ConfigurationBuilder() - .addClassLoader(ClasspathHelper.contextClassLoader()) - .addUrls(ClasspathHelper.forClassLoader()) - .addScanners(new TypeAnnotationsScanner(), new SubTypesScanner()); - Reflections reflections = new Reflections(config); - APIScanner scanner = new APIScanner(permissionFactory); - scanner.scan(reflections); + for(Module module: modules){ + scanner.scan(module.getClassIndex()); + } Policy.setPolicy(new ModuleSecurityPolicy()); System.setSecurityManager(new ModuleSecurityManager()); - environment = new ModuleEnvironment(modules,permissionFactory); + environment = new ModuleEnvironment(beanContext, modules, permissionFactory); } public ModuleEnvironment getEnvironment() { diff --git a/engine/src/main/java/org/destinationsol/util/InjectionHelper.java b/engine/src/main/java/org/destinationsol/util/InjectionHelper.java index d074cc858..b96dfcec8 100644 --- a/engine/src/main/java/org/destinationsol/util/InjectionHelper.java +++ b/engine/src/main/java/org/destinationsol/util/InjectionHelper.java @@ -15,9 +15,9 @@ */ package org.destinationsol.util; +import com.google.common.collect.Sets; import org.destinationsol.common.In; import org.destinationsol.game.context.Context; -import org.reflections.ReflectionUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.terasology.gestalt.util.reflection.ParameterProvider; @@ -28,7 +28,9 @@ import java.security.PrivilegedAction; import java.util.NoSuchElementException; import java.util.Optional; +import java.util.Set; +// TODO replace with gestalt-di's impl public final class InjectionHelper { private static final Logger logger = LoggerFactory.getLogger(InjectionHelper.class); @@ -37,8 +39,14 @@ private InjectionHelper() { public static void inject(final Object object, Context context) { AccessController.doPrivileged((PrivilegedAction) () -> { - for (Field field : ReflectionUtils.getAllFields(object.getClass(), - ReflectionUtils.withAnnotation(In.class))) { + + Set fields = Sets.newHashSet(); // TODO replace with gestalt-di's impl + for (Field field : object.getClass().getDeclaredFields()) { + if (field.getAnnotation(In.class) != null) { + fields.add(field); + } + } + for (Field field : fields) { Object value = context.get(field.getType()); if (value != null) { try { @@ -53,6 +61,7 @@ public static void inject(final Object object, Context context) { return null; }); } + /** * Creates a new instance for a class using constructor injection. * The constructor does not need a special annotation for this. @@ -63,7 +72,8 @@ public static void inject(final Object object, Context context) { *
  • If not all parameters can be populated from the Context, the next Constructor with less parameters is used.
  • *
  • If no parameters can be populated at all, the default constructor (if available) is used.
  • * - * @param clazz The class to instantiate. + * + * @param clazz The class to instantiate. * @param context The context to use for injection. * @return A new instance of the class to create. * @throws NoSuchElementException if the injection failed, e.g. if no parameters were available on the context and a default constructor is missing. diff --git a/templates/build.gradle b/templates/build.gradle index 963e2bcf3..561c13e45 100644 --- a/templates/build.gradle +++ b/templates/build.gradle @@ -6,10 +6,7 @@ import java.text.SimpleDateFormat; // Git plugin details at https://github.com/ajoberstar/gradle-git import org.ajoberstar.gradle.git.tasks.* -import org.reflections.Reflections; -import org.reflections.scanners.SubTypesScanner; -import org.reflections.scanners.TypeAnnotationsScanner; -import org.reflections.util.ConfigurationBuilder; + // Dependencies needed for what our Gradle scripts themselves use. It cannot be included via an external Gradle file :-( buildscript { @@ -169,6 +166,17 @@ sourceSets { test.java.outputDir = new File("$buildDir/testClasses") } +// Adds Resources as parameter for AnnotationProcessor (gather ResourceIndex, +// also add resource as input for compilejava, for re-gathering ResourceIndex, when resource was changed. +compileJava { // TODO adds assets + inputs.files sourceSets.main.resources.srcDirs + options.compilerArgs = ["-Aresource=${sourceSets.main.resources.srcDirs.join(File.pathSeparator)}"] +} +compileTestJava { + inputs.files sourceSets.test.resources.srcDirs + options.compilerArgs = ["-Aresource=${sourceSets.test.resources.srcDirs.join(File.pathSeparator)}"] +} + // Generate the module directory structure if missing task createSkeleton() { mkdir('assets') @@ -185,30 +193,6 @@ task createSkeleton() { mkdir('src/test/java') } -task cacheReflections { - description = 'Caches reflection output to make regular startup faster. May go stale and need cleanup at times.' - inputs.files sourceSets.main.output.classesDirs, - // getClassesDir from all sourceSets (for any jvm (seems) language) - configurations."${sourceSets.main.runtimeClasspathConfigurationName}" - - outputs.upToDateWhen {classes.state.upToDate} - outputs.file("$buildDir/classes/reflections.cache") - dependsOn classes - - doLast { - // Without the .mkdirs() we might hit a scenario where the classes dir doesn't exist yet - Reflections reflections = new Reflections(new ConfigurationBuilder() - .addUrls(inputs.files.collect { it.toURI().toURL() }) - .setScanners(new TypeAnnotationsScanner(), new SubTypesScanner())) - reflections.save("$buildDir/classes/reflections.cache") - } -} - -task cleanReflections(type: Delete) { - description = 'Cleans the reflection cache. Useful in cases where it has gone stale and needs regeneration.' - delete sourceSets.main.output.classesDirs[0].toString() + "/reflections.cache" -} - // This task syncs everything in the assets dir into the output dir, used when jarring the module task syncAssets(type: Sync) { from 'assets' @@ -228,7 +212,6 @@ task syncDeltas(type: Sync) { // Instructions for packaging a jar file - is a manifest even needed for modules? jar { // Make sure the assets directory is included - dependsOn cacheReflections dependsOn syncAssets dependsOn syncOverrides dependsOn syncDeltas @@ -242,8 +225,6 @@ jar { } } -jar.finalizedBy cleanReflections - // Prep an IntelliJ module for the DestinationSol module - yes, might want to read that twice :D idea { module { From fd12eacf86694d3c90921070c9f1396dd2463ff3 Mon Sep 17 00:00:00 2001 From: DarkWeird Date: Fri, 19 Mar 2021 14:53:41 +0300 Subject: [PATCH 13/38] fix(DI): update tests for working with `gestalt-di` --- .../DamageSystemTests/NonNegativeDamageTest.java | 11 +++++++++-- .../DamageSystemTests/NonNegativeHealthTest.java | 11 +++++++++-- .../systems/DamageSystemTests/OnDamageTest.java | 11 +++++++++-- .../ZeroHealthCausesDestructionTest.java | 10 +++++++++- .../DestroyAtZeroHealthTest.java | 4 +++- .../DestructionSystemTests/DestructionTest.java | 4 +++- .../RemovalForOptimizationTest.java | 4 +++- .../LocationSystemTests/AngleUpdateTest.java | 4 +++- .../LocationSystemTests/PositionUpdateTest.java | 11 +++++++++-- .../LocationSystemTests/VelocityUpdateTest.java | 4 +++- .../testingUtilities/InitializationUtilities.java | 13 +++++++++++-- .../testsupport/AssetsHelperInitializer.java | 7 ++++++- 12 files changed, 77 insertions(+), 17 deletions(-) diff --git a/engine/src/test/java/org/destinationsol/systems/DamageSystemTests/NonNegativeDamageTest.java b/engine/src/test/java/org/destinationsol/systems/DamageSystemTests/NonNegativeDamageTest.java index a949a1ed5..b104bfb7f 100644 --- a/engine/src/test/java/org/destinationsol/systems/DamageSystemTests/NonNegativeDamageTest.java +++ b/engine/src/test/java/org/destinationsol/systems/DamageSystemTests/NonNegativeDamageTest.java @@ -22,8 +22,14 @@ import org.destinationsol.modules.ModuleManager; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.terasology.gestalt.di.DefaultBeanContext; import org.terasology.gestalt.entitysystem.component.management.ComponentManager; import org.terasology.gestalt.entitysystem.entity.EntityRef; +import org.terasology.gestalt.module.ModuleFactory; +import org.terasology.gestalt.module.ModulePathScanner; +import org.terasology.gestalt.module.TableModuleRegistry; + +import java.util.Collections; import static org.junit.jupiter.api.Assertions.assertEquals; @@ -37,9 +43,10 @@ public class NonNegativeDamageTest { @BeforeEach public void setUp() throws Exception { - moduleManager = new ModuleManager(); + ModuleFactory moduleFactory = new ModuleFactory(); + moduleManager = new ModuleManager(new DefaultBeanContext(), moduleFactory,new TableModuleRegistry(),new ModulePathScanner(moduleFactory)); moduleManager.init(); - entitySystemManager = new EntitySystemManager(moduleManager.getEnvironment(), new ComponentManager(), new ContextImpl()); + entitySystemManager = new EntitySystemManager(moduleManager, new ComponentManager(), Collections.emptyList()); } @Test diff --git a/engine/src/test/java/org/destinationsol/systems/DamageSystemTests/NonNegativeHealthTest.java b/engine/src/test/java/org/destinationsol/systems/DamageSystemTests/NonNegativeHealthTest.java index 2d6df4c8b..370dc1c11 100644 --- a/engine/src/test/java/org/destinationsol/systems/DamageSystemTests/NonNegativeHealthTest.java +++ b/engine/src/test/java/org/destinationsol/systems/DamageSystemTests/NonNegativeHealthTest.java @@ -24,8 +24,14 @@ import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; +import org.terasology.gestalt.di.DefaultBeanContext; import org.terasology.gestalt.entitysystem.component.management.ComponentManager; import org.terasology.gestalt.entitysystem.entity.EntityRef; +import org.terasology.gestalt.module.ModuleFactory; +import org.terasology.gestalt.module.ModulePathScanner; +import org.terasology.gestalt.module.TableModuleRegistry; + +import java.util.Collections; import static org.junit.jupiter.api.Assertions.assertEquals; @@ -38,9 +44,10 @@ public class NonNegativeHealthTest { @BeforeEach public void setUp() throws Exception { - moduleManager = new ModuleManager(); + ModuleFactory moduleFactory = new ModuleFactory(); + moduleManager = new ModuleManager(new DefaultBeanContext(), moduleFactory,new TableModuleRegistry(),new ModulePathScanner(moduleFactory)); moduleManager.init(); - entitySystemManager = new EntitySystemManager(moduleManager.getEnvironment(), new ComponentManager(), new ContextImpl()); + entitySystemManager = new EntitySystemManager(moduleManager, new ComponentManager(), Collections.emptyList()); } /** diff --git a/engine/src/test/java/org/destinationsol/systems/DamageSystemTests/OnDamageTest.java b/engine/src/test/java/org/destinationsol/systems/DamageSystemTests/OnDamageTest.java index 2e9000a9c..855726684 100644 --- a/engine/src/test/java/org/destinationsol/systems/DamageSystemTests/OnDamageTest.java +++ b/engine/src/test/java/org/destinationsol/systems/DamageSystemTests/OnDamageTest.java @@ -22,8 +22,14 @@ import org.destinationsol.modules.ModuleManager; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.terasology.gestalt.di.DefaultBeanContext; import org.terasology.gestalt.entitysystem.component.management.ComponentManager; import org.terasology.gestalt.entitysystem.entity.EntityRef; +import org.terasology.gestalt.module.ModuleFactory; +import org.terasology.gestalt.module.ModulePathScanner; +import org.terasology.gestalt.module.TableModuleRegistry; + +import java.util.Collections; import static org.junit.jupiter.api.Assertions.assertEquals; @@ -37,9 +43,10 @@ public class OnDamageTest { @BeforeEach public void setUp() throws Exception { - moduleManager = new ModuleManager(); + ModuleFactory moduleFactory = new ModuleFactory(); + moduleManager = new ModuleManager(new DefaultBeanContext(), moduleFactory,new TableModuleRegistry(),new ModulePathScanner(moduleFactory)); moduleManager.init(); - entitySystemManager = new EntitySystemManager(moduleManager.getEnvironment(), new ComponentManager(), new ContextImpl()); + entitySystemManager = new EntitySystemManager(moduleManager, new ComponentManager(), Collections.emptyList()); } @Test diff --git a/engine/src/test/java/org/destinationsol/systems/DamageSystemTests/ZeroHealthCausesDestructionTest.java b/engine/src/test/java/org/destinationsol/systems/DamageSystemTests/ZeroHealthCausesDestructionTest.java index a4b8e7e40..8ed156b66 100644 --- a/engine/src/test/java/org/destinationsol/systems/DamageSystemTests/ZeroHealthCausesDestructionTest.java +++ b/engine/src/test/java/org/destinationsol/systems/DamageSystemTests/ZeroHealthCausesDestructionTest.java @@ -19,13 +19,21 @@ import org.destinationsol.game.context.internal.ContextImpl; import org.destinationsol.health.components.Health; import org.destinationsol.health.events.DamageEvent; +import org.destinationsol.modules.ModuleManager; import org.destinationsol.removal.components.SlatedForDeletion; import org.destinationsol.removal.events.DeletionEvent; import org.destinationsol.testsupport.AssetsHelperInitializer; import org.destinationsol.testsupport.Box2DInitializer; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.terasology.gestalt.di.DefaultBeanContext; +import org.terasology.gestalt.entitysystem.component.management.ComponentManager; import org.terasology.gestalt.entitysystem.entity.EntityRef; +import org.terasology.gestalt.module.ModuleFactory; +import org.terasology.gestalt.module.ModulePathScanner; +import org.terasology.gestalt.module.TableModuleRegistry; + +import java.util.Collections; import static org.junit.jupiter.api.Assertions.assertFalse; @@ -38,7 +46,7 @@ public class ZeroHealthCausesDestructionTest implements Box2DInitializer, Assets @BeforeEach public void setUp() throws Exception { - entitySystemManager = new EntitySystemManager(getModuleManager().getEnvironment(), getComponentManager(), new ContextImpl()); + entitySystemManager = new EntitySystemManager(getModuleManager(),getComponentManager(), Collections.emptyList()); } @Test diff --git a/engine/src/test/java/org/destinationsol/systems/DestroyOnZeroHealthSystemTests/DestroyAtZeroHealthTest.java b/engine/src/test/java/org/destinationsol/systems/DestroyOnZeroHealthSystemTests/DestroyAtZeroHealthTest.java index 666f23df4..e0e8dabdd 100644 --- a/engine/src/test/java/org/destinationsol/systems/DestroyOnZeroHealthSystemTests/DestroyAtZeroHealthTest.java +++ b/engine/src/test/java/org/destinationsol/systems/DestroyOnZeroHealthSystemTests/DestroyAtZeroHealthTest.java @@ -26,6 +26,8 @@ import org.junit.jupiter.api.Test; import org.terasology.gestalt.entitysystem.entity.EntityRef; +import java.util.Collections; + import static org.junit.jupiter.api.Assertions.assertFalse; public class DestroyAtZeroHealthTest implements Box2DInitializer, AssetsHelperInitializer { @@ -34,7 +36,7 @@ public class DestroyAtZeroHealthTest implements Box2DInitializer, AssetsHelperIn @BeforeEach public void setUp() throws Exception { - entitySystemManager = new EntitySystemManager(getModuleManager().getEnvironment(), getComponentManager(), new ContextImpl()); + entitySystemManager = new EntitySystemManager(getModuleManager(), getComponentManager(), Collections.emptyList()); } @Test diff --git a/engine/src/test/java/org/destinationsol/systems/DestructionSystemTests/DestructionTest.java b/engine/src/test/java/org/destinationsol/systems/DestructionSystemTests/DestructionTest.java index c675ec330..bd64c26da 100644 --- a/engine/src/test/java/org/destinationsol/systems/DestructionSystemTests/DestructionTest.java +++ b/engine/src/test/java/org/destinationsol/systems/DestructionSystemTests/DestructionTest.java @@ -26,6 +26,8 @@ import org.junit.jupiter.api.Test; import org.terasology.gestalt.entitysystem.entity.EntityRef; +import java.util.Collections; + import static org.junit.jupiter.api.Assertions.assertFalse; /** @@ -37,7 +39,7 @@ public class DestructionTest implements Box2DInitializer, AssetsHelperInitialize @BeforeEach public void setUp() throws Exception { - entitySystemManager = new EntitySystemManager(getModuleManager().getEnvironment(), getComponentManager(), new ContextImpl()); + entitySystemManager = new EntitySystemManager(getModuleManager(), getComponentManager(), Collections.emptyList()); } @Test diff --git a/engine/src/test/java/org/destinationsol/systems/DestructionSystemTests/RemovalForOptimizationTest.java b/engine/src/test/java/org/destinationsol/systems/DestructionSystemTests/RemovalForOptimizationTest.java index c5e8c86b2..56e39db9f 100644 --- a/engine/src/test/java/org/destinationsol/systems/DestructionSystemTests/RemovalForOptimizationTest.java +++ b/engine/src/test/java/org/destinationsol/systems/DestructionSystemTests/RemovalForOptimizationTest.java @@ -27,6 +27,8 @@ import org.junit.jupiter.api.Test; import org.terasology.gestalt.entitysystem.entity.EntityRef; +import java.util.Collections; + import static org.junit.jupiter.api.Assertions.assertFalse; /** @@ -38,7 +40,7 @@ public class RemovalForOptimizationTest implements Box2DInitializer, AssetsHelpe @BeforeEach public void setUp() throws Exception { - entitySystemManager = new EntitySystemManager(getModuleManager().getEnvironment(), getComponentManager(), new ContextImpl()); + entitySystemManager = new EntitySystemManager(getModuleManager(), getComponentManager(), Collections.emptyList()); } @Test diff --git a/engine/src/test/java/org/destinationsol/systems/LocationSystemTests/AngleUpdateTest.java b/engine/src/test/java/org/destinationsol/systems/LocationSystemTests/AngleUpdateTest.java index f288af480..c896a2be8 100644 --- a/engine/src/test/java/org/destinationsol/systems/LocationSystemTests/AngleUpdateTest.java +++ b/engine/src/test/java/org/destinationsol/systems/LocationSystemTests/AngleUpdateTest.java @@ -25,6 +25,8 @@ import org.junit.jupiter.api.Test; import org.terasology.gestalt.entitysystem.entity.EntityRef; +import java.util.Collections; + import static org.junit.jupiter.api.Assertions.assertEquals; public class AngleUpdateTest implements AssetsHelperInitializer, Box2DInitializer { @@ -33,7 +35,7 @@ public class AngleUpdateTest implements AssetsHelperInitializer, Box2DInitialize @BeforeEach public void setUp() throws Exception { - entitySystemManager = new EntitySystemManager(getModuleManager().getEnvironment(), getComponentManager(), new ContextImpl()); + entitySystemManager = new EntitySystemManager(getModuleManager(), getComponentManager(), Collections.emptyList()); } @Test diff --git a/engine/src/test/java/org/destinationsol/systems/LocationSystemTests/PositionUpdateTest.java b/engine/src/test/java/org/destinationsol/systems/LocationSystemTests/PositionUpdateTest.java index 25be5e44d..10f181dba 100644 --- a/engine/src/test/java/org/destinationsol/systems/LocationSystemTests/PositionUpdateTest.java +++ b/engine/src/test/java/org/destinationsol/systems/LocationSystemTests/PositionUpdateTest.java @@ -24,8 +24,14 @@ import org.destinationsol.testsupport.Box2DInitializer; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.terasology.gestalt.di.DefaultBeanContext; import org.terasology.gestalt.entitysystem.component.management.ComponentManager; import org.terasology.gestalt.entitysystem.entity.EntityRef; +import org.terasology.gestalt.module.ModuleFactory; +import org.terasology.gestalt.module.ModulePathScanner; +import org.terasology.gestalt.module.TableModuleRegistry; + +import java.util.Collections; import static org.junit.jupiter.api.Assertions.assertEquals; @@ -37,9 +43,10 @@ public class PositionUpdateTest implements Box2DInitializer { @BeforeEach public void setUp() throws Exception { - moduleManager = new ModuleManager(); + ModuleFactory moduleFactory = new ModuleFactory(); + moduleManager = new ModuleManager(new DefaultBeanContext(), moduleFactory,new TableModuleRegistry(),new ModulePathScanner(moduleFactory)); moduleManager.init(); - entitySystemManager = new EntitySystemManager(moduleManager.getEnvironment(), new ComponentManager(), new ContextImpl()); + entitySystemManager = new EntitySystemManager(moduleManager, new ComponentManager(), Collections.emptyList()); } @Test diff --git a/engine/src/test/java/org/destinationsol/systems/LocationSystemTests/VelocityUpdateTest.java b/engine/src/test/java/org/destinationsol/systems/LocationSystemTests/VelocityUpdateTest.java index 4ff5b0bd2..d2517b861 100644 --- a/engine/src/test/java/org/destinationsol/systems/LocationSystemTests/VelocityUpdateTest.java +++ b/engine/src/test/java/org/destinationsol/systems/LocationSystemTests/VelocityUpdateTest.java @@ -26,6 +26,8 @@ import org.junit.jupiter.api.Test; import org.terasology.gestalt.entitysystem.entity.EntityRef; +import java.util.Collections; + import static org.junit.jupiter.api.Assertions.assertEquals; public class VelocityUpdateTest implements AssetsHelperInitializer, Box2DInitializer { @@ -34,7 +36,7 @@ public class VelocityUpdateTest implements AssetsHelperInitializer, Box2DInitial @BeforeEach public void setUp() throws Exception { - entitySystemManager = new EntitySystemManager(getModuleManager().getEnvironment(), getComponentManager(), new ContextImpl()); + entitySystemManager = new EntitySystemManager(getModuleManager(), getComponentManager(), Collections.emptyList()); } @Test diff --git a/engine/src/test/java/org/destinationsol/testingUtilities/InitializationUtilities.java b/engine/src/test/java/org/destinationsol/testingUtilities/InitializationUtilities.java index cb47dc13b..658cc6746 100644 --- a/engine/src/test/java/org/destinationsol/testingUtilities/InitializationUtilities.java +++ b/engine/src/test/java/org/destinationsol/testingUtilities/InitializationUtilities.java @@ -15,6 +15,7 @@ */ package org.destinationsol.testingUtilities; +import org.destinationsol.entitysystem.EntitySystemManager; import org.destinationsol.modules.ModuleManager; import com.badlogic.gdx.Gdx; import com.badlogic.gdx.backends.headless.HeadlessApplication; @@ -23,6 +24,13 @@ import org.destinationsol.SolApplication; import org.destinationsol.game.DebugOptions; import org.destinationsol.game.SolGame; +import org.terasology.gestalt.di.DefaultBeanContext; +import org.terasology.gestalt.entitysystem.component.management.ComponentManager; +import org.terasology.gestalt.module.ModuleFactory; +import org.terasology.gestalt.module.ModulePathScanner; +import org.terasology.gestalt.module.TableModuleRegistry; + +import java.util.Collections; public final class InitializationUtilities { @@ -39,14 +47,15 @@ public static void init() { DebugOptions.DEV_ROOT_PATH = "engine/src/main/resources/"; ModuleManager moduleManager; try { - moduleManager = new ModuleManager(); + ModuleFactory moduleFactory = new ModuleFactory(); + moduleManager = new ModuleManager(new DefaultBeanContext(), moduleFactory,new TableModuleRegistry(),new ModulePathScanner(moduleFactory)); } catch (Exception ignore) { return; } GL20 mockGL = new MockGL(); Gdx.gl = mockGL; Gdx.gl20 = mockGL; - final HeadlessApplication application = new HeadlessApplication(new SolApplication(moduleManager, 100), new HeadlessApplicationConfiguration()); + final HeadlessApplication application = new HeadlessApplication(new SolApplication(100), new HeadlessApplicationConfiguration()); game = ((SolApplication) application.getApplicationListener()).getGame(); } } diff --git a/engine/src/test/java/org/destinationsol/testsupport/AssetsHelperInitializer.java b/engine/src/test/java/org/destinationsol/testsupport/AssetsHelperInitializer.java index 4c1f97b8d..de0da636e 100644 --- a/engine/src/test/java/org/destinationsol/testsupport/AssetsHelperInitializer.java +++ b/engine/src/test/java/org/destinationsol/testsupport/AssetsHelperInitializer.java @@ -9,7 +9,11 @@ import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.parallel.ResourceLock; +import org.terasology.gestalt.di.DefaultBeanContext; import org.terasology.gestalt.entitysystem.component.management.ComponentManager; +import org.terasology.gestalt.module.ModuleFactory; +import org.terasology.gestalt.module.ModulePathScanner; +import org.terasology.gestalt.module.TableModuleRegistry; /** * Create partial game instance with {@link ModuleManager}, {@link Assets}, {@link ComponentManager}, {@link HeadlessApplication} @@ -44,7 +48,8 @@ default void initAssets() throws Exception { ComponentManager componentManager = new ComponentManager(); stateObject.setComponentManager(componentManager); - ModuleManager moduleManager = new ModuleManager(); + ModuleFactory moduleFactory = new ModuleFactory(); + ModuleManager moduleManager = new ModuleManager(new DefaultBeanContext(), moduleFactory,new TableModuleRegistry(),new ModulePathScanner(moduleFactory)); moduleManager.init(); stateObject.setModuleManager(moduleManager); From d68ddf71e76241498b02fc3034b8833a5fef091b Mon Sep 17 00:00:00 2001 From: DarkWeird Date: Fri, 19 Mar 2021 15:24:59 +0300 Subject: [PATCH 14/38] fix(DI): fix tests with events --- .../DamageSystemTests/NonNegativeDamageTest.java | 4 ++-- .../DamageSystemTests/NonNegativeHealthTest.java | 3 ++- .../systems/DamageSystemTests/OnDamageTest.java | 3 ++- .../ZeroHealthCausesDestructionTest.java | 10 ++++++++-- .../DestroyAtZeroHealthTest.java | 5 ++++- .../DestructionSystemTests/DestructionTest.java | 3 ++- .../RemovalForOptimizationTest.java | 3 ++- .../systems/LocationSystemTests/AngleUpdateTest.java | 3 ++- .../LocationSystemTests/PositionUpdateTest.java | 3 ++- .../LocationSystemTests/VelocityUpdateTest.java | 3 ++- 10 files changed, 28 insertions(+), 12 deletions(-) diff --git a/engine/src/test/java/org/destinationsol/systems/DamageSystemTests/NonNegativeDamageTest.java b/engine/src/test/java/org/destinationsol/systems/DamageSystemTests/NonNegativeDamageTest.java index b104bfb7f..e79d6a445 100644 --- a/engine/src/test/java/org/destinationsol/systems/DamageSystemTests/NonNegativeDamageTest.java +++ b/engine/src/test/java/org/destinationsol/systems/DamageSystemTests/NonNegativeDamageTest.java @@ -16,9 +16,9 @@ package org.destinationsol.systems.DamageSystemTests; import org.destinationsol.entitysystem.EntitySystemManager; -import org.destinationsol.game.context.internal.ContextImpl; import org.destinationsol.health.components.Health; import org.destinationsol.health.events.DamageEvent; +import org.destinationsol.health.systems.DamageSystem; import org.destinationsol.modules.ModuleManager; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -46,7 +46,7 @@ public void setUp() throws Exception { ModuleFactory moduleFactory = new ModuleFactory(); moduleManager = new ModuleManager(new DefaultBeanContext(), moduleFactory,new TableModuleRegistry(),new ModulePathScanner(moduleFactory)); moduleManager.init(); - entitySystemManager = new EntitySystemManager(moduleManager, new ComponentManager(), Collections.emptyList()); + entitySystemManager = new EntitySystemManager(moduleManager, new ComponentManager(), Collections.singletonList(new DamageSystem())); } @Test diff --git a/engine/src/test/java/org/destinationsol/systems/DamageSystemTests/NonNegativeHealthTest.java b/engine/src/test/java/org/destinationsol/systems/DamageSystemTests/NonNegativeHealthTest.java index 370dc1c11..0c99f3359 100644 --- a/engine/src/test/java/org/destinationsol/systems/DamageSystemTests/NonNegativeHealthTest.java +++ b/engine/src/test/java/org/destinationsol/systems/DamageSystemTests/NonNegativeHealthTest.java @@ -19,6 +19,7 @@ import org.destinationsol.game.context.internal.ContextImpl; import org.destinationsol.health.components.Health; import org.destinationsol.health.events.DamageEvent; +import org.destinationsol.health.systems.DamageSystem; import org.destinationsol.modules.ModuleManager; import org.destinationsol.removal.systems.DestroyOnZeroHealthSystem; import org.junit.jupiter.api.BeforeEach; @@ -47,7 +48,7 @@ public void setUp() throws Exception { ModuleFactory moduleFactory = new ModuleFactory(); moduleManager = new ModuleManager(new DefaultBeanContext(), moduleFactory,new TableModuleRegistry(),new ModulePathScanner(moduleFactory)); moduleManager.init(); - entitySystemManager = new EntitySystemManager(moduleManager, new ComponentManager(), Collections.emptyList()); + entitySystemManager = new EntitySystemManager(moduleManager, new ComponentManager(), Collections.singletonList(new DamageSystem())); } /** diff --git a/engine/src/test/java/org/destinationsol/systems/DamageSystemTests/OnDamageTest.java b/engine/src/test/java/org/destinationsol/systems/DamageSystemTests/OnDamageTest.java index 855726684..8eef6f563 100644 --- a/engine/src/test/java/org/destinationsol/systems/DamageSystemTests/OnDamageTest.java +++ b/engine/src/test/java/org/destinationsol/systems/DamageSystemTests/OnDamageTest.java @@ -19,6 +19,7 @@ import org.destinationsol.game.context.internal.ContextImpl; import org.destinationsol.health.components.Health; import org.destinationsol.health.events.DamageEvent; +import org.destinationsol.health.systems.DamageSystem; import org.destinationsol.modules.ModuleManager; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -46,7 +47,7 @@ public void setUp() throws Exception { ModuleFactory moduleFactory = new ModuleFactory(); moduleManager = new ModuleManager(new DefaultBeanContext(), moduleFactory,new TableModuleRegistry(),new ModulePathScanner(moduleFactory)); moduleManager.init(); - entitySystemManager = new EntitySystemManager(moduleManager, new ComponentManager(), Collections.emptyList()); + entitySystemManager = new EntitySystemManager(moduleManager, new ComponentManager(), Collections.singletonList(new DamageSystem())); } @Test diff --git a/engine/src/test/java/org/destinationsol/systems/DamageSystemTests/ZeroHealthCausesDestructionTest.java b/engine/src/test/java/org/destinationsol/systems/DamageSystemTests/ZeroHealthCausesDestructionTest.java index 8ed156b66..bd7227f20 100644 --- a/engine/src/test/java/org/destinationsol/systems/DamageSystemTests/ZeroHealthCausesDestructionTest.java +++ b/engine/src/test/java/org/destinationsol/systems/DamageSystemTests/ZeroHealthCausesDestructionTest.java @@ -19,12 +19,17 @@ import org.destinationsol.game.context.internal.ContextImpl; import org.destinationsol.health.components.Health; import org.destinationsol.health.events.DamageEvent; +import org.destinationsol.health.systems.DamageSystem; import org.destinationsol.modules.ModuleManager; import org.destinationsol.removal.components.SlatedForDeletion; import org.destinationsol.removal.events.DeletionEvent; +import org.destinationsol.removal.systems.DeletionUpdateSystem; +import org.destinationsol.removal.systems.DestroyOnZeroHealthSystem; +import org.destinationsol.removal.systems.DestructionSystem; import org.destinationsol.testsupport.AssetsHelperInitializer; import org.destinationsol.testsupport.Box2DInitializer; import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; import org.terasology.gestalt.di.DefaultBeanContext; import org.terasology.gestalt.entitysystem.component.management.ComponentManager; @@ -33,6 +38,7 @@ import org.terasology.gestalt.module.ModulePathScanner; import org.terasology.gestalt.module.TableModuleRegistry; +import java.util.Arrays; import java.util.Collections; import static org.junit.jupiter.api.Assertions.assertFalse; @@ -46,10 +52,11 @@ public class ZeroHealthCausesDestructionTest implements Box2DInitializer, Assets @BeforeEach public void setUp() throws Exception { - entitySystemManager = new EntitySystemManager(getModuleManager(),getComponentManager(), Collections.emptyList()); + entitySystemManager = new EntitySystemManager(getModuleManager(),getComponentManager(), Arrays.asList(new DestroyOnZeroHealthSystem(), new DamageSystem(),new DestructionSystem())); } @Test + @Disabled("Reimplement with test-di... DestroyOnZero and Damage Systems using entity manager for sending events") public void testLethalDamageCausesDestruction() { EntityRef entity = entitySystemManager.getEntityManager().createEntity(new Health()); if (entity.getComponent(Health.class).isPresent()) { @@ -61,7 +68,6 @@ public void testLethalDamageCausesDestruction() { DamageEvent event = new DamageEvent(50); entitySystemManager.sendEvent(event, entity); - // Emulate `DeletionUpdateSystem#update` entitySystemManager.sendEvent(new DeletionEvent(), new SlatedForDeletion()); diff --git a/engine/src/test/java/org/destinationsol/systems/DestroyOnZeroHealthSystemTests/DestroyAtZeroHealthTest.java b/engine/src/test/java/org/destinationsol/systems/DestroyOnZeroHealthSystemTests/DestroyAtZeroHealthTest.java index e0e8dabdd..a0ff310e4 100644 --- a/engine/src/test/java/org/destinationsol/systems/DestroyOnZeroHealthSystemTests/DestroyAtZeroHealthTest.java +++ b/engine/src/test/java/org/destinationsol/systems/DestroyOnZeroHealthSystemTests/DestroyAtZeroHealthTest.java @@ -20,9 +20,11 @@ import org.destinationsol.removal.components.SlatedForDeletion; import org.destinationsol.removal.events.DeletionEvent; import org.destinationsol.removal.events.ZeroHealthEvent; +import org.destinationsol.removal.systems.DestroyOnZeroHealthSystem; import org.destinationsol.testsupport.AssetsHelperInitializer; import org.destinationsol.testsupport.Box2DInitializer; import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; import org.terasology.gestalt.entitysystem.entity.EntityRef; @@ -36,10 +38,11 @@ public class DestroyAtZeroHealthTest implements Box2DInitializer, AssetsHelperIn @BeforeEach public void setUp() throws Exception { - entitySystemManager = new EntitySystemManager(getModuleManager(), getComponentManager(), Collections.emptyList()); + entitySystemManager = new EntitySystemManager(getModuleManager(), getComponentManager(), Collections.singletonList(new DestroyOnZeroHealthSystem())); } @Test + @Disabled("Reimplement with test-di... DamageSystems using entity manager for sending events") public void testZeroHealthCausesDestruction() { EntityRef entity = entitySystemManager.getEntityManager().createEntity(); diff --git a/engine/src/test/java/org/destinationsol/systems/DestructionSystemTests/DestructionTest.java b/engine/src/test/java/org/destinationsol/systems/DestructionSystemTests/DestructionTest.java index bd64c26da..ec43c3d99 100644 --- a/engine/src/test/java/org/destinationsol/systems/DestructionSystemTests/DestructionTest.java +++ b/engine/src/test/java/org/destinationsol/systems/DestructionSystemTests/DestructionTest.java @@ -20,6 +20,7 @@ import org.destinationsol.removal.components.SlatedForDeletion; import org.destinationsol.removal.events.DeletionEvent; import org.destinationsol.removal.events.ShouldBeDestroyedEvent; +import org.destinationsol.removal.systems.DestructionSystem; import org.destinationsol.testsupport.AssetsHelperInitializer; import org.destinationsol.testsupport.Box2DInitializer; import org.junit.jupiter.api.BeforeEach; @@ -39,7 +40,7 @@ public class DestructionTest implements Box2DInitializer, AssetsHelperInitialize @BeforeEach public void setUp() throws Exception { - entitySystemManager = new EntitySystemManager(getModuleManager(), getComponentManager(), Collections.emptyList()); + entitySystemManager = new EntitySystemManager(getModuleManager(), getComponentManager(), Collections.singletonList(new DestructionSystem())); } @Test diff --git a/engine/src/test/java/org/destinationsol/systems/DestructionSystemTests/RemovalForOptimizationTest.java b/engine/src/test/java/org/destinationsol/systems/DestructionSystemTests/RemovalForOptimizationTest.java index 56e39db9f..d3f9d3a48 100644 --- a/engine/src/test/java/org/destinationsol/systems/DestructionSystemTests/RemovalForOptimizationTest.java +++ b/engine/src/test/java/org/destinationsol/systems/DestructionSystemTests/RemovalForOptimizationTest.java @@ -21,6 +21,7 @@ import org.destinationsol.removal.components.SlatedForDeletion; import org.destinationsol.removal.events.DeletionEvent; import org.destinationsol.removal.events.RemovalForOptimizationEvent; +import org.destinationsol.removal.systems.DestructionSystem; import org.destinationsol.testsupport.AssetsHelperInitializer; import org.destinationsol.testsupport.Box2DInitializer; import org.junit.jupiter.api.BeforeEach; @@ -40,7 +41,7 @@ public class RemovalForOptimizationTest implements Box2DInitializer, AssetsHelpe @BeforeEach public void setUp() throws Exception { - entitySystemManager = new EntitySystemManager(getModuleManager(), getComponentManager(), Collections.emptyList()); + entitySystemManager = new EntitySystemManager(getModuleManager(), getComponentManager(), Collections.singletonList(new DestructionSystem())); } @Test diff --git a/engine/src/test/java/org/destinationsol/systems/LocationSystemTests/AngleUpdateTest.java b/engine/src/test/java/org/destinationsol/systems/LocationSystemTests/AngleUpdateTest.java index c896a2be8..a4a0046bf 100644 --- a/engine/src/test/java/org/destinationsol/systems/LocationSystemTests/AngleUpdateTest.java +++ b/engine/src/test/java/org/destinationsol/systems/LocationSystemTests/AngleUpdateTest.java @@ -19,6 +19,7 @@ import org.destinationsol.game.context.internal.ContextImpl; import org.destinationsol.location.components.Angle; import org.destinationsol.location.events.AngleUpdateEvent; +import org.destinationsol.location.systems.LocationSystem; import org.destinationsol.testsupport.AssetsHelperInitializer; import org.destinationsol.testsupport.Box2DInitializer; import org.junit.jupiter.api.BeforeEach; @@ -35,7 +36,7 @@ public class AngleUpdateTest implements AssetsHelperInitializer, Box2DInitialize @BeforeEach public void setUp() throws Exception { - entitySystemManager = new EntitySystemManager(getModuleManager(), getComponentManager(), Collections.emptyList()); + entitySystemManager = new EntitySystemManager(getModuleManager(), getComponentManager(), Collections.singletonList(new LocationSystem())); } @Test diff --git a/engine/src/test/java/org/destinationsol/systems/LocationSystemTests/PositionUpdateTest.java b/engine/src/test/java/org/destinationsol/systems/LocationSystemTests/PositionUpdateTest.java index 10f181dba..5d8005b57 100644 --- a/engine/src/test/java/org/destinationsol/systems/LocationSystemTests/PositionUpdateTest.java +++ b/engine/src/test/java/org/destinationsol/systems/LocationSystemTests/PositionUpdateTest.java @@ -20,6 +20,7 @@ import org.destinationsol.game.context.internal.ContextImpl; import org.destinationsol.location.components.Position; import org.destinationsol.location.events.PositionUpdateEvent; +import org.destinationsol.location.systems.LocationSystem; import org.destinationsol.modules.ModuleManager; import org.destinationsol.testsupport.Box2DInitializer; import org.junit.jupiter.api.BeforeEach; @@ -46,7 +47,7 @@ public void setUp() throws Exception { ModuleFactory moduleFactory = new ModuleFactory(); moduleManager = new ModuleManager(new DefaultBeanContext(), moduleFactory,new TableModuleRegistry(),new ModulePathScanner(moduleFactory)); moduleManager.init(); - entitySystemManager = new EntitySystemManager(moduleManager, new ComponentManager(), Collections.emptyList()); + entitySystemManager = new EntitySystemManager(moduleManager, new ComponentManager(), Collections.singletonList(new LocationSystem())); } @Test diff --git a/engine/src/test/java/org/destinationsol/systems/LocationSystemTests/VelocityUpdateTest.java b/engine/src/test/java/org/destinationsol/systems/LocationSystemTests/VelocityUpdateTest.java index d2517b861..9778693d7 100644 --- a/engine/src/test/java/org/destinationsol/systems/LocationSystemTests/VelocityUpdateTest.java +++ b/engine/src/test/java/org/destinationsol/systems/LocationSystemTests/VelocityUpdateTest.java @@ -20,6 +20,7 @@ import org.destinationsol.game.context.internal.ContextImpl; import org.destinationsol.location.components.Velocity; import org.destinationsol.location.events.VelocityUpdateEvent; +import org.destinationsol.location.systems.LocationSystem; import org.destinationsol.testsupport.AssetsHelperInitializer; import org.destinationsol.testsupport.Box2DInitializer; import org.junit.jupiter.api.BeforeEach; @@ -36,7 +37,7 @@ public class VelocityUpdateTest implements AssetsHelperInitializer, Box2DInitial @BeforeEach public void setUp() throws Exception { - entitySystemManager = new EntitySystemManager(getModuleManager(), getComponentManager(), Collections.emptyList()); + entitySystemManager = new EntitySystemManager(getModuleManager(), getComponentManager(), Collections.singletonList(new LocationSystem())); } @Test From 6e7c60c2506d7b48ebedea48cf9fde0b028e03f2 Mon Sep 17 00:00:00 2001 From: Michael Pollind Date: Sun, 25 Apr 2021 19:51:53 -0700 Subject: [PATCH 15/38] update gestalt version --- build.gradle | 2 +- engine/build.gradle | 2 +- .../main/java/org/destinationsol/ContextWrapperService.java | 2 +- engine/src/main/java/org/destinationsol/CoreService.java | 3 +-- engine/src/main/java/org/destinationsol/SolApplication.java | 3 --- .../main/java/org/destinationsol/SolGameServiceRegistry.java | 3 +-- 6 files changed, 5 insertions(+), 10 deletions(-) diff --git a/build.gradle b/build.gradle index 52ab8a0dd..834e86ee7 100644 --- a/build.gradle +++ b/build.gradle @@ -27,7 +27,7 @@ allprojects { appName = 'DestinationSol' gdxVersion = '1.9.8' roboVMVersion = '2.3.3' - gestaltVersion = '7.0.6-SNAPSHOT' + gestaltVersion = '8.0.0-SNAPSHOT' } } diff --git a/engine/build.gradle b/engine/build.gradle index d3753376b..ac952a390 100644 --- a/engine/build.gradle +++ b/engine/build.gradle @@ -21,7 +21,7 @@ buildscript { // HACK: Needed for NUI and gestalt entity-component reflections classpath group: 'org.terasology.nui', name: 'nui', version: '2.0.0-SNAPSHOT' classpath group: 'javax.servlet', name: 'javax.servlet-api', version: '3.0.1' - classpath group: 'org.terasology.gestalt', name: 'gestalt-entity-system', version: '7.0.6-SNAPSHOT' + classpath "org.terasology.gestalt:gestalt-entity-system:$gestaltVersion" } } diff --git a/engine/src/main/java/org/destinationsol/ContextWrapperService.java b/engine/src/main/java/org/destinationsol/ContextWrapperService.java index b0ecb0ae1..14658b504 100644 --- a/engine/src/main/java/org/destinationsol/ContextWrapperService.java +++ b/engine/src/main/java/org/destinationsol/ContextWrapperService.java @@ -17,7 +17,7 @@ import org.destinationsol.game.context.Context; -import org.terasology.gestalt.di.Lifetime; +import org.terasology.context.Lifetime; import org.terasology.gestalt.di.ServiceRegistry; public class ContextWrapperService extends ServiceRegistry { diff --git a/engine/src/main/java/org/destinationsol/CoreService.java b/engine/src/main/java/org/destinationsol/CoreService.java index eedee8114..9149373d0 100644 --- a/engine/src/main/java/org/destinationsol/CoreService.java +++ b/engine/src/main/java/org/destinationsol/CoreService.java @@ -14,10 +14,9 @@ import org.destinationsol.ui.SolInputManager; import org.destinationsol.ui.SolLayouts; import org.destinationsol.ui.UiDrawer; -import org.terasology.gestalt.di.Lifetime; +import org.terasology.context.Lifetime; import org.terasology.gestalt.di.ServiceRegistry; import org.terasology.gestalt.entitysystem.component.management.ComponentManager; -import org.terasology.gestalt.module.ModuleEnvironment; public class CoreService extends ServiceRegistry { public CoreService(SolApplication application) { diff --git a/engine/src/main/java/org/destinationsol/SolApplication.java b/engine/src/main/java/org/destinationsol/SolApplication.java index 7e4aefb93..841f7aea0 100644 --- a/engine/src/main/java/org/destinationsol/SolApplication.java +++ b/engine/src/main/java/org/destinationsol/SolApplication.java @@ -42,7 +42,6 @@ import org.destinationsol.game.console.adapter.ParameterAdapterManager; import org.destinationsol.game.context.Context; import org.destinationsol.game.drawables.DrawableLevel; -import org.destinationsol.game.drawables.DrawableManager; import org.destinationsol.health.components.Health; import org.destinationsol.location.components.Angle; import org.destinationsol.location.components.Position; @@ -70,10 +69,8 @@ import org.terasology.context.annotation.API; import org.terasology.gestalt.di.BeanContext; import org.terasology.gestalt.di.DefaultBeanContext; -import org.terasology.gestalt.di.ServiceRegistry; import org.terasology.gestalt.entitysystem.component.management.ComponentManager; import org.terasology.gestalt.entitysystem.entity.EntityRef; -import org.terasology.gestalt.module.ModuleEnvironment; import org.terasology.gestalt.module.ModuleServiceRegistry; import org.terasology.gestalt.module.sandbox.StandardPermissionProviderFactory; diff --git a/engine/src/main/java/org/destinationsol/SolGameServiceRegistry.java b/engine/src/main/java/org/destinationsol/SolGameServiceRegistry.java index 116c87163..ad6e938b4 100644 --- a/engine/src/main/java/org/destinationsol/SolGameServiceRegistry.java +++ b/engine/src/main/java/org/destinationsol/SolGameServiceRegistry.java @@ -48,8 +48,7 @@ import org.destinationsol.game.screens.GameScreens; import org.destinationsol.game.ship.ShipBuilder; import org.destinationsol.ui.TutorialManager; -import org.terasology.gestalt.di.BeanContext; -import org.terasology.gestalt.di.Lifetime; +import org.terasology.context.Lifetime; import org.terasology.gestalt.di.ServiceRegistry; public class SolGameServiceRegistry extends ServiceRegistry { From 6e9f56a79f9b73c7457782089d28bc4759abbc1d Mon Sep 17 00:00:00 2001 From: Michael Pollind Date: Sat, 22 May 2021 16:20:23 -0700 Subject: [PATCH 16/38] update with 3d1 snapshot --- engine/build.gradle | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/engine/build.gradle b/engine/build.gradle index 0ef560334..baaefd79d 100644 --- a/engine/build.gradle +++ b/engine/build.gradle @@ -45,10 +45,12 @@ dependencies { annotationProcessor "org.terasology.gestalt:gestalt-inject-java:$gestaltVersion" implementation "net.jcip:jcip-annotations:1.0" - - api group: 'org.terasology.nui', name: 'nui', version: nuiVersion - api group: 'org.terasology.nui', name: 'nui-libgdx', version: nuiVersion - api group: 'org.terasology.nui', name: 'nui-gestalt7', version: nuiVersion + + api group: 'org.terasology.nui', name: 'nui', version: '3di-SNAPSHOT' + api group: 'org.terasology.nui', name: 'nui-libgdx', version: '3di-SNAPSHOT' + api group: 'org.terasology.nui', name: 'nui-gestalt7', version: '3di-SNAPSHOT' + api group: 'org.terasology.nui', name: 'nui-gestalt-di', version: '3di-SNAPSHOT' + api group: 'org.terasology.nui', name: 'nui-reflect', version: '3di-SNAPSHOT' implementation group: 'com.google.protobuf', name: 'protobuf-java', version: '3.4.0' From 5672d6c2f19c05bff274dcbc4be0e9f1cce9e536 Mon Sep 17 00:00:00 2001 From: Michael Pollind Date: Sat, 22 May 2021 18:22:44 -0700 Subject: [PATCH 17/38] update packages --- .gitignore | 1 + engine/build.gradle | 10 +++++----- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/.gitignore b/.gitignore index 294828258..13f75e3f8 100644 --- a/.gitignore +++ b/.gitignore @@ -78,3 +78,4 @@ engine/src/main/resources/entity_store.dat # Ignore donwloaded JREs jre/** +engine/src/main/generated/ \ No newline at end of file diff --git a/engine/build.gradle b/engine/build.gradle index baaefd79d..2bc3630c5 100644 --- a/engine/build.gradle +++ b/engine/build.gradle @@ -6,6 +6,7 @@ apply plugin: 'java-library' buildscript { repositories { mavenCentral() + mavenLocal() // HACK: Needed for NUI and gestalt entity-component reflections mavenLocal() @@ -46,11 +47,10 @@ dependencies { implementation "net.jcip:jcip-annotations:1.0" - api group: 'org.terasology.nui', name: 'nui', version: '3di-SNAPSHOT' - api group: 'org.terasology.nui', name: 'nui-libgdx', version: '3di-SNAPSHOT' - api group: 'org.terasology.nui', name: 'nui-gestalt7', version: '3di-SNAPSHOT' - api group: 'org.terasology.nui', name: 'nui-gestalt-di', version: '3di-SNAPSHOT' - api group: 'org.terasology.nui', name: 'nui-reflect', version: '3di-SNAPSHOT' + api group: 'org.terasology.nui', name: 'nui', version: '3.0.3-SNAPSHOT' + api group: 'org.terasology.nui', name: 'nui-libgdx', version: '3.0.3-SNAPSHOT' + api group: 'org.terasology.nui', name: 'nui-gestalt-di', version: '3.0.3-SNAPSHOT' + api group: 'org.terasology.nui', name: 'nui-reflect', version: '3.0.3-SNAPSHOT' implementation group: 'com.google.protobuf', name: 'protobuf-java', version: '3.4.0' From 935766e47ab3931fbf21b029ae184908eefc2816 Mon Sep 17 00:00:00 2001 From: Michael Pollind Date: Wed, 16 Jun 2021 20:43:19 -0700 Subject: [PATCH 18/38] update for 4.0.0 snapshot --- engine/build.gradle | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/engine/build.gradle b/engine/build.gradle index 2bc3630c5..a28356b4f 100644 --- a/engine/build.gradle +++ b/engine/build.gradle @@ -47,10 +47,10 @@ dependencies { implementation "net.jcip:jcip-annotations:1.0" - api group: 'org.terasology.nui', name: 'nui', version: '3.0.3-SNAPSHOT' - api group: 'org.terasology.nui', name: 'nui-libgdx', version: '3.0.3-SNAPSHOT' - api group: 'org.terasology.nui', name: 'nui-gestalt-di', version: '3.0.3-SNAPSHOT' - api group: 'org.terasology.nui', name: 'nui-reflect', version: '3.0.3-SNAPSHOT' + api group: 'org.terasology.nui', name: 'nui', version: '4.0.0-SNAPSHOT' + api group: 'org.terasology.nui', name: 'nui-libgdx', version: '4.0.0-SNAPSHOT' + api group: 'org.terasology.nui', name: 'nui-gestalt', version: '4.0.0-SNAPSHOT' + api group: 'org.terasology.nui', name: 'nui-reflect', version: '4.0.0-SNAPSHOT' implementation group: 'com.google.protobuf', name: 'protobuf-java', version: '3.4.0' From 1164f5e087df2f7247a8ae80abc20e6c3c152d68 Mon Sep 17 00:00:00 2001 From: Benjamin Amos Date: Tue, 6 Jul 2021 14:38:54 +0100 Subject: [PATCH 19/38] Added FacadeModuleConfig for Android compatibility. SolApplication is now initialised with an additional ServiceRegistry parameter for facade-provided implementation classes. This is used for providing a FacadeModuleConfig instance to the ModuleManager. --- .../destinationsol/desktop/SolDesktop.java | 36 +++++++++++++++++- .../org/destinationsol/SolApplication.java | 4 +- .../modules/FacadeModuleConfig.java | 37 ++++++++++++++++++ .../destinationsol/modules/ModuleManager.java | 38 +++++++++++++++---- .../NonNegativeDamageTest.java | 4 +- .../NonNegativeHealthTest.java | 4 +- .../DamageSystemTests/OnDamageTest.java | 4 +- .../PositionUpdateTest.java | 4 +- .../InitializationUtilities.java | 20 ++++++---- .../testsupport/AssetsHelperInitializer.java | 3 +- .../testsupport/TestModuleConfig.java | 36 ++++++++++++++++++ templates/build.gradle | 2 + 12 files changed, 169 insertions(+), 23 deletions(-) create mode 100644 engine/src/main/java/org/destinationsol/modules/FacadeModuleConfig.java create mode 100644 engine/src/test/java/org/destinationsol/testsupport/TestModuleConfig.java diff --git a/desktop/src/main/java/org/destinationsol/desktop/SolDesktop.java b/desktop/src/main/java/org/destinationsol/desktop/SolDesktop.java index e66474e5e..456657b7d 100644 --- a/desktop/src/main/java/org/destinationsol/desktop/SolDesktop.java +++ b/desktop/src/main/java/org/destinationsol/desktop/SolDesktop.java @@ -22,6 +22,7 @@ import com.badlogic.gdx.backends.lwjgl3.Lwjgl3ApplicationConfiguration; import com.badlogic.gdx.backends.lwjgl3.Lwjgl3Graphics; import org.destinationsol.GameOptions; +import org.destinationsol.modules.FacadeModuleConfig; import org.destinationsol.modules.ModuleManager; import org.destinationsol.SolApplication; import org.destinationsol.SolFileReader; @@ -29,13 +30,18 @@ import org.destinationsol.ui.ResizeSubscriber; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.terasology.context.Lifetime; import org.terasology.crashreporter.CrashReporter; +import org.terasology.gestalt.di.ServiceRegistry; +import org.terasology.gestalt.module.ModuleEnvironment; +import org.terasology.gestalt.module.sandbox.JavaModuleClassLoader; import java.awt.Graphics2D; import java.awt.Color; import java.awt.SplashScreen; import java.awt.Rectangle; import java.io.BufferedReader; +import java.io.File; import java.io.FileReader; import java.io.IOException; import java.io.PrintWriter; @@ -123,7 +129,7 @@ public static void main(String[] argv) { splash.close(); } // Everything is set up correctly, launch the application - SolApplication application = new SolApplication(100); + SolApplication application = new SolApplication(100, new DesktopServices()); SolApplication.addResizeSubscriber(new SolDesktop.FullScreenWindowPositionAdjustment(!options.fullscreen)); // Everything is set up correctly, launch the application new Lwjgl3Application(application, applicationConfig); @@ -211,6 +217,34 @@ private static void setScreenDimensions(Lwjgl3ApplicationConfiguration applicati } } + private static class DesktopServices extends ServiceRegistry { + public DesktopServices() { + this.with(FacadeModuleConfig.class).lifetime(Lifetime.Singleton).use(DesktopModuleConfig::new); + } + } + + private static class DesktopModuleConfig implements FacadeModuleConfig { + @Override + public File getModulesPath() { + return Paths.get(".").resolve("modules").toFile(); + } + + @Override + public boolean useSecurityManager() { + return true; + } + + @Override + public ModuleEnvironment.ClassLoaderSupplier getClassLoaderSupplier() { + return JavaModuleClassLoader::create; + } + + @Override + public Class[] getAPIClasses() { + return new Class[0]; + } + } + /** * Provides the implementation of SolFileReader used by this class. */ diff --git a/engine/src/main/java/org/destinationsol/SolApplication.java b/engine/src/main/java/org/destinationsol/SolApplication.java index 841f7aea0..2472c1a2c 100644 --- a/engine/src/main/java/org/destinationsol/SolApplication.java +++ b/engine/src/main/java/org/destinationsol/SolApplication.java @@ -69,6 +69,7 @@ import org.terasology.context.annotation.API; import org.terasology.gestalt.di.BeanContext; import org.terasology.gestalt.di.DefaultBeanContext; +import org.terasology.gestalt.di.ServiceRegistry; import org.terasology.gestalt.entitysystem.component.management.ComponentManager; import org.terasology.gestalt.entitysystem.entity.EntityRef; import org.terasology.gestalt.module.ModuleServiceRegistry; @@ -133,13 +134,14 @@ protected SolApplication() { throw new RuntimeException("Unimplemented"); } - public SolApplication(float targetFPS) { + public SolApplication(float targetFPS, ServiceRegistry platformServices) { // Initiate Box2D to make sure natives are loaded early enough Box2D.init(); this.targetFPS = targetFPS; resizeSubscribers = new HashSet<>(); this.appContext = new DefaultBeanContext( + platformServices, new ModuleServiceRegistry(new StandardPermissionProviderFactory()), new CoreService(this), new ContextWrapperService()); diff --git a/engine/src/main/java/org/destinationsol/modules/FacadeModuleConfig.java b/engine/src/main/java/org/destinationsol/modules/FacadeModuleConfig.java new file mode 100644 index 000000000..649bd2f8a --- /dev/null +++ b/engine/src/main/java/org/destinationsol/modules/FacadeModuleConfig.java @@ -0,0 +1,37 @@ +package org.destinationsol.modules; + +import org.terasology.gestalt.module.ModuleEnvironment; + +import java.io.File; + +/** + * This interface defines the module configuration for a given facade. Different facades will have different implementations + * and capabilities, so some properties that may vary between facades are defined here. + */ +public interface FacadeModuleConfig { + /** + * Returns the root folder to search for modules in. All modules should be located within this root folder. + * @return the root module path + */ + File getModulesPath(); + + /** + * Determines if the game uses SecurityManager for gestalt sandboxing. + * This should usually be true, unless running on a platform that does not support it. + * @return true, if SecurityManager should be used, otherwise false. + */ + boolean useSecurityManager(); + + /** + * Returns a method used to construct the class loader for a given module, parent and permissions. + * @return the class loader supplier method. + */ + ModuleEnvironment.ClassLoaderSupplier getClassLoaderSupplier(); + + /** + * Returns a list of classes that should be accessible from within the sandbox. + * Any classes not part of the built-in list or this one cannot be used in module code. + * @return a list of API classes. + */ + Class[] getAPIClasses(); +} diff --git a/engine/src/main/java/org/destinationsol/modules/ModuleManager.java b/engine/src/main/java/org/destinationsol/modules/ModuleManager.java index 14e1ce8f6..eaa86bf36 100644 --- a/engine/src/main/java/org/destinationsol/modules/ModuleManager.java +++ b/engine/src/main/java/org/destinationsol/modules/ModuleManager.java @@ -158,7 +158,7 @@ public class ModuleManager { java.io.DataOutputStream.class, java.io.FilterOutputStream.class, java.io.PipedOutputStream.class, - /* Gestalt classes */ + /* Gestalt entity-system classes */ org.terasology.gestalt.entitysystem.component.Component.class, org.terasology.gestalt.entitysystem.component.EmptyComponent.class, org.terasology.gestalt.entitysystem.event.Event.class, @@ -167,22 +167,37 @@ public class ModuleManager { org.terasology.gestalt.entitysystem.entity.EntityManager.class, org.terasology.gestalt.entitysystem.event.EventResult.class, org.terasology.gestalt.entitysystem.event.ReceiveEvent.class, - org.terasology.gestalt.entitysystem.prefab.GeneratedFromRecipeComponent.class + org.terasology.gestalt.entitysystem.prefab.GeneratedFromRecipeComponent.class, + /* Gestalt DI classes */ + org.terasology.context.AbstractBeanDefinition.class, + org.terasology.context.BeanResolution.class, + org.terasology.context.Argument.class, + org.terasology.context.DefaultArgument.class, + org.terasology.context.AnnotationMetadata.class, + org.terasology.context.DefaultAnnotationMetadata.class, + org.terasology.context.AnnotationValue.class, + org.terasology.context.DefaultAnnotationValue.class, + org.terasology.gestalt.di.exceptions.DependencyResolutionException.class, + org.terasology.context.exception.DependencyInjectionException.class, + javax.inject.Inject.class }; protected static ModuleEnvironment environment; private final ModuleFactory moduleFactory; private final ModulePathScanner scanner; private final BeanContext beanContext; + private final FacadeModuleConfig moduleConfig; protected ModuleRegistry registry; protected Module engineModule; @Inject - public ModuleManager(BeanContext beanContext, ModuleFactory moduleFactory, ModuleRegistry moduleRegistry, ModulePathScanner scanner) { + public ModuleManager(BeanContext beanContext, ModuleFactory moduleFactory, ModuleRegistry moduleRegistry, + ModulePathScanner scanner, FacadeModuleConfig moduleConfig) { this.moduleFactory = moduleFactory; this.registry = moduleRegistry; this.scanner = scanner; this.beanContext = beanContext; + this.moduleConfig = moduleConfig; } public void init() throws Exception { @@ -191,7 +206,7 @@ public void init() throws Exception { Module nuiModule = moduleFactory.createPackageModule(new ModuleMetadata(new Name("nui"), new Version("2.0.0")),"org.terasology.nui"); // scan for all standard modules - File modulesRoot = Paths.get(".").resolve("modules").toFile(); + File modulesRoot = moduleConfig.getModulesPath(); scanner.scan(registry, modulesRoot); Set requiredModules = Sets.newHashSet(); @@ -211,11 +226,14 @@ public void loadEnvironment(Set modules) { for (String api : API_WHITELIST) { permissionFactory.getBasePermissionSet().addAPIPackage(api); } - for (Class apiClass : CLASS_WHITELIST) { permissionFactory.getBasePermissionSet().addAPIClass(apiClass); } + for (Class apiClass : moduleConfig.getAPIClasses()) { + permissionFactory.getBasePermissionSet().addAPIClass(apiClass); + } + // The JSON serializers need to reflect classes to discover what exists permissionFactory.getBasePermissionSet().grantPermission("com.google.gson", ReflectPermission.class); permissionFactory.getBasePermissionSet().grantPermission("com.google.gson.internal", ReflectPermission.class); @@ -226,9 +244,13 @@ public void loadEnvironment(Set modules) { for(Module module: modules){ scanner.scan(module.getClassIndex()); } - Policy.setPolicy(new ModuleSecurityPolicy()); - System.setSecurityManager(new ModuleSecurityManager()); - environment = new ModuleEnvironment(beanContext, modules, permissionFactory); + + if (moduleConfig.useSecurityManager()) { + Policy.setPolicy(new ModuleSecurityPolicy()); + System.setSecurityManager(new ModuleSecurityManager()); + } + + environment = new ModuleEnvironment(beanContext, modules, permissionFactory, moduleConfig.getClassLoaderSupplier()); } public ModuleEnvironment getEnvironment() { diff --git a/engine/src/test/java/org/destinationsol/systems/DamageSystemTests/NonNegativeDamageTest.java b/engine/src/test/java/org/destinationsol/systems/DamageSystemTests/NonNegativeDamageTest.java index e79d6a445..1de26f9a5 100644 --- a/engine/src/test/java/org/destinationsol/systems/DamageSystemTests/NonNegativeDamageTest.java +++ b/engine/src/test/java/org/destinationsol/systems/DamageSystemTests/NonNegativeDamageTest.java @@ -20,6 +20,7 @@ import org.destinationsol.health.events.DamageEvent; import org.destinationsol.health.systems.DamageSystem; import org.destinationsol.modules.ModuleManager; +import org.destinationsol.testsupport.TestModuleConfig; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.terasology.gestalt.di.DefaultBeanContext; @@ -44,7 +45,8 @@ public class NonNegativeDamageTest { @BeforeEach public void setUp() throws Exception { ModuleFactory moduleFactory = new ModuleFactory(); - moduleManager = new ModuleManager(new DefaultBeanContext(), moduleFactory,new TableModuleRegistry(),new ModulePathScanner(moduleFactory)); + moduleManager = new ModuleManager(new DefaultBeanContext(), moduleFactory, new TableModuleRegistry(), + new ModulePathScanner(moduleFactory), new TestModuleConfig()); moduleManager.init(); entitySystemManager = new EntitySystemManager(moduleManager, new ComponentManager(), Collections.singletonList(new DamageSystem())); } diff --git a/engine/src/test/java/org/destinationsol/systems/DamageSystemTests/NonNegativeHealthTest.java b/engine/src/test/java/org/destinationsol/systems/DamageSystemTests/NonNegativeHealthTest.java index 0c99f3359..927955565 100644 --- a/engine/src/test/java/org/destinationsol/systems/DamageSystemTests/NonNegativeHealthTest.java +++ b/engine/src/test/java/org/destinationsol/systems/DamageSystemTests/NonNegativeHealthTest.java @@ -22,6 +22,7 @@ import org.destinationsol.health.systems.DamageSystem; import org.destinationsol.modules.ModuleManager; import org.destinationsol.removal.systems.DestroyOnZeroHealthSystem; +import org.destinationsol.testsupport.TestModuleConfig; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; @@ -46,7 +47,8 @@ public class NonNegativeHealthTest { @BeforeEach public void setUp() throws Exception { ModuleFactory moduleFactory = new ModuleFactory(); - moduleManager = new ModuleManager(new DefaultBeanContext(), moduleFactory,new TableModuleRegistry(),new ModulePathScanner(moduleFactory)); + moduleManager = new ModuleManager(new DefaultBeanContext(), moduleFactory, new TableModuleRegistry(), + new ModulePathScanner(moduleFactory), new TestModuleConfig()); moduleManager.init(); entitySystemManager = new EntitySystemManager(moduleManager, new ComponentManager(), Collections.singletonList(new DamageSystem())); } diff --git a/engine/src/test/java/org/destinationsol/systems/DamageSystemTests/OnDamageTest.java b/engine/src/test/java/org/destinationsol/systems/DamageSystemTests/OnDamageTest.java index 8eef6f563..6cd1739ec 100644 --- a/engine/src/test/java/org/destinationsol/systems/DamageSystemTests/OnDamageTest.java +++ b/engine/src/test/java/org/destinationsol/systems/DamageSystemTests/OnDamageTest.java @@ -21,6 +21,7 @@ import org.destinationsol.health.events.DamageEvent; import org.destinationsol.health.systems.DamageSystem; import org.destinationsol.modules.ModuleManager; +import org.destinationsol.testsupport.TestModuleConfig; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.terasology.gestalt.di.DefaultBeanContext; @@ -45,7 +46,8 @@ public class OnDamageTest { @BeforeEach public void setUp() throws Exception { ModuleFactory moduleFactory = new ModuleFactory(); - moduleManager = new ModuleManager(new DefaultBeanContext(), moduleFactory,new TableModuleRegistry(),new ModulePathScanner(moduleFactory)); + moduleManager = new ModuleManager(new DefaultBeanContext(), moduleFactory, new TableModuleRegistry(), + new ModulePathScanner(moduleFactory), new TestModuleConfig()); moduleManager.init(); entitySystemManager = new EntitySystemManager(moduleManager, new ComponentManager(), Collections.singletonList(new DamageSystem())); } diff --git a/engine/src/test/java/org/destinationsol/systems/LocationSystemTests/PositionUpdateTest.java b/engine/src/test/java/org/destinationsol/systems/LocationSystemTests/PositionUpdateTest.java index 5d8005b57..36c23ca56 100644 --- a/engine/src/test/java/org/destinationsol/systems/LocationSystemTests/PositionUpdateTest.java +++ b/engine/src/test/java/org/destinationsol/systems/LocationSystemTests/PositionUpdateTest.java @@ -23,6 +23,7 @@ import org.destinationsol.location.systems.LocationSystem; import org.destinationsol.modules.ModuleManager; import org.destinationsol.testsupport.Box2DInitializer; +import org.destinationsol.testsupport.TestModuleConfig; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.terasology.gestalt.di.DefaultBeanContext; @@ -45,7 +46,8 @@ public class PositionUpdateTest implements Box2DInitializer { @BeforeEach public void setUp() throws Exception { ModuleFactory moduleFactory = new ModuleFactory(); - moduleManager = new ModuleManager(new DefaultBeanContext(), moduleFactory,new TableModuleRegistry(),new ModulePathScanner(moduleFactory)); + moduleManager = new ModuleManager(new DefaultBeanContext(), moduleFactory, new TableModuleRegistry(), + new ModulePathScanner(moduleFactory), new TestModuleConfig()); moduleManager.init(); entitySystemManager = new EntitySystemManager(moduleManager, new ComponentManager(), Collections.singletonList(new LocationSystem())); } diff --git a/engine/src/test/java/org/destinationsol/testingUtilities/InitializationUtilities.java b/engine/src/test/java/org/destinationsol/testingUtilities/InitializationUtilities.java index 658cc6746..3b6fc21f9 100644 --- a/engine/src/test/java/org/destinationsol/testingUtilities/InitializationUtilities.java +++ b/engine/src/test/java/org/destinationsol/testingUtilities/InitializationUtilities.java @@ -16,6 +16,7 @@ package org.destinationsol.testingUtilities; import org.destinationsol.entitysystem.EntitySystemManager; +import org.destinationsol.modules.FacadeModuleConfig; import org.destinationsol.modules.ModuleManager; import com.badlogic.gdx.Gdx; import com.badlogic.gdx.backends.headless.HeadlessApplication; @@ -24,7 +25,10 @@ import org.destinationsol.SolApplication; import org.destinationsol.game.DebugOptions; import org.destinationsol.game.SolGame; +import org.destinationsol.testsupport.TestModuleConfig; +import org.terasology.context.Lifetime; import org.terasology.gestalt.di.DefaultBeanContext; +import org.terasology.gestalt.di.ServiceRegistry; import org.terasology.gestalt.entitysystem.component.management.ComponentManager; import org.terasology.gestalt.module.ModuleFactory; import org.terasology.gestalt.module.ModulePathScanner; @@ -45,17 +49,17 @@ public static void init() { } initialized = true; DebugOptions.DEV_ROOT_PATH = "engine/src/main/resources/"; - ModuleManager moduleManager; - try { - ModuleFactory moduleFactory = new ModuleFactory(); - moduleManager = new ModuleManager(new DefaultBeanContext(), moduleFactory,new TableModuleRegistry(),new ModulePathScanner(moduleFactory)); - } catch (Exception ignore) { - return; - } GL20 mockGL = new MockGL(); Gdx.gl = mockGL; Gdx.gl20 = mockGL; - final HeadlessApplication application = new HeadlessApplication(new SolApplication(100), new HeadlessApplicationConfiguration()); + + ServiceRegistry serviceRegistry = new ServiceRegistry(); + serviceRegistry + .with(FacadeModuleConfig.class) + .lifetime(Lifetime.Singleton) + .use(TestModuleConfig::new); + + final HeadlessApplication application = new HeadlessApplication(new SolApplication(100, serviceRegistry), new HeadlessApplicationConfiguration()); game = ((SolApplication) application.getApplicationListener()).getGame(); } } diff --git a/engine/src/test/java/org/destinationsol/testsupport/AssetsHelperInitializer.java b/engine/src/test/java/org/destinationsol/testsupport/AssetsHelperInitializer.java index de0da636e..ec84bbad4 100644 --- a/engine/src/test/java/org/destinationsol/testsupport/AssetsHelperInitializer.java +++ b/engine/src/test/java/org/destinationsol/testsupport/AssetsHelperInitializer.java @@ -49,7 +49,8 @@ default void initAssets() throws Exception { stateObject.setComponentManager(componentManager); ModuleFactory moduleFactory = new ModuleFactory(); - ModuleManager moduleManager = new ModuleManager(new DefaultBeanContext(), moduleFactory,new TableModuleRegistry(),new ModulePathScanner(moduleFactory)); + ModuleManager moduleManager = new ModuleManager(new DefaultBeanContext(), moduleFactory, new TableModuleRegistry(), + new ModulePathScanner(moduleFactory), new TestModuleConfig()); moduleManager.init(); stateObject.setModuleManager(moduleManager); diff --git a/engine/src/test/java/org/destinationsol/testsupport/TestModuleConfig.java b/engine/src/test/java/org/destinationsol/testsupport/TestModuleConfig.java new file mode 100644 index 000000000..650f02ade --- /dev/null +++ b/engine/src/test/java/org/destinationsol/testsupport/TestModuleConfig.java @@ -0,0 +1,36 @@ +package org.destinationsol.testsupport; + +import org.destinationsol.modules.FacadeModuleConfig; +import org.terasology.gestalt.module.ModuleEnvironment; +import org.terasology.gestalt.module.sandbox.JavaModuleClassLoader; + +import java.io.File; +import java.nio.file.Paths; + +/** + * Defines the settings used for module-based tests. + * + * This is currently just a copy of SolDesktop::DesktopModuleConfig but could be customised further for test-specific + * module paths. + */ +public class TestModuleConfig implements FacadeModuleConfig { + @Override + public File getModulesPath() { + return Paths.get(".").resolve("modules").toFile(); + } + + @Override + public boolean useSecurityManager() { + return true; + } + + @Override + public ModuleEnvironment.ClassLoaderSupplier getClassLoaderSupplier() { + return JavaModuleClassLoader::create; + } + + @Override + public Class[] getAPIClasses() { + return new Class[0]; + } +} \ No newline at end of file diff --git a/templates/build.gradle b/templates/build.gradle index 410866ea0..e3d6208b9 100644 --- a/templates/build.gradle +++ b/templates/build.gradle @@ -154,6 +154,8 @@ dependencies { } } } + + annotationProcessor "org.terasology.gestalt:gestalt-inject-java:$gestaltVersion" } // Change the output dir of each module From fa44ec22250d9ee517aeb0ce96a8ce545efec82e Mon Sep 17 00:00:00 2001 From: Benjamin Amos Date: Tue, 6 Jul 2021 16:54:26 +0100 Subject: [PATCH 20/38] fix: add missing indexing attributes to types --- .../main/java/org/destinationsol/game/UpdateAwareSystem.java | 3 +++ .../destinationsol/game/attributes/RegisterUpdateSystem.java | 3 +++ .../main/java/org/destinationsol/game/ship/AbilityConfig.java | 2 ++ 3 files changed, 8 insertions(+) diff --git a/engine/src/main/java/org/destinationsol/game/UpdateAwareSystem.java b/engine/src/main/java/org/destinationsol/game/UpdateAwareSystem.java index e8e14e4f7..f1221296e 100644 --- a/engine/src/main/java/org/destinationsol/game/UpdateAwareSystem.java +++ b/engine/src/main/java/org/destinationsol/game/UpdateAwareSystem.java @@ -15,6 +15,9 @@ */ package org.destinationsol.game; +import org.terasology.context.annotation.IndexInherited; + +@IndexInherited public interface UpdateAwareSystem { void update(SolGame game, float timeStep); diff --git a/engine/src/main/java/org/destinationsol/game/attributes/RegisterUpdateSystem.java b/engine/src/main/java/org/destinationsol/game/attributes/RegisterUpdateSystem.java index 96ab2ad3f..b5ab7b8b0 100644 --- a/engine/src/main/java/org/destinationsol/game/attributes/RegisterUpdateSystem.java +++ b/engine/src/main/java/org/destinationsol/game/attributes/RegisterUpdateSystem.java @@ -15,6 +15,8 @@ */ package org.destinationsol.game.attributes; +import org.terasology.context.annotation.Index; + import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; @@ -22,6 +24,7 @@ @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) +@Index public @interface RegisterUpdateSystem { int priority() default 0; boolean paused() default false; diff --git a/engine/src/main/java/org/destinationsol/game/ship/AbilityConfig.java b/engine/src/main/java/org/destinationsol/game/ship/AbilityConfig.java index b56c8c433..cf30585ed 100644 --- a/engine/src/main/java/org/destinationsol/game/ship/AbilityConfig.java +++ b/engine/src/main/java/org/destinationsol/game/ship/AbilityConfig.java @@ -20,7 +20,9 @@ import org.destinationsol.game.item.ItemManager; import org.destinationsol.game.item.SolItem; import org.json.JSONObject; +import org.terasology.context.annotation.IndexInherited; +@IndexInherited public interface AbilityConfig { public ShipAbility build(); From 435b5ebfab08813e84307f3b377db7fc40a9aa85 Mon Sep 17 00:00:00 2001 From: Benjamin Amos Date: Tue, 6 Jul 2021 18:12:09 +0100 Subject: [PATCH 21/38] fix: fix tutorial from not running Also fixed the rapid output of "Bean no found". --- .../org/destinationsol/SolApplication.java | 2 +- .../SolGameServiceRegistry.java | 6 +++-- .../java/org/destinationsol/game/SolGame.java | 24 +++++++------------ .../destinationsol/ui/SolInputManager.java | 4 ++-- .../destinationsol/ui/TutorialManager.java | 22 +++++++++++++---- 5 files changed, 34 insertions(+), 24 deletions(-) diff --git a/engine/src/main/java/org/destinationsol/SolApplication.java b/engine/src/main/java/org/destinationsol/SolApplication.java index 2472c1a2c..a5cc54a59 100644 --- a/engine/src/main/java/org/destinationsol/SolApplication.java +++ b/engine/src/main/java/org/destinationsol/SolApplication.java @@ -332,7 +332,7 @@ private void draw() { public void play(boolean tut, String shipName, boolean isNewGame, WorldConfig worldConfig) { - gameContext = appContext.getNestedContainer(new SolGameServiceRegistry(isNewGame), new ContextWrapperService()); + gameContext = appContext.getNestedContainer(new SolGameServiceRegistry(tut), new ContextWrapperService()); appContext.getBean(ComponentSystemManager.class).preBegin(); solGame = gameContext.getBean(SolGame.class); gameContext.getBean(ComponentSystemManager.class).preBegin(); diff --git a/engine/src/main/java/org/destinationsol/SolGameServiceRegistry.java b/engine/src/main/java/org/destinationsol/SolGameServiceRegistry.java index ad6e938b4..11122a3e6 100644 --- a/engine/src/main/java/org/destinationsol/SolGameServiceRegistry.java +++ b/engine/src/main/java/org/destinationsol/SolGameServiceRegistry.java @@ -54,7 +54,10 @@ public class SolGameServiceRegistry extends ServiceRegistry { public SolGameServiceRegistry(boolean isTutorial) { - this.with(SolGame.class).lifetime(Lifetime.Singleton).use(() -> new SolGame(isTutorial)); + this.with(SolGame.class).lifetime(Lifetime.Singleton); + if (isTutorial) { + this.with(TutorialManager.class).lifetime(Lifetime.Singleton); + } this.with(EntitySystemManager.class); this.with(SerialisationManager.class).lifetime(Lifetime.Singleton); @@ -82,7 +85,6 @@ public SolGameServiceRegistry(boolean isTutorial) { this.with(GameColors.class).lifetime(Lifetime.Singleton); this.with(BeaconHandler.class).lifetime(Lifetime.Singleton); this.with(MountDetectDrawer.class).lifetime(Lifetime.Singleton); - this.with(TutorialManager.class).lifetime(Lifetime.Singleton); this.with(GalaxyFiller.class).lifetime(Lifetime.Singleton); this.with(SolContactListener.class).lifetime(Lifetime.Singleton); this.with(GameScreens.class).lifetime(Lifetime.Singleton); diff --git a/engine/src/main/java/org/destinationsol/game/SolGame.java b/engine/src/main/java/org/destinationsol/game/SolGame.java index a2552ff2b..dc8fb1d76 100644 --- a/engine/src/main/java/org/destinationsol/game/SolGame.java +++ b/engine/src/main/java/org/destinationsol/game/SolGame.java @@ -67,11 +67,11 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.List; +import java.util.Optional; import java.util.SortedMap; import java.util.TreeMap; public class SolGame { - protected boolean isTutorial; @Inject protected GameScreens gameScreens; @Inject @@ -129,9 +129,10 @@ public class SolGame { @Inject protected SolContactListener contactListener; @Inject + protected Optional tutorialManager; + @Inject BeanContext beanContext; - protected TutorialManager tutorialManager; private Hero hero; private float timeStep; private float time; @@ -145,14 +146,8 @@ public class SolGame { @Inject public SolGame() { - this(false); - } - - public SolGame(boolean isTutorial) { - // TODO: make this non-static FactionInfo.init(); timeFactor = 1; - } public void createUpdateSystems(Context context) { @@ -162,8 +157,9 @@ public void createUpdateSystems(Context context) { updateSystems = new TreeMap>(); List defaultSystems = new ArrayList(); defaultSystems.addAll(Arrays.asList(planetManager, context.get(SolCam.class), chunkManager, mountDetectDrawer, objectManager, mapDrawer, soundManager, beaconHandler, drawableDebugger)); - if (tutorialManager != null) { - defaultSystems.add(tutorialManager); + if (tutorialManager.isPresent()) { + tutorialManager.get().init(); + defaultSystems.add(tutorialManager.get()); } updateSystems.put(0, defaultSystems); @@ -270,7 +266,7 @@ public void onGameEnd(Context context) { if (hero.isDead()) { respawn(); } - if (!isTutorial) { + if (!isTutorial()) { //The ship should have been saved when it entered the star-port if (!hero.isTranscendent()) { saveShip(); @@ -285,8 +281,6 @@ public void onGameEnd(Context context) { // TODO: Remove this when context is reset after each game context.get(EntitySystemManager.class).getEntityManager().allEntities().forEach(EntityRef::delete); - } else { - context.remove(TutorialManager.class, tutorialManager); } FactionInfo.clearValues(); // objectManager.dispose(); @@ -533,7 +527,7 @@ public MountDetectDrawer getMountDetectDrawer() { } public TutorialManager getTutMan() { - return tutorialManager; + return tutorialManager.orElse(null); } public EntitySystemManager getEntitySystemManager() { @@ -565,7 +559,7 @@ public void setRespawnState() { } public boolean isTutorial() { - return isTutorial; + return tutorialManager.isPresent(); } public SolApplication getSolApplication() { diff --git a/engine/src/main/java/org/destinationsol/ui/SolInputManager.java b/engine/src/main/java/org/destinationsol/ui/SolInputManager.java index 4ecf64078..e8109f2e1 100644 --- a/engine/src/main/java/org/destinationsol/ui/SolInputManager.java +++ b/engine/src/main/java/org/destinationsol/ui/SolInputManager.java @@ -240,7 +240,7 @@ public void update(SolApplication solApplication) { screen.updateCustom(solApplication, inputPointers, clickedOutside); } - TutorialManager tutorialManager = game == null ? null : context.get(TutorialManager.class); + TutorialManager tutorialManager = game == null ? null : game.getTutMan(); if (tutorialManager != null && tutorialManager.isFinished()) { solApplication.finishGame(); } @@ -351,7 +351,7 @@ public void draw(UiDrawer uiDrawer, SolApplication solApplication) { uiDrawer.setTextMode(null); SolGame game = solApplication.getGame(); - TutorialManager tutorialManager = game == null ? null : context.get(TutorialManager.class); + TutorialManager tutorialManager = game == null ? null : game.getTutMan(); if (tutorialManager != null && getTopScreen() != game.getScreens().menuScreen) { tutorialManager.draw(uiDrawer); } diff --git a/engine/src/main/java/org/destinationsol/ui/TutorialManager.java b/engine/src/main/java/org/destinationsol/ui/TutorialManager.java index 8e3548811..4d5877653 100644 --- a/engine/src/main/java/org/destinationsol/ui/TutorialManager.java +++ b/engine/src/main/java/org/destinationsol/ui/TutorialManager.java @@ -28,23 +28,37 @@ import org.destinationsol.game.screens.ShipKbControl; import org.destinationsol.game.screens.ShipMixedControl; +import javax.inject.Inject; +import javax.inject.Provider; import java.util.ArrayList; import java.util.List; public class TutorialManager implements UpdateAwareSystem { - private DisplayDimensions displayDimensions; private final Rectangle background; private final ArrayList steps; + private final GameScreens screens; + private final GameOptions gameOptions; + private final Provider game; + private final DisplayDimensions displayDimensions; private int stepIndex; - public TutorialManager(GameScreens screens, boolean mobile, GameOptions gameOptions, SolGame game) { - displayDimensions = SolApplication.displayDimensions; + @Inject + public TutorialManager(GameScreens screens, GameOptions gameOptions, Provider game, DisplayDimensions displayDimensions) { + this.screens = screens; + this.gameOptions = gameOptions; + this.game = game; + this.displayDimensions = displayDimensions; float backgroundW = displayDimensions.getRatio() * .5f; float backgroundH = .2f; background = new Rectangle(displayDimensions.getRatio() / 2 - backgroundW / 2, 1 - backgroundH, backgroundW, backgroundH); steps = new ArrayList<>(); + } + + public void init() { + boolean mobile = game.get().getSolApplication().isMobile(); + stepIndex = 0; MainGameScreen main = screens.mainGameScreen; @@ -139,7 +153,7 @@ public TutorialManager(GameScreens screens, boolean mobile, GameOptions gameOpti if (screens.inventoryScreen.getSelectedItem() == null || (screens.inventoryScreen.getSelectedItem() != null && screens.inventoryScreen.getSelectedItem().isEquipped() == 0)) { addStep(new SelectEquippedItemStep( - "Select an equipped item\n(note the text \"using\")", screens.inventoryScreen, game)); + "Select an equipped item\n(note the text \"using\")", screens.inventoryScreen, game.get())); } if (mobile) { From ca9eb189a5f6fe5ba056570db97249896f01d5bf Mon Sep 17 00:00:00 2001 From: Michael Pollind Date: Tue, 3 Aug 2021 20:09:43 -0700 Subject: [PATCH 22/38] chore: remove mavenLocal() --- build.gradle | 1 - config/gradle/common.gradle | 3 +-- engine/build.gradle | 3 --- 3 files changed, 1 insertion(+), 6 deletions(-) diff --git a/build.gradle b/build.gradle index cdf324f89..04ee27230 100644 --- a/build.gradle +++ b/build.gradle @@ -33,7 +33,6 @@ allprojects { } repositories { - mavenLocal() // Good ole Maven central mavenCentral() diff --git a/config/gradle/common.gradle b/config/gradle/common.gradle index acefdad28..78d9dffc0 100644 --- a/config/gradle/common.gradle +++ b/config/gradle/common.gradle @@ -24,7 +24,6 @@ sourceCompatibility = 1.8 targetCompatibility = 1.8 repositories { - mavenLocal() // Good ole Maven central mavenCentral() @@ -117,4 +116,4 @@ tasks.withType(Pmd) { // Make sure our config file for code analytics get extracted (vulnerability: non-IDE execution of single analytic) ideaModule.dependsOn rootProject.extractConfig tasks.eclipse.dependsOn rootProject.extractConfig -check.dependsOn rootProject.extractConfig \ No newline at end of file +check.dependsOn rootProject.extractConfig diff --git a/engine/build.gradle b/engine/build.gradle index a28356b4f..e4bd34dfd 100644 --- a/engine/build.gradle +++ b/engine/build.gradle @@ -6,10 +6,7 @@ apply plugin: 'java-library' buildscript { repositories { mavenCentral() - mavenLocal() - // HACK: Needed for NUI and gestalt entity-component reflections - mavenLocal() google() maven { url "http://artifactory.terasology.org/artifactory/virtual-repo-live" } // Needed for Jsemver, which is a gestalt dependency From 57a5e50684952148411cccf53c5f8e975deb7bf5 Mon Sep 17 00:00:00 2001 From: Michael Pollind Date: Tue, 3 Aug 2021 20:32:42 -0700 Subject: [PATCH 23/38] bugfix: resolve tutorialManager --- .../SolGameServiceRegistry.java | 2 +- .../destinationsol/ui/SolInputManager.java | 5 ++- .../destinationsol/ui/TutorialManager.java | 43 +++++++++++-------- 3 files changed, 28 insertions(+), 22 deletions(-) diff --git a/engine/src/main/java/org/destinationsol/SolGameServiceRegistry.java b/engine/src/main/java/org/destinationsol/SolGameServiceRegistry.java index ad6e938b4..4d43ad287 100644 --- a/engine/src/main/java/org/destinationsol/SolGameServiceRegistry.java +++ b/engine/src/main/java/org/destinationsol/SolGameServiceRegistry.java @@ -60,6 +60,7 @@ public SolGameServiceRegistry(boolean isTutorial) { this.with(SerialisationManager.class).lifetime(Lifetime.Singleton); + this.with(TutorialManager.class).lifetime(Lifetime.Singleton); this.with(DrawableManager.class).lifetime(Lifetime.Singleton); this.with(PlanetManager.class).lifetime(Lifetime.Singleton); this.with(ChunkManager.class).lifetime(Lifetime.Singleton); @@ -82,7 +83,6 @@ public SolGameServiceRegistry(boolean isTutorial) { this.with(GameColors.class).lifetime(Lifetime.Singleton); this.with(BeaconHandler.class).lifetime(Lifetime.Singleton); this.with(MountDetectDrawer.class).lifetime(Lifetime.Singleton); - this.with(TutorialManager.class).lifetime(Lifetime.Singleton); this.with(GalaxyFiller.class).lifetime(Lifetime.Singleton); this.with(SolContactListener.class).lifetime(Lifetime.Singleton); this.with(GameScreens.class).lifetime(Lifetime.Singleton); diff --git a/engine/src/main/java/org/destinationsol/ui/SolInputManager.java b/engine/src/main/java/org/destinationsol/ui/SolInputManager.java index 4ecf64078..5338bac3f 100644 --- a/engine/src/main/java/org/destinationsol/ui/SolInputManager.java +++ b/engine/src/main/java/org/destinationsol/ui/SolInputManager.java @@ -240,7 +240,7 @@ public void update(SolApplication solApplication) { screen.updateCustom(solApplication, inputPointers, clickedOutside); } - TutorialManager tutorialManager = game == null ? null : context.get(TutorialManager.class); + TutorialManager tutorialManager = game == null ? null : game.getContext().get(TutorialManager.class); if (tutorialManager != null && tutorialManager.isFinished()) { solApplication.finishGame(); } @@ -351,7 +351,8 @@ public void draw(UiDrawer uiDrawer, SolApplication solApplication) { uiDrawer.setTextMode(null); SolGame game = solApplication.getGame(); - TutorialManager tutorialManager = game == null ? null : context.get(TutorialManager.class); + + TutorialManager tutorialManager = game == null ? null : game.getContext().get(TutorialManager.class); if (tutorialManager != null && getTopScreen() != game.getScreens().menuScreen) { tutorialManager.draw(uiDrawer); } diff --git a/engine/src/main/java/org/destinationsol/ui/TutorialManager.java b/engine/src/main/java/org/destinationsol/ui/TutorialManager.java index 8e3548811..0e966c4ac 100644 --- a/engine/src/main/java/org/destinationsol/ui/TutorialManager.java +++ b/engine/src/main/java/org/destinationsol/ui/TutorialManager.java @@ -15,6 +15,8 @@ */ package org.destinationsol.ui; +import com.badlogic.gdx.Application; +import com.badlogic.gdx.Gdx; import com.badlogic.gdx.math.Rectangle; import org.destinationsol.GameOptions; import org.destinationsol.SolApplication; @@ -28,6 +30,7 @@ import org.destinationsol.game.screens.ShipKbControl; import org.destinationsol.game.screens.ShipMixedControl; +import javax.inject.Inject; import java.util.ArrayList; import java.util.List; @@ -38,8 +41,10 @@ public class TutorialManager implements UpdateAwareSystem { private int stepIndex; - public TutorialManager(GameScreens screens, boolean mobile, GameOptions gameOptions, SolGame game) { + @Inject + public TutorialManager(GameScreens screens, SolGame game, GameOptions gameOptions) { displayDimensions = SolApplication.displayDimensions; + boolean isMobile = Gdx.app.getType() == Application.ApplicationType.Android || Gdx.app.getType() == Application.ApplicationType.iOS; float backgroundW = displayDimensions.getRatio() * .5f; float backgroundH = .2f; @@ -69,7 +74,7 @@ public TutorialManager(GameScreens screens, boolean mobile, GameOptions gameOpti upCtrl = kbControl.upCtrl; leftCtrl = kbControl.leftCtrl; abilityCtrl = kbControl.abilityCtrl; - if (mobile) { + if (isMobile) { shootKey = "(GUN 1 button)"; shootKey2 = "(Press GUN 1 button)"; } else { @@ -81,14 +86,14 @@ public TutorialManager(GameScreens screens, boolean mobile, GameOptions gameOpti addStep("Hi! Shoot your main gun\n" + shootKey, shootCtrl); if (leftCtrl != null) { - if (mobile) { + if (isMobile) { addStep("Great! Turn left.\nDon't fly away yet!", leftCtrl); } else { addStep("Great! Turn left (" + gameOptions.getKeyLeftName() + " key). \nDon't fly away yet!", leftCtrl); } } - if (mobile) { + if (isMobile) { addStep("Have a look at the map", main.mapControl, true); } else { addStep("Have a look at the map\n(" + gameOptions.getKeyMapName() + " key)", main.mapControl, true); @@ -96,39 +101,39 @@ public TutorialManager(GameScreens screens, boolean mobile, GameOptions gameOpti if (mouseCtrl) { addStep("Zoom in the map\n(mouse wheel UP)", screens.mapScreen.zoomInControl); - } else if (mobile) { + } else if (isMobile) { addStep("Zoom in the map", screens.mapScreen.zoomInControl); } else { addStep("Zoom in the map\n(" + gameOptions.getKeyZoomInName() + " key)", screens.mapScreen.zoomInControl); } - if (mobile) { + if (isMobile) { addStep("Close the map", screens.mapScreen.closeControl, true); } else { addStep("Close the map\n(" + gameOptions.getKeyMapName() + " or " + gameOptions.getKeyCloseName() + " keys)", screens.mapScreen.closeControl, true); } - if (mouseCtrl || mobile) { + if (mouseCtrl || isMobile) { addStep("Have a look\nat your inventory", main.inventoryControl, true); } else { addStep("Have a look\nat your inventory (" + gameOptions.getKeyInventoryName() + " key)", main.inventoryControl, true); } - if (mouseCtrl || mobile) { + if (mouseCtrl || isMobile) { addStep("In the inventory,\nselect the second row", screens.inventoryScreen.itemControls[1]); } else { addStep("In the inventory,\nselect the next item (" + gameOptions.getKeyDownName() + " key)", screens.inventoryScreen.downControl); } - if (mouseCtrl || mobile) { + if (mouseCtrl || isMobile) { addStep("Go to the next page", screens.inventoryScreen.nextControl, true); } else { addStep("Go to the next page\n(" + gameOptions.getKeyRightName() + " key)", screens.inventoryScreen.nextControl, true); } - if (mouseCtrl || mobile) { + if (mouseCtrl || isMobile) { addStep("Throw away some item\nyou don't use", screens.inventoryScreen.showInventory.dropControl); } else { addStep("Throw away some item\nyou don't use (" + gameOptions.getKeyDropName() + " key)", @@ -142,20 +147,20 @@ public TutorialManager(GameScreens screens, boolean mobile, GameOptions gameOpti "Select an equipped item\n(note the text \"using\")", screens.inventoryScreen, game)); } - if (mobile) { + if (isMobile) { addStep("Unequip the item\nthat is used now", screens.inventoryScreen.showInventory.eq1Control); } else { addStep("Unequip the item\nthat is used now (" + gameOptions.getKeyEquipName() + " key)", screens.inventoryScreen.showInventory.eq1Control); } - if (mobile) { + if (isMobile) { addStep("Now equip it again", screens.inventoryScreen.showInventory.eq1Control); } else { addStep("Now equip it again\n(" + gameOptions.getKeyEquipName() + " key)", screens.inventoryScreen.showInventory.eq1Control); } - if (mobile) { + if (isMobile) { addStep("Close the inventory\n(Touch the screen outside inventory)", screens.inventoryScreen.closeControl, true); } else { addStep("Close the inventory (" + gameOptions.getKeyCloseName() + " key)", screens.inventoryScreen.closeControl, true); @@ -163,31 +168,31 @@ public TutorialManager(GameScreens screens, boolean mobile, GameOptions gameOpti if (mouseCtrl) { addStep("Move forward (" + gameOptions.getKeyUpMouseName() + " key).\nThere's no stop!", upCtrl); - } else if (mobile) { + } else if (isMobile) { addStep("Move forward.\nThere's no stop!", upCtrl); } else { addStep("Move forward (" + gameOptions.getKeyUpName() + " key).\nThere's no stop!", upCtrl); } - if (mobile) { + if (isMobile) { addStep("Fly closer to the station\nand talk with it", main.talkControl, true); } else { addStep("Fly closer to the station\nand talk with it (" + gameOptions.getKeyTalkName() + " key)", main.talkControl, true); } - if (mouseCtrl || mobile) { + if (mouseCtrl || isMobile) { addStep("See what there is to buy", screens.talkScreen.buyControl, true); } else { addStep("See what there is to buy\n(" + gameOptions.getKeyBuyMenuName() + " key)", screens.talkScreen.buyControl, true); } - if (mobile) { + if (isMobile) { addStep("Buy some item", screens.inventoryScreen.buyItemsScreen.buyControl); } else { addStep("Buy some item\n(" + gameOptions.getKeyBuyItemName() + " key)", screens.inventoryScreen.buyItemsScreen.buyControl); } - if (mobile) { + if (isMobile) { addStep("Close the Buy screen\n(Touch the screen outside inventory)", screens.inventoryScreen.closeControl, true); } else { addStep("Close the Buy screen\n(" + gameOptions.getKeyCloseName() + " key)", screens.inventoryScreen.closeControl, true); @@ -196,7 +201,7 @@ public TutorialManager(GameScreens screens, boolean mobile, GameOptions gameOpti if (mouseCtrl) { addStep("Use the ability of your ship\n(MIDDLE mouse button or " + gameOptions.getKeyAbilityName() + " key)", abilityCtrl, true); - } else if (mobile) { + } else if (isMobile) { addStep("Use the ability of your ship", abilityCtrl, true); } else { addStep("Use the ability of your ship\n(" + gameOptions.getKeyAbilityName() + " key)", abilityCtrl, true); From 2f3325bdf61a14e9a2b3f37944cef217b778bf8d Mon Sep 17 00:00:00 2001 From: Michael Pollind Date: Wed, 4 Aug 2021 19:45:34 -0700 Subject: [PATCH 24/38] chore: fix compiling errors --- .../destinationsol/ui/TutorialManager.java | 36 +++++++++---------- 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/engine/src/main/java/org/destinationsol/ui/TutorialManager.java b/engine/src/main/java/org/destinationsol/ui/TutorialManager.java index 2a515c126..f4dad6f47 100644 --- a/engine/src/main/java/org/destinationsol/ui/TutorialManager.java +++ b/engine/src/main/java/org/destinationsol/ui/TutorialManager.java @@ -84,7 +84,7 @@ public void init() { upCtrl = kbControl.upCtrl; leftCtrl = kbControl.leftCtrl; abilityCtrl = kbControl.abilityCtrl; - if (isMobile) { + if (mobile) { shootKey = "(GUN 1 button)"; shootKey2 = "(Press GUN 1 button)"; } else { @@ -96,14 +96,14 @@ public void init() { addStep("Hi! Shoot your main gun\n" + shootKey, shootCtrl); if (leftCtrl != null) { - if (isMobile) { + if (mobile) { addStep("Great! Turn left.\nDon't fly away yet!", leftCtrl); } else { addStep("Great! Turn left (" + gameOptions.getKeyLeftName() + " key). \nDon't fly away yet!", leftCtrl); } } - if (isMobile) { + if (mobile) { addStep("Have a look at the map", main.mapControl, true); } else { addStep("Have a look at the map\n(" + gameOptions.getKeyMapName() + " key)", main.mapControl, true); @@ -111,39 +111,39 @@ public void init() { if (mouseCtrl) { addStep("Zoom in the map\n(mouse wheel UP)", screens.mapScreen.zoomInControl); - } else if (isMobile) { + } else if (mobile) { addStep("Zoom in the map", screens.mapScreen.zoomInControl); } else { addStep("Zoom in the map\n(" + gameOptions.getKeyZoomInName() + " key)", screens.mapScreen.zoomInControl); } - if (isMobile) { + if (mobile) { addStep("Close the map", screens.mapScreen.closeControl, true); } else { addStep("Close the map\n(" + gameOptions.getKeyMapName() + " or " + gameOptions.getKeyCloseName() + " keys)", screens.mapScreen.closeControl, true); } - if (mouseCtrl || isMobile) { + if (mouseCtrl || mobile) { addStep("Have a look\nat your inventory", main.inventoryControl, true); } else { addStep("Have a look\nat your inventory (" + gameOptions.getKeyInventoryName() + " key)", main.inventoryControl, true); } - if (mouseCtrl || isMobile) { + if (mouseCtrl || mobile) { addStep("In the inventory,\nselect the second row", screens.inventoryScreen.itemControls[1]); } else { addStep("In the inventory,\nselect the next item (" + gameOptions.getKeyDownName() + " key)", screens.inventoryScreen.downControl); } - if (mouseCtrl || isMobile) { + if (mouseCtrl || mobile) { addStep("Go to the next page", screens.inventoryScreen.nextControl, true); } else { addStep("Go to the next page\n(" + gameOptions.getKeyRightName() + " key)", screens.inventoryScreen.nextControl, true); } - if (mouseCtrl || isMobile) { + if (mouseCtrl || mobile) { addStep("Throw away some item\nyou don't use", screens.inventoryScreen.showInventory.dropControl); } else { addStep("Throw away some item\nyou don't use (" + gameOptions.getKeyDropName() + " key)", @@ -157,20 +157,20 @@ public void init() { "Select an equipped item\n(note the text \"using\")", screens.inventoryScreen, game.get())); } - if (isMobile) { + if (mobile) { addStep("Unequip the item\nthat is used now", screens.inventoryScreen.showInventory.eq1Control); } else { addStep("Unequip the item\nthat is used now (" + gameOptions.getKeyEquipName() + " key)", screens.inventoryScreen.showInventory.eq1Control); } - if (isMobile) { + if (mobile) { addStep("Now equip it again", screens.inventoryScreen.showInventory.eq1Control); } else { addStep("Now equip it again\n(" + gameOptions.getKeyEquipName() + " key)", screens.inventoryScreen.showInventory.eq1Control); } - if (isMobile) { + if (mobile) { addStep("Close the inventory\n(Touch the screen outside inventory)", screens.inventoryScreen.closeControl, true); } else { addStep("Close the inventory (" + gameOptions.getKeyCloseName() + " key)", screens.inventoryScreen.closeControl, true); @@ -178,31 +178,31 @@ public void init() { if (mouseCtrl) { addStep("Move forward (" + gameOptions.getKeyUpMouseName() + " key).\nThere's no stop!", upCtrl); - } else if (isMobile) { + } else if (mobile) { addStep("Move forward.\nThere's no stop!", upCtrl); } else { addStep("Move forward (" + gameOptions.getKeyUpName() + " key).\nThere's no stop!", upCtrl); } - if (isMobile) { + if (mobile) { addStep("Fly closer to the station\nand talk with it", main.talkControl, true); } else { addStep("Fly closer to the station\nand talk with it (" + gameOptions.getKeyTalkName() + " key)", main.talkControl, true); } - if (mouseCtrl || isMobile) { + if (mouseCtrl || mobile) { addStep("See what there is to buy", screens.talkScreen.buyControl, true); } else { addStep("See what there is to buy\n(" + gameOptions.getKeyBuyMenuName() + " key)", screens.talkScreen.buyControl, true); } - if (isMobile) { + if (mobile) { addStep("Buy some item", screens.inventoryScreen.buyItemsScreen.buyControl); } else { addStep("Buy some item\n(" + gameOptions.getKeyBuyItemName() + " key)", screens.inventoryScreen.buyItemsScreen.buyControl); } - if (isMobile) { + if (mobile) { addStep("Close the Buy screen\n(Touch the screen outside inventory)", screens.inventoryScreen.closeControl, true); } else { addStep("Close the Buy screen\n(" + gameOptions.getKeyCloseName() + " key)", screens.inventoryScreen.closeControl, true); @@ -211,7 +211,7 @@ public void init() { if (mouseCtrl) { addStep("Use the ability of your ship\n(MIDDLE mouse button or " + gameOptions.getKeyAbilityName() + " key)", abilityCtrl, true); - } else if (isMobile) { + } else if (mobile) { addStep("Use the ability of your ship", abilityCtrl, true); } else { addStep("Use the ability of your ship\n(" + gameOptions.getKeyAbilityName() + " key)", abilityCtrl, true); From 76db920459e8e8202eb373f0728eabd07c22dc91 Mon Sep 17 00:00:00 2001 From: Michael Pollind Date: Thu, 5 Aug 2021 07:00:56 -0700 Subject: [PATCH 25/38] bugfix: remove duplicate registration for TutorialManager --- .../main/java/org/destinationsol/SolGameServiceRegistry.java | 3 --- 1 file changed, 3 deletions(-) diff --git a/engine/src/main/java/org/destinationsol/SolGameServiceRegistry.java b/engine/src/main/java/org/destinationsol/SolGameServiceRegistry.java index 3a4bbf356..2ddfa34db 100644 --- a/engine/src/main/java/org/destinationsol/SolGameServiceRegistry.java +++ b/engine/src/main/java/org/destinationsol/SolGameServiceRegistry.java @@ -52,7 +52,6 @@ import org.terasology.gestalt.di.ServiceRegistry; public class SolGameServiceRegistry extends ServiceRegistry { - public SolGameServiceRegistry(boolean isTutorial) { this.with(SolGame.class).lifetime(Lifetime.Singleton); if (isTutorial) { @@ -62,8 +61,6 @@ public SolGameServiceRegistry(boolean isTutorial) { this.with(EntitySystemManager.class); this.with(SerialisationManager.class).lifetime(Lifetime.Singleton); - - this.with(TutorialManager.class).lifetime(Lifetime.Singleton); this.with(DrawableManager.class).lifetime(Lifetime.Singleton); this.with(PlanetManager.class).lifetime(Lifetime.Singleton); this.with(ChunkManager.class).lifetime(Lifetime.Singleton); From 595f73b20ab975d420411845c1ff3afca5cef243 Mon Sep 17 00:00:00 2001 From: Michael Pollind Date: Sat, 11 Sep 2021 20:24:25 -0700 Subject: [PATCH 26/38] chore: fix Component --- .../org/destinationsol/body/components/BodyLinked.java | 4 ++-- .../destinationsol/force/components/Durability.java | 2 +- .../org/destinationsol/health/components/Health.java | 2 +- .../org/destinationsol/location/components/Angle.java | 10 +++++----- .../destinationsol/location/components/Position.java | 4 ++-- .../destinationsol/location/components/Velocity.java | 4 ++-- .../rendering/components/Renderable.java | 2 +- .../java/org/destinationsol/size/components/Size.java | 3 ++- 8 files changed, 16 insertions(+), 15 deletions(-) diff --git a/engine/src/main/java/org/destinationsol/body/components/BodyLinked.java b/engine/src/main/java/org/destinationsol/body/components/BodyLinked.java index e202aa5f6..3fa340f16 100644 --- a/engine/src/main/java/org/destinationsol/body/components/BodyLinked.java +++ b/engine/src/main/java/org/destinationsol/body/components/BodyLinked.java @@ -47,7 +47,7 @@ public float getMass() { } @Override - public void copy(BodyLinked other) { - this.mass = other.getMass(); + public void copyFrom(BodyLinked other) { + this.mass = other.mass; } } diff --git a/engine/src/main/java/org/destinationsol/force/components/Durability.java b/engine/src/main/java/org/destinationsol/force/components/Durability.java index 15abbc019..65a685ee0 100644 --- a/engine/src/main/java/org/destinationsol/force/components/Durability.java +++ b/engine/src/main/java/org/destinationsol/force/components/Durability.java @@ -49,7 +49,7 @@ public void setDurability(float durability) { } @Override - public void copy(Durability other) { + public void copyFrom(Durability other) { this.durability = other.durability; } } diff --git a/engine/src/main/java/org/destinationsol/health/components/Health.java b/engine/src/main/java/org/destinationsol/health/components/Health.java index e3251b20a..2bd97324b 100644 --- a/engine/src/main/java/org/destinationsol/health/components/Health.java +++ b/engine/src/main/java/org/destinationsol/health/components/Health.java @@ -26,7 +26,7 @@ public final class Health implements Component { public float currentHealth = 30; @Override - public void copy(Health other) { + public void copyFrom(Health other) { this.maxHealth = other.maxHealth; this.currentHealth = other.currentHealth; } diff --git a/engine/src/main/java/org/destinationsol/location/components/Angle.java b/engine/src/main/java/org/destinationsol/location/components/Angle.java index 5319d07b2..9e0e077eb 100644 --- a/engine/src/main/java/org/destinationsol/location/components/Angle.java +++ b/engine/src/main/java/org/destinationsol/location/components/Angle.java @@ -26,11 +26,6 @@ public class Angle implements Component { */ private float angle; - @Override - public void copy(Angle other) { - this.angle = other.angle; - } - public float getAngle() { return angle; } @@ -38,4 +33,9 @@ public float getAngle() { public void setAngle(float angle) { this.angle = SolMath.norm(angle); } + + @Override + public void copyFrom(Angle other) { + this.angle = other.angle; + } } diff --git a/engine/src/main/java/org/destinationsol/location/components/Position.java b/engine/src/main/java/org/destinationsol/location/components/Position.java index 7e38db2c9..f05cb6ee4 100644 --- a/engine/src/main/java/org/destinationsol/location/components/Position.java +++ b/engine/src/main/java/org/destinationsol/location/components/Position.java @@ -27,7 +27,7 @@ public class Position implements Component { public Vector2 position = new Vector2(); @Override - public void copy(Position other) { - position = other.position.cpy(); + public void copyFrom(Position other) { + this.position.set(other.position); } } diff --git a/engine/src/main/java/org/destinationsol/location/components/Velocity.java b/engine/src/main/java/org/destinationsol/location/components/Velocity.java index ffa461f34..9a1110c13 100644 --- a/engine/src/main/java/org/destinationsol/location/components/Velocity.java +++ b/engine/src/main/java/org/destinationsol/location/components/Velocity.java @@ -27,7 +27,7 @@ public class Velocity implements Component { public Vector2 velocity = new Vector2(); @Override - public void copy(Velocity other) { - velocity = other.velocity.cpy(); + public void copyFrom(Velocity other) { + this.velocity.set(other.velocity); } } diff --git a/engine/src/main/java/org/destinationsol/rendering/components/Renderable.java b/engine/src/main/java/org/destinationsol/rendering/components/Renderable.java index b459c4e2d..9daf6241e 100644 --- a/engine/src/main/java/org/destinationsol/rendering/components/Renderable.java +++ b/engine/src/main/java/org/destinationsol/rendering/components/Renderable.java @@ -30,7 +30,7 @@ public final class Renderable implements Component { public boolean isInvisible; @Override - public void copy(Renderable other) { + public void copyFrom(Renderable other) { ArrayList newElements = new ArrayList<>(); for (int index = 0; index < other.elements.size(); index++) { RenderableElement data = new RenderableElement(); diff --git a/engine/src/main/java/org/destinationsol/size/components/Size.java b/engine/src/main/java/org/destinationsol/size/components/Size.java index 62ab7009d..2087f69fe 100644 --- a/engine/src/main/java/org/destinationsol/size/components/Size.java +++ b/engine/src/main/java/org/destinationsol/size/components/Size.java @@ -15,6 +15,7 @@ */ package org.destinationsol.size.components; + import org.terasology.gestalt.entitysystem.component.Component; /** @@ -25,7 +26,7 @@ public class Size implements Component { public float size; @Override - public void copy(Size other) { + public void copyFrom(Size other) { this.size = other.size; } } From dd1921ecbb6dc0cfa47bfd9d449f49c1df8e3949 Mon Sep 17 00:00:00 2001 From: Michael Pollind Date: Thu, 30 Sep 2021 20:17:49 -0700 Subject: [PATCH 27/38] chore: merged in changes from master --- build.gradle | 2 +- engine/build.gradle | 1 + .../main/java/org/destinationsol/Const.java | 2 - .../java/org/destinationsol/GameOptions.java | 2 + .../org/destinationsol/SolApplication.java | 7 +- .../assets/fonts/ScaledFontProducer.java | 87 +++ .../assets/ui/KeyboardKeyTypeAdapter.java | 45 ++ .../destinationsol/assets/ui/UIFormat.java | 2 + .../destinationsol/game/CamRotStrategy.java | 8 +- .../org/destinationsol/game/GalaxyFiller.java | 32 +- .../org/destinationsol/game/HardnessCalc.java | 7 +- .../org/destinationsol/game/MapDrawer.java | 11 +- .../destinationsol/game/PlayerCreator.java | 2 +- .../destinationsol/game/RubbleBuilder.java | 8 +- .../org/destinationsol/game/ShipConfig.java | 3 +- .../java/org/destinationsol/game/SolGame.java | 71 ++- .../org/destinationsol/game/StarPort.java | 3 +- .../game/chunk/ChunkFiller.java | 29 +- .../game/input/BigObjAvoider.java | 5 +- .../game/input/ExplorerDestProvider.java | 6 +- .../game/input/UiControlledPilot.java | 20 +- .../org/destinationsol/game/maze/Maze.java | 24 + .../destinationsol/game/maze/MazeBuilder.java | 13 +- ...azeConfigs.java => MazeConfigManager.java} | 35 +- .../destinationsol/game/maze/MazeLayout.java | 14 + .../game/maze/MazeLayoutBuilder.java | 23 +- .../game/maze/MazeLayoutManager.java | 101 +++ .../game/planet/BeltConfig.java | 46 ++ .../game/planet/BeltConfigManager.java | 147 +++++ .../game/planet/CloudBuilder.java | 100 +++ .../game/planet/OrbitalEnemiesBuilder.java | 72 +++ .../destinationsol/game/planet/Planet.java | 12 +- .../game/planet/PlanetConfig.java | 8 + ...tConfigs.java => PlanetConfigManager.java} | 44 +- .../game/planet/PlanetManager.java | 40 +- .../game/planet/PlanetObjectsBuilder.java | 101 +-- .../org/destinationsol/game/planet/Sky.java | 2 +- .../{SolSystem.java => SolarSystem.java} | 15 +- .../game/planet/SolarSystemConfig.java | 50 ++ .../game/planet/SolarSystemConfigManager.java | 153 +++++ .../game/planet/SunSingleton.java | 10 +- .../game/planet/SystemBelt.java | 18 +- .../game/planet/SystemsBuilder.java | 60 +- .../game/screens/BorderDrawer.java | 4 +- .../game/screens/GameScreens.java | 5 + .../game/screens/MainGameScreen.java | 184 +----- .../game/screens/MapScreen.java | 2 +- .../game/screens/ShipMixedControl.java | 2 +- .../game/screens/SunWarnDrawer.java | 4 +- .../game/screens/TalkScreen.java | 2 +- .../game/screens/ZoneNameAnnouncer.java | 4 +- .../org/destinationsol/game/ship/SolShip.java | 2 +- .../menu/InputMapControllerScreen.java | 11 +- .../menu/InputMapKeyboardScreen.java | 7 +- .../menu/InputMapMixedScreen.java | 7 +- .../org/destinationsol/menu/MenuScreens.java | 2 +- .../destinationsol/menu/OptionsScreen.java | 6 +- .../destinationsol/menu/ResolutionScreen.java | 49 +- .../rubble/components/RubbleMesh.java | 26 + .../systems/RubbleBodyCreationSystem.java | 112 ++++ .../rubble/systems/RubbleCreationSystem.java | 104 +++- .../org/destinationsol/save/SaveData.java | 4 +- .../destinationsol/ui/SolInputManager.java | 2 +- .../destinationsol/ui/TutorialManager.java | 157 +++-- .../org/destinationsol/ui/nui/NUIManager.java | 81 ++- .../destinationsol/ui/nui/NUIScreenLayer.java | 7 + .../ui/nui/screens/MainGameScreen.java | 288 +++++++++ .../ui/nui/screens/UIShipControlsScreen.java | 238 ++++++++ .../ui/nui/widgets/KeyActivatedButton.java | 109 ++++ .../ui/nui/widgets/UIWarnButton.java | 87 +++ .../destinationsol/world/GalaxyBuilder.java | 216 +++++++ .../org/destinationsol/world/Orbital.java | 83 +++ .../world/generators/BeltGenerator.java | 138 +++++ .../world/generators/BeltGeneratorImpl.java | 32 + .../world/generators/DenseBeltGenerator.java | 35 ++ .../world/generators/FeatureGenerator.java | 72 +++ .../generators/LargeSolarSystemGenerator.java | 45 ++ .../world/generators/MazeGenerator.java | 138 +++++ .../world/generators/MazeGeneratorImpl.java | 31 + .../world/generators/PlanetGenerator.java | 377 ++++++++++++ .../world/generators/PlanetGeneratorImpl.java | 43 ++ .../world/generators/SmallMazeGenerator.java | 28 + .../generators/SmallPlanetGenerator.java | 50 ++ .../generators/SolarSystemGenerator.java | 573 ++++++++++++++++++ .../generators/SolarSystemGeneratorImpl.java | 54 ++ .../world/generators/SpiralMazeGenerator.java | 29 + .../collisionMeshes/miscCollisionMeshes.json | 6 +- .../assets/schemas/schemaMazeLayouts.json | 17 + .../destinationsol/assets/skins/default.skin | 5 +- .../assets/skins/mainGameScreen.skin | 17 + .../{shard_0.png => rubble_0.png} | Bin .../{shard_1.png => rubble_1.png} | Bin .../{shard_2.png => rubble_2.png} | Bin .../assets/textures/ui/nui/buttonDisabled.png | Bin 0 -> 241 bytes .../assets/textures/ui/nui/buttonWarn.png | Bin 0 -> 239 bytes .../assets/ui/mainGameScreen_desktop.ui | 51 ++ .../assets/ui/mainGameScreen_mobile.ui | 68 +++ .../assets/ui/uiShipControlsScreen.ui | 104 ++++ .../org/destinationsol/game/RubbleTest.java | 42 +- .../world/GalaxyBuilderTest.java | 144 +++++ .../world/generators/BeltGeneratorTest.java | 144 +++++ .../world/generators/MazeGeneratorTest.java | 139 +++++ .../world/generators/PlanetGeneratorTest.java | 150 +++++ .../generators/SolarSystemGeneratorTest.java | 200 ++++++ .../core/assets/mazes/spiralMazeLayout.json | 15 + 105 files changed, 5485 insertions(+), 508 deletions(-) create mode 100644 engine/src/main/java/org/destinationsol/assets/fonts/ScaledFontProducer.java create mode 100644 engine/src/main/java/org/destinationsol/assets/ui/KeyboardKeyTypeAdapter.java rename engine/src/main/java/org/destinationsol/game/maze/{MazeConfigs.java => MazeConfigManager.java} (61%) create mode 100644 engine/src/main/java/org/destinationsol/game/maze/MazeLayoutManager.java create mode 100644 engine/src/main/java/org/destinationsol/game/planet/BeltConfig.java create mode 100644 engine/src/main/java/org/destinationsol/game/planet/BeltConfigManager.java create mode 100644 engine/src/main/java/org/destinationsol/game/planet/CloudBuilder.java create mode 100644 engine/src/main/java/org/destinationsol/game/planet/OrbitalEnemiesBuilder.java rename engine/src/main/java/org/destinationsol/game/planet/{PlanetConfigs.java => PlanetConfigManager.java} (61%) rename engine/src/main/java/org/destinationsol/game/planet/{SolSystem.java => SolarSystem.java} (85%) create mode 100644 engine/src/main/java/org/destinationsol/game/planet/SolarSystemConfig.java create mode 100644 engine/src/main/java/org/destinationsol/game/planet/SolarSystemConfigManager.java create mode 100644 engine/src/main/java/org/destinationsol/rubble/components/RubbleMesh.java create mode 100644 engine/src/main/java/org/destinationsol/rubble/systems/RubbleBodyCreationSystem.java create mode 100644 engine/src/main/java/org/destinationsol/ui/nui/screens/MainGameScreen.java create mode 100644 engine/src/main/java/org/destinationsol/ui/nui/screens/UIShipControlsScreen.java create mode 100644 engine/src/main/java/org/destinationsol/ui/nui/widgets/KeyActivatedButton.java create mode 100644 engine/src/main/java/org/destinationsol/ui/nui/widgets/UIWarnButton.java create mode 100644 engine/src/main/java/org/destinationsol/world/GalaxyBuilder.java create mode 100644 engine/src/main/java/org/destinationsol/world/Orbital.java create mode 100644 engine/src/main/java/org/destinationsol/world/generators/BeltGenerator.java create mode 100644 engine/src/main/java/org/destinationsol/world/generators/BeltGeneratorImpl.java create mode 100644 engine/src/main/java/org/destinationsol/world/generators/DenseBeltGenerator.java create mode 100644 engine/src/main/java/org/destinationsol/world/generators/FeatureGenerator.java create mode 100644 engine/src/main/java/org/destinationsol/world/generators/LargeSolarSystemGenerator.java create mode 100644 engine/src/main/java/org/destinationsol/world/generators/MazeGenerator.java create mode 100644 engine/src/main/java/org/destinationsol/world/generators/MazeGeneratorImpl.java create mode 100644 engine/src/main/java/org/destinationsol/world/generators/PlanetGenerator.java create mode 100644 engine/src/main/java/org/destinationsol/world/generators/PlanetGeneratorImpl.java create mode 100644 engine/src/main/java/org/destinationsol/world/generators/SmallMazeGenerator.java create mode 100644 engine/src/main/java/org/destinationsol/world/generators/SmallPlanetGenerator.java create mode 100644 engine/src/main/java/org/destinationsol/world/generators/SolarSystemGenerator.java create mode 100644 engine/src/main/java/org/destinationsol/world/generators/SolarSystemGeneratorImpl.java create mode 100644 engine/src/main/java/org/destinationsol/world/generators/SpiralMazeGenerator.java create mode 100644 engine/src/main/resources/org/destinationsol/assets/schemas/schemaMazeLayouts.json create mode 100644 engine/src/main/resources/org/destinationsol/assets/skins/mainGameScreen.skin rename engine/src/main/resources/org/destinationsol/assets/textures/smallGameObjects/{shard_0.png => rubble_0.png} (100%) rename engine/src/main/resources/org/destinationsol/assets/textures/smallGameObjects/{shard_1.png => rubble_1.png} (100%) rename engine/src/main/resources/org/destinationsol/assets/textures/smallGameObjects/{shard_2.png => rubble_2.png} (100%) create mode 100644 engine/src/main/resources/org/destinationsol/assets/textures/ui/nui/buttonDisabled.png create mode 100644 engine/src/main/resources/org/destinationsol/assets/textures/ui/nui/buttonWarn.png create mode 100644 engine/src/main/resources/org/destinationsol/assets/ui/mainGameScreen_desktop.ui create mode 100644 engine/src/main/resources/org/destinationsol/assets/ui/mainGameScreen_mobile.ui create mode 100644 engine/src/main/resources/org/destinationsol/assets/ui/uiShipControlsScreen.ui create mode 100644 engine/src/test/java/org/destinationsol/world/GalaxyBuilderTest.java create mode 100644 engine/src/test/java/org/destinationsol/world/generators/BeltGeneratorTest.java create mode 100644 engine/src/test/java/org/destinationsol/world/generators/MazeGeneratorTest.java create mode 100644 engine/src/test/java/org/destinationsol/world/generators/PlanetGeneratorTest.java create mode 100644 engine/src/test/java/org/destinationsol/world/generators/SolarSystemGeneratorTest.java create mode 100644 modules/core/assets/mazes/spiralMazeLayout.json diff --git a/build.gradle b/build.gradle index 04ee27230..954658a59 100644 --- a/build.gradle +++ b/build.gradle @@ -28,7 +28,7 @@ allprojects { gdxVersion = '1.9.8' roboVMVersion = '2.3.3' gestaltVersion = '8.0.0-SNAPSHOT' - nuiVersion = '3.0.0-SNAPSHOT' + nuiVersion = '3.1.0-SNAPSHOT' } } diff --git a/engine/build.gradle b/engine/build.gradle index e4bd34dfd..fc00d2ddc 100644 --- a/engine/build.gradle +++ b/engine/build.gradle @@ -108,4 +108,5 @@ test { useJUnitPlatform() // showStandardStreams: makes the standard streams (err and out) visible at console when running tests testLogging.showStandardStreams = true + workingDir = rootProject.projectDir } diff --git a/engine/src/main/java/org/destinationsol/Const.java b/engine/src/main/java/org/destinationsol/Const.java index 21a2e1bbe..3896e908c 100644 --- a/engine/src/main/java/org/destinationsol/Const.java +++ b/engine/src/main/java/org/destinationsol/Const.java @@ -19,12 +19,10 @@ public class Const { public static final float ATM_HEIGHT = 14f; public static final float MAX_SKY_HEIGHT_FROM_GROUND = 1.5f * ATM_HEIGHT; public static final float MAX_GROUND_HEIGHT = 25f; - public static final float SUN_RADIUS = 2f * (MAX_GROUND_HEIGHT + ATM_HEIGHT); public static final float MAX_MOVE_SPD = 8f; public static final float REAL_TIME_STEP = 1.0f / 60.0f; public static final float CHUNK_SIZE = 20f; public static final int ITEM_GROUPS_PER_PAGE = 8; - public static final float PLANET_GAP = 8f; public static final String VERSION = "2.0.1"; public static final float FRICTION = .5f; public static final float IMPULSE_TO_COLL_VOL = 2f; diff --git a/engine/src/main/java/org/destinationsol/GameOptions.java b/engine/src/main/java/org/destinationsol/GameOptions.java index 4f7c8388f..eeb68cc45 100644 --- a/engine/src/main/java/org/destinationsol/GameOptions.java +++ b/engine/src/main/java/org/destinationsol/GameOptions.java @@ -269,6 +269,7 @@ public void advanceMapScrollSpeed() { if (mapScrollSpeed > 15) { mapScrollSpeed = 1; } + save(); } public void advanceNuiUiScale() { @@ -276,6 +277,7 @@ public void advanceNuiUiScale() { if (nuiUiScale > 2.0f) { nuiUiScale = 0.25f; } + save(); } /** diff --git a/engine/src/main/java/org/destinationsol/SolApplication.java b/engine/src/main/java/org/destinationsol/SolApplication.java index 99ce48ef2..3bebba4d8 100644 --- a/engine/src/main/java/org/destinationsol/SolApplication.java +++ b/engine/src/main/java/org/destinationsol/SolApplication.java @@ -183,6 +183,10 @@ public void create() { @Override public void resize(int newWidth, int newHeight) { + //To prevent application crashing, dont resize the height and width to 0 s, this condition checks it + if (newWidth == 0 && newHeight == 0) { + return; + } displayDimensions.set(newWidth, newHeight); for (ResizeSubscriber resizeSubscriber : resizeSubscribers) { @@ -334,8 +338,7 @@ public void play(boolean tut, String shipName, boolean isNewGame, WorldConfig wo gameContext.getBean(ComponentSystemManager.class).preBegin(); entitySystemManager = gameContext.getBean(EntitySystemManager.class); - solGame.createUpdateSystems(gameContext.getBean(Context.class)); - solGame.startGame(shipName, isNewGame, worldConfig, new SolNames(), entitySystemManager); + solGame.startGame(shipName, isNewGame, worldConfig, entitySystemManager); if (!isNewGame) { try { diff --git a/engine/src/main/java/org/destinationsol/assets/fonts/ScaledFontProducer.java b/engine/src/main/java/org/destinationsol/assets/fonts/ScaledFontProducer.java new file mode 100644 index 000000000..9b6a5479b --- /dev/null +++ b/engine/src/main/java/org/destinationsol/assets/fonts/ScaledFontProducer.java @@ -0,0 +1,87 @@ +/* + * Copyright 2021 The Terasology Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.destinationsol.assets.fonts; + +import com.badlogic.gdx.graphics.g2d.BitmapFont; +import org.terasology.gestalt.assets.AssetDataProducer; +import org.terasology.gestalt.assets.ResourceUrn; +import org.terasology.gestalt.assets.management.AssetManager; +import org.terasology.gestalt.assets.module.annotations.RegisterAssetDataProducer; +import org.terasology.gestalt.naming.Name; + +import java.io.IOException; +import java.util.Collections; +import java.util.Optional; +import java.util.Set; + +/** + * An {@link AssetDataProducer} that returns the specified font scaled to the size provided in the base ResourceUrn's + * fragment part. + * + * For example, a font of "engine:main#2" would return the font data from "engine:main" scaled by a factor + * of 2x. The scale can be fractional, for example "engine:main#0.5" would produce a font that is half the size. + */ +@RegisterAssetDataProducer +public class ScaledFontProducer implements AssetDataProducer { + /** + * The asset manager used to obtain the base font data. + */ + private final AssetManager assetManager; + + /** + * Creates a new {@link ScaledFontProducer} to produce scaled fonts assets depending on the ResourceUrn provided. + * @param assetManager the asset manager to use when obtaining base font data + */ + public ScaledFontProducer(AssetManager assetManager) { + this.assetManager = assetManager; + } + + @Override + public Set getAvailableAssetUrns() { + return Collections.emptySet(); + } + + @Override + public Set getModulesProviding(Name resourceName) { + return Collections.emptySet(); + } + + @Override + public ResourceUrn redirect(ResourceUrn urn) { + return urn; + } + + @Override + public Optional getAssetData(ResourceUrn urn) throws IOException { + if (urn.getFragmentName().isEmpty()) { + return Optional.empty(); + } + + // The 1/scale value is due to the rendering scaling performed in UIFont.java, which uses the existing scale. + // Without this, large values would be displayed as smaller and smaller values as larger. + float scale = 1.0f / Float.parseFloat(urn.getFragmentName().toString()); + Optional fontAsset = assetManager.getAsset(urn.getRootUrn(), Font.class); + if (!fontAsset.isPresent()) { + return Optional.empty(); + } + + BitmapFont bitmapFont = fontAsset.get().getBitmapFont(); + BitmapFont.BitmapFontData fontData = new BitmapFont.BitmapFontData(bitmapFont.getData().getFontFile(), bitmapFont.getData().flipped); + fontData.setScale(scale); + + return Optional.of(new FontData(new BitmapFont(fontData, bitmapFont.getRegions(), bitmapFont.isFlipped()))); + } +} diff --git a/engine/src/main/java/org/destinationsol/assets/ui/KeyboardKeyTypeAdapter.java b/engine/src/main/java/org/destinationsol/assets/ui/KeyboardKeyTypeAdapter.java new file mode 100644 index 000000000..545d3abbd --- /dev/null +++ b/engine/src/main/java/org/destinationsol/assets/ui/KeyboardKeyTypeAdapter.java @@ -0,0 +1,45 @@ +/* + * Copyright 2021 The Terasology Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.destinationsol.assets.ui; + +import com.google.gson.JsonDeserializationContext; +import com.google.gson.JsonDeserializer; +import com.google.gson.JsonElement; +import com.google.gson.JsonParseException; +import org.terasology.input.Keyboard; + +import java.lang.reflect.Type; +import java.util.Locale; + +/** + * A {@link JsonDeserializer} that deserialises keyboard keys from their names. + * + * {@link CaseInsensitiveEnumTypeAdapterFactory} cannot be used as the {@link Keyboard.Key#toString()} method returns + * different names. + */ +public class KeyboardKeyTypeAdapter implements JsonDeserializer { + @Override + public Keyboard.Key deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { + String keyName = json.getAsString().toUpperCase(Locale.ENGLISH); + try { + return Enum.valueOf(Keyboard.Key.class, keyName); + } catch (IllegalArgumentException ignore) { + return (Keyboard.Key) Keyboard.Key.find(keyName); + } catch (NullPointerException ignore) { + return Keyboard.Key.NONE; + } + } +} diff --git a/engine/src/main/java/org/destinationsol/assets/ui/UIFormat.java b/engine/src/main/java/org/destinationsol/assets/ui/UIFormat.java index 5236f9492..8ae6df85e 100644 --- a/engine/src/main/java/org/destinationsol/assets/ui/UIFormat.java +++ b/engine/src/main/java/org/destinationsol/assets/ui/UIFormat.java @@ -36,6 +36,7 @@ import org.terasology.gestalt.assets.format.AssetDataFile; import org.terasology.gestalt.assets.management.AssetManager; import org.terasology.gestalt.assets.module.annotations.RegisterAssetFileFormat; +import org.terasology.input.Keyboard; import org.terasology.nui.Color; import org.terasology.nui.LayoutHint; import org.terasology.nui.UILayout; @@ -112,6 +113,7 @@ public UISkin deserialize(JsonElement json, Type typeOfT, JsonDeserializationCon .registerTypeAdapter(Font.class, new UISkinFormat.FontTypeAdapter()) .registerTypeAdapter(Color.class, new UISkinFormat.ColorTypeHandler()) .registerTypeAdapter(Vector2i.class, new Vector2iTypeAdaptor()) + .registerTypeAdapter(Keyboard.Key.class, new KeyboardKeyTypeAdapter()) .registerTypeHierarchyAdapter(UIWidget.class, new UIWidgetTypeAdapter()); Gson gson = gsonBuilder.create(); return gson.fromJson(element, UIData.class); diff --git a/engine/src/main/java/org/destinationsol/game/CamRotStrategy.java b/engine/src/main/java/org/destinationsol/game/CamRotStrategy.java index 5444089be..2ae7cf602 100644 --- a/engine/src/main/java/org/destinationsol/game/CamRotStrategy.java +++ b/engine/src/main/java/org/destinationsol/game/CamRotStrategy.java @@ -16,10 +16,10 @@ package org.destinationsol.game; import com.badlogic.gdx.math.Vector2; -import org.destinationsol.Const; import org.destinationsol.common.SolMath; import org.destinationsol.game.planet.Planet; -import org.destinationsol.game.planet.SolSystem; +import org.destinationsol.game.planet.SolarSystem; +import org.destinationsol.world.generators.SolarSystemGenerator; public interface CamRotStrategy { float getRotation(Vector2 position, SolGame game); @@ -42,9 +42,9 @@ public float getRotation(Vector2 position, SolGame game) { if (npPos.dst(position) < fh) { return SolMath.angle(position, npPos) - 90; } - SolSystem sys = game.getPlanetManager().getNearestSystem(position); + SolarSystem sys = game.getPlanetManager().getNearestSystem(position); Vector2 sysPos = sys.getPosition(); - if (sysPos.dst(position) < Const.SUN_RADIUS) { + if (sysPos.dst(position) < SolarSystemGenerator.SUN_RADIUS) { return SolMath.angle(position, sysPos) - 90; } return 0; diff --git a/engine/src/main/java/org/destinationsol/game/GalaxyFiller.java b/engine/src/main/java/org/destinationsol/game/GalaxyFiller.java index 307cbcbef..59bb6a010 100644 --- a/engine/src/main/java/org/destinationsol/game/GalaxyFiller.java +++ b/engine/src/main/java/org/destinationsol/game/GalaxyFiller.java @@ -33,11 +33,12 @@ import org.destinationsol.game.maze.Maze; import org.destinationsol.game.planet.ConsumedAngles; import org.destinationsol.game.planet.Planet; -import org.destinationsol.game.planet.PlanetManager; -import org.destinationsol.game.planet.SolSystem; -import org.destinationsol.game.planet.SysConfig; +import org.destinationsol.game.planet.SolarSystem; +import org.destinationsol.game.planet.SolarSystemConfig; import org.destinationsol.game.ship.FarShip; import org.destinationsol.game.ship.hulls.HullConfig; +import org.destinationsol.world.generators.FeatureGenerator; +import org.destinationsol.world.generators.SolarSystemGenerator; import org.json.JSONObject; import javax.inject.Inject; @@ -54,7 +55,7 @@ public GalaxyFiller(HullConfigManager hullConfigManager) { this.hullConfigManager = hullConfigManager; } - private Vector2 getPosForStation(SolSystem sys, boolean mainStation, ConsumedAngles angles) { + private Vector2 getPosForStation(SolarSystem sys, boolean mainStation, ConsumedAngles angles) { Planet planet; ArrayList planets = sys.getPlanets(); float angleToSun; @@ -73,14 +74,14 @@ private Vector2 getPosForStation(SolSystem sys, boolean mainStation, ConsumedAng } } angles.add(angleToSun, STATION_CONSUME_SECTOR); - float stationDist = planet.getDistance() + planet.getFullHeight() + Const.PLANET_GAP; + float stationDist = planet.getDistance() + planet.getFullHeight() + FeatureGenerator.ORBITAL_FEATURE_BUFFER; Vector2 stationPos = new Vector2(); SolMath.fromAl(stationPos, angleToSun, stationDist); - stationPos.add(planet.getSystem().getPosition()); + stationPos.add(planet.getSolarSystemPosition()); return stationPos; } - private FarShip build(SolGame game, ShipConfig config, Faction faction, boolean mainStation, SolSystem system, + private FarShip build(SolGame game, ShipConfig config, Faction faction, boolean mainStation, SolarSystem system, ConsumedAngles angles) { HullConfig hullConf = config.hull; @@ -139,7 +140,7 @@ public void fill(SolGame game, HullConfigManager hullConfigManager, ItemManager return; } createStarPorts(game); - ArrayList systems = game.getPlanetManager().getSystems(); + ArrayList systems = game.getGalaxyBuilder().getBuiltSolarSystems(); JSONObject rootNode = Validator.getValidatedJSON(moduleName + ":startingStation", "engine:schemaStartingStation"); @@ -150,17 +151,17 @@ public void fill(SolGame game, HullConfigManager hullConfigManager, ItemManager mainStationPos.set(mainStation.getPosition()); mainStationHc = mainStation.getHullConfig(); - for (SolSystem system : systems) { - SysConfig sysConfig = system.getConfig(); + for (SolarSystem system : systems) { + SolarSystemConfig solarSystemConfig = system.getConfig(); - for (ShipConfig shipConfig : sysConfig.constAllies) { + for (ShipConfig shipConfig : solarSystemConfig.constAllies) { int count = (int) (shipConfig.density); for (int i = 0; i < count; i++) { build(game, shipConfig, Faction.LAANI, false, system, angles); } } - for (ShipConfig shipConfig : sysConfig.constEnemies) { + for (ShipConfig shipConfig : solarSystemConfig.constEnemies) { int count = (int) (shipConfig.density); for (int i = 0; i < count; i++) { build(game, shipConfig, Faction.EHAR, false, system, angles); @@ -172,10 +173,9 @@ public void fill(SolGame game, HullConfigManager hullConfigManager, ItemManager } private void createStarPorts(SolGame game) { - PlanetManager planetManager = game.getPlanetManager(); ArrayList biggest = new ArrayList<>(); - for (SolSystem system : planetManager.getSystems()) { + for (SolarSystem system : game.getGalaxyBuilder().getBuiltSolarSystems()) { float minHeight = 0; Planet biggestPlanet = null; int biggestPlanetIndex = -1; @@ -233,7 +233,7 @@ private void createGuard(SolGame game, FarShip target, ShipConfig guardConfig, F game.getObjectManager().addFarObjNow(enemy); } - private Vector2 getEmptySpace(SolGame game, SolSystem system) { + private Vector2 getEmptySpace(SolGame game, SolarSystem system) { Vector2 result = new Vector2(); Vector2 systemPosition = system.getPosition(); float systemRadius = system.getConfig().hard ? system.getRadius() : system.getInnerRadius(); @@ -249,7 +249,7 @@ private Vector2 getEmptySpace(SolGame game, SolSystem system) { } public Vector2 getPlayerSpawnPos(SolGame game) { - Vector2 position = new Vector2(Const.SUN_RADIUS * 2, 0); + Vector2 position = new Vector2(SolarSystemGenerator.SUN_RADIUS * 2, 0); if ("planet".equals(DebugOptions.SPAWN_PLACE)) { Planet planet = game.getPlanetManager().getPlanets().get(0); diff --git a/engine/src/main/java/org/destinationsol/game/HardnessCalc.java b/engine/src/main/java/org/destinationsol/game/HardnessCalc.java index 60a644964..87177605d 100644 --- a/engine/src/main/java/org/destinationsol/game/HardnessCalc.java +++ b/engine/src/main/java/org/destinationsol/game/HardnessCalc.java @@ -24,8 +24,9 @@ import org.destinationsol.game.item.Shield; import org.destinationsol.game.item.SolItem; import org.destinationsol.game.maze.MazeConfig; +import org.destinationsol.game.planet.BeltConfig; import org.destinationsol.game.planet.PlanetConfig; -import org.destinationsol.game.planet.SysConfig; +import org.destinationsol.game.planet.SolarSystemConfig; import org.destinationsol.game.projectile.ProjectileConfig; import org.destinationsol.game.ship.FarShip; import org.destinationsol.game.ship.SolShip; @@ -190,11 +191,11 @@ public static float getMazeDps(MazeConfig c) { return res * 1.25f; } - public static float getBeltDps(SysConfig c) { + public static float getBeltDps(BeltConfig c) { return 1.2f * getShipConfListDps(c.tempEnemies); } - public static float getSysDps(SysConfig c, boolean inner) { + public static float getSysDps(SolarSystemConfig c, boolean inner) { return getShipConfListDps(inner ? c.innerTempEnemies : c.tempEnemies); } diff --git a/engine/src/main/java/org/destinationsol/game/MapDrawer.java b/engine/src/main/java/org/destinationsol/game/MapDrawer.java index 93c8937a6..084d71b2c 100644 --- a/engine/src/main/java/org/destinationsol/game/MapDrawer.java +++ b/engine/src/main/java/org/destinationsol/game/MapDrawer.java @@ -33,7 +33,7 @@ import org.destinationsol.game.maze.MazeBuilder; import org.destinationsol.game.planet.FarTileObject; import org.destinationsol.game.planet.Planet; -import org.destinationsol.game.planet.SolSystem; +import org.destinationsol.game.planet.SolarSystem; import org.destinationsol.game.planet.SurfaceDirection; import org.destinationsol.game.planet.SystemBelt; import org.destinationsol.game.planet.Tile; @@ -43,6 +43,7 @@ import org.destinationsol.ui.DisplayDimensions; import org.destinationsol.ui.UiDrawer; import org.destinationsol.ui.Waypoint; +import org.destinationsol.world.generators.SolarSystemGenerator; import javax.inject.Inject; import java.util.ArrayList; @@ -191,17 +192,17 @@ private void drawMazes(GameDrawer drawer, SolGame game, float viewDist, Planet n private void drawPlanets(GameDrawer drawer, SolGame game, float viewDist, Planet np, Vector2 camPos, float heroDmgCap, float camAngle, Context context) { - ArrayList systems = game.getPlanetManager().getSystems(); + ArrayList systems = game.getPlanetManager().getSystems(); SolCam cam = context.get(SolCam.class); float circleWidth = cam.getRealLineWidth() * 6; float vh = cam.getViewHeight(zoom); - for (SolSystem sys : systems) { + for (SolarSystem sys : systems) { drawer.drawCircle(lineTexture, sys.getPosition(), sys.getRadius(), SolColor.UI_MED, circleWidth, vh); } - for (SolSystem sys : systems) { + for (SolarSystem sys : systems) { float dangerRad = HardnessCalc.isDangerous(heroDmgCap, sys.getDps()) ? sys.getRadius() : 0; Vector2 sysPos = sys.getPosition(); - float rad = Const.SUN_RADIUS; + float rad = SolarSystemGenerator.SUN_RADIUS; if (camPos.dst(sysPos) - rad < viewDist) { drawer.draw(starTexture, 2 * rad, 2 * rad, rad, rad, sysPos.x, sysPos.y, 0, SolColor.WHITE); } diff --git a/engine/src/main/java/org/destinationsol/game/PlayerCreator.java b/engine/src/main/java/org/destinationsol/game/PlayerCreator.java index 8d842a374..7756b48a2 100644 --- a/engine/src/main/java/org/destinationsol/game/PlayerCreator.java +++ b/engine/src/main/java/org/destinationsol/game/PlayerCreator.java @@ -185,7 +185,7 @@ private Pilot createPilot(SolGame game, boolean isMouseControl) { if (isMouseControl) { return new AiPilot(new BeaconDestProvider(), true, Faction.LAANI, false, "you", Const.AI_DET_DIST); } else { - return new UiControlledPilot(game.getScreens().mainGameScreen); + return new UiControlledPilot(game.getScreens().getMainGameScreen().getShipControl()); } } diff --git a/engine/src/main/java/org/destinationsol/game/RubbleBuilder.java b/engine/src/main/java/org/destinationsol/game/RubbleBuilder.java index 50ab30910..ad1d82433 100644 --- a/engine/src/main/java/org/destinationsol/game/RubbleBuilder.java +++ b/engine/src/main/java/org/destinationsol/game/RubbleBuilder.java @@ -33,7 +33,7 @@ public class RubbleBuilder { public static final float MIN_SCALE = .07f; public static final float MAX_SCALE = .12f; - public static final float SIZE_TO_SHARD_COUNT = 13f; + public static final float SIZE_TO_RUBBLE_COUNT = 13f; private static final float MAX_ROT_SPD = 5f; private static final float MAX_SPD = 4f; private final CollisionMeshLoader myCollisionMeshLoader; @@ -42,11 +42,11 @@ public class RubbleBuilder { @Inject public RubbleBuilder() { myCollisionMeshLoader = new CollisionMeshLoader("engine:miscCollisionMeshes"); - myTextures = Assets.listTexturesMatching("engine:shard_.*"); + myTextures = Assets.listTexturesMatching("engine:rubble_.*"); } - public void buildExplosionShards(SolGame game, Vector2 position, Vector2 baseVelocity, float size) { - int count = (int) (size * SIZE_TO_SHARD_COUNT); + public void buildExplosionRubbles(SolGame game, Vector2 position, Vector2 baseVelocity, float size) { + int count = (int) (size * SIZE_TO_RUBBLE_COUNT); for (int i = 0; i < count; i++) { Rubble s = build(game, position, baseVelocity, size); game.getObjectManager().addObjDelayed(s); diff --git a/engine/src/main/java/org/destinationsol/game/ShipConfig.java b/engine/src/main/java/org/destinationsol/game/ShipConfig.java index ba20bf38c..8ca7fd833 100644 --- a/engine/src/main/java/org/destinationsol/game/ShipConfig.java +++ b/engine/src/main/java/org/destinationsol/game/ShipConfig.java @@ -33,7 +33,8 @@ public class ShipConfig { public final HullConfig hull; public final String items; public final int money; - public final float density; + //TODO: Consider refactoring 'density' to some other name, as it more accurately reflects a probability of ship spawning + public float density; public final ShipConfig guard; public final float dps; public Vector2 spawnPos; diff --git a/engine/src/main/java/org/destinationsol/game/SolGame.java b/engine/src/main/java/org/destinationsol/game/SolGame.java index dc8fb1d76..173b636ba 100644 --- a/engine/src/main/java/org/destinationsol/game/SolGame.java +++ b/engine/src/main/java/org/destinationsol/game/SolGame.java @@ -22,6 +22,7 @@ import org.destinationsol.ContextWrapper; import org.destinationsol.GameOptions; import org.destinationsol.SolApplication; +import org.destinationsol.assets.Assets; import org.destinationsol.assets.sound.OggSoundManager; import org.destinationsol.assets.sound.SpecialSounds; import org.destinationsol.common.DebugCol; @@ -42,12 +43,19 @@ import org.destinationsol.game.item.LootBuilder; import org.destinationsol.game.item.MercItem; import org.destinationsol.game.item.SolItem; +import org.destinationsol.game.maze.Maze; +import org.destinationsol.game.maze.MazeConfigManager; +import org.destinationsol.game.particle.EffectTypes; import org.destinationsol.game.particle.PartMan; import org.destinationsol.game.particle.SpecialEffects; +import org.destinationsol.game.planet.BeltConfigManager; import org.destinationsol.game.planet.Planet; +import org.destinationsol.game.planet.PlanetConfigManager; import org.destinationsol.game.planet.PlanetManager; -import org.destinationsol.game.planet.SolSystem; +import org.destinationsol.game.planet.SolarSystem; +import org.destinationsol.game.planet.SolarSystemConfigManager; import org.destinationsol.game.planet.SunSingleton; +import org.destinationsol.game.planet.SystemBelt; import org.destinationsol.game.screens.GameScreens; import org.destinationsol.game.ship.ShipAbility; import org.destinationsol.game.ship.ShipBuilder; @@ -59,9 +67,13 @@ import org.destinationsol.ui.TutorialManager; import org.destinationsol.ui.UiDrawer; import org.destinationsol.ui.Waypoint; +import org.destinationsol.ui.nui.screens.MainGameScreen; import org.destinationsol.util.InjectionHelper; import org.terasology.gestalt.di.BeanContext; +import org.destinationsol.world.GalaxyBuilder; +import org.terasology.gestalt.assets.ResourceUrn; import org.terasology.gestalt.entitysystem.entity.EntityRef; +import org.terasology.nui.asset.UIElement; import javax.inject.Inject; import java.util.ArrayList; @@ -72,6 +84,9 @@ import java.util.TreeMap; public class SolGame { + private static final String NUI_MAIN_GAME_SCREEN_DESKTOP_URI = "engine:mainGameScreen_desktop"; + private static final String NUI_MAIN_GAME_SCREEN_MOBILE_URI = "engine:mainGameScreen_mobile"; + @Inject protected GameScreens gameScreens; @Inject @@ -79,8 +94,6 @@ public class SolGame { @Inject protected ObjectManager objectManager; @Inject - protected SolApplication solApplication; - @Inject protected DrawableManager drawableManager; @Inject protected PlanetManager planetManager; @@ -132,7 +145,10 @@ public class SolGame { protected Optional tutorialManager; @Inject BeanContext beanContext; + @Inject + GalaxyBuilder galaxyBuilder; + protected SolApplication solApplication; private Hero hero; private float timeStep; private float time; @@ -143,10 +159,22 @@ public class SolGame { private SortedMap> updateSystems; private EntitySystemManager entitySystemManager; + private final MainGameScreen mainGameScreen; + + public MainGameScreen getMainGameScreen() { + return mainGameScreen; + } @Inject - public SolGame() { + public SolGame(SolApplication solApplication) { FactionInfo.init(); + this.solApplication = solApplication; + boolean isMobile = solApplication.isMobile(); + if (!isMobile) { + mainGameScreen = (MainGameScreen) Assets.getAssetHelper().get(new ResourceUrn(NUI_MAIN_GAME_SCREEN_DESKTOP_URI), UIElement.class).get().getRootWidget(); + } else { + mainGameScreen = (MainGameScreen) Assets.getAssetHelper().get(new ResourceUrn(NUI_MAIN_GAME_SCREEN_MOBILE_URI), UIElement.class).get().getRootWidget(); + } timeFactor = 1; } @@ -200,13 +228,20 @@ public void createUpdateSystems(Context context) { } } - public void startGame(String shipName, boolean isNewGame, WorldConfig worldConfig, SolNames solNames, EntitySystemManager entitySystemManager) { + public void startGame(String shipName, boolean isNewGame, WorldConfig worldConfig, EntitySystemManager entitySystemManager) { this.entitySystemManager = entitySystemManager; respawnState = new RespawnState(); SolRandom.setSeed(worldConfig.getSeed()); - planetManager.fill(solNames, worldConfig.getNumberOfSystems()); + + //World Generation will be initiated from here + galaxyBuilder.buildWithRandomSolarSystemGenerators(); + + //Add all the Planets in the game to the PlanetManager TODO: Add mazes, belts, etc. once the are implemented + addObjectsToPlanetManager(); + createGame(shipName, isNewGame); + if (!isNewGame) { createAndSpawnMercenariesFromSave(); } @@ -221,6 +256,23 @@ public void run() { } }, 0, 30); gameScreens.consoleScreen.init(this); + solApplication.getNuiManager().pushScreen(mainGameScreen); + tutorialManager.ifPresent(TutorialManager::start); + } + + private void addObjectsToPlanetManager() { + planetManager.getSystems().addAll(galaxyBuilder.getBuiltSolarSystems()); + for (SolarSystem system : planetManager.getSystems()) { + for (Planet planet : system.getPlanets()) { + planetManager.getPlanets().add(planet); + } + for (Maze maze : system.getMazes()) { + planetManager.getMazes().add(maze); + } + for (SystemBelt belt : system.getBelts()) { + planetManager.getBelts().add(belt); + } + } } public Context getContext() { @@ -284,6 +336,7 @@ public void onGameEnd(Context context) { } FactionInfo.clearValues(); // objectManager.dispose(); + solApplication.getNuiManager().clearScreens(); } private void saveShip() { @@ -443,7 +496,7 @@ public boolean isPlaceEmpty(Vector2 position, boolean considerPlanets) { } } - SolSystem ns = planetManager.getNearestSystem(position); + SolarSystem ns = planetManager.getNearestSystem(position); if (ns.getPosition().dst(position) < SunSingleton.SUN_HOT_RAD) { return false; } @@ -570,4 +623,8 @@ public HullConfigManager getHullConfigManager() { return hullConfigManager; } + public GalaxyBuilder getGalaxyBuilder() { + return galaxyBuilder; + } + } diff --git a/engine/src/main/java/org/destinationsol/game/StarPort.java b/engine/src/main/java/org/destinationsol/game/StarPort.java index bcfe34c2b..f5017971e 100644 --- a/engine/src/main/java/org/destinationsol/game/StarPort.java +++ b/engine/src/main/java/org/destinationsol/game/StarPort.java @@ -38,6 +38,7 @@ import org.destinationsol.game.ship.FarShip; import org.destinationsol.game.ship.ForceBeacon; import org.destinationsol.game.ship.SolShip; +import org.destinationsol.world.generators.FeatureGenerator; import javax.inject.Inject; import java.util.ArrayList; @@ -46,7 +47,7 @@ public class StarPort implements SolObject { public static final int SIZE = 8; - private static final float DIST_FROM_PLANET = Const.PLANET_GAP * .5f; + private static final float DIST_FROM_PLANET = FeatureGenerator.ORBITAL_FEATURE_BUFFER * .5f; private static final float FARE = 10f; private final Body body; private final ArrayList lightSources; diff --git a/engine/src/main/java/org/destinationsol/game/chunk/ChunkFiller.java b/engine/src/main/java/org/destinationsol/game/chunk/ChunkFiller.java index 58ef058d6..7a79e569c 100644 --- a/engine/src/main/java/org/destinationsol/game/chunk/ChunkFiller.java +++ b/engine/src/main/java/org/destinationsol/game/chunk/ChunkFiller.java @@ -38,14 +38,15 @@ import org.destinationsol.game.input.MoveDestProvider; import org.destinationsol.game.input.Pilot; import org.destinationsol.game.input.StillGuard; -import org.destinationsol.game.maze.Maze; +import org.destinationsol.game.planet.BeltConfig; import org.destinationsol.game.planet.Planet; import org.destinationsol.game.planet.PlanetManager; -import org.destinationsol.game.planet.SolSystem; -import org.destinationsol.game.planet.SysConfig; +import org.destinationsol.game.planet.SolarSystem; +import org.destinationsol.game.planet.SolarSystemConfig; import org.destinationsol.game.planet.SystemBelt; import org.destinationsol.game.ship.FarShip; import org.destinationsol.game.ship.hulls.HullConfig; +import org.destinationsol.world.generators.SolarSystemGenerator; import java.util.ArrayList; import java.util.Optional; @@ -66,7 +67,6 @@ public class ChunkFiller { private static final float ENEMY_MAX_ROT_SPD = 15f; private static final float DUST_SZ = .02f; private static final float MAX_A_SPD = .2f; - private static final float BELT_A_DENSITY = .04f; private static final float MAZE_ZONE_BORDER = 20; private final TextureAtlas.AtlasRegion dustTexture; @@ -114,18 +114,18 @@ public void fill(SolGame game, Vector2 chunk, RemoveController removeController, private Optional getConfig(SolGame game, Vector2 chunkCenter, float[] densityMultiplier, RemoveController removeController, boolean fillFarBackground) { PlanetManager planetManager = game.getPlanetManager(); - SolSystem system = planetManager.getNearestSystem(chunkCenter); + SolarSystem system = planetManager.getNearestSystem(chunkCenter); float distanceToSystem = system.getPosition().dst(chunkCenter); if (distanceToSystem < system.getRadius()) { - if (distanceToSystem < Const.SUN_RADIUS) { + if (distanceToSystem < SolarSystemGenerator.SUN_RADIUS) { return Optional.empty(); } for (SystemBelt belt : system.getBelts()) { if (belt.contains(chunkCenter)) { if (!fillFarBackground) { - fillAsteroids(game, removeController, true, chunkCenter); + fillAsteroids(game, removeController, true, chunkCenter, belt.getAsteroidFrequency()); } - SysConfig beltConfig = belt.getConfig(); + BeltConfig beltConfig = belt.getConfig(); for (ShipConfig enemyConfig : beltConfig.tempEnemies) { if (!fillFarBackground) { fillEnemies(game, removeController, enemyConfig, chunkCenter); @@ -149,6 +149,8 @@ private Optional getConfig(SolGame game, Vector2 chunkCenter, fl } return Optional.of(system.getConfig().envConfig); } + //TODO: Uncomment this section when there are mazes added to the SolarSystem + /* Maze maze = planetManager.getNearestMaze(chunkCenter); float distanceToMaze = maze.getPos().dst(chunkCenter); float zoneRadius = maze.getRadius() + MAZE_ZONE_BORDER; @@ -156,16 +158,18 @@ private Optional getConfig(SolGame game, Vector2 chunkCenter, fl densityMultiplier[0] = 1 - distanceToMaze / zoneRadius; return Optional.of(maze.getConfig().envConfig); } + */ + return Optional.empty(); } - private void fillForSys(SolGame game, Vector2 chunkCenter, RemoveController removeController, SolSystem system) { - SysConfig config = system.getConfig(); + private void fillForSys(SolGame game, Vector2 chunkCenter, RemoveController removeController, SolarSystem system) { + SolarSystemConfig config = system.getConfig(); Vector2 mainStationPosition = game.getGalaxyFiller().getMainStationPosition(); Vector2 startPosition = mainStationPosition == null ? new Vector2() : mainStationPosition; float distanceToStartPosition = chunkCenter.dst(startPosition); if (Const.CHUNK_SIZE < distanceToStartPosition) { - fillAsteroids(game, removeController, false, chunkCenter); + fillAsteroids(game, removeController, false, chunkCenter, ASTEROID_DENSITY); ArrayList enemies = system.getPosition().dst(chunkCenter) < system.getInnerRadius() ? config.innerTempEnemies : config.tempEnemies; for (ShipConfig enemyConfig : enemies) { fillEnemies(game, removeController, enemyConfig, chunkCenter); @@ -201,8 +205,7 @@ private FarShip buildSpaceEnemy(SolGame game, Vector2 position, RemoveController remover, false, money, null, true); } - private void fillAsteroids(SolGame game, RemoveController remover, boolean forBelt, Vector2 chunkCenter) { - float density = forBelt ? BELT_A_DENSITY : ASTEROID_DENSITY; + private void fillAsteroids(SolGame game, RemoveController remover, boolean forBelt, Vector2 chunkCenter, float density) { int count = getEntityCount(density); if (count == 0) { return; diff --git a/engine/src/main/java/org/destinationsol/game/input/BigObjAvoider.java b/engine/src/main/java/org/destinationsol/game/input/BigObjAvoider.java index 4658129e7..44931a1da 100644 --- a/engine/src/main/java/org/destinationsol/game/input/BigObjAvoider.java +++ b/engine/src/main/java/org/destinationsol/game/input/BigObjAvoider.java @@ -20,6 +20,7 @@ import org.destinationsol.common.SolMath; import org.destinationsol.game.SolGame; import org.destinationsol.game.planet.Planet; +import org.destinationsol.world.generators.SolarSystemGenerator; public class BigObjAvoider { @@ -51,8 +52,8 @@ public float avoid(SolGame game, Vector2 from, Vector2 destination, float angleT result = angleToDestination + 45 * SolMath.toInt(myProj.y < 0); } } - Vector2 sunPos = planet.getSystem().getPosition(); - float sunRad = Const.SUN_RADIUS; + Vector2 sunPos = planet.getSolarSystemPosition(); + float sunRad = SolarSystemGenerator.SUN_RADIUS; myProj.set(sunPos); myProj.sub(from); SolMath.rotate(myProj, -angleToDestination); diff --git a/engine/src/main/java/org/destinationsol/game/input/ExplorerDestProvider.java b/engine/src/main/java/org/destinationsol/game/input/ExplorerDestProvider.java index 1c76485d6..560dae67c 100644 --- a/engine/src/main/java/org/destinationsol/game/input/ExplorerDestProvider.java +++ b/engine/src/main/java/org/destinationsol/game/input/ExplorerDestProvider.java @@ -22,7 +22,7 @@ import org.destinationsol.common.SolRandom; import org.destinationsol.game.SolGame; import org.destinationsol.game.planet.Planet; -import org.destinationsol.game.planet.SolSystem; +import org.destinationsol.game.planet.SolarSystem; import org.destinationsol.game.ship.SolShip; import org.destinationsol.game.ship.hulls.HullConfig; @@ -38,14 +38,14 @@ public class ExplorerDestProvider implements MoveDestProvider { private final Vector2 destination; private final boolean isAggressive; private final float desiredSpeed; - private final SolSystem system; + private final SolarSystem system; private Vector2 relativeDestination; private Planet planet; private float awaitOnPlanet; private boolean landInDestination; private Vector2 destinationVelocity; - public ExplorerDestProvider(Vector2 position, boolean aggressive, HullConfig config, SolSystem system) { + public ExplorerDestProvider(Vector2 position, boolean aggressive, HullConfig config, SolarSystem system) { this.system = system; destination = new Vector2(); float minDistance = Float.MAX_VALUE; diff --git a/engine/src/main/java/org/destinationsol/game/input/UiControlledPilot.java b/engine/src/main/java/org/destinationsol/game/input/UiControlledPilot.java index ac5c591d9..01ce59fa4 100644 --- a/engine/src/main/java/org/destinationsol/game/input/UiControlledPilot.java +++ b/engine/src/main/java/org/destinationsol/game/input/UiControlledPilot.java @@ -19,16 +19,16 @@ import org.destinationsol.Const; import org.destinationsol.game.Faction; import org.destinationsol.game.SolGame; -import org.destinationsol.game.screens.MainGameScreen; +import org.destinationsol.game.screens.ShipUiControl; import org.destinationsol.game.ship.FarShip; import org.destinationsol.game.ship.SolShip; public class UiControlledPilot implements Pilot { - private final MainGameScreen myScreen; + private final ShipUiControl uiControls; - public UiControlledPilot(MainGameScreen screen) { - myScreen = screen; + public UiControlledPilot(ShipUiControl controls) { + uiControls = controls; } @Override @@ -37,27 +37,27 @@ public void update(SolGame game, SolShip ship, SolShip nearestEnemy) { @Override public boolean isUp() { - return myScreen.isUp(); + return uiControls.isUp(); } @Override public boolean isLeft() { - return myScreen.isLeft(); + return uiControls.isLeft(); } @Override public boolean isRight() { - return myScreen.isRight(); + return uiControls.isRight(); } @Override public boolean isShoot() { - return myScreen.isShoot(); + return uiControls.isShoot(); } @Override public boolean isShoot2() { - return myScreen.isShoot2(); + return uiControls.isShoot2(); } @Override @@ -67,7 +67,7 @@ public boolean collectsItems() { @Override public boolean isAbility() { - return myScreen.isAbility(); + return uiControls.isAbility(); } @Override diff --git a/engine/src/main/java/org/destinationsol/game/maze/Maze.java b/engine/src/main/java/org/destinationsol/game/maze/Maze.java index acc858250..7f7eb37d9 100644 --- a/engine/src/main/java/org/destinationsol/game/maze/Maze.java +++ b/engine/src/main/java/org/destinationsol/game/maze/Maze.java @@ -28,6 +28,8 @@ public class Maze { private final float radius; private final float damagePerSecond; private boolean areObjectsCreated; + private MazeLayout mazeLayout; + private boolean hasLayout; public Maze(MazeConfig config, Vector2 position, float radius) { this.config = config; @@ -36,6 +38,15 @@ public Maze(MazeConfig config, Vector2 position, float radius) { damagePerSecond = HardnessCalc.getMazeDps(config); } + public Maze(MazeConfig config, Vector2 position, float radius, MazeLayout mazeLayout) { + this.config = config; + this.position = position; + this.radius = radius; + this.mazeLayout = mazeLayout; + hasLayout = true; + damagePerSecond = HardnessCalc.getMazeDps(config); + } + public void update(SolGame game) { SolCam cam = game.getCam(); Vector2 camPos = cam.getPosition(); @@ -63,4 +74,17 @@ public float getRadius() { public float getDps() { return damagePerSecond; } + + public void setMazeLayout(MazeLayout mazeLayout) { + this.mazeLayout = mazeLayout; + hasLayout = true; + } + + public boolean hasLayoutSet() { + return hasLayout; + } + + public MazeLayout getMazeLayout() { + return mazeLayout; + } } diff --git a/engine/src/main/java/org/destinationsol/game/maze/MazeBuilder.java b/engine/src/main/java/org/destinationsol/game/maze/MazeBuilder.java index 649d38a15..c328d6a01 100644 --- a/engine/src/main/java/org/destinationsol/game/maze/MazeBuilder.java +++ b/engine/src/main/java/org/destinationsol/game/maze/MazeBuilder.java @@ -45,13 +45,18 @@ public void build(SolGame game, Maze maze) { size = (int) (innerRadius * 2 / TILE_SZ); mazePosition = maze.getPos(); mazeAngle = SolRandom.seededRandomFloat(180); - - MazeLayout layout = buildMaze(game, maze); - buildEnemies(game, maze, layout); + MazeLayout mazeLayout = buildMaze(game, maze); + buildEnemies(game, maze, mazeLayout); } private MazeLayout buildMaze(SolGame game, Maze maze) { - MazeLayout layout = new MazeLayoutBuilder(size).build(); + MazeLayout layout; + if (maze.hasLayoutSet()) { + layout = new MazeLayoutBuilder(size).build(maze.getMazeLayout().inners); + } else { + layout = new MazeLayoutBuilder(size).build(); + } + new MazeTileObject.Builder(); MazeConfig config = maze.getConfig(); for (int col = 0; col < size; col++) { diff --git a/engine/src/main/java/org/destinationsol/game/maze/MazeConfigs.java b/engine/src/main/java/org/destinationsol/game/maze/MazeConfigManager.java similarity index 61% rename from engine/src/main/java/org/destinationsol/game/maze/MazeConfigs.java rename to engine/src/main/java/org/destinationsol/game/maze/MazeConfigManager.java index a7ea5a4fe..b22462a2e 100644 --- a/engine/src/main/java/org/destinationsol/game/maze/MazeConfigs.java +++ b/engine/src/main/java/org/destinationsol/game/maze/MazeConfigManager.java @@ -27,24 +27,47 @@ import java.util.List; import java.util.Set; -public class MazeConfigs { +/** + * This class manages loading config files in for Mazes. It also allows for getting a random Maze config or a + * specific Maze config by name. It can either load the default Maze configs, or specified custom configs + */ +public class MazeConfigManager { public final List configs; + HullConfigManager hullConfigManager; + ItemManager itemManager; - public MazeConfigs(HullConfigManager hullConfigs, ItemManager itemManager) { + public MazeConfigManager(HullConfigManager hullConfigManager, ItemManager itemManager) { configs = new ArrayList<>(); - final Set configUrns = Assets.getAssetHelper().listAssets(Json.class, "mazesConfig"); + this.hullConfigManager = hullConfigManager; + this.itemManager = itemManager; + + } + + /** + * Load the default MazeConfig JSON data from the engine module + */ + public void loadDefaultMazeConfigs() { + load("mazesConfig", "engine:schemaMazesConfig"); + } + + /** + * Load in maze configs from JSON data using specified asset type and schema + * @param assetType type name of asset to load + * @param schema json schema + */ + public void load(String assetType, String schema) { + final Set configUrns = Assets.getAssetHelper().listAssets(Json.class, assetType); for (ResourceUrn configUrn : configUrns) { - JSONObject rootNode = Validator.getValidatedJSON(configUrn.toString(), "engine:schemaMazesConfig"); + JSONObject rootNode = Validator.getValidatedJSON(configUrn.toString(), schema); for (String s : rootNode.keySet()) { if (!(rootNode.get(s) instanceof JSONObject)) { continue; } JSONObject mazeNode = rootNode.getJSONObject(s); - MazeConfig c = MazeConfig.load(s, mazeNode, hullConfigs, itemManager); + MazeConfig c = MazeConfig.load(s, mazeNode, hullConfigManager, itemManager); configs.add(c); } - } } } diff --git a/engine/src/main/java/org/destinationsol/game/maze/MazeLayout.java b/engine/src/main/java/org/destinationsol/game/maze/MazeLayout.java index bccb7a301..6e50a7749 100644 --- a/engine/src/main/java/org/destinationsol/game/maze/MazeLayout.java +++ b/engine/src/main/java/org/destinationsol/game/maze/MazeLayout.java @@ -17,10 +17,13 @@ package org.destinationsol.game.maze; public class MazeLayout { + /** This 2D array determines where MazeTiles will or will not be placed. The other arrays are created based off of + * inners*/ public final boolean[][] inners; public final boolean[][] holes; public final boolean[][] right; public final boolean[][] down; + public String name = ""; public MazeLayout(boolean[][] inners, boolean[][] holes, boolean[][] right, boolean[][] down) { this.inners = inners; @@ -29,4 +32,15 @@ public MazeLayout(boolean[][] inners, boolean[][] holes, boolean[][] right, bool this.down = down; } + public MazeLayout(boolean[][] inners, boolean[][] holes, boolean[][] right, boolean[][] down, String name) { + this.inners = inners; + this.holes = holes; + this.right = right; + this.down = down; + this.name = name; + } + + public String getName() { + return name; + } } diff --git a/engine/src/main/java/org/destinationsol/game/maze/MazeLayoutBuilder.java b/engine/src/main/java/org/destinationsol/game/maze/MazeLayoutBuilder.java index df5aa6a2e..1c97dd869 100644 --- a/engine/src/main/java/org/destinationsol/game/maze/MazeLayoutBuilder.java +++ b/engine/src/main/java/org/destinationsol/game/maze/MazeLayoutBuilder.java @@ -23,7 +23,7 @@ public class MazeLayoutBuilder { private static final float HOLE_PERCENTAGE = 0.2f; private static final float WALL_PERCENTAGE = 0.5f; private final int size; - private final boolean[][] inners; + private boolean[][] inners; private final boolean[][] holes; private final boolean[][] right; private final boolean[][] down; @@ -51,6 +51,27 @@ public MazeLayout build() { return new MazeLayout(inners, holes, right, down); } + /** + * This method iterates through the 'inner' array in the the MazeLayout. If inner is true, the maze should exist + * in that location. If also will place wall to the right of and below the tile. + * @param innerPreset 2D array representing layout. + * @return new Maze layout + */ + public MazeLayout build(boolean[][] innerPreset) { + inners = innerPreset; + for (int col = 0; col < size; col++) { + for (int row = 0; row < size; row++) { + boolean inner = inners[col][row]; + boolean rInner = col < size - 1 && inners[col + 1][row]; + boolean dInner = row < size - 1 && inners[col][row + 1]; + right[col][row] = (inner || rInner) && SolRandom.test(WALL_PERCENTAGE); + down[col][row] = (inner || dInner) && SolRandom.test(WALL_PERCENTAGE); + } + } + makeAllAccessible(); + return new MazeLayout(inners, holes, right, down); + } + private void makeAllAccessible() { int[][] steps = new int[size][size]; expandPath(steps, 0, 0, 0); diff --git a/engine/src/main/java/org/destinationsol/game/maze/MazeLayoutManager.java b/engine/src/main/java/org/destinationsol/game/maze/MazeLayoutManager.java new file mode 100644 index 000000000..4d1896b1b --- /dev/null +++ b/engine/src/main/java/org/destinationsol/game/maze/MazeLayoutManager.java @@ -0,0 +1,101 @@ +/* + * Copyright 2021 The Terasology Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.destinationsol.game.maze; + +import org.destinationsol.assets.Assets; +import org.destinationsol.assets.json.Json; +import org.destinationsol.assets.json.Validator; +import org.json.JSONArray; +import org.json.JSONObject; +import org.terasology.gestalt.assets.ResourceUrn; + +import java.util.ArrayList; +import java.util.List; +import java.util.Set; + +/** + * This class is used to load MazeLayouts from JSON files into MazeGenerators. This allows Mazes to have custom layouts. + * A JSON maze layout has two properties: "name" which is a string and "inner", which is a 2D array of booleans which + * represents where the maze should have tiles and should not have tiles. See spiralMazeLayout.json in the core module + * for an example. + */ +public class MazeLayoutManager { + public final List mazeLayouts; + + public MazeLayoutManager() { + this.mazeLayouts = new ArrayList<>(); + } + + /** + * This loads in the specified JSON asset. The assetName parameter should be the name of the JSON file you created. + * The layout is added to the mazeLayouts list. + * @param assetName JSON asset name + */ + public void load(String assetName) { + final Set configUrns = Assets.getAssetHelper().listAssets(Json.class, assetName); + for (ResourceUrn configUrn : configUrns) { + JSONObject rootNode = Validator.getValidatedJSON(configUrn.toString(), "engine:schemaMazeLayouts"); + String layoutName = ""; + ArrayList> inners = new ArrayList<>(); + for (String s : rootNode.keySet()) { + if (!(rootNode.get(s) instanceof JSONArray)) { + layoutName = rootNode.getString(s); + continue; + } + JSONArray mazeNode = rootNode.getJSONArray(s); + if (s.equals("inner")) { + for (int i = 0; i < mazeNode.length(); i++) { + ArrayList innerList = new ArrayList<>(); + JSONArray innerMazeNode = mazeNode.getJSONArray(i); + for (int j = 0; j < mazeNode.length(); j++) { + innerList.add(innerMazeNode.getBoolean(j)); + } + inners.add(innerList); + } + } + } + boolean[][] innersArray = new boolean[inners.size()][]; + for (int i = 0; i < inners.size(); i++) { + ArrayList row = inners.get(i); + Boolean[] rowObj = row.toArray(new Boolean[row.size()]); + boolean[] rowPrim = new boolean[rowObj.length]; + for (int j = 0; j < rowObj.length; j++) { + rowPrim[j] = rowObj[j]; + } + innersArray[i] = rowPrim; + } + mazeLayouts. add(new MazeLayout(innersArray, new boolean[0][], new boolean[0][], new boolean[0][], layoutName)); + } + } + + public List getMazeLayouts() { + return mazeLayouts; + } + + /** + * Return layout with the specified name + * @param name name of the layout. Specified by the name property in JSON + * @return the MazeLayout + */ + public MazeLayout getLayout(String name) { + for (MazeLayout layout : mazeLayouts) { + if (layout.getName().equals(name)) { + return layout; + } + } + return null; + } +} diff --git a/engine/src/main/java/org/destinationsol/game/planet/BeltConfig.java b/engine/src/main/java/org/destinationsol/game/planet/BeltConfig.java new file mode 100644 index 000000000..23a996ea7 --- /dev/null +++ b/engine/src/main/java/org/destinationsol/game/planet/BeltConfig.java @@ -0,0 +1,46 @@ +/* + * Copyright 2021 The Terasology Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.destinationsol.game.planet; + +import org.destinationsol.game.ShipConfig; +import org.destinationsol.game.chunk.SpaceEnvConfig; +import org.destinationsol.game.item.TradeConfig; + +import java.util.ArrayList; + +public class BeltConfig { + + public final String name; + //These ArrayLists represent Configs for the enemies. When the game is populating the Belt, it will look into + //the belt config for enemy ship configs. These enemies are temporary (they respawn) + public final ArrayList tempEnemies; + public final ArrayList innerTempEnemies; + public final SpaceEnvConfig envConfig; + public final TradeConfig tradeConfig; + + public final boolean hard; + + public BeltConfig(String name, SpaceEnvConfig envConfig, boolean hard) { + this.name = name; + this.envConfig = envConfig; + this.hard = hard; + //These objects are loaded in by the BeltConfigManager class using JSON + this.tradeConfig = new TradeConfig(); + this.tempEnemies = new ArrayList<>(); + this.innerTempEnemies = new ArrayList<>(); + } + +} diff --git a/engine/src/main/java/org/destinationsol/game/planet/BeltConfigManager.java b/engine/src/main/java/org/destinationsol/game/planet/BeltConfigManager.java new file mode 100644 index 000000000..6759d5854 --- /dev/null +++ b/engine/src/main/java/org/destinationsol/game/planet/BeltConfigManager.java @@ -0,0 +1,147 @@ +/* + * Copyright 2020 The Terasology Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.destinationsol.game.planet; + +import org.destinationsol.assets.Assets; +import org.destinationsol.assets.json.Json; +import org.destinationsol.assets.json.Validator; +import org.destinationsol.common.SolRandom; +import org.destinationsol.files.HullConfigManager; +import org.destinationsol.game.ShipConfig; +import org.destinationsol.game.chunk.SpaceEnvConfig; +import org.destinationsol.game.item.ItemManager; +import org.json.JSONObject; +import org.terasology.gestalt.assets.ResourceUrn; +import org.terasology.gestalt.naming.Name; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Map; +import java.util.Set; + +public class BeltConfigManager { + private final Map configs; + private final Map hardConfigs; + private HullConfigManager hullConfigManager; + private ItemManager itemManager; + + public BeltConfigManager(HullConfigManager hullConfigManager, ItemManager itemManager) { + configs = new HashMap<>(); + hardConfigs = new HashMap<>(); + this.hullConfigManager = hullConfigManager; + this.itemManager = itemManager; + } + + /** + * This method is used to tell the JSON data loader to load data from the engine module. + */ + public void loadDefaultBeltConfigs() { + load("engine:asteroidBeltsConfig", "engine:schemaSystemsConfig", "asteroidBeltsConfig"); + } + + /** + * This method loads in all the Belt configuration data from the specified location. + * @param jsonPath path to the JSON data + * @param schemaPath path to the schema + */ + public void load(String jsonPath, String schemaPath, String assetType) { + JSONObject rootNode = Validator.getValidatedJSON(jsonPath, schemaPath); + + for (String s : rootNode.keySet()) { + if (!(rootNode.get(s) instanceof JSONObject)) { + continue; + } + JSONObject node = rootNode.getJSONObject(s); + String name = s; + + boolean hard = node.optBoolean("hard", false); + Map configsToLoad = hard ? hardConfigs : configs; + + SpaceEnvConfig envConfig = new SpaceEnvConfig(node.getJSONObject("environment")); + + BeltConfig beltConfig = new BeltConfig(name, envConfig, hard); + configsToLoad.put(name, beltConfig); + } + + //TODO: determine why "engine" module is excluded + Set configUrnList = Assets.getAssetHelper().listAssets(Json.class, assetType, new Name("engine")); + + for (ResourceUrn configUrn : configUrnList) { + rootNode = Validator.getValidatedJSON(configUrn.toString(), "engine:schemaSystemsConfig"); + + for (String nodeValue : rootNode.keySet()) { + if (!(rootNode.get(nodeValue) instanceof JSONObject)) { + continue; + } + JSONObject node = rootNode.getJSONObject(nodeValue); + String name = nodeValue; + + boolean hard = node.optBoolean("hard", false); + Map configsToLoad = hard ? hardConfigs : configs; + + BeltConfig config = configsToLoad.get(name); + + // TODO : Maybe add sanity checks for config? + + //Load the configs for the enemy ships used in this belt. If there are no ships in the JSONArray, the resulting list will be empty + config.tempEnemies.addAll(ShipConfig.loadList(node.has("temporaryEnemies") ? node.getJSONArray("temporaryEnemies") : null, hullConfigManager, itemManager)); + config.innerTempEnemies.addAll(ShipConfig.loadList(node.has("innerTemporaryEnemies") ? node.getJSONArray("innerTemporaryEnemies") : null, hullConfigManager, itemManager)); + + //get the config for trading for this belt + config.tradeConfig.load(node.has("trading") ? node.getJSONObject("trading") : null, hullConfigManager, itemManager); + } + } + } + + /** + * Retrieves the BeltConfig with the specified name. + * @param name name of the BeltConfig + * @return the BeltConfig + */ + public BeltConfig getBeltConfig(String name) { + BeltConfig beltConfig = configs.get(name); + if (beltConfig != null) { + return beltConfig; + } + return hardConfigs.get(name); + } + + /** + * This returns a random config for a Belt from among the configs available. + * @param hard whether or not the Belt is part of a hard SolarSystem + * @return Config for the Belt + */ + public BeltConfig getRandomBeltConfig(boolean hard) { + Map config = hard ? hardConfigs : configs; + return SolRandom.seededRandomElement(new ArrayList<>(config.values())); + } + + /** + * This adds all the ShipConfigs used in the BeltConfigs into the passed in shipConfigs list. + * @param shipConfigs list to add the ShipConfigs from BeltConfigs to + */ + public void addAllConfigs(ArrayList shipConfigs) { + for (BeltConfig beltConfig : configs.values()) { + shipConfigs.addAll(beltConfig.tempEnemies); + shipConfigs.addAll(beltConfig.innerTempEnemies); + } + + for (BeltConfig beltConfig : hardConfigs.values()) { + shipConfigs.addAll(beltConfig.tempEnemies); + shipConfigs.addAll(beltConfig.innerTempEnemies); + } + } +} diff --git a/engine/src/main/java/org/destinationsol/game/planet/CloudBuilder.java b/engine/src/main/java/org/destinationsol/game/planet/CloudBuilder.java new file mode 100644 index 000000000..e2dfa5731 --- /dev/null +++ b/engine/src/main/java/org/destinationsol/game/planet/CloudBuilder.java @@ -0,0 +1,100 @@ +/* + * Copyright 2021 The Terasology Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.destinationsol.game.planet; + +import com.badlogic.gdx.graphics.g2d.TextureAtlas; + +import java.util.ArrayList; +import java.util.List; + +/** + * This class keeps track of the variables which are taken into account when placing clouds (or other floating decorations + * onto a Planet. These values are used by {@link PlanetObjectsBuilder} to create the actual objects that decorate + * a Planet. + */ +public class CloudBuilder { + private final List cloudTextures = new ArrayList<>(); + + /** Frequency at which clouds will generate */ + private float cloudDensity; + + /** The lowest point (in terms of percentage of the atmosphere) that clouds will generate at */ + private float atmosphereStartingPercentage; + + /** The highest point (in terms of percentage of the atmosphere) that clouds will generate at */ + private float atmosphereEndingPercentage; + + /** The smallest width (in terms of percentage of the default width) that a cloud will generate with */ + private float cloudWidthStartingPercentage; + + /**The largest width (in terms of percentage of the default width) that a cloud will generate with */ + private float cloudWidthEndingPercentage; + + public CloudBuilder(List cloudTextures, float cloudDensity, + float atmosphereStartingPercentage, float atmosphereEndingPercentage, + float cloudWidthStartingPercentage, float cloudWidthEndingPercentage) { + this.cloudTextures.addAll(cloudTextures); + this.cloudDensity = cloudDensity; + this.atmosphereStartingPercentage = atmosphereStartingPercentage; + this.atmosphereEndingPercentage = atmosphereEndingPercentage; + this.cloudWidthStartingPercentage = cloudWidthStartingPercentage; + this.cloudWidthEndingPercentage = cloudWidthEndingPercentage; + } + + public float getAtmosphereStartingPercentage() { + return atmosphereStartingPercentage; + } + + public void setAtmosphereStartingPercentage(float atmosphereStartingPercentage) { + this.atmosphereStartingPercentage = atmosphereStartingPercentage; + } + + public float getAtmosphereEndingPercentage() { + return atmosphereEndingPercentage; + } + + public void setAtmosphereEndingPercentage(float atmosphereEndingPercentage) { + this.atmosphereEndingPercentage = atmosphereEndingPercentage; + } + + public float getCloudWidthStartingPercentage() { + return cloudWidthStartingPercentage; + } + + public void setCloudWidthStartingPercentage(float cloudWidthStartingPercentage) { + this.cloudWidthStartingPercentage = cloudWidthStartingPercentage; + } + + public float getCloudWidthEndingPercentage() { + return cloudWidthEndingPercentage; + } + + public void setCloudWidthEndingPercentage(float cloudWidthEndingPercentage) { + this.cloudWidthEndingPercentage = cloudWidthEndingPercentage; + } + + public float getCloudDensity() { + return cloudDensity; + } + + public void setCloudDensity(float cloudDensity) { + this.cloudDensity = cloudDensity; + } + + public List getCloudTextures() { + return cloudTextures; + } +} diff --git a/engine/src/main/java/org/destinationsol/game/planet/OrbitalEnemiesBuilder.java b/engine/src/main/java/org/destinationsol/game/planet/OrbitalEnemiesBuilder.java new file mode 100644 index 000000000..07abd3e36 --- /dev/null +++ b/engine/src/main/java/org/destinationsol/game/planet/OrbitalEnemiesBuilder.java @@ -0,0 +1,72 @@ +/* + * Copyright 2021 The Terasology Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.destinationsol.game.planet; + +import org.destinationsol.game.ShipConfig; + +import java.util.ArrayList; +import java.util.List; + +/** + * This class keeps track of the variables which are taken into account when placing various types of ships within the + * orbit of a Planet. These values are used by {@link PlanetObjectsBuilder} to create the actual ships that are on + * a Planet. This class keeps track specifically of variables which affect the entire category of Orbital Enemies. Other + * variables, such ship density (how many of the ships are places), are dependent on the specific ShipConfig, + * and so are held within the list of ShipConfigs. + */ +public class OrbitalEnemiesBuilder { + private ArrayList orbitalEnemies = new ArrayList<>(); + //Offset Percentage represents how far apart enemies should be made, in terms of circumference of the planet + private float offsetPercentage; + //TODO: Change atmosphere percentage to something more understandable, like height + private float atmospherePercentage; + private float detectionDistance; + + public OrbitalEnemiesBuilder(List orbitalEnemies, float offsetPercentage, float atmospherePercentage, float detectionDistance) { + this.orbitalEnemies.addAll(orbitalEnemies); + this.offsetPercentage = offsetPercentage; + this.atmospherePercentage = atmospherePercentage; + this.detectionDistance = detectionDistance; + } + + public ArrayList getOrbitalEnemies() { + return orbitalEnemies; + } + + public float getOffsetPercentage() { + return offsetPercentage; + } + + public void setOffsetPercentage(float offsetPercentage) { + this.offsetPercentage = offsetPercentage; + } + + public float getAtmospherePercentage() { + return atmospherePercentage; + } + + public void setAtmospherePercentage(float atmospherePercentage) { + this.atmospherePercentage = atmospherePercentage; + } + + public float getDetectionDistance() { + return detectionDistance; + } + + public void setDetectionDistance(float detectionDistance) { + this.detectionDistance = detectionDistance; + } +} diff --git a/engine/src/main/java/org/destinationsol/game/planet/Planet.java b/engine/src/main/java/org/destinationsol/game/planet/Planet.java index 35299dde2..dba0d4139 100644 --- a/engine/src/main/java/org/destinationsol/game/planet/Planet.java +++ b/engine/src/main/java/org/destinationsol/game/planet/Planet.java @@ -27,7 +27,7 @@ import java.util.List; public class Planet { - private final SolSystem system; + private final Vector2 solarSystemPosition; private final Vector2 position; private final float distance; private final float rotationSpeedInSystem; @@ -46,9 +46,9 @@ public class Planet { private float minGroundHeight; private Vector2 velocity; - public Planet(SolSystem sys, float angleToSys, float dist, float angle, float toSysRotationSpeed, float rotationSpeed, + public Planet(Vector2 solarSystemPosition, float angleToSys, float dist, float angle, float toSysRotationSpeed, float rotationSpeed, float groundHeight, boolean objsCreated, PlanetConfig config, String name) { - system = sys; + this.solarSystemPosition = solarSystemPosition; angleInSystem = angleToSys; distance = dist; this.angle = angle; @@ -84,7 +84,7 @@ public void update(SolGame game, float timeStep) { private void setSecondaryParams() { SolMath.fromAl(position, angleInSystem, distance); - position.add(system.getPosition()); + position.add(solarSystemPosition); float speed = SolMath.angleToArc(rotationSpeedInSystem, distance); float velocityAngle = angleInSystem + 90; SolMath.fromAl(velocity, velocityAngle, speed); @@ -113,8 +113,8 @@ public float getGroundHeight() { return groundHeight; } - public SolSystem getSystem() { - return system; + public Vector2 getSolarSystemPosition() { + return solarSystemPosition; } @Bound diff --git a/engine/src/main/java/org/destinationsol/game/planet/PlanetConfig.java b/engine/src/main/java/org/destinationsol/game/planet/PlanetConfig.java index 57d45cff5..cf2139258 100644 --- a/engine/src/main/java/org/destinationsol/game/planet/PlanetConfig.java +++ b/engine/src/main/java/org/destinationsol/game/planet/PlanetConfig.java @@ -16,6 +16,7 @@ package org.destinationsol.game.planet; import com.badlogic.gdx.graphics.g2d.TextureAtlas; +import org.destinationsol.Const; import org.destinationsol.assets.Assets; import org.destinationsol.files.HullConfigManager; import org.destinationsol.game.GameColors; @@ -44,6 +45,10 @@ public class PlanetConfig { public final TradeConfig tradeConfig; public final boolean hardOnly; public final boolean easyOnly; + //These 'builder' classes allow custom World Generators to modify values used when placing objects on the planet + public final OrbitalEnemiesBuilder lowOrbitalEnemiesBuilder; + public final OrbitalEnemiesBuilder highOrbitalEnemiesBuilder; + public final CloudBuilder cloudBuilder; public PlanetConfig(String configName, float minGrav, float maxGrav, List deco, List groundEnemies, List highOrbitEnemies, List lowOrbitEnemies, List cloudTextures, @@ -66,6 +71,9 @@ public PlanetConfig(String configName, float minGrav, float maxGrav, List allConfigs; private final List easy; private final List medium; private final List hard; - public PlanetConfigs(HullConfigManager hullConfigs, GameColors cols, ItemManager itemManager) { + public PlanetConfigManager(HullConfigManager hullConfigManager, GameColors gameColors, ItemManager itemManager) { + this.hullConfigManager = hullConfigManager; + this.gameColors = gameColors; + this.itemManager = itemManager; allConfigs = new HashMap<>(); easy = new ArrayList<>(); medium = new ArrayList<>(); hard = new ArrayList<>(); + } + + /** + * Load the default configs for Planets from the engine module + */ + public void loadDefaultPlanetConfigs() { + load("planetsConfig", "engine:schemaPlanetsConfig"); + } - Set planetJsonConfigs = Assets.getAssetHelper().listAssets(Json.class, "planetsConfig"); + /** + * Load specified configs for Planets + * @param asset The name of the asset type to load + * @param schemaPath the path of the schema to load + */ + public void load(String asset, String schemaPath) { + Set planetJsonConfigs = Assets.getAssetHelper().listAssets(Json.class, asset); for (ResourceUrn planetConfigJson : planetJsonConfigs) { String moduleName = planetConfigJson.getModuleName().toString(); - JSONObject rootNode = Validator.getValidatedJSON(planetConfigJson.toString(), "engine:schemaPlanetsConfig"); + JSONObject rootNode = Validator.getValidatedJSON(planetConfigJson.toString(), schemaPath); for (String s : rootNode.keySet()) { JSONObject node = rootNode.getJSONObject(s); - PlanetConfig planetConfig = PlanetConfig.load(s, node, hullConfigs, cols, itemManager, moduleName); + PlanetConfig planetConfig = PlanetConfig.load(s, node, hullConfigManager, gameColors, itemManager, moduleName); allConfigs.put(s, planetConfig); if (planetConfig.hardOnly) { hard.add(planetConfig); @@ -64,10 +88,20 @@ public PlanetConfigs(HullConfigManager hullConfigs, GameColors cols, ItemManager } } + /** + * Get a particular config from the configs already loaded in. + * @param name Name of the config to get + * @return the particular config + */ public PlanetConfig getConfig(String name) { return allConfigs.get(name); } + /** + * This determines whether the planet gets an easy, hard, or medium config. If easy is true, it will be an easy planet. + * If easy is false but hard is true, it will be a hard planet. Else, it will be a medium planet. If both are true, + * it will be easy + */ public PlanetConfig getRandom(boolean easy, boolean hard) { List cfg = easy ? this.easy : hard ? this.hard : medium; return SolRandom.seededRandomElement(cfg); diff --git a/engine/src/main/java/org/destinationsol/game/planet/PlanetManager.java b/engine/src/main/java/org/destinationsol/game/planet/PlanetManager.java index b0b7825bb..0043560de 100644 --- a/engine/src/main/java/org/destinationsol/game/planet/PlanetManager.java +++ b/engine/src/main/java/org/destinationsol/game/planet/PlanetManager.java @@ -18,49 +18,40 @@ import com.badlogic.gdx.graphics.Color; import com.badlogic.gdx.math.Vector2; import com.badlogic.gdx.physics.box2d.Body; -import org.destinationsol.Const; import org.destinationsol.common.SolColor; import org.destinationsol.common.SolMath; -import org.destinationsol.files.HullConfigManager; import org.destinationsol.game.DebugOptions; -import org.destinationsol.game.GameColors; import org.destinationsol.game.GameDrawer; import org.destinationsol.game.SolCam; import org.destinationsol.game.SolGame; -import org.destinationsol.game.SolNames; import org.destinationsol.game.SolObject; import org.destinationsol.game.UpdateAwareSystem; import org.destinationsol.game.context.Context; -import org.destinationsol.game.item.ItemManager; import org.destinationsol.game.maze.Maze; -import org.destinationsol.game.maze.MazeConfigs; import org.destinationsol.game.ship.SolShip; import org.destinationsol.game.ship.hulls.Hull; import org.destinationsol.game.ship.hulls.HullConfig; +import org.destinationsol.world.generators.SolarSystemGenerator; import javax.inject.Inject; import java.util.ArrayList; import java.util.List; public class PlanetManager implements UpdateAwareSystem { - private final ArrayList systems; + private final ArrayList systems; private final ArrayList planets; private final ArrayList belts; private final FlatPlaceFinder flatPlaceFinder; - private final PlanetConfigs planetConfigs; - private final MazeConfigs mazeConfigs; private final ArrayList mazes; private final SunSingleton sunSingleton; - private final SysConfigs sysConfigs; private final PlanetCoreSingleton planetCoreSingleton; private Planet nearestPlanet; @Inject - public PlanetManager(HullConfigManager hullConfigs, GameColors cols, - ItemManager itemManager) { - planetConfigs = new PlanetConfigs(hullConfigs, cols, itemManager); - sysConfigs = new SysConfigs(hullConfigs, itemManager); - mazeConfigs = new MazeConfigs(hullConfigs, itemManager); + public PlanetManager() { +// sysConfigs = new SysConfigs(hullConfigs, itemManager); +// mazeConfigs = new MazeConfigs(hullConfigs, itemManager); + systems = new ArrayList<>(); mazes = new ArrayList<>(); @@ -71,10 +62,6 @@ public PlanetManager(HullConfigManager hullConfigs, GameColors cols, planetCoreSingleton = new PlanetCoreSingleton(); } - public void fill(SolNames names, int numberOfSystems) { - new SystemsBuilder().build(systems, planets, belts, planetConfigs, mazeConfigs, mazes, sysConfigs, names, numberOfSystems); - } - @Override public void update(SolGame game, float timeStep) { Vector2 camPos = game.getCam().getPosition(); @@ -87,7 +74,7 @@ public void update(SolGame game, float timeStep) { nearestPlanet = getNearestPlanet(camPos); - SolSystem nearestSys = getNearestSystem(camPos); + SolarSystem nearestSys = getNearestSystem(camPos); applyGrav(game, nearestSys); } @@ -104,7 +91,7 @@ public Planet getNearestPlanet(Vector2 position) { return res; } - private void applyGrav(SolGame game, SolSystem nearestSys) { + private void applyGrav(SolGame game, SolarSystem nearestSys) { float npGh = nearestPlanet.getGroundHeight(); float npFh = nearestPlanet.getFullHeight(); float npMinH = nearestPlanet.getMinGroundHeight(); @@ -133,7 +120,7 @@ private void applyGrav(SolGame game, SolSystem nearestSys) { srcPos = npPos; gravConst = npGravConst; onPlanet = true; - } else if (toSys < Const.SUN_RADIUS) { + } else if (toSys < SolarSystemGenerator.SUN_RADIUS) { minDist = SunSingleton.SUN_HOT_RAD; srcPos = sysPos; gravConst = SunSingleton.GRAV_CONST; @@ -219,7 +206,7 @@ public ArrayList getBelts() { return belts; } - public ArrayList getSystems() { + public ArrayList getSystems() { return systems; } @@ -232,10 +219,10 @@ public ArrayList getMazes() { return mazes; } - public SolSystem getNearestSystem(Vector2 position) { + public SolarSystem getNearestSystem(Vector2 position) { float minDst = Float.MAX_VALUE; - SolSystem res = null; - for (SolSystem system : systems) { + SolarSystem res = null; + for (SolarSystem system : systems) { float dst = position.dst(system.getPosition()); if (dst < minDst) { minDst = dst; @@ -265,4 +252,5 @@ public void drawSunHack(SolGame game, GameDrawer drawer, Context context) { public void drawPlanetCoreHack(SolGame game, GameDrawer drawer, Context context) { planetCoreSingleton.draw(game, drawer, context); } + } diff --git a/engine/src/main/java/org/destinationsol/game/planet/PlanetObjectsBuilder.java b/engine/src/main/java/org/destinationsol/game/planet/PlanetObjectsBuilder.java index 257773e99..6e41d73d9 100644 --- a/engine/src/main/java/org/destinationsol/game/planet/PlanetObjectsBuilder.java +++ b/engine/src/main/java/org/destinationsol/game/planet/PlanetObjectsBuilder.java @@ -39,6 +39,8 @@ import org.destinationsol.game.item.TradeConfig; import org.destinationsol.game.ship.FarShip; import org.destinationsol.game.ship.hulls.HullConfig; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import java.util.ArrayList; import java.util.HashMap; @@ -49,22 +51,27 @@ public class PlanetObjectsBuilder { private static final float TOP_TILE_SZ = 2f; private static final float MAX_CLOUD_PIECE_SZ = 1.5f; - private static final float MAX_CLOUT_PIECE_ROT_SPD = 5f; + private static final float MAX_CLOUD_PIECE_ROT_SPD = 5f; private static final int MAX_CLOUD_PIECE_COUNT = 30; private static final float MAX_CLOUD_PIECE_DIST_SHIFT = 1f; private static final float MAX_CLOUD_LINEAR_SPD = .1f; private static final float AVG_CLOUD_LINEAR_WIDTH = 3f; - private static final float CLOUD_DENSITY = .2f; private static final float DECO_PACK_SZ = 5f; private static final float DECO_PACK_ANGULAR_WIDTH = 360 * DECO_PACK_SZ / (2 * MathUtils.PI * Const.MAX_GROUND_HEIGHT); + private static final Logger logger = LoggerFactory.getLogger(PlanetObjectsBuilder.class); + + private ArrayList groundShips = new ArrayList<>(); + public float createPlanetObjs(SolGame game, Planet planet) { if (DebugOptions.NO_OBJS) { return 0; } float minRadius = createGround(game, planet); - createClouds(game, planet); + + CloudBuilder cloudBuilder = planet.getConfig().cloudBuilder; + createClouds(game, planet, cloudBuilder); createDecorations(game, planet); if (planet.getConfig().skyConfig != null) { Sky sky = new Sky(game, planet); @@ -77,47 +84,59 @@ public float createPlanetObjs(SolGame game, Planet planet) { private void createShips(SolGame game, Planet planet) { ConsumedAngles takenAngles = new ConsumedAngles(); + //Create a station on the Planet + buildStation(game, planet, takenAngles); + + float groundHeight = planet.getGroundHeight(); + //Place ground enemies + PlanetConfig config = planet.getConfig(); + buildGroundEnemies(game, planet, takenAngles, groundHeight, config); + + for (FarShip ship : groundShips) { + game.getObjectManager().addFarObjNow(ship); + } + + //Place enemies in the air + buildOrbitEnemies(game, planet, groundHeight, config.lowOrbitalEnemiesBuilder); + buildOrbitEnemies(game, planet, groundHeight, config.highOrbitalEnemiesBuilder); + } + + private void buildStation(SolGame game, Planet planet, ConsumedAngles takenAngles) { ShipConfig stationConfig = planet.getConfig().stationConfig; if (stationConfig != null) { - FarShip station = buildGroundShip(game, planet, stationConfig, planet.getConfig().tradeConfig, Faction.LAANI, takenAngles, "Station"); - game.getObjectManager().addFarObjNow(station); + buildGroundShip(game, planet, stationConfig, planet.getConfig().tradeConfig, Faction.LAANI, takenAngles, "Station"); } + } - float groundHeight = planet.getGroundHeight(); - - PlanetConfig config = planet.getConfig(); + private void buildGroundEnemies(SolGame game, Planet planet, ConsumedAngles takenAngles, float groundHeight, PlanetConfig config) { for (ShipConfig groundEnemy : config.groundEnemies) { int count = (int) (groundEnemy.density * groundHeight); for (int i = 0; i < count; i++) { - FarShip enemy = buildGroundShip(game, planet, groundEnemy, null, Faction.EHAR, takenAngles, null); - game.getObjectManager().addFarObjNow(enemy); + buildGroundShip(game, planet, groundEnemy, null, Faction.EHAR, takenAngles, null); } } - - buildOrbitEnemies(game, planet, groundHeight, 0, .1f, config.lowOrbitEnemies, Const.AUTO_SHOOT_SPACE); - buildOrbitEnemies(game, planet, groundHeight, .1f, .6f, config.highOrbitEnemies, Const.AI_DET_DIST); } - private void buildOrbitEnemies(SolGame game, Planet planet, float groundHeight, float offsetPercentage, float atmPercentage, List configs, float detDist) { - if (configs.isEmpty()) { + private void buildOrbitEnemies(SolGame game, Planet planet, float groundHeight, OrbitalEnemiesBuilder orbitalEnemiesBuilder) { + if (orbitalEnemiesBuilder.getOrbitalEnemies().isEmpty()) { return; } HashMap counts = new HashMap<>(); int totalCount = 0; - for (ShipConfig oe : configs) { - int count = (int) (atmPercentage * oe.density * groundHeight * Const.ATM_HEIGHT); + for (ShipConfig oe : orbitalEnemiesBuilder.getOrbitalEnemies()) { + int count = (int) (orbitalEnemiesBuilder.getAtmospherePercentage() * oe.density * groundHeight * Const.ATM_HEIGHT); counts.put(oe, count); totalCount += count; } - float stepPercentage = atmPercentage / totalCount; - float heightPercentage = offsetPercentage; + float stepPercentage = orbitalEnemiesBuilder.getAtmospherePercentage() / totalCount; + float heightPercentage = orbitalEnemiesBuilder.getOffsetPercentage(); - for (ShipConfig shipConfig : configs) { + for (ShipConfig shipConfig : orbitalEnemiesBuilder.getOrbitalEnemies()) { int count = counts.get(shipConfig); for (int i = 0; i < count; i++) { - FarShip enemy = buildOrbitEnemy(game, planet, heightPercentage, shipConfig, detDist); + FarShip enemy = buildOrbitEnemy(game, planet, heightPercentage, shipConfig, orbitalEnemiesBuilder.getDetectionDistance()); game.getObjectManager().addFarObjNow(enemy); heightPercentage += stepPercentage; } @@ -170,25 +189,25 @@ private float createGround(SolGame game, Planet planet) { return minRadius; } - private void createClouds(SolGame game, Planet planet) { - List cloudTextures = planet.getConfig().cloudTextures; + private void createClouds(SolGame game, Planet planet, CloudBuilder cloudBuilder) { + List cloudTextures = cloudBuilder.getCloudTextures(); if (cloudTextures.isEmpty()) { return; } - int cloudCount = SolRandom.randomInt(.7f, (int) (CLOUD_DENSITY * Const.ATM_HEIGHT * planet.getGroundHeight())); + int cloudCount = SolRandom.randomInt(.7f, (int) (cloudBuilder.getCloudDensity() * Const.ATM_HEIGHT * planet.getGroundHeight())); for (int i = 0; i < cloudCount; i++) { - FarPlanetSprites cloud = createCloud(planet, cloudTextures); + FarPlanetSprites cloud = createCloud(planet, cloudTextures, cloudBuilder); game.getObjectManager().addFarObjNow(cloud); } } - private FarPlanetSprites createCloud(Planet planet, List cloudTextures) { - float distancePercentage = SolRandom.randomFloat(0, 1); + private FarPlanetSprites createCloud(Planet planet, List cloudTextures, CloudBuilder cloudBuilder) { + float distancePercentage = SolRandom.randomFloat(cloudBuilder.getAtmosphereStartingPercentage(), cloudBuilder.getAtmosphereEndingPercentage()); float distance = planet.getGroundHeight() - TOP_TILE_SZ + .9f * Const.ATM_HEIGHT * distancePercentage; float angle = SolRandom.randomFloat(180); List drawables = new ArrayList<>(); - float sizePercentage = SolRandom.randomFloat(.2f, 1); + float sizePercentage = SolRandom.randomFloat(cloudBuilder.getCloudWidthStartingPercentage(), cloudBuilder.getCloudWidthEndingPercentage()); float linearWidth = sizePercentage * (distancePercentage + .5f) * AVG_CLOUD_LINEAR_WIDTH; float maxAngleShift = SolMath.arcToAngle(linearWidth, distance); float maxDistanceShift = (1 - distancePercentage) * MAX_CLOUD_PIECE_DIST_SHIFT; @@ -213,7 +232,7 @@ private RectSprite createCloudSprite(List cloudTexture float size = .5f * (1 + distancePercentage) * MAX_CLOUD_PIECE_SZ; float relativeAngle = SolRandom.randomFloat(30); - float rotationSpeed = SolRandom.randomFloat(MAX_CLOUT_PIECE_ROT_SPD); + float rotationSpeed = SolRandom.randomFloat(MAX_CLOUD_PIECE_ROT_SPD); float angleShift = relativeAngleShift * maxAngleShift; float distanceShift = maxDistanceShift == 0 ? 0 : distancePercentage * SolRandom.randomFloat(0, maxDistanceShift); float distance = baseDistance + distanceShift; @@ -302,9 +321,10 @@ private void addDeco(SolGame game, float groundHeight, Vector2 planetPos, } } - private FarShip buildGroundShip(SolGame game, Planet planet, ShipConfig shipConfig, TradeConfig tradeConfig, + private void buildGroundShip(SolGame game, Planet planet, ShipConfig shipConfig, TradeConfig tradeConfig, Faction faction, ConsumedAngles takenAngles, String mapHint) { Vector2 position = game.getPlanetManager().findFlatPlace(game, planet, takenAngles, shipConfig.hull.getApproxRadius()); + boolean goodSpot = true; boolean station = shipConfig.hull.getType() == HullConfig.Type.STATION; String shipItems = shipConfig.items; boolean hasRepairer; @@ -321,17 +341,26 @@ private FarShip buildGroundShip(SolGame game, Planet planet, ShipConfig shipConf SolMath.toWorld(position, position, planet.getAngle(), planet.getPosition()); Vector2 distanceToPlanet = SolMath.getVec(planet.getPosition()).sub(position); - float angle = SolMath.angle(distanceToPlanet) - 180; + logger.info("Planet: " + planet.getName() + ", Station Vector: " + distanceToPlanet.toString()); + float angle = 0; + //TODO: Determine why distanceToPlanet is occasionally equal to {NaN, NaN} + if (!distanceToPlanet.equals(new Vector2(Float.NaN, Float.NaN))) { + angle = SolMath.angle(distanceToPlanet) - 180; + } else { + goodSpot = false; + } if (station) { angle += 90; } - Vector2 velocity = new Vector2(distanceToPlanet).nor(); - SolMath.free(distanceToPlanet); - Pilot provider = new AiPilot(new StillGuard(position, game, shipConfig), false, faction, true, mapHint, Const.AI_DET_DIST); + if (goodSpot) { + Vector2 velocity = new Vector2(distanceToPlanet).nor(); - return game.getShipBuilder().buildNewFar(game, position, velocity, angle, 0, provider, shipItems, shipConfig.hull, - null, hasRepairer, money, tradeConfig, true); + Pilot provider = new AiPilot(new StillGuard(position, game, shipConfig), false, faction, true, mapHint, Const.AI_DET_DIST); + groundShips.add(game.getShipBuilder().buildNewFar(game, position, velocity, angle, 0, provider, shipItems, shipConfig.hull, + null, hasRepairer, money, tradeConfig, true)); + } + SolMath.free(distanceToPlanet); } private FarShip buildOrbitEnemy(SolGame game, Planet planet, float heightPercentage, ShipConfig shipConfig, float detectionDistance) { diff --git a/engine/src/main/java/org/destinationsol/game/planet/Sky.java b/engine/src/main/java/org/destinationsol/game/planet/Sky.java index 82619d7eb..7cee3f908 100644 --- a/engine/src/main/java/org/destinationsol/game/planet/Sky.java +++ b/engine/src/main/java/org/destinationsol/game/planet/Sky.java @@ -84,7 +84,7 @@ public void update(SolGame game) { distPercentage = 1; } - Vector2 sysPos = planet.getSystem().getPosition(); + Vector2 sysPos = planet.getSolarSystemPosition(); float angleToCam = SolMath.angle(planetPos, camPos); float angleToSun = SolMath.angle(planetPos, sysPos); float dayPercentage = 1 - SolMath.angleDiff(angleToCam, angleToSun) / 180; diff --git a/engine/src/main/java/org/destinationsol/game/planet/SolSystem.java b/engine/src/main/java/org/destinationsol/game/planet/SolarSystem.java similarity index 85% rename from engine/src/main/java/org/destinationsol/game/planet/SolSystem.java rename to engine/src/main/java/org/destinationsol/game/planet/SolarSystem.java index 57cf079a0..0c2c698a2 100644 --- a/engine/src/main/java/org/destinationsol/game/planet/SolSystem.java +++ b/engine/src/main/java/org/destinationsol/game/planet/SolarSystem.java @@ -17,27 +17,30 @@ import com.badlogic.gdx.math.Vector2; import org.destinationsol.game.HardnessCalc; +import org.destinationsol.game.maze.Maze; import java.util.ArrayList; -public class SolSystem { +public class SolarSystem { private final Vector2 position; private final ArrayList planets; private final ArrayList belts; - private final SysConfig config; + private final ArrayList mazes; + private final SolarSystemConfig config; private final String name; private final float radius; private final float damagePerSecond; private final float innerDamagePerSecond; private float innerRadius; - public SolSystem(Vector2 position, SysConfig config, String name, float sysRadius) { + public SolarSystem(Vector2 position, SolarSystemConfig config, String name, float sysRadius) { this.config = config; this.name = name; this.position = new Vector2(position); planets = new ArrayList<>(); belts = new ArrayList<>(); + mazes = new ArrayList<>(); radius = sysRadius; damagePerSecond = HardnessCalc.getSysDps(config, false); innerRadius = radius / 2; @@ -52,6 +55,10 @@ public ArrayList getBelts() { return belts; } + public ArrayList getMazes() { + return mazes; + } + public Vector2 getPosition() { return position; } @@ -60,7 +67,7 @@ public float getRadius() { return radius; } - public SysConfig getConfig() { + public SolarSystemConfig getConfig() { return config; } diff --git a/engine/src/main/java/org/destinationsol/game/planet/SolarSystemConfig.java b/engine/src/main/java/org/destinationsol/game/planet/SolarSystemConfig.java new file mode 100644 index 000000000..4efbc2599 --- /dev/null +++ b/engine/src/main/java/org/destinationsol/game/planet/SolarSystemConfig.java @@ -0,0 +1,50 @@ +/* + * Copyright 2021 The Terasology Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.destinationsol.game.planet; + +import org.destinationsol.game.ShipConfig; +import org.destinationsol.game.chunk.SpaceEnvConfig; +import org.destinationsol.game.item.TradeConfig; + +import java.util.ArrayList; + +public class SolarSystemConfig { + + public final String name; + public final SpaceEnvConfig envConfig; + //These ArrayLists represent Configs for the enemy ships. When the game is populating the SolarSystem, it will look into + //the SolarSystem config for enemy ship configs. Some enemies are temporary (they respawn) and some are constant (they don't respawn) + public final ArrayList tempEnemies; + public final ArrayList constEnemies; + public final ArrayList constAllies; + public final ArrayList innerTempEnemies; + public final TradeConfig tradeConfig; + public final boolean hard; + + public SolarSystemConfig(String name, SpaceEnvConfig envConfig, boolean hard) { + this.name = name; + this.envConfig = envConfig; + this.hard = hard; + + //These objects are loaded in by the SolarSystemConfigManager class using JSON + this.tradeConfig = new TradeConfig(); + this.constEnemies = new ArrayList<>(); + this.constAllies = new ArrayList<>(); + this.tempEnemies = new ArrayList<>(); + this.innerTempEnemies = new ArrayList<>(); + } + +} diff --git a/engine/src/main/java/org/destinationsol/game/planet/SolarSystemConfigManager.java b/engine/src/main/java/org/destinationsol/game/planet/SolarSystemConfigManager.java new file mode 100644 index 000000000..ca6f32710 --- /dev/null +++ b/engine/src/main/java/org/destinationsol/game/planet/SolarSystemConfigManager.java @@ -0,0 +1,153 @@ +/* + * Copyright 2021 The Terasology Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.destinationsol.game.planet; + +import org.destinationsol.assets.Assets; +import org.destinationsol.assets.json.Json; +import org.destinationsol.assets.json.Validator; +import org.destinationsol.common.SolRandom; +import org.destinationsol.files.HullConfigManager; +import org.destinationsol.game.ShipConfig; +import org.destinationsol.game.chunk.SpaceEnvConfig; +import org.destinationsol.game.item.ItemManager; +import org.json.JSONObject; +import org.terasology.gestalt.assets.ResourceUrn; +import org.terasology.gestalt.naming.Name; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Map; +import java.util.Set; + +public class SolarSystemConfigManager { + private final Map configs; + private final Map hardConfigs; + private HullConfigManager hullConfigManager; + private ItemManager itemManager; + + public SolarSystemConfigManager(HullConfigManager hullConfigManager, ItemManager itemManager) { + configs = new HashMap<>(); + hardConfigs = new HashMap<>(); + this.hullConfigManager = hullConfigManager; + this.itemManager = itemManager; + } + + /** + * This method is used to tell the JSON data loader to load data from the engine module. + */ + public void loadDefaultSolarSystemConfigs() { + load("engine:systemsConfig", "engine:schemaSystemsConfig", "systemsConfig"); + } + + /** + * This method loads in all the SolarSystem configuration data from the specified location. + * @param jsonPath path to the JSON data + * @param schemaPath path to the schema + */ + public void load(String jsonPath, String schemaPath, String assetType) { + JSONObject rootNode = Validator.getValidatedJSON(jsonPath, schemaPath); + + for (String nodeValue : rootNode.keySet()) { + if (!(rootNode.get(nodeValue) instanceof JSONObject)) { + continue; + } + JSONObject node = rootNode.getJSONObject(nodeValue); + String name = nodeValue; + + boolean hard = node.optBoolean("hard", false); + Map configsToLoad = hard ? hardConfigs : configs; + + SpaceEnvConfig envConfig = new SpaceEnvConfig(node.getJSONObject("environment")); + + SolarSystemConfig solarSystemConfig = new SolarSystemConfig(name, envConfig, hard); + configsToLoad.put(name, solarSystemConfig); + } + + //TODO: determine why "engine" module is excluded + Set configUrnList = Assets.getAssetHelper().listAssets(Json.class, assetType, new Name("engine")); + + for (ResourceUrn configUrn : configUrnList) { + rootNode = Validator.getValidatedJSON(configUrn.toString(), schemaPath); + + for (String nodeValue : rootNode.keySet()) { + if (!(rootNode.get(nodeValue) instanceof JSONObject)) { + continue; + } + JSONObject node = rootNode.getJSONObject(nodeValue); + String name = nodeValue; + + boolean hard = node.optBoolean("hard", false); + Map configsToLoad = hard ? hardConfigs : configs; + + SolarSystemConfig config = configsToLoad.get(name); + + + //Load the configs for the enemy ships used in this SolarSystem. If there are no ships in the JSONArray, the resulting list will be empty + config.tempEnemies.addAll(ShipConfig.loadList(node.has("temporaryEnemies") ? node.getJSONArray("temporaryEnemies") : null, hullConfigManager, itemManager)); + config.innerTempEnemies.addAll(ShipConfig.loadList(node.has("innerTemporaryEnemies") ? node.getJSONArray("innerTemporaryEnemies") : null, hullConfigManager, itemManager)); + config.constEnemies.addAll(ShipConfig.loadList(node.has("constantEnemies") ? node.getJSONArray("constantEnemies") : null, hullConfigManager, itemManager)); + config.constAllies.addAll(ShipConfig.loadList(node.has("constantAllies") ? node.getJSONArray("constantAllies") : null, hullConfigManager, itemManager)); + + //Get the config for trading for this SolarSystem. + config.tradeConfig.load(node.has("trading") ? node.getJSONObject("trading") : null, hullConfigManager, itemManager); + } + } + } + + /** + * Retrieves the SolarSystemConfig with the specified name. + * @param name name of the SolarSystemConfig + * @return the SolarSystemConfig + */ + public SolarSystemConfig getSolarSystemConfig(String name) { + SolarSystemConfig config = configs.get(name); + if (config != null) { + return config; + } + return hardConfigs.get(name); + } + + /** + * This returns a random config for a SolarSystem from among the configs available. + * @param hard whether or not the SolarSystem is a hard SolarSystem + * @return Config for the SolarSystem + */ + public SolarSystemConfig getRandomSolarSystemConfig(boolean hard) { + Map config = hard ? hardConfigs : configs; + return SolRandom.seededRandomElement(new ArrayList<>(config.values())); + } + + /** + * This adds all the ShipConfigs used in the SolarSystemConfigs into the passed in shipConfigs list. + * @param shipConfigs list to add the ShipConfigs from SolarSystemConfigs to + */ + public void addAllConfigs(ArrayList shipConfigs) { + for (SolarSystemConfig solarSystemConfig : configs.values()) { + shipConfigs.addAll(solarSystemConfig.constAllies); + shipConfigs.addAll(solarSystemConfig.constEnemies); + shipConfigs.addAll(solarSystemConfig.tempEnemies); + shipConfigs.addAll(solarSystemConfig.innerTempEnemies); + } + + for (SolarSystemConfig solarSystemConfig : hardConfigs.values()) { + shipConfigs.addAll(solarSystemConfig.constAllies); + shipConfigs.addAll(solarSystemConfig.constEnemies); + shipConfigs.addAll(solarSystemConfig.tempEnemies); + shipConfigs.addAll(solarSystemConfig.innerTempEnemies); + } + } + +} diff --git a/engine/src/main/java/org/destinationsol/game/planet/SunSingleton.java b/engine/src/main/java/org/destinationsol/game/planet/SunSingleton.java index b49451dec..784edd962 100644 --- a/engine/src/main/java/org/destinationsol/game/planet/SunSingleton.java +++ b/engine/src/main/java/org/destinationsol/game/planet/SunSingleton.java @@ -19,7 +19,6 @@ import com.badlogic.gdx.graphics.g2d.TextureAtlas; import com.badlogic.gdx.math.MathUtils; import com.badlogic.gdx.math.Vector2; -import org.destinationsol.Const; import org.destinationsol.assets.Assets; import org.destinationsol.common.SolColor; import org.destinationsol.common.SolMath; @@ -29,9 +28,10 @@ import org.destinationsol.game.SolGame; import org.destinationsol.game.SolObject; import org.destinationsol.game.context.Context; +import org.destinationsol.world.generators.SolarSystemGenerator; public class SunSingleton { - public static final float SUN_HOT_RAD = .75f * Const.SUN_RADIUS; + public static final float SUN_HOT_RAD = .75f * SolarSystemGenerator.SUN_RADIUS; public static final float GRAV_CONST = 2000; private static final float SUN_DMG = 4f; private final TextureAtlas.AtlasRegion gradatingTexture; @@ -49,12 +49,12 @@ public class SunSingleton { public void draw(SolGame game, GameDrawer drawer, Context context) { SolCam solCam = context.get(SolCam.class); Vector2 camPos = solCam.getPosition(); - SolSystem sys = game.getPlanetManager().getNearestSystem(camPos); + SolarSystem sys = game.getPlanetManager().getNearestSystem(camPos); Vector2 toCam = SolMath.getVec(camPos); toCam.sub(sys.getPosition()); float toCamLen = toCam.len(); - if (toCamLen < Const.SUN_RADIUS) { - float closeness = 1 - toCamLen / Const.SUN_RADIUS; + if (toCamLen < SolarSystemGenerator.SUN_RADIUS) { + float closeness = 1 - toCamLen / SolarSystemGenerator.SUN_RADIUS; gradatingTint.a = MathUtils.clamp(closeness * 4, (float) 0, (float) 1); fillTint.a = MathUtils.clamp((closeness - .25f) * 4, (float) 0, (float) 1); diff --git a/engine/src/main/java/org/destinationsol/game/planet/SystemBelt.java b/engine/src/main/java/org/destinationsol/game/planet/SystemBelt.java index 3cae2b4cc..dbd51daf5 100644 --- a/engine/src/main/java/org/destinationsol/game/planet/SystemBelt.java +++ b/engine/src/main/java/org/destinationsol/game/planet/SystemBelt.java @@ -21,15 +21,17 @@ public class SystemBelt { private final Float halfWidth; private final float radius; - private final SolSystem system; - private final SysConfig config; + private final Vector2 solarSystemPosition = new Vector2(); + private final BeltConfig config; private final float damagePerSecond; + private final float asteroidFrequency; - SystemBelt(Float halfWidth, float radius, SolSystem s, SysConfig config) { + public SystemBelt(Float halfWidth, float radius, Vector2 solarSystemPosition, BeltConfig config, float asteroidFrequency) { this.halfWidth = halfWidth; this.radius = radius; - system = s; + this.solarSystemPosition.set(solarSystemPosition); this.config = config; + this.asteroidFrequency = asteroidFrequency; damagePerSecond = HardnessCalc.getBeltDps(config); } @@ -42,15 +44,19 @@ public Float getHalfWidth() { } public boolean contains(Vector2 position) { - float toCenter = system.getPosition().dst(position); + float toCenter = solarSystemPosition.dst(position); return radius - halfWidth < toCenter && toCenter < radius + halfWidth; } - public SysConfig getConfig() { + public BeltConfig getConfig() { return config; } public float getDps() { return damagePerSecond; } + + public float getAsteroidFrequency() { + return asteroidFrequency; + } } diff --git a/engine/src/main/java/org/destinationsol/game/planet/SystemsBuilder.java b/engine/src/main/java/org/destinationsol/game/planet/SystemsBuilder.java index 10f30c689..8e3a7a9b0 100644 --- a/engine/src/main/java/org/destinationsol/game/planet/SystemsBuilder.java +++ b/engine/src/main/java/org/destinationsol/game/planet/SystemsBuilder.java @@ -23,7 +23,9 @@ import org.destinationsol.game.SolNames; import org.destinationsol.game.maze.Maze; import org.destinationsol.game.maze.MazeConfig; -import org.destinationsol.game.maze.MazeConfigs; +import org.destinationsol.game.maze.MazeConfigManager; +import org.destinationsol.world.generators.FeatureGenerator; +import org.destinationsol.world.generators.SolarSystemGenerator; import java.util.ArrayList; import java.util.List; @@ -37,8 +39,8 @@ public class SystemsBuilder { private static final float MAZE_GAP = 10f; private static final float BELT_HALF_WIDTH = 20f; - public List build(List systems, List planets, ArrayList belts, PlanetConfigs planetConfigs, - MazeConfigs mazeConfigs, ArrayList mazes, SysConfigs sysConfigs, SolNames names, int systemCount) { + public List build(List systems, List planets, ArrayList belts, PlanetConfigManager planetConfigManager, + MazeConfigManager mazeConfigManager, ArrayList mazes, SolarSystemConfigManager solarSystemConfigManager, BeltConfigManager beltConfigManager, SolNames names, int systemCount) { int sysLeft = systemCount; int mazesLeft = systemCount * 2; @@ -51,11 +53,11 @@ public List build(List systems, List planets, Arra List ghs = generatePlanetGhs(); float sysRadius = calcSysRadius(ghs); Vector2 position = getBodyPos(systems, mazes, sysRadius); - SolSystem s = createSystem(ghs, position, planets, belts, planetConfigs, sysRadius, sysConfigs, names, systems.isEmpty()); + SolarSystem s = createSystem(ghs, position, planets, belts, planetConfigManager, sysRadius, solarSystemConfigManager, beltConfigManager , names, systems.isEmpty()); systems.add(s); sysLeft--; } else { - MazeConfig mc = SolRandom.seededRandomElement(mazeConfigs.configs); + MazeConfig mc = SolRandom.seededRandomElement(mazeConfigManager.configs); float mazeRadius = SolRandom.seededRandomFloat(.7f, 1) * MAX_MAZE_RADIUS; Vector2 position = getBodyPos(systems, mazes, mazeRadius + MAZE_GAP); Maze m = new Maze(mc, position, mazeRadius); @@ -85,9 +87,9 @@ private List generatePlanetGhs() { private float calcSysRadius(List ghs) { float r = 0; - r += Const.SUN_RADIUS; + r += SolarSystemGenerator.SUN_RADIUS; for (Float groundHeight : ghs) { - r += Const.PLANET_GAP; + r += FeatureGenerator.ORBITAL_FEATURE_BUFFER; if (groundHeight > 0) { r += Const.ATM_HEIGHT; r += groundHeight; @@ -97,12 +99,12 @@ private float calcSysRadius(List ghs) { r -= groundHeight; r -= groundHeight; } - r += Const.PLANET_GAP; + r += FeatureGenerator.ORBITAL_FEATURE_BUFFER; } return r; } - private Vector2 getBodyPos(List systems, ArrayList mazes, float bodyRadius) { + private Vector2 getBodyPos(List systems, ArrayList mazes, float bodyRadius) { Vector2 res = new Vector2(); float dist = 0; while (true) { @@ -110,7 +112,7 @@ private Vector2 getBodyPos(List systems, ArrayList mazes, float float angle = SolRandom.seededRandomFloat(180); SolMath.fromAl(res, angle, dist); boolean good = true; - for (SolSystem system : systems) { + for (SolarSystem system : systems) { if (system.getPosition().dst(res) < system.getRadius() + bodyRadius) { good = false; break; @@ -126,30 +128,33 @@ private Vector2 getBodyPos(List systems, ArrayList mazes, float return res; } } - dist += Const.SUN_RADIUS; + dist += SolarSystemGenerator.SUN_RADIUS; } } - private SolSystem createSystem(List groundHeights, Vector2 systemPosition, List planets, ArrayList belts, - PlanetConfigs planetConfigs, - float systemRadius, SysConfigs sysConfigs, SolNames names, boolean firstSys) { + private SolarSystem createSystem(List groundHeights, Vector2 systemPosition, List planets, ArrayList belts, + PlanetConfigManager planetConfigManager, + float systemRadius, SolarSystemConfigManager solarSystemConfigs, BeltConfigManager beltConfigs, + SolNames names, boolean firstSys) { + solarSystemConfigs.loadDefaultSolarSystemConfigs(); + beltConfigs.loadDefaultBeltConfigs(); boolean hard = !firstSys; String systemType = DebugOptions.FORCE_SYSTEM_TYPE; - SysConfig sysConfig; + SolarSystemConfig solarSystemConfig; if (systemType.isEmpty()) { - sysConfig = sysConfigs.getRandomCfg(hard); + solarSystemConfig = solarSystemConfigs.getRandomSolarSystemConfig(hard); } else { - sysConfig = sysConfigs.getConfig(systemType); + solarSystemConfig = solarSystemConfigs.getSolarSystemConfig(systemType); } String name = firstSys ? SolRandom.seededRandomElement(names.systems) : "Sol"; //hack - SolSystem system = new SolSystem(systemPosition, sysConfig, name, systemRadius); - float planetDist = Const.SUN_RADIUS; + SolarSystem system = new SolarSystem(systemPosition, solarSystemConfig, name, systemRadius); + float planetDist = SolarSystemGenerator.SUN_RADIUS; for (Float groundHeight : groundHeights) { float reserved; if (groundHeight > 0) { - reserved = Const.PLANET_GAP + Const.ATM_HEIGHT + groundHeight; + reserved = FeatureGenerator.ORBITAL_FEATURE_BUFFER + Const.ATM_HEIGHT + groundHeight; } else { - reserved = Const.PLANET_GAP - groundHeight; + reserved = FeatureGenerator.ORBITAL_FEATURE_BUFFER - groundHeight; } planetDist += reserved; if (groundHeight > 0) { @@ -157,18 +162,13 @@ private SolSystem createSystem(List groundHeights, Vector2 systemPosition PlanetConfig planetConfig; if (pt.isEmpty()) { boolean inner = planetDist < systemRadius / 2; - planetConfig = planetConfigs.getRandom(!inner && !hard, inner && hard); + planetConfig = planetConfigManager.getRandom(!inner && !hard, inner && hard); } else { - planetConfig = planetConfigs.getConfig(pt); + planetConfig = planetConfigManager.getConfig(pt); } Planet planet = createPlanet(planetDist, system, groundHeight, planetConfig, names); planets.add(planet); system.getPlanets().add(planet); - } else { - SysConfig beltConfig = sysConfigs.getRandomBelt(hard); - SystemBelt belt = new SystemBelt(-groundHeight, planetDist, system, beltConfig); - belts.add(belt); - system.addBelt(belt); } planetDist += reserved; } @@ -178,11 +178,11 @@ private SolSystem createSystem(List groundHeights, Vector2 systemPosition return system; } - private Planet createPlanet(float planetDist, SolSystem s, float groundHeight, PlanetConfig planetConfig, + private Planet createPlanet(float planetDist, SolarSystem s, float groundHeight, PlanetConfig planetConfig, SolNames names) { float toSysRotationSpeed = SolMath.arcToAngle(PLANET_SPD, planetDist) * SolMath.toInt(SolRandom.seededTest(.5f)); float rotationSpeed = SolMath.arcToAngle(GROUND_SPD, groundHeight) * SolMath.toInt(SolRandom.seededTest(.5f)); String name = SolRandom.seededRandomElement(names.planets.get(planetConfig.moduleName)); - return new Planet(s, SolRandom.seededRandomFloat(180), planetDist, SolRandom.seededRandomFloat(180), toSysRotationSpeed, rotationSpeed, groundHeight, false, planetConfig, name); + return new Planet(s.getPosition(), SolRandom.seededRandomFloat(180), planetDist, SolRandom.seededRandomFloat(180), toSysRotationSpeed, rotationSpeed, groundHeight, false, planetConfig, name); } } diff --git a/engine/src/main/java/org/destinationsol/game/screens/BorderDrawer.java b/engine/src/main/java/org/destinationsol/game/screens/BorderDrawer.java index d6bb8c3cb..b0e714d0a 100644 --- a/engine/src/main/java/org/destinationsol/game/screens/BorderDrawer.java +++ b/engine/src/main/java/org/destinationsol/game/screens/BorderDrawer.java @@ -35,7 +35,7 @@ import org.destinationsol.game.context.Context; import org.destinationsol.game.planet.Planet; import org.destinationsol.game.planet.PlanetManager; -import org.destinationsol.game.planet.SolSystem; +import org.destinationsol.game.planet.SolarSystem; import org.destinationsol.game.planet.SunSingleton; import org.destinationsol.game.ship.FarShip; import org.destinationsol.game.ship.SolShip; @@ -206,7 +206,7 @@ private void drawPlanetProximityIndicators(UiDrawer drawer, SolGame game, SolCam float objRad = planet.getFullHeight(); apply0(camPosition, camAngle, objPos, objRad); } - SolSystem sys = planetManager.getNearestSystem(camPosition); + SolarSystem sys = planetManager.getNearestSystem(camPosition); apply0(camPosition, camAngle, sys.getPosition(), SunSingleton.SUN_HOT_RAD); for (PlanetProximityIndicator planetProximityIndicator : planetProximityIndicators) { planetProximityIndicator.draw(drawer); diff --git a/engine/src/main/java/org/destinationsol/game/screens/GameScreens.java b/engine/src/main/java/org/destinationsol/game/screens/GameScreens.java index 27c3069da..48989610a 100644 --- a/engine/src/main/java/org/destinationsol/game/screens/GameScreens.java +++ b/engine/src/main/java/org/destinationsol/game/screens/GameScreens.java @@ -43,4 +43,9 @@ public GameScreens(SolApplication cmp, Context context) { consoleScreen = new ConsoleScreen(context); } + // This was added for PlayerCreatorTest.java (used in PlayerCreator) + // so that it can successfully mock the returned result. + public MainGameScreen getMainGameScreen() { + return mainGameScreen; + } } diff --git a/engine/src/main/java/org/destinationsol/game/screens/MainGameScreen.java b/engine/src/main/java/org/destinationsol/game/screens/MainGameScreen.java index d4eba0edb..258613675 100644 --- a/engine/src/main/java/org/destinationsol/game/screens/MainGameScreen.java +++ b/engine/src/main/java/org/destinationsol/game/screens/MainGameScreen.java @@ -15,7 +15,6 @@ */ package org.destinationsol.game.screens; -import com.badlogic.gdx.Input; import com.badlogic.gdx.graphics.Color; import com.badlogic.gdx.graphics.g2d.TextureAtlas; import com.badlogic.gdx.math.MathUtils; @@ -50,6 +49,7 @@ import org.destinationsol.ui.SolUiScreen; import org.destinationsol.ui.UiDrawer; import org.destinationsol.ui.nui.screens.ConsoleScreen; +import org.destinationsol.ui.nui.screens.UIShipControlsScreen; import org.terasology.gestalt.assets.ResourceUrn; import org.terasology.nui.asset.UIElement; @@ -68,16 +68,9 @@ public class MainGameScreen extends SolUiBaseScreen { private static final float HELPER_ROW_2 = HELPER_ROW_1 - .5f * CELL_SZ; private static final float HELPER_ROW_3 = HELPER_ROW_2 - .5f * CELL_SZ; - public final ShipUiControl shipControl; - public final SolUiControl mapControl; - public final SolUiControl inventoryControl; - public final SolUiControl talkControl; - private final SolUiControl mercControl; + private final ShipUiControl shipControl; private final SolUiControl freeCamControl; - private final SolUiControl menuControl; private final SolUiControl pauseControl; - private final SolUiControl consoleControlGrave; - private final SolUiControl consoleControlF1; private final CameraKeyboardControl cameraControl; private final ZoneNameAnnouncer zoneNameAnnouncer; @@ -100,7 +93,6 @@ public class MainGameScreen extends SolUiBaseScreen { private final TextPlace myMoneyExcessTp; private final SolApplication solApplication; private final Context context; - private final ConsoleScreen consoleScreen; private List gameOverlayScreens = new ArrayList<>(); private List warnDrawers = new ArrayList<>(); @@ -114,7 +106,11 @@ public class MainGameScreen extends SolUiBaseScreen { switch (gameOptions.controlType) { case KEYBOARD: - shipControl = new ShipKbControl(solApplication, controls); + UIShipControlsScreen shipControlsScreen = + (UIShipControlsScreen) Assets.getAssetHelper().get( + new ResourceUrn("engine:uiShipControlsScreen"), UIElement.class).get().getRootWidget(); + solApplication.getNuiManager().pushScreen(shipControlsScreen); + shipControl = shipControlsScreen; break; case MOUSE: shipControl = new ShipMouseControl(); @@ -130,26 +126,6 @@ public class MainGameScreen extends SolUiBaseScreen { boolean mobile = solApplication.isMobile(); float lastCol = displayDimensions.getRatio() - MainGameScreen.CELL_SZ; - Rectangle menuArea = mobile ? btn(0, HELPER_ROW_2, true) : rightPaneLayout.buttonRect(0); - menuControl = new SolUiControl(menuArea, true, gameOptions.getKeyMenu()); - menuControl.setDisplayName("Menu"); - controls.add(menuControl); - Rectangle mapArea = mobile ? btn(0, HELPER_ROW_1, true) : rightPaneLayout.buttonRect(1); - mapControl = new SolUiControl(mapArea, true, gameOptions.getKeyMap()); - mapControl.setDisplayName("Map"); - controls.add(mapControl); - Rectangle invArea = mobile ? btn(lastCol, HELPER_ROW_1, true) : rightPaneLayout.buttonRect(2); - inventoryControl = new SolUiControl(invArea, true, gameOptions.getKeyInventory()); - inventoryControl.setDisplayName("Items"); - controls.add(inventoryControl); - Rectangle talkArea = mobile ? btn(lastCol, HELPER_ROW_2, true) : rightPaneLayout.buttonRect(3); - talkControl = new SolUiControl(talkArea, true, gameOptions.getKeyTalk()); - talkControl.setDisplayName("Talk"); - controls.add(talkControl); - Rectangle mercArea = mobile ? btn(lastCol, HELPER_ROW_3, true) : rightPaneLayout.buttonRect(4); - mercControl = new SolUiControl(mercArea, true, gameOptions.getKeyMercenaryInteraction()); - mercControl.setDisplayName("Mercs"); - controls.add(mercControl); // No button, since on mobile, it should be ideally controlled straightly by dragging. freeCamControl = new SolUiControl(null, false, gameOptions.getKeyFreeCameraMovement()); controls.add(freeCamControl); @@ -157,11 +133,6 @@ public class MainGameScreen extends SolUiBaseScreen { controls.add(pauseControl); cameraControl = new CameraKeyboardControl(gameOptions, controls); - consoleControlGrave = new SolUiControl(null, true, Input.Keys.GRAVE); - consoleControlF1 = new SolUiControl(null, true, Input.Keys.F1); - controls.add(consoleControlGrave); - controls.add(consoleControlF1); - // possible warning messages in order of importance, so earlier one will be drawn on the center warnDrawers.add(new SunWarnDrawer()); warnDrawers.add(new DmgWarnDrawer()); @@ -180,8 +151,6 @@ public class MainGameScreen extends SolUiBaseScreen { compassTexture = Assets.getAtlasRegion("engine:uiCompass"); myCompassTint = SolColor.col(1, 0); - consoleScreen = (ConsoleScreen) Assets.getAssetHelper().get(new ResourceUrn("engine:console"), UIElement.class).get().getRootWidget(); - myLifeTp = new TextPlace(SolColor.W50); myRepairsExcessTp = new TextPlace(SolColor.WHITE); myShieldLifeTp = new TextPlace(SolColor.W50); @@ -247,79 +216,20 @@ public void updateCustom(SolApplication solApplication, SolInputManager.InputPoi zoneNameAnnouncer.update(game, context); - if (menuControl.isJustOff()) { - inputMan.setScreen(solApplication, screens.menuScreen); - } boolean controlsEnabled = inputMan.getTopScreen() == this; shipControl.update(solApplication, controlsEnabled); - if (mapControl.isJustOff()) { - inputMan.setScreen(solApplication, screens.mapScreen); - } - - inventoryControl.setEnabled(hero.isNonTranscendent()); - if (hero.isNonTranscendent() && !inputMan.isScreenOn(screens.inventoryScreen)) { - if (hero.getItemContainer().hasNew()) { - inventoryControl.enableWarn(); - } - } - if (inventoryControl.isJustOff()) { - InventoryScreen is = screens.inventoryScreen; - boolean isOn = inputMan.isScreenOn(is); - inputMan.setScreen(solApplication, screens.mainGameScreen); - if (!isOn) { - is.showInventory.setTarget(hero.getShip()); - is.setOperations(is.showInventory); - inputMan.addScreen(solApplication, is); - } - } - - mercControl.setEnabled(hero.isNonTranscendent()); - if (hero.isNonTranscendent() && !inputMan.isScreenOn(screens.inventoryScreen)) { - if (hero.getMercs().hasNew()) { - mercControl.enableWarn(); - } - } - if (mercControl.isJustOff()) { - InventoryScreen is = screens.inventoryScreen; - boolean isOn = inputMan.isScreenOn(is); - inputMan.setScreen(solApplication, screens.mainGameScreen); - if (!isOn) { - is.setOperations(is.chooseMercenaryScreen); - inputMan.addScreen(solApplication, is); - - game.getHero().getMercs().markAllAsSeen(); - } - } - SolCam.DIRECT_CAM_CONTROL = freeCamControl.isOn(); - updateTalk(game); - - if (solApplication.getNuiManager().hasScreen(consoleScreen)) { + if (solApplication.getNuiManager().hasScreenOfType(ConsoleScreen.class)) { controls.forEach(x -> x.setEnabled(false)); - consoleControlGrave.setEnabled(true); - consoleControlF1.setEnabled(true); - } - - if (pauseControl.isJustOff()) { - game.setPaused(!game.isPaused()); - } - - if (consoleScreen.isConsoleJustClosed()) { + } else if (!inputMan.isScreenOn(screens.menuScreen)) { game.setPaused(false); controls.forEach(x -> x.setEnabled(true)); - consoleControlGrave.setEnabled(true); - consoleControlF1.setEnabled(true); } - if (consoleControlGrave.isJustOff() || consoleControlF1.isJustOff()) { - if (solApplication.getNuiManager().hasScreen(consoleScreen)) { - solApplication.getNuiManager().removeScreen(consoleScreen); - } else { - solApplication.getNuiManager().pushScreen(consoleScreen); - game.setPaused(true); - } + if (pauseControl.isJustOff()) { + game.setPaused(!game.isPaused()); } for (SolUiScreen screen : gameOverlayScreens) { @@ -327,50 +237,6 @@ public void updateCustom(SolApplication solApplication, SolInputManager.InputPoi } } - private void updateTalk(SolGame game) { - Hero hero = game.getHero(); - if (hero.isTranscendent()) { - talkControl.setEnabled(false); - return; - } - FactionManager factionManager = game.getFactionMan(); - - SolShip target = null; - float minDist = TalkScreen.MAX_TALK_DIST; - float har = hero.getHull().config.getApproxRadius(); - List objs = game.getObjectManager().getObjects(); - for (SolObject o : objs) { - if (!(o instanceof SolShip)) { - continue; - } - SolShip ship = (SolShip) o; - if (factionManager.areEnemies(hero.getShip(), ship)) { - continue; - } - if (ship.getTradeContainer() == null) { - continue; - } - float dst = ship.getPosition().dst(hero.getPosition()); - float ar = ship.getHull().config.getApproxRadius(); - if (minDist < dst - har - ar) { - continue; - } - target = ship; - minDist = dst; - } - talkControl.setEnabled(target != null); - if (talkControl.isJustOff()) { - TalkScreen talkScreen = game.getScreens().talkScreen; - SolInputManager inputMan = solApplication.getInputManager(); - boolean isOn = inputMan.isScreenOn(talkScreen); - inputMan.setScreen(solApplication, this); - if (!isOn) { - talkScreen.setTarget(target); - inputMan.addScreen(solApplication, talkScreen); - } - } - } - private boolean drawGunStat(UiDrawer uiDrawer, Hero hero, boolean secondary, float col0, float col1, float col2, float y) { Gun g = hero.getHull().getGun(secondary); @@ -548,32 +414,8 @@ public void blurCustom(SolApplication solApplication) { } } - public boolean isLeft() { - return shipControl.isLeft(); - } - - public boolean isRight() { - return shipControl.isRight(); - } - - public boolean isUp() { - return shipControl.isUp(); - } - - public boolean isDown() { - return shipControl.isDown(); - } - - public boolean isShoot() { - return shipControl.isShoot(); - } - - public boolean isShoot2() { - return shipControl.isShoot2(); - } - - public boolean isAbility() { - return shipControl.isAbility(); + public ShipUiControl getShipControl() { + return shipControl; } public boolean isCameraUp() { diff --git a/engine/src/main/java/org/destinationsol/game/screens/MapScreen.java b/engine/src/main/java/org/destinationsol/game/screens/MapScreen.java index 3c1857bc5..eb59ca2de 100644 --- a/engine/src/main/java/org/destinationsol/game/screens/MapScreen.java +++ b/engine/src/main/java/org/destinationsol/game/screens/MapScreen.java @@ -101,7 +101,7 @@ public void updateCustom(SolApplication solApplication, SolInputManager.InputPoi float mapZoom = mapDrawer.getZoom(); zoomInControl.setEnabled(mapZoom != MapDrawer.MIN_ZOOM); zoomOutControl.setEnabled(mapZoom != MapDrawer.MAX_ZOOM); - ShipUiControl shipControl = game.getScreens().mainGameScreen.shipControl; + ShipUiControl shipControl = game.getScreens().mainGameScreen.getShipControl(); if (shipControl instanceof ShipMouseControl) { shipControl.update(solApplication, true); } diff --git a/engine/src/main/java/org/destinationsol/game/screens/ShipMixedControl.java b/engine/src/main/java/org/destinationsol/game/screens/ShipMixedControl.java index f41cab456..57c567b65 100644 --- a/engine/src/main/java/org/destinationsol/game/screens/ShipMixedControl.java +++ b/engine/src/main/java/org/destinationsol/game/screens/ShipMixedControl.java @@ -85,7 +85,7 @@ public void update(SolApplication solApplication, boolean enabled) { turnLeft = true; } } - if (!im.isMouseOnUi()) { + if (!im.isMouseOnUi() && !solApplication.getNuiManager().isMouseOnUi()) { if (Gdx.input.isButtonPressed(Input.Buttons.LEFT)) { shootCtrl.maybeFlashPressed(gameOptions.getKeyShoot()); } diff --git a/engine/src/main/java/org/destinationsol/game/screens/SunWarnDrawer.java b/engine/src/main/java/org/destinationsol/game/screens/SunWarnDrawer.java index 308238784..b2530cf11 100644 --- a/engine/src/main/java/org/destinationsol/game/screens/SunWarnDrawer.java +++ b/engine/src/main/java/org/destinationsol/game/screens/SunWarnDrawer.java @@ -16,9 +16,9 @@ package org.destinationsol.game.screens; import com.badlogic.gdx.math.Vector2; -import org.destinationsol.Const; import org.destinationsol.game.Hero; import org.destinationsol.game.SolGame; +import org.destinationsol.world.generators.SolarSystemGenerator; public class SunWarnDrawer extends WarnDrawer { @@ -33,6 +33,6 @@ public boolean shouldWarn(SolGame game) { } Vector2 position = hero.getPosition(); float toCenter = game.getPlanetManager().getNearestSystem(position).getPosition().dst(position); - return toCenter < Const.SUN_RADIUS; + return toCenter < SolarSystemGenerator.SUN_RADIUS; } } diff --git a/engine/src/main/java/org/destinationsol/game/screens/TalkScreen.java b/engine/src/main/java/org/destinationsol/game/screens/TalkScreen.java index 156c0b823..5aa7e8b9b 100644 --- a/engine/src/main/java/org/destinationsol/game/screens/TalkScreen.java +++ b/engine/src/main/java/org/destinationsol/game/screens/TalkScreen.java @@ -30,7 +30,7 @@ import org.destinationsol.ui.UiDrawer; public class TalkScreen extends SolUiBaseScreen { - static final float MAX_TALK_DIST = 1f; + public static final float MAX_TALK_DIST = 1f; public final SolUiControl buyControl; public final SolUiControl closeControl; diff --git a/engine/src/main/java/org/destinationsol/game/screens/ZoneNameAnnouncer.java b/engine/src/main/java/org/destinationsol/game/screens/ZoneNameAnnouncer.java index a2602a317..f4c57a33e 100644 --- a/engine/src/main/java/org/destinationsol/game/screens/ZoneNameAnnouncer.java +++ b/engine/src/main/java/org/destinationsol/game/screens/ZoneNameAnnouncer.java @@ -24,7 +24,7 @@ import org.destinationsol.game.context.Context; import org.destinationsol.game.planet.Planet; import org.destinationsol.game.planet.PlanetManager; -import org.destinationsol.game.planet.SolSystem; +import org.destinationsol.game.planet.SolarSystem; import org.destinationsol.ui.DisplayDimensions; import org.destinationsol.ui.FontSize; import org.destinationsol.ui.UiDrawer; @@ -51,7 +51,7 @@ public void update(SolGame game, Context context) { zone = planet.getName(); pref = "Planet"; } else { - SolSystem system = planetManager.getNearestSystem(camPosition); + SolarSystem system = planetManager.getNearestSystem(camPosition); if (system.getPosition().dst(camPosition) < system.getRadius()) { zone = system.getName(); pref = "System"; diff --git a/engine/src/main/java/org/destinationsol/game/ship/SolShip.java b/engine/src/main/java/org/destinationsol/game/ship/SolShip.java index 4de2098d1..0af4a0e68 100644 --- a/engine/src/main/java/org/destinationsol/game/ship/SolShip.java +++ b/engine/src/main/java/org/destinationsol/game/ship/SolShip.java @@ -354,7 +354,7 @@ public boolean shouldBeRemoved(SolGame game) { @Override public void onRemove(SolGame game) { if (myHull.life <= 0) { - game.getRubbleBuilder().buildExplosionShards(game, myHull.getPosition(), myHull.getVelocity(), myHull.config.getSize()); + game.getRubbleBuilder().buildExplosionRubbles(game, myHull.getPosition(), myHull.getVelocity(), myHull.config.getSize()); throwAllLoot(game); } myHull.onRemove(game); diff --git a/engine/src/main/java/org/destinationsol/menu/InputMapControllerScreen.java b/engine/src/main/java/org/destinationsol/menu/InputMapControllerScreen.java index f9128a71a..45004bf82 100644 --- a/engine/src/main/java/org/destinationsol/menu/InputMapControllerScreen.java +++ b/engine/src/main/java/org/destinationsol/menu/InputMapControllerScreen.java @@ -19,6 +19,7 @@ import com.badlogic.gdx.Gdx; import com.badlogic.gdx.Input; import com.badlogic.gdx.InputAdapter; +import com.badlogic.gdx.InputProcessor; import com.badlogic.gdx.controllers.Controller; import com.badlogic.gdx.controllers.ControllerListener; import com.badlogic.gdx.controllers.Controllers; @@ -39,6 +40,7 @@ public class InputMapControllerScreen extends InputMapOperations { private List itemsList = new ArrayList<>(); private int selectedIndex; private int controllerItems; + private InputProcessor inputProcessor; private InputConfigItem InitItem(int axis, int button, String displayName) { String inputName; @@ -237,11 +239,12 @@ public void setEnterNewKey(boolean newKey) { // Cancel the key input if (!isEnterNewKey) { - Gdx.input.setInputProcessor(null); + Gdx.input.setInputProcessor(inputProcessor); Controllers.clearListeners(); } else { // Capture the new key input // Keyboard items + inputProcessor = Gdx.input.getInputProcessor(); Gdx.input.setInputProcessor(new InputAdapter() { @Override public boolean keyUp(int keycode) { @@ -257,7 +260,7 @@ public boolean keyUp(int keycode) { itemsList.set(selectedIndex, item); } - Gdx.input.setInputProcessor(null); + Gdx.input.setInputProcessor(inputProcessor); Controllers.clearListeners(); isEnterNewKey = false; @@ -299,7 +302,7 @@ public boolean buttonUp(Controller controller, int buttonIndex) { itemsList.set(selectedIndex, item); } - Gdx.input.setInputProcessor(null); + Gdx.input.setInputProcessor(inputProcessor); Controllers.clearListeners(); isEnterNewKey = false; @@ -319,7 +322,7 @@ public boolean axisMoved(Controller controller, int axisIndex, float value) { itemsList.set(selectedIndex, item); } - Gdx.input.setInputProcessor(null); + Gdx.input.setInputProcessor(inputProcessor); Controllers.clearListeners(); isEnterNewKey = false; diff --git a/engine/src/main/java/org/destinationsol/menu/InputMapKeyboardScreen.java b/engine/src/main/java/org/destinationsol/menu/InputMapKeyboardScreen.java index b2b84ee21..2f048edc6 100644 --- a/engine/src/main/java/org/destinationsol/menu/InputMapKeyboardScreen.java +++ b/engine/src/main/java/org/destinationsol/menu/InputMapKeyboardScreen.java @@ -19,6 +19,7 @@ import com.badlogic.gdx.Gdx; import com.badlogic.gdx.Input; import com.badlogic.gdx.InputAdapter; +import com.badlogic.gdx.InputProcessor; import org.destinationsol.GameOptions; import org.destinationsol.SolApplication; import org.destinationsol.ui.SolInputManager; @@ -33,6 +34,7 @@ public class InputMapKeyboardScreen extends InputMapOperations { private boolean isEnterNewKey; private List itemsList = new ArrayList<>(); private int selectedIndex; + private InputProcessor inputProcessor; private void InitialiseList(GameOptions gameOptions) { itemsList.clear(); @@ -214,8 +216,9 @@ public void setEnterNewKey(boolean newKey) { // Cancel the key input if (!isEnterNewKey) { - Gdx.input.setInputProcessor(null); + Gdx.input.setInputProcessor(inputProcessor); } else { + inputProcessor = Gdx.input.getInputProcessor(); // Capture the new key input Gdx.input.setInputProcessor(new InputAdapter() { @Override @@ -229,7 +232,7 @@ public boolean keyUp(int keycode) { InputConfigItem item = itemsList.get(selectedIndex); item.setInputKey(Input.Keys.toString(keycode)); itemsList.set(selectedIndex, item); - Gdx.input.setInputProcessor(null); + Gdx.input.setInputProcessor(inputProcessor); isEnterNewKey = false; return true; // return true to indicate the event was handled diff --git a/engine/src/main/java/org/destinationsol/menu/InputMapMixedScreen.java b/engine/src/main/java/org/destinationsol/menu/InputMapMixedScreen.java index 028ea37ab..73a528dc2 100644 --- a/engine/src/main/java/org/destinationsol/menu/InputMapMixedScreen.java +++ b/engine/src/main/java/org/destinationsol/menu/InputMapMixedScreen.java @@ -19,6 +19,7 @@ import com.badlogic.gdx.Gdx; import com.badlogic.gdx.Input; import com.badlogic.gdx.InputAdapter; +import com.badlogic.gdx.InputProcessor; import org.destinationsol.GameOptions; import org.destinationsol.SolApplication; import org.destinationsol.ui.SolInputManager; @@ -32,6 +33,7 @@ public class InputMapMixedScreen extends InputMapOperations { private List itemsList = new ArrayList<>(); private boolean isEnterNewKey; private int selectedIndex; + private InputProcessor inputProcessor; private void InitialiseList(GameOptions gameOptions) { itemsList.clear(); @@ -186,8 +188,9 @@ public void setEnterNewKey(boolean newKey) { // Cancel the key input if (!isEnterNewKey) { - Gdx.input.setInputProcessor(null); + Gdx.input.setInputProcessor(inputProcessor); } else { + inputProcessor = Gdx.input.getInputProcessor(); // Capture the new key input Gdx.input.setInputProcessor(new InputAdapter() { @Override @@ -201,7 +204,7 @@ public boolean keyUp(int keycode) { InputConfigItem item = itemsList.get(selectedIndex); item.setInputKey(Input.Keys.toString(keycode)); itemsList.set(selectedIndex, item); - Gdx.input.setInputProcessor(null); + Gdx.input.setInputProcessor(inputProcessor); isEnterNewKey = false; return true; // return true to indicate the event was handled diff --git a/engine/src/main/java/org/destinationsol/menu/MenuScreens.java b/engine/src/main/java/org/destinationsol/menu/MenuScreens.java index c4e213682..6c50db735 100644 --- a/engine/src/main/java/org/destinationsol/menu/MenuScreens.java +++ b/engine/src/main/java/org/destinationsol/menu/MenuScreens.java @@ -33,7 +33,7 @@ public MenuScreens(SolLayouts layouts, boolean mobile, GameOptions gameOptions) main = new MainMenuScreen(mobile, gameOptions); options = new OptionsScreen(mobile, menuLayout, gameOptions); inputMapScreen = new InputMapScreen(gameOptions); - resolutionScreen = new ResolutionScreen(menuLayout, gameOptions); + resolutionScreen = new ResolutionScreen(mobile, menuLayout, gameOptions); credits = new CreditsScreen(gameOptions); loading = new LoadingScreen(); newGame = new NewGameScreen(menuLayout, gameOptions); diff --git a/engine/src/main/java/org/destinationsol/menu/OptionsScreen.java b/engine/src/main/java/org/destinationsol/menu/OptionsScreen.java index b65dfd138..e8bf0d2a4 100644 --- a/engine/src/main/java/org/destinationsol/menu/OptionsScreen.java +++ b/engine/src/main/java/org/destinationsol/menu/OptionsScreen.java @@ -43,7 +43,7 @@ public class OptionsScreen extends SolUiBaseScreen { OptionsScreen(boolean mobile, MenuLayout menuLayout, GameOptions gameOptions) { displayDimensions = SolApplication.displayDimensions; - int rowNo = mobile ? 0 : -3; + int rowNo = mobile ? -1 : -3; musicVolumeControl = new SolUiControl(menuLayout.buttonRect(-1, rowNo++), true); musicVolumeControl.setDisplayName("Music Volume"); controls.add(musicVolumeControl); @@ -52,8 +52,8 @@ public class OptionsScreen extends SolUiBaseScreen { soundVolumeControl.setDisplayName("Sound Volume"); controls.add(soundVolumeControl); - // Mobile platforms always run in fullscreen, so the resolution cannot be changed - resolutionControl = new SolUiControl(mobile ? null : menuLayout.buttonRect(-1, rowNo++), true); + // Mobile platforms always run in fullscreen but the NUI UI scale can be changed + resolutionControl = new SolUiControl(menuLayout.buttonRect(-1, rowNo++), true); resolutionControl.setDisplayName("Resolution"); controls.add(resolutionControl); diff --git a/engine/src/main/java/org/destinationsol/menu/ResolutionScreen.java b/engine/src/main/java/org/destinationsol/menu/ResolutionScreen.java index 70fe9bef8..b9f24d5ad 100644 --- a/engine/src/main/java/org/destinationsol/menu/ResolutionScreen.java +++ b/engine/src/main/java/org/destinationsol/menu/ResolutionScreen.java @@ -43,22 +43,23 @@ public class ResolutionScreen extends SolUiBaseScreen { private final SolUiControl fullscreenControl; private final SolUiControl nuiUIScaleControl; - ResolutionScreen(MenuLayout menuLayout, GameOptions gameOptions) { + ResolutionScreen(boolean mobile, MenuLayout menuLayout, GameOptions gameOptions) { displayDimensions = SolApplication.displayDimensions; + int rowNo = mobile ? 0 : 1; - resolutionControl = new SolUiControl(menuLayout.buttonRect(-1, 1), true); + resolutionControl = new SolUiControl(mobile ? null : menuLayout.buttonRect(-1, rowNo++), true); resolutionControl.setDisplayName("Resolution"); controls.add(resolutionControl); - fullscreenControl = new SolUiControl(menuLayout.buttonRect(-1, 2), true); + fullscreenControl = new SolUiControl(mobile ? null : menuLayout.buttonRect(-1, rowNo++), true); fullscreenControl.setDisplayName("Fullscreen"); controls.add(fullscreenControl); - nuiUIScaleControl = new SolUiControl(menuLayout.buttonRect(-1, 3), true); + nuiUIScaleControl = new SolUiControl(menuLayout.buttonRect(-1, rowNo++), true); nuiUIScaleControl.setDisplayName("NUI UI scale"); controls.add(nuiUIScaleControl); - closeControl = new SolUiControl(menuLayout.buttonRect(-1, 4), true, gameOptions.getKeyEscape()); + closeControl = new SolUiControl(menuLayout.buttonRect(-1, rowNo++), true, gameOptions.getKeyEscape()); closeControl.setDisplayName("Back"); controls.add(closeControl); @@ -71,26 +72,30 @@ public void updateCustom(SolApplication solApplication, SolInputManager.InputPoi GameOptions options = solApplication.getOptions(); if (closeControl.isJustOff()) { - if (options.fullscreen) { - Graphics.DisplayMode mode = null; - //HACK: Gdx.graphics.getDisplayMode() always returns the native desktop resolution. - //See https://github.com/libgdx/libgdx/blob/5398d46aa082489052fccfaaaff7440e137ba5dc/backends/gdx-backend-lwjgl/src/com/badlogic/gdx/backends/lwjgl/LwjglGraphics.java#L555 - //and http://legacy.lwjgl.org/javadoc/org/lwjgl/opengl/Display.html#getDisplayMode() - //for more details. - for (Graphics.DisplayMode displayMode : Gdx.graphics.getDisplayModes()) { - if (displayMode.width == options.x && displayMode.height == options.y) { - mode = displayMode; + // Mobile only ever runs at one resolution: the entire screen. + // Changing the screen resolution does not work. + if (!solApplication.isMobile()) { + if (options.fullscreen) { + Graphics.DisplayMode mode = null; + //HACK: Gdx.graphics.getDisplayMode() always returns the native desktop resolution. + //See https://github.com/libgdx/libgdx/blob/5398d46aa082489052fccfaaaff7440e137ba5dc/backends/gdx-backend-lwjgl/src/com/badlogic/gdx/backends/lwjgl/LwjglGraphics.java#L555 + //and http://legacy.lwjgl.org/javadoc/org/lwjgl/opengl/Display.html#getDisplayMode() + //for more details. + for (Graphics.DisplayMode displayMode : Gdx.graphics.getDisplayModes()) { + if (displayMode.width == options.x && displayMode.height == options.y) { + mode = displayMode; + } + } + if (mode != null) { + Gdx.graphics.setFullscreenMode(mode); + solApplication.getNuiManager().resize(mode.width, mode.height); + } else { + logger.warn("The resolution {}x{} is not supported in fullscreen mode!", options.x, options.y); } - } - if (mode != null) { - Gdx.graphics.setFullscreenMode(mode); - solApplication.getNuiManager().resize(mode.width, mode.height); } else { - logger.warn("The resolution {}x{} is not supported in fullscreen mode!", options.x, options.y); + Gdx.graphics.setWindowedMode(options.x, options.y); + solApplication.getNuiManager().resize(options.x, options.y); } - } else { - Gdx.graphics.setWindowedMode(options.x, options.y); - solApplication.getNuiManager().resize(options.x, options.y); } inputManager.setScreen(solApplication, solApplication.getMenuScreens().options); return; diff --git a/engine/src/main/java/org/destinationsol/rubble/components/RubbleMesh.java b/engine/src/main/java/org/destinationsol/rubble/components/RubbleMesh.java new file mode 100644 index 000000000..7c8bbd307 --- /dev/null +++ b/engine/src/main/java/org/destinationsol/rubble/components/RubbleMesh.java @@ -0,0 +1,26 @@ +/* + * Copyright 2020 The Terasology Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.destinationsol.rubble.components; + +import org.destinationsol.body.events.GenerateBodyEvent; +import org.destinationsol.rubble.systems.RubbleBodyCreationSystem; +import org.terasology.gestalt.entitysystem.component.EmptyComponent; + +/** + * This class directs the {@link GenerateBodyEvent} to the {@link RubbleBodyCreationSystem} + */ +public class RubbleMesh extends EmptyComponent { +} diff --git a/engine/src/main/java/org/destinationsol/rubble/systems/RubbleBodyCreationSystem.java b/engine/src/main/java/org/destinationsol/rubble/systems/RubbleBodyCreationSystem.java new file mode 100644 index 000000000..dce38591c --- /dev/null +++ b/engine/src/main/java/org/destinationsol/rubble/systems/RubbleBodyCreationSystem.java @@ -0,0 +1,112 @@ +/* + * Copyright 2020 The Terasology Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.destinationsol.rubble.systems; + +import com.badlogic.gdx.math.MathUtils; +import com.badlogic.gdx.math.Vector2; +import com.badlogic.gdx.physics.box2d.Body; +import com.badlogic.gdx.physics.box2d.BodyDef; +import com.badlogic.gdx.physics.box2d.FixtureDef; +import com.badlogic.gdx.physics.box2d.World; +import org.destinationsol.Const; +import org.destinationsol.asteroids.components.AsteroidMesh; +import org.destinationsol.body.events.BodyCreatedEvent; +import org.destinationsol.body.events.GenerateBodyEvent; +import org.destinationsol.common.In; +import org.destinationsol.entitysystem.EntitySystemManager; +import org.destinationsol.entitysystem.EventReceiver; +import org.destinationsol.game.CollisionMeshLoader; +import org.destinationsol.game.UpdateAwareSystem; +import org.destinationsol.location.components.Angle; +import org.destinationsol.location.components.Position; +import org.destinationsol.rendering.RenderableElement; +import org.destinationsol.rendering.components.Renderable; +import org.destinationsol.rubble.components.RubbleMesh; +import org.destinationsol.size.components.Size; +import org.terasology.gestalt.entitysystem.entity.EntityRef; +import org.terasology.gestalt.entitysystem.event.EventResult; +import org.terasology.gestalt.entitysystem.event.ReceiveEvent; + +import java.util.ArrayList; + +/** + * This system creates a {@link Body} for an entity with a {@link RubbleMesh} component. + */ +public class RubbleBodyCreationSystem implements EventReceiver { + + private static final float DENSITY = 3f; + + @In + private EntitySystemManager entitySystemManager; + + @In + private World world; + + private final CollisionMeshLoader collisionMeshLoader = new CollisionMeshLoader("engine:miscCollisionMeshes"); + + @ReceiveEvent(components = {RubbleMesh.class, Size.class, Position.class, Angle.class, Renderable.class}) + public EventResult onGenerateBody(GenerateBodyEvent event, EntityRef entity) { + + float size = entity.getComponent(Size.class).get().size; + Vector2 position = entity.getComponent(Position.class).get().position; + float angle = entity.getComponent(Angle.class).get().getAngle(); + ArrayList renderableElements = entity.getComponent(Renderable.class).get().elements; + + //This creates an entity with a generic Body. The fixtures, which provide the collision meshes, are attached later. + BodyDef bd = new BodyDef(); + bd.type = BodyDef.BodyType.DynamicBody; + bd.angle = angle * MathUtils.degRad; + bd.angularDamping = 0; + bd.position.set(position); + bd.linearDamping = 0; + Body body = world.createBody(bd); + + //This sets a reference to an entity in the Body, so that the entity can be retrieved from the body during collision handling. + body.setUserData(entity); + + //This attaches collision meshes to the Body of an entity, based on its graphics. + for (RenderableElement element : renderableElements) { + FixtureDef fixtureDef = new FixtureDef(); + fixtureDef.density = DENSITY; + fixtureDef.friction = Const.FRICTION; + collisionMeshLoader.attachFixture(body, element.texture.name, fixtureDef, size); + + calculateGraphicsOffset(element); + } + + entitySystemManager.sendEvent(new BodyCreatedEvent(body), entity); + + return EventResult.CONTINUE; + } + + /** + * This calculates the offset of the renderable element from "the origin" (as defined in the JSON that the + * CollisionMeshLoader reads from). + * The origin is where the center of the object should be, which is relevant for physics handling. The + * CollisionMeshLoader creates Fixtures (collision meshes) using that information, so the sprites need to be + * adjusted to overlay the mesh properly. + * LibGDX draws sprites from the bottom left corner. Since the position information is from the center, it + * needs to be adjusted to be at the bottom left of the sprite. To do so, (.5, .5) is subtracted from the origin. + * (The coordinates are scaled to range from zero to one, so (.5, .5) represents the center.) + * The originInformation is the information that was read from the JSON, which is used to calculate the graphics + * offset information. + */ + //TODO separate this method into a separate system once CollisionMeshLoader is modular + private void calculateGraphicsOffset(RenderableElement element) { + Vector2 originInformation = collisionMeshLoader.getOrigin(element.texture.name, 1); + element.graphicsOffset = new Vector2(originInformation.x - .5f, originInformation.y - .5f); + } +} diff --git a/engine/src/main/java/org/destinationsol/rubble/systems/RubbleCreationSystem.java b/engine/src/main/java/org/destinationsol/rubble/systems/RubbleCreationSystem.java index d57caab47..1d1802c22 100644 --- a/engine/src/main/java/org/destinationsol/rubble/systems/RubbleCreationSystem.java +++ b/engine/src/main/java/org/destinationsol/rubble/systems/RubbleCreationSystem.java @@ -15,16 +15,28 @@ */ package org.destinationsol.rubble.systems; +import com.badlogic.gdx.graphics.Color; import com.badlogic.gdx.math.Vector2; +import org.destinationsol.assets.Assets; +import org.destinationsol.body.components.BodyLinked; +import org.destinationsol.common.In; +import org.destinationsol.common.SolMath; +import org.destinationsol.common.SolRandom; +import org.destinationsol.entitysystem.EntitySystemManager; import org.destinationsol.entitysystem.EventReceiver; import org.destinationsol.game.Rubble; import org.destinationsol.game.RubbleBuilder; -import org.destinationsol.game.SolGame; +import org.destinationsol.game.drawables.DrawableLevel; +import org.destinationsol.health.components.Health; +import org.destinationsol.location.components.Angle; import org.destinationsol.location.components.Position; import org.destinationsol.location.components.Velocity; import org.destinationsol.removal.events.DeletionEvent; import org.destinationsol.removal.systems.DestructionSystem; +import org.destinationsol.rendering.RenderableElement; +import org.destinationsol.rendering.components.Renderable; import org.destinationsol.rubble.components.CreatesRubbleOnDestruction; +import org.destinationsol.rubble.components.RubbleMesh; import org.destinationsol.size.components.Size; import org.destinationsol.stasis.components.Stasis; import org.terasology.gestalt.entitysystem.entity.EntityRef; @@ -40,37 +52,105 @@ */ public class RubbleCreationSystem implements EventReceiver { - @Inject - RubbleBuilder rubbleBuilder; + public static final float SIZE_TO_RUBBLE_COUNT = 13f; + public static final float MIN_SCALE = .07f; + public static final float MAX_SCALE = .12f; + private static final float MAX_SPD = 40f; @Inject - SolGame solGame; + private RubbleBuilder rubbleBuilder; @Inject public RubbleCreationSystem() { } - //TODO once Shards are entities, this needs to be refactored to replace ShardBuilder + @In + private EntitySystemManager entitySystemManager; /** - * When an entity with a {@link CreatesRubbleOnDestruction} component is destroyed, this creates {@link Rubble}s where + * When an entity with a {@link CreatesRubbleOnDestruction} component is destroyed, this creates {@link Rubble} where * the entity was, unless the entity is in {@link Stasis}. */ @ReceiveEvent(components = {CreatesRubbleOnDestruction.class, Position.class, Size.class}) @Before(DestructionSystem.class) public EventResult onDeletion(DeletionEvent event, EntityRef entity) { if (!entity.hasComponent(Stasis.class)) { - Vector2 position = entity.getComponent(Position.class).get().position; - Vector2 velocity; + Velocity velocityComponent; + Angle angleComponent; + if (entity.hasComponent(Velocity.class)) { - velocity = entity.getComponent(Velocity.class).get().velocity; + velocityComponent = entity.getComponent(Velocity.class).get(); + } else { + velocityComponent = new Velocity(); + velocityComponent.velocity = new Vector2(); + } + + if (entity.hasComponent(Angle.class)) { + angleComponent = entity.getComponent(Angle.class).get(); } else { - velocity = new Vector2(); + angleComponent = new Angle(); + angleComponent.setAngle(0f); } - float size = entity.getComponent(Size.class).get().size; - rubbleBuilder.buildExplosionShards(solGame, position, velocity, size); + + buildRubblePieces(entity.getComponent(Position.class).get(), velocityComponent, angleComponent, entity.getComponent(Size.class).get()); } return EventResult.CONTINUE; } + + /** + * This method creates pieces of rubble using values from the object that they are being creating from. It + * initializes entities for each piece of rubble with the relevant component + * @param pos Position component of parent entity + * @param vel Velocity component of parent entity + * @param angle Angle component of parent entity + * @param size Size component of parent entity, used to determine amount of rubble to generate + */ + private void buildRubblePieces(Position pos, Velocity vel, Angle angle, Size size) { + int count = (int) (size.size * SIZE_TO_RUBBLE_COUNT); + Vector2 basePos = pos.position; + for (int i = 0; i < count; i++) { + + //Create graphics component + RenderableElement element = new RenderableElement(); + element.texture = SolRandom.randomElement(Assets.listTexturesMatching("engine:rubble.*")); + element.drawableLevel = DrawableLevel.PROJECTILES; + element.graphicsOffset = new Vector2(); + + float scale = SolRandom.randomFloat(MIN_SCALE, MAX_SCALE); + element.setSize(scale); + + element.relativePosition = new Vector2(); + element.tint = Color.WHITE; + Renderable graphicsComponent = new Renderable(); + graphicsComponent.elements.add(element); + + //Create position component + float velocityAngle = SolRandom.randomFloat(180); + Vector2 position = new Vector2(); + SolMath.fromAl(position, velocityAngle, SolRandom.randomFloat(size.size)); + position.add(basePos); + Position positionComponent = new Position(); + positionComponent.position = position; + + //Create health component + Health health = new Health(); + health.currentHealth = 1; + + //Create size component + Size sizeComponent = new Size(); + sizeComponent.size = scale; + + //Create velocity component + Velocity velocityComponent = new Velocity(); + Vector2 velocity = SolMath.fromAl(velocityAngle, SolRandom.randomFloat(MAX_SPD)); + velocity.add(vel.velocity); + velocityComponent.velocity = velocity; + + EntityRef entityRef = entitySystemManager.getEntityManager().createEntity(graphicsComponent, positionComponent, + velocityComponent, angle, sizeComponent, new RubbleMesh()); + SolMath.free(velocity); + entityRef.setComponent(new BodyLinked()); + } + } } diff --git a/engine/src/main/java/org/destinationsol/save/SaveData.java b/engine/src/main/java/org/destinationsol/save/SaveData.java index 3f7aef4b5..8669eeb70 100644 --- a/engine/src/main/java/org/destinationsol/save/SaveData.java +++ b/engine/src/main/java/org/destinationsol/save/SaveData.java @@ -18,14 +18,14 @@ import org.destinationsol.game.FarObject; import org.destinationsol.game.planet.Planet; -import org.destinationsol.game.planet.SolSystem; +import org.destinationsol.game.planet.SolarSystem; import java.util.ArrayList; import java.util.List; public class SaveData { public final List farObjects; - public final List systems; + public final List systems; public final List planets; public SaveData() { diff --git a/engine/src/main/java/org/destinationsol/ui/SolInputManager.java b/engine/src/main/java/org/destinationsol/ui/SolInputManager.java index e8109f2e1..dcd7c6eba 100644 --- a/engine/src/main/java/org/destinationsol/ui/SolInputManager.java +++ b/engine/src/main/java/org/destinationsol/ui/SolInputManager.java @@ -286,7 +286,7 @@ private void updateCursor(SolApplication solApplication) { if (game == null || mouseOnUi) { currCursor = uiCursor; } else { - currCursor = game.getScreens().mainGameScreen.shipControl.getInGameTex(); + currCursor = game.getScreens().mainGameScreen.getShipControl().getInGameTex(); if (currCursor == null) { currCursor = uiCursor; } diff --git a/engine/src/main/java/org/destinationsol/ui/TutorialManager.java b/engine/src/main/java/org/destinationsol/ui/TutorialManager.java index f4dad6f47..0ca3e9655 100644 --- a/engine/src/main/java/org/destinationsol/ui/TutorialManager.java +++ b/engine/src/main/java/org/destinationsol/ui/TutorialManager.java @@ -15,11 +15,8 @@ */ package org.destinationsol.ui; -import com.badlogic.gdx.Application; -import com.badlogic.gdx.Gdx; import com.badlogic.gdx.math.Rectangle; import org.destinationsol.GameOptions; -import org.destinationsol.SolApplication; import org.destinationsol.common.SolColor; import org.destinationsol.game.SolGame; import org.destinationsol.game.UpdateAwareSystem; @@ -27,8 +24,9 @@ import org.destinationsol.game.screens.GameScreens; import org.destinationsol.game.screens.InventoryScreen; import org.destinationsol.game.screens.MainGameScreen; -import org.destinationsol.game.screens.ShipKbControl; import org.destinationsol.game.screens.ShipMixedControl; +import org.destinationsol.ui.nui.screens.UIShipControlsScreen; +import org.destinationsol.ui.nui.widgets.UIWarnButton; import javax.inject.Inject; import javax.inject.Provider; @@ -51,39 +49,45 @@ public TutorialManager(GameScreens screens, GameOptions gameOptions, Provider(); + stepIndex = 0; } public void init() { - boolean mobile = game.get().getSolApplication().isMobile(); - stepIndex = 0; + } + public void start() { + boolean mobile = game.get().getSolApplication().isMobile(); MainGameScreen main = screens.mainGameScreen; - boolean mouseCtrl = main.shipControl instanceof ShipMixedControl; - SolUiControl shootCtrl; + boolean mouseCtrl = main.getShipControl() instanceof ShipMixedControl; + org.destinationsol.ui.nui.screens.MainGameScreen nuiMain = game.get().getMainGameScreen(); + SolUiControl shootCtrl = null; String shootKey; String shootKey2; - SolUiControl upCtrl; - SolUiControl leftCtrl; - SolUiControl abilityCtrl; + SolUiControl upCtrl = null; + SolUiControl abilityCtrl = null; + UIWarnButton nuiShootCtrl = null; + UIWarnButton nuiUpCtrl = null; + UIWarnButton nuiLeftCtrl = null; + UIWarnButton nuiAbilityCtrl = null; if (mouseCtrl) { - ShipMixedControl mixedControl = (ShipMixedControl) main.shipControl; + ShipMixedControl mixedControl = (ShipMixedControl) main.getShipControl(); shootCtrl = mixedControl.shootCtrl; shootKey = "(LEFT mouse button)"; shootKey2 = "(Click LEFT mouse button)"; upCtrl = mixedControl.upCtrl; - leftCtrl = null; abilityCtrl = mixedControl.abilityCtrl; } else { - ShipKbControl kbControl = (ShipKbControl) main.shipControl; - shootCtrl = kbControl.shootCtrl; - upCtrl = kbControl.upCtrl; - leftCtrl = kbControl.leftCtrl; - abilityCtrl = kbControl.abilityCtrl; + UIShipControlsScreen kbControl = (UIShipControlsScreen) main.getShipControl(); + nuiShootCtrl = kbControl.getGun1Button(); + nuiUpCtrl = kbControl.getForwardButton(); + nuiLeftCtrl = kbControl.getLeftButton(); + nuiAbilityCtrl = kbControl.getAbilityButton(); if (mobile) { shootKey = "(GUN 1 button)"; shootKey2 = "(Press GUN 1 button)"; @@ -93,20 +97,25 @@ public void init() { } } - addStep("Hi! Shoot your main gun\n" + shootKey, shootCtrl); + if (mouseCtrl) { + addStep("Hi! Shoot your main gun\n" + shootKey, shootCtrl); + } else { + addStep("Hi! Shoot your main gun\n" + shootKey, nuiShootCtrl); + } - if (leftCtrl != null) { + if (nuiLeftCtrl != null) { if (mobile) { - addStep("Great! Turn left.\nDon't fly away yet!", leftCtrl); + addStep("Great! Turn left.\nDon't fly away yet!", nuiLeftCtrl); } else { - addStep("Great! Turn left (" + gameOptions.getKeyLeftName() + " key). \nDon't fly away yet!", leftCtrl); + addStep("Great! Turn left (" + gameOptions.getKeyLeftName() + " key). \nDon't fly away yet!", nuiLeftCtrl); } } + UIWarnButton mapButton = nuiMain.getMapButton(); if (mobile) { - addStep("Have a look at the map", main.mapControl, true); + addStep("Have a look at the map", mapButton, true); } else { - addStep("Have a look at the map\n(" + gameOptions.getKeyMapName() + " key)", main.mapControl, true); + addStep("Have a look at the map\n(" + gameOptions.getKeyMapName() + " key)", mapButton, true); } if (mouseCtrl) { @@ -124,10 +133,11 @@ public void init() { screens.mapScreen.closeControl, true); } + UIWarnButton inventoryButton = nuiMain.getInventoryButton(); if (mouseCtrl || mobile) { - addStep("Have a look\nat your inventory", main.inventoryControl, true); + addStep("Have a look\nat your inventory", inventoryButton, true); } else { - addStep("Have a look\nat your inventory (" + gameOptions.getKeyInventoryName() + " key)", main.inventoryControl, true); + addStep("Have a look\nat your inventory (" + gameOptions.getKeyInventoryName() + " key)", inventoryButton, true); } if (mouseCtrl || mobile) { @@ -179,15 +189,16 @@ public void init() { if (mouseCtrl) { addStep("Move forward (" + gameOptions.getKeyUpMouseName() + " key).\nThere's no stop!", upCtrl); } else if (mobile) { - addStep("Move forward.\nThere's no stop!", upCtrl); + addStep("Move forward.\nThere's no stop!", nuiUpCtrl); } else { - addStep("Move forward (" + gameOptions.getKeyUpName() + " key).\nThere's no stop!", upCtrl); + addStep("Move forward (" + gameOptions.getKeyUpName() + " key).\nThere's no stop!", nuiUpCtrl); } + UIWarnButton talkButton = nuiMain.getTalkButton(); if (mobile) { - addStep("Fly closer to the station\nand talk with it", main.talkControl, true); + addStep("Fly closer to the station\nand talk with it", talkButton, true); } else { - addStep("Fly closer to the station\nand talk with it (" + gameOptions.getKeyTalkName() + " key)", main.talkControl, true); + addStep("Fly closer to the station\nand talk with it (" + gameOptions.getKeyTalkName() + " key)", talkButton, true); } if (mouseCtrl || mobile) { @@ -212,29 +223,50 @@ public void init() { addStep("Use the ability of your ship\n(MIDDLE mouse button or " + gameOptions.getKeyAbilityName() + " key)", abilityCtrl, true); } else if (mobile) { - addStep("Use the ability of your ship", abilityCtrl, true); + addStep("Use the ability of your ship", nuiAbilityCtrl, true); } else { - addStep("Use the ability of your ship\n(" + gameOptions.getKeyAbilityName() + " key)", abilityCtrl, true); + addStep("Use the ability of your ship\n(" + gameOptions.getKeyAbilityName() + " key)", nuiAbilityCtrl, true); } - addStep("Here's a couple of hints...\n" + shootKey2, shootCtrl); - addStep("Enemies are orange icons, allies are blue\n" + shootKey2, shootCtrl); - addStep("Avoid enemies with skull icon\n" + shootKey2, shootCtrl); - addStep("To repair, have repair kits and just stay idle\n" + shootKey2, shootCtrl); - addStep("Destroy asteroids to find money\n" + shootKey2, shootCtrl); - addStep("Find or buy shields, armor, guns; equip them\n" + shootKey2, shootCtrl); - addStep("Buy new ships, hire mercenaries\n" + shootKey2, shootCtrl); - addStep("Tutorial is complete and will exit now!\n" + shootKey2, shootCtrl); + if (mouseCtrl) { + addStep("Here's a couple of hints...\n" + shootKey2, shootCtrl); + addStep("Enemies are orange icons, allies are blue\n" + shootKey2, shootCtrl); + addStep("Avoid enemies with skull icon\n" + shootKey2, shootCtrl); + addStep("To repair, have repair kits and just stay idle\n" + shootKey2, shootCtrl); + addStep("Destroy asteroids to find money\n" + shootKey2, shootCtrl); + addStep("Find or buy shields, armor, guns; equip them\n" + shootKey2, shootCtrl); + addStep("Buy new ships, hire mercenaries\n" + shootKey2, shootCtrl); + addStep("Tutorial is complete and will exit now!\n" + shootKey2, shootCtrl); + } else { + addStep("Here's a couple of hints...\n" + shootKey2, nuiShootCtrl); + addStep("Enemies are orange icons, allies are blue\n" + shootKey2, nuiShootCtrl); + addStep("Avoid enemies with skull icon\n" + shootKey2, nuiShootCtrl); + addStep("To repair, have repair kits and just stay idle\n" + shootKey2, nuiShootCtrl); + addStep("Destroy asteroids to find money\n" + shootKey2, nuiShootCtrl); + addStep("Find or buy shields, armor, guns; equip them\n" + shootKey2, nuiShootCtrl); + addStep("Buy new ships, hire mercenaries\n" + shootKey2, nuiShootCtrl); + addStep("Tutorial is complete and will exit now!\n" + shootKey2, nuiShootCtrl); + } + + steps.get(0).start(); } private void addStep(String text, SolUiControl ctrl) { addStep(text, ctrl, false); } + private void addStep(String text, UIWarnButton ctrl) { + addStep(text, ctrl, false); + } + private void addStep(String text, SolUiControl ctrl, boolean checkOn) { steps.add(new Step(text, ctrl, checkOn)); } + private void addStep(String text, UIWarnButton ctrl, boolean checkOn) { + steps.add(new NuiStep(text, ctrl, checkOn)); + } + private void addStep(Step step) { steps.add(step); } @@ -245,6 +277,9 @@ public void update(SolGame game, float timeStep) { step.highlight(); if (step.canProgressToNextStep()) { stepIndex++; + if (stepIndex < steps.size()) { + steps.get(stepIndex).start(); + } } } @@ -275,6 +310,10 @@ public Step(String text, SolUiControl ctrl, boolean checkOn) { this.checkOn = checkOn; } + public void start() { + // Empty, as it is only used in NuiStep + } + // highlight control that needs to be pressed public void highlight() { if (ctrl != null) { @@ -291,6 +330,44 @@ public boolean canProgressToNextStep() { } } + public static class NuiStep extends Step { + public final UIWarnButton nuiCtrl; + private boolean buttonPressed; + + public NuiStep(String text, UIWarnButton ctrl, boolean checkOn) { + super(text, null, checkOn); + nuiCtrl = ctrl; + } + + @Override + public void start() { + nuiCtrl.subscribe(widget -> { + buttonPressed = true; + }); + } + + // highlight control that needs to be pressed + @Override + public void highlight() { + if (nuiCtrl != null) { + nuiCtrl.enableWarn(); + } + } + + @Override + public boolean canProgressToNextStep() { + boolean pressed = buttonPressed; + buttonPressed = false; + if (checkOn) { + // TODO: The following line should work but doesn't currently due a nui-libgdx issue + //return nuiCtrl.getMode().equals(UIButton.DOWN_MODE); + return pressed; + } else { + return pressed; + } + } + } + public static class SelectEquippedItemStep extends Step { InventoryScreen inventoryScreen; SolGame game; diff --git a/engine/src/main/java/org/destinationsol/ui/nui/NUIManager.java b/engine/src/main/java/org/destinationsol/ui/nui/NUIManager.java index 864da21df..79ea55ea1 100644 --- a/engine/src/main/java/org/destinationsol/ui/nui/NUIManager.java +++ b/engine/src/main/java/org/destinationsol/ui/nui/NUIManager.java @@ -24,8 +24,10 @@ import org.destinationsol.assets.sound.OggSound; import org.destinationsol.game.context.Context; import org.destinationsol.util.InjectionHelper; -import org.terasology.gestalt.assets.ResourceUrn; +import org.terasology.joml.geom.Rectanglei; +import org.joml.Vector2i; import org.terasology.input.InputType; +import org.terasology.input.Keyboard; import org.terasology.input.MouseInput; import org.terasology.input.device.CharKeyboardAction; import org.terasology.input.device.RawKeyboardAction; @@ -42,16 +44,20 @@ import org.terasology.nui.backends.libgdx.NUIInputProcessor; import org.terasology.nui.canvas.CanvasImpl; import org.terasology.nui.events.NUICharEvent; +import org.terasology.nui.canvas.CanvasRenderer; import org.terasology.nui.events.NUIKeyEvent; import org.terasology.nui.events.NUIMouseButtonEvent; import org.terasology.nui.events.NUIMouseWheelEvent; import org.terasology.nui.skin.UISkin; +import org.terasology.nui.util.RectUtility; import org.terasology.nui.widgets.UIButton; import org.terasology.nui.widgets.UIText; import java.util.Deque; import java.util.Iterator; import java.util.LinkedList; +import java.util.List; +import java.util.stream.Collectors; /** * The NUI Manager is responsible for the initialisation and interaction between the NUI library and the game. @@ -66,7 +72,7 @@ public class NUIManager { /** * The game's canvas, which is used for all NUI rendering operations. See also {@link NUIManager#canvasRenderer}. */ - private CanvasImpl canvas; + private SolCanvas canvas; /** * A blank white texture, used by-default for the text cursor. */ @@ -91,6 +97,10 @@ public class NUIManager { * The current game context used to initialise UI screens. */ private Context context; + /** + * The baseline UI scale used on Android. + */ + private final float baseUIScale; /** * The UI stack. The elements are rendered from most recently added to least recent, so a stack-like structure @@ -101,6 +111,7 @@ public class NUIManager { private static final String WHITE_TEXTURE_URN = "engine:uiWhiteTex"; private static final String DEFAULT_SKIN_URN = "engine:default"; private static final String BUTTON_CLICK_URN = "engine:uiHover"; + private static final float MOBILE_UI_DENSITY = 1.5f; /** * The value 0.9 was found from {@link org.destinationsol.ui.SolInputManager#playClick}, so it was copied here to * retain the same click sound as the built-in UI. @@ -118,6 +129,11 @@ public NUIManager(SolApplication solApplication, Context context, CommonDrawer c NUIInputProcessor.CONSUME_INPUT = true; this.context = context; + // TODO: Re-enable tabbing when it works + TabbingManager.tabForwardInput = Keyboard.Key.NONE; + TabbingManager.tabBackInputModifier = Keyboard.Key.NONE; + TabbingManager.activateInput = Keyboard.Key.NONE; + mouse = new LibGDXMouseDevice(); keyboard = new LibGDXKeyboardDevice(); canvasRenderer = new LibGDXCanvasRenderer(Gdx.graphics.getWidth(), Gdx.graphics.getHeight(), @@ -126,7 +142,7 @@ public NUIManager(SolApplication solApplication, Context context, CommonDrawer c whiteTexture = Assets.getDSTexture(WHITE_TEXTURE_URN).getUiTexture(); skin = Assets.getSkin(DEFAULT_SKIN_URN); - canvas = new CanvasImpl(canvasRenderer, focusManager, keyboard, mouse, whiteTexture, skin, 100); + canvas = new SolCanvas(canvasRenderer, focusManager, keyboard, mouse, whiteTexture, skin, 100); TabbingManager.setFocusManager(focusManager); OggSound sound = Assets.getSound(BUTTON_CLICK_URN); @@ -139,6 +155,16 @@ public NUIManager(SolApplication solApplication, Context context, CommonDrawer c // NOTE: SolApplication::addResizeSubscriber is not intended to be static, so use the instance form for compatibility solApplication.addResizeSubscriber(() -> resize(Gdx.graphics.getBackBufferWidth(), Gdx.graphics.getBackBufferHeight())); + // Mobile screen densities can vary considerably, so a large digital resolution can be displayed + // on a very small screen. Due to this, it makes sense to scale the UI roughly proportionally + // to form a more sensible default. Otherwise, the UI may appear to be too big/small. + // On very large mobile screens, such as tablets, you may need to adjust the UI scale further in the game options. + if (solApplication.isMobile()) { + baseUIScale = Gdx.graphics.getDensity() / MOBILE_UI_DENSITY; + } else { + baseUIScale = 1.0f; + } + setUiScale(options.getNuiUiScale()); } @@ -147,7 +173,10 @@ public NUIManager(SolApplication solApplication, Context context, CommonDrawer c * @param solApplication the application to use */ public void update(SolApplication solApplication) { - canvas.processMousePosition(mouse.getPosition()); + for (int pointer = 0; pointer < mouse.getMaxPointers(); pointer++) { + canvas.processMousePosition(mouse.getPosition(pointer), pointer); + } + canvas.setGameTime(System.currentTimeMillis()); for (RawKeyboardAction action : keyboard.getInputQueue()) { @@ -181,9 +210,9 @@ public void update(SolApplication solApplication) { for (MouseAction action : mouse.getInputQueue()) { if (action.getInput().getType() == InputType.MOUSE_BUTTON) { if (action.getState().isDown()) { - canvas.processMouseClick((MouseInput) action.getInput(), action.getMousePosition()); + canvas.processMouseClick((MouseInput) action.getInput(), action.getMousePosition(), action.getPointer()); } else { - canvas.processMouseRelease((MouseInput) action.getInput(), action.getMousePosition()); + canvas.processMouseRelease((MouseInput) action.getInput(), action.getMousePosition(), action.getPointer()); } NUIMouseButtonEvent event = new NUIMouseButtonEvent((MouseInput) action.getInput(), action.getState(), action.getMousePosition()); @@ -317,6 +346,16 @@ public Deque getScreens() { return uiScreens; } + /** + * Removes all of the UI screens currently on UI stack. + */ + public void clearScreens() { + for (NUIScreenLayer uiScreen : uiScreens) { + uiScreen.onRemoved(); + } + uiScreens.clear(); + } + /** * Returns the default {@link UISkin} for widgets. * @return the default {@link UISkin} @@ -333,6 +372,21 @@ public void setContext(Context context) { this.context = context; } + /** + * Returns if the mouse is currently over an interactive UI element. + * @return true, if the mouse is currently over an interactive UI element, otherwise false + */ + public boolean isMouseOnUi() { + // TODO: Find better way of doing this. + Vector2i mousePosition = mouse.getPosition(); + for (Rectanglei interactionRegion : canvas.getInteractionRegions()) { + if (RectUtility.contains(interactionRegion, mousePosition)) { + return true; + } + } + return false; + } + /** * Re-sizes the current canvas to a particular width and height. This is not always the same as the game's current * rendering resolution. @@ -349,7 +403,18 @@ public void resize(int width, int height) { * @param scale the new UI scale to use */ public void setUiScale(float scale) { - canvas.setUiScale(scale); - canvasRenderer.setUiScale(1.0f / scale); + float actualScale = scale * baseUIScale; + canvas.setUiScale(actualScale); + canvasRenderer.setUiScale(1.0f / actualScale); + } + + private class SolCanvas extends CanvasImpl { + public SolCanvas(CanvasRenderer renderer, FocusManager focusManager, KeyboardDevice keyboard, MouseDevice mouse, UITextureRegion whiteTexture, UISkin defaultSkin, int uiScale) { + super(renderer, focusManager, keyboard, mouse, whiteTexture, defaultSkin, uiScale); + } + + public List getInteractionRegions() { + return interactionRegions.stream().map(region -> region.region).collect(Collectors.toList()); + } } } diff --git a/engine/src/main/java/org/destinationsol/ui/nui/NUIScreenLayer.java b/engine/src/main/java/org/destinationsol/ui/nui/NUIScreenLayer.java index 8657cadcc..e83a02b7b 100644 --- a/engine/src/main/java/org/destinationsol/ui/nui/NUIScreenLayer.java +++ b/engine/src/main/java/org/destinationsol/ui/nui/NUIScreenLayer.java @@ -15,6 +15,7 @@ */ package org.destinationsol.ui.nui; +import org.destinationsol.ui.nui.widgets.KeyActivatedButton; import org.joml.Vector2i; import org.terasology.input.ButtonState; import org.terasology.input.Keyboard; @@ -126,6 +127,12 @@ public boolean onKeyEvent(NUIKeyEvent event) { return true; } + // Send key events to all KeyActivatedButton sub-widgets. These buttons are supposed to react to key events + // even when they are not in-focus. + for (UIWidget widget : contents.findAll(KeyActivatedButton.class)) { + widget.onKeyEvent(event); + } + return super.onKeyEvent(event); } diff --git a/engine/src/main/java/org/destinationsol/ui/nui/screens/MainGameScreen.java b/engine/src/main/java/org/destinationsol/ui/nui/screens/MainGameScreen.java new file mode 100644 index 000000000..0e4337470 --- /dev/null +++ b/engine/src/main/java/org/destinationsol/ui/nui/screens/MainGameScreen.java @@ -0,0 +1,288 @@ +/* + * Copyright 2021 The Terasology Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.destinationsol.ui.nui.screens; + +import org.destinationsol.GameOptions; +import org.destinationsol.SolApplication; +import org.destinationsol.assets.Assets; +import org.destinationsol.common.In; +import org.destinationsol.game.FactionManager; +import org.destinationsol.game.Hero; +import org.destinationsol.game.SolGame; +import org.destinationsol.game.SolObject; +import org.destinationsol.game.screens.GameScreens; +import org.destinationsol.game.screens.TalkScreen; +import org.destinationsol.game.ship.SolShip; +import org.destinationsol.ui.SolInputManager; +import org.destinationsol.ui.nui.NUIScreenLayer; +import org.destinationsol.ui.nui.widgets.KeyActivatedButton; +import org.destinationsol.ui.nui.widgets.UIWarnButton; +import org.terasology.gestalt.assets.ResourceUrn; +import org.terasology.input.ButtonState; +import org.terasology.input.Keyboard; +import org.terasology.nui.AbstractWidget; +import org.terasology.nui.UIWidget; +import org.terasology.nui.asset.UIElement; +import org.terasology.nui.backends.libgdx.GDXInputUtil; +import org.terasology.nui.events.NUIKeyEvent; + +import java.util.List; + +/** + * The main HUD screen displayed when in-game. This screen is responsible for the menu buttons shown + * on the right-hand side of the UI. Through it, the menu, map, current ship inventory, communications UI + * and mercenaries UI can be accessed. + */ +public class MainGameScreen extends NUIScreenLayer { + private SolShip talkTarget; + private UIWarnButton menuButton; + private UIWarnButton mapButton; + private UIWarnButton inventoryButton; + private UIWarnButton talkButton; + private UIWarnButton mercsButton; + private ConsoleScreen consoleScreen; + + @In + private SolApplication solApplication; + + @Override + public void initialise() { + consoleScreen = (ConsoleScreen) Assets.getAssetHelper().get(new ResourceUrn("engine:console"), UIElement.class).get().getRootWidget(); + + GameOptions gameOptions = solApplication.getOptions(); + + menuButton = find("menuButton", UIWarnButton.class); + menuButton.setKey(GDXInputUtil.GDXToNuiKey(gameOptions.getKeyMenu())); + menuButton.subscribe(this::onMenuButtonClicked); + + mapButton = find("mapButton", UIWarnButton.class); + mapButton.setKey(GDXInputUtil.GDXToNuiKey(gameOptions.getKeyMap())); + mapButton.subscribe(this::onMapButtonClicked); + + inventoryButton = find("itemsButton", UIWarnButton.class); + inventoryButton.setKey(GDXInputUtil.GDXToNuiKey(gameOptions.getKeyInventory())); + inventoryButton.subscribe(this::onItemsButtonClicked); + + talkButton = find("talkButton", UIWarnButton.class); + talkButton.setKey(GDXInputUtil.GDXToNuiKey(gameOptions.getKeyTalk())); + talkButton.subscribe(this::onTalkButtonClicked); + + mercsButton = find("mercsButton", UIWarnButton.class); + mercsButton.setKey(GDXInputUtil.GDXToNuiKey(gameOptions.getKeyMercenaryInteraction())); + mercsButton.subscribe(this::onMercsButtonClicked); + } + + @Override + public void update(float delta) { + super.update(delta); + SolInputManager solInputManager = solApplication.getInputManager(); + GameScreens gameScreens = solApplication.getGame().getScreens(); + if (!solInputManager.isScreenOn(gameScreens.menuScreen) && + !solInputManager.isScreenOn(gameScreens.mapScreen)) { + ((AbstractWidget) contents).setVisible(true); + } else { + ((AbstractWidget) contents).setVisible(false); + } + + if (solInputManager.getTopScreen() != gameScreens.mainGameScreen) { + // User is in an original UI menu, so disable the escape key toggling the pause menu. + menuButton.setKey(Keyboard.Key.NONE); + } else { + menuButton.setKey(GDXInputUtil.GDXToNuiKey(solApplication.getOptions().getKeyMenu())); + } + + // NOTE: Copied directly from the original MainGameScreen class. The logic hasn't been changed + // but some variables have been re-named to be more descriptive. + SolGame game = solApplication.getGame(); + Hero hero = game.getHero(); + + if (hero.isNonTranscendent() && !solInputManager.isScreenOn(gameScreens.inventoryScreen)) { + if (hero.getItemContainer().hasNew()) { + inventoryButton.enableWarn(); + } + + if (hero.getMercs().hasNew()) { + mercsButton.enableWarn(); + } + } + + mercsButton.setEnabled(hero.isNonTranscendent()); + if (hero.isTranscendent()) { + talkButton.setEnabled(false); + return; + } + + FactionManager factionManager = game.getFactionMan(); + + // The ship can only communicate if there is a friendly target in range. + talkTarget = null; + float minDist = TalkScreen.MAX_TALK_DIST; + float heroApproxRadius = hero.getHull().config.getApproxRadius(); + List objs = game.getObjectManager().getObjects(); + for (SolObject obj : objs) { + if (!(obj instanceof SolShip)) { + continue; + } + SolShip ship = (SolShip) obj; + if (factionManager.areEnemies(hero.getShip(), ship)) { + continue; + } + if (ship.getTradeContainer() == null) { + continue; + } + float distance = ship.getPosition().dst(hero.getPosition()); + float shipApproxRadius = ship.getHull().config.getApproxRadius(); + if (minDist < distance - heroApproxRadius - shipApproxRadius) { + continue; + } + talkTarget = ship; + minDist = distance; + } + talkButton.setEnabled(talkTarget != null); + + if (consoleScreen.isConsoleJustClosed()) { + game.setPaused(false); + } + } + + @Override + protected boolean escapeCloses() { + return false; + } + + @Override + public boolean onKeyEvent(NUIKeyEvent event) { + if (event.getState() == ButtonState.UP && + (event.getKey() == Keyboard.Key.GRAVE || event.getKey() == Keyboard.Key.F1) && + nuiManager.hasScreen(consoleScreen)) { + nuiManager.removeScreen(consoleScreen); + return true; + } + + if (!contents.isVisible()) { + return false; + } + + if (event.getState() == ButtonState.UP && + (event.getKey() == Keyboard.Key.GRAVE || event.getKey() == Keyboard.Key.F1)) { + if (!nuiManager.hasScreen(consoleScreen)) { + nuiManager.pushScreen(consoleScreen); + solApplication.getGame().setPaused(true); + } + return true; + } + + return super.onKeyEvent(event); + } + + @Override + public void onRemoved() { + menuButton.unsubscribe(this::onMenuButtonClicked); + mapButton.unsubscribe(this::onMapButtonClicked); + inventoryButton.unsubscribe(this::onItemsButtonClicked); + talkButton.unsubscribe(this::onTalkButtonClicked); + mercsButton.unsubscribe(this::onMercsButtonClicked); + } + + /** + * Returns the "Menu" UI Button element. + * @return the "Menu" UI Button + */ + public UIWarnButton getMenuButton() { + return menuButton; + } + + /** + * Returns the "Map" UI Button element. + * @return The "Map" UI Button + */ + public UIWarnButton getMapButton() { + return mapButton; + } + + /** + * Returns the "Items" UI Button element. + * @return The "Items" UI Button + */ + public UIWarnButton getInventoryButton() { + return inventoryButton; + } + + /** + * Returns the "Talk" UI Button element. + * @return The "Talk" UI Button + */ + public UIWarnButton getTalkButton() { + return talkButton; + } + + /** + * Returns the "Mercs" UI Button element. + * @return The "Mercs" UI Button + */ + public UIWarnButton getMercsButton() { + return mercsButton; + } + + private void onMenuButtonClicked(UIWidget widget) { + SolInputManager solInputManager = solApplication.getInputManager(); + GameScreens gameScreens = solApplication.getGame().getScreens(); + + solInputManager.setScreen(solApplication, gameScreens.menuScreen); + } + + private void onMapButtonClicked(UIWidget widget) { + SolInputManager solInputManager = solApplication.getInputManager(); + GameScreens gameScreens = solApplication.getGame().getScreens(); + + solInputManager.setScreen(solApplication, gameScreens.mapScreen); + } + + private void onItemsButtonClicked(UIWidget widget) { + SolInputManager solInputManager = solApplication.getInputManager(); + GameScreens gameScreens = solApplication.getGame().getScreens(); + + solInputManager.setScreen(solApplication, gameScreens.mainGameScreen); + if (!solInputManager.isScreenOn(gameScreens.inventoryScreen)) { + gameScreens.inventoryScreen.showInventory.setTarget(solApplication.getGame().getHero().getShip()); + gameScreens.inventoryScreen.setOperations(gameScreens.inventoryScreen.showInventory); + solInputManager.addScreen(solApplication, gameScreens.inventoryScreen); + } + } + + private void onTalkButtonClicked(UIWidget widget) { + SolInputManager solInputManager = solApplication.getInputManager(); + GameScreens gameScreens = solApplication.getGame().getScreens(); + + solInputManager.setScreen(solApplication, gameScreens.mainGameScreen); + if (!solInputManager.isScreenOn(gameScreens.talkScreen)) { + gameScreens.talkScreen.setTarget(talkTarget); + solInputManager.addScreen(solApplication, gameScreens.talkScreen); + } + } + + private void onMercsButtonClicked(UIWidget widget) { + SolInputManager solInputManager = solApplication.getInputManager(); + GameScreens gameScreens = solApplication.getGame().getScreens(); + + solInputManager.setScreen(solApplication, gameScreens.mainGameScreen); + if (!solInputManager.isScreenOn(gameScreens.inventoryScreen)) { + gameScreens.inventoryScreen.setOperations(gameScreens.inventoryScreen.chooseMercenaryScreen); + solInputManager.addScreen(solApplication, gameScreens.inventoryScreen); + solApplication.getGame().getHero().getMercs().markAllAsSeen(); + } + } +} diff --git a/engine/src/main/java/org/destinationsol/ui/nui/screens/UIShipControlsScreen.java b/engine/src/main/java/org/destinationsol/ui/nui/screens/UIShipControlsScreen.java new file mode 100644 index 000000000..7758fe913 --- /dev/null +++ b/engine/src/main/java/org/destinationsol/ui/nui/screens/UIShipControlsScreen.java @@ -0,0 +1,238 @@ +/* + * Copyright 2021 The Terasology Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.destinationsol.ui.nui.screens; + +import org.destinationsol.GameOptions; +import org.destinationsol.SolApplication; +import org.destinationsol.common.In; +import org.destinationsol.game.Hero; +import org.destinationsol.game.item.Gun; +import org.destinationsol.game.screens.ShipUiControl; +import org.destinationsol.ui.nui.NUIScreenLayer; +import org.destinationsol.ui.nui.widgets.KeyActivatedButton; +import org.destinationsol.ui.nui.widgets.UIWarnButton; +import org.terasology.input.ButtonState; +import org.terasology.input.Keyboard; +import org.terasology.nui.AbstractWidget; +import org.terasology.nui.backends.libgdx.GDXInputUtil; +import org.terasology.nui.events.NUIKeyEvent; +import org.terasology.nui.widgets.UIButton; + +/** + * This screen contains the touchscreen controls used when playing the game on mobile platforms. + * It is the implementation of {@link ShipUiControl} used when the control type is set to "Keyboard". + */ +public class UIShipControlsScreen extends NUIScreenLayer implements ShipUiControl { + public UIWarnButton leftButton; + public UIWarnButton rightButton; + public UIWarnButton forwardButton; + public UIWarnButton gun1Button; + public UIWarnButton gun2Button; + public UIWarnButton abilityButton; + private Keyboard.Key downKey; + private boolean downKeyHeld; + private boolean controlsEnabled; + + @In + private SolApplication solApplication; + + @Override + public void initialise() { + GameOptions gameOptions = solApplication.getOptions(); + + leftButton = find("leftButton", UIWarnButton.class); + leftButton.setKey(GDXInputUtil.GDXToNuiKey(gameOptions.getKeyLeft())); + + rightButton = find("rightButton", UIWarnButton.class); + rightButton.setKey(GDXInputUtil.GDXToNuiKey(gameOptions.getKeyRight())); + + forwardButton = find("forwardButton", UIWarnButton.class); + forwardButton.setKey(GDXInputUtil.GDXToNuiKey(gameOptions.getKeyUp())); + + gun1Button = find("gun1Button", UIWarnButton.class); + gun1Button.setKey(GDXInputUtil.GDXToNuiKey(gameOptions.getKeyShoot())); + + gun2Button = find("gun2Button", UIWarnButton.class); + gun2Button.setKey(GDXInputUtil.GDXToNuiKey(gameOptions.getKeyShoot2())); + + abilityButton = find("abilityButton", UIWarnButton.class); + abilityButton.setKey(GDXInputUtil.GDXToNuiKey(gameOptions.getKeyAbility())); + + downKey = GDXInputUtil.GDXToNuiKey(gameOptions.getKeyDown()); + + // Hide touchscreen controls if not on mobile + if (!solApplication.isMobile()) { + leftButton.setVisible(false); + rightButton.setVisible(false); + forwardButton.setVisible(false); + gun1Button.setVisible(false); + gun2Button.setVisible(false); + abilityButton.setVisible(false); + } + } + + /** + * Implementation of {@link org.terasology.nui.UIWidget#update(float)} + * @param delta the time elapsed since the last update cycle + */ + @Override + public void update(float delta) { + // Hide and disable controls if the main game screen is not visible. + boolean mainGameScreenVisible = solApplication.getInputManager().isScreenOn(solApplication.getGame().getScreens().mainGameScreen); + ((AbstractWidget)contents).setVisible(mainGameScreenVisible); + contents.setEnabled(mainGameScreenVisible); + + if (!controlsEnabled) { + leftButton.setEnabled(false); + rightButton.setEnabled(false); + forwardButton.setEnabled(false); + gun1Button.setEnabled(false); + gun2Button.setEnabled(false); + abilityButton.setEnabled(false); + return; + } + + Hero hero = solApplication.getGame().getHero(); + boolean hasEngine = hero.isNonTranscendent() && hero.getHull().getEngine() != null; + forwardButton.setEnabled(hasEngine); + leftButton.setEnabled(hasEngine); + rightButton.setEnabled(hasEngine); + + Gun gun1 = hero.isTranscendent() ? null : hero.getHull().getGun(false); + boolean gun1Enabled = gun1 != null && gun1.ammo > 0; + gun1Button.setEnabled(gun1Enabled); + + Gun gun2 = hero.isTranscendent() ? null : hero.getHull().getGun(true); + boolean gun2Enabled = gun2 != null && gun2.ammo > 0; + gun2Button.setEnabled(gun2Enabled); + + // The ability button needs to de-press before it is disabled, + // as otherwise it causes the button to be pressed again when it is enabled. + if (!abilityButton.getMode().equals(UIButton.DOWN_MODE)) { + abilityButton.setEnabled(hero.isNonTranscendent() && hero.canUseAbility()); + } + + super.update(delta); + } + + /** + * Implementation of {@link ShipUiControl#update(SolApplication, boolean)} + * @param solApplication an instance of the game's {@link SolApplication} + * @param enabled are the UI controls currently enabled + */ + @Override + public void update(SolApplication solApplication, boolean enabled) { + controlsEnabled = enabled; + } + + @Override + public boolean onKeyEvent(NUIKeyEvent event) { + if (event.getKey() == downKey) { + downKeyHeld = (event.getState() == ButtonState.DOWN); + return true; + } + + return super.onKeyEvent(event); + } + + /** + * Returns the "Left" touchscreen control button element. + * @return the "Left" UI Button + */ + public UIWarnButton getLeftButton() { + return leftButton; + } + + /** + * Returns the "Right" touchscreen control button element. + * @return the "Right" UI Button + */ + public UIWarnButton getRightButton() { + return rightButton; + } + + /** + * Returns the "Fwd" touchscreen control button element. + * @return the "Fwd" UI Button + */ + public UIWarnButton getForwardButton() { + return forwardButton; + } + + /** + * Returns the "Gun" touchscreen control button element. + * @return the "Gun" UI Button + */ + public UIWarnButton getGun1Button() { + return gun1Button; + } + + /** + * Returns the "Gun2" touchscreen control button element. + * @return the "Gun2" UI Button + */ + public UIWarnButton getGun2Button() { + return gun2Button; + } + + /** + * Returns the "Ability" touchscreen control button element. + * @return the "Ability" UI Button + */ + public UIWarnButton getAbilityButton() { + return abilityButton; + } + + @Override + public boolean isLeft() { + return leftButton.getMode().equals(UIButton.DOWN_MODE); + } + + @Override + public boolean isRight() { + return rightButton.getMode().equals(UIButton.DOWN_MODE); + } + + @Override + public boolean isUp() { + return forwardButton.getMode().equals(UIButton.DOWN_MODE); + } + + @Override + public boolean isDown() { + return downKeyHeld; + } + + @Override + public boolean isShoot() { + return gun1Button.getMode().equals(UIButton.DOWN_MODE); + } + + @Override + public boolean isShoot2() { + return gun2Button.getMode().equals(UIButton.DOWN_MODE); + } + + @Override + public boolean isAbility() { + return abilityButton.getMode().equals(UIButton.DOWN_MODE); + } + + @Override + protected boolean escapeCloses() { + return false; + } +} diff --git a/engine/src/main/java/org/destinationsol/ui/nui/widgets/KeyActivatedButton.java b/engine/src/main/java/org/destinationsol/ui/nui/widgets/KeyActivatedButton.java new file mode 100644 index 000000000..539956cea --- /dev/null +++ b/engine/src/main/java/org/destinationsol/ui/nui/widgets/KeyActivatedButton.java @@ -0,0 +1,109 @@ +/* + * Copyright 2021 The Terasology Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.destinationsol.ui.nui.widgets; + +import org.terasology.input.Keyboard; +import org.terasology.nui.LayoutConfig; +import org.terasology.nui.databinding.Binding; +import org.terasology.nui.databinding.DefaultBinding; +import org.terasology.nui.events.NUIKeyEvent; +import org.terasology.nui.widgets.UIButton; + +/** + * A {@link UIButton} this can also be activated when a specific key is pressed. + */ +public class KeyActivatedButton extends UIButton { + /** + * The {@code Binding} containing the key that activates this button. + */ + @LayoutConfig + private Binding key = new DefaultBinding<>(Keyboard.Key.NONE); + + /** + * The {@code Binding} stating if the button should still activate on key presses when invisible. + * The default value is false, as this is consistent with the default behaviour of a UIButton. + * + * Setting the value to true allows the button to be activated by a key press when invisible, + * which is consistent with the default behaviour of {@link org.destinationsol.ui.SolUiControl}. + */ + @LayoutConfig + private Binding activateWhenInvisible = new DefaultBinding<>(false); + + /** + * Binds the key used to activate this {@code KeyActivatedButton}. + * + * @param key The {@code Binding} containing the key used to activate this {@code KeyActivatedButton}. + */ + public void bindKey(Binding key) { + this.key = key; + } + + /** + * Retrieves the key used to activate this {@code KeyActivatedButton}. + * + * @return The key used to activate this {@code KeyActivatedButton} + */ + public Keyboard.Key getKey() { + return this.key.get(); + } + + /** + * Sets the key used to activate this {@code KeyActivatedButton}. + * + * @param key The key used to activate this {@code KeyActivatedButton} + */ + public void setKey(Keyboard.Key key) { + this.key.set(key); + } + + /** + * Returns true if the button should be activated by key presses when invisible. + * @return true, if the button should be activated by key presses when invisible, otherwise false + */ + // This method should really be called "shouldActivateWhenInvisible" but the widget de-serialisation logic + // seems to require get* and set* method names to populate the bindings. + public boolean getActivateWhenInvisible() { + return activateWhenInvisible.get(); + } + + /** + * Sets if the button should be activated by key presses when invisible. + * @param value true, if the button should be activated by key presses when invisible, otherwise false + */ + public void setActivateWhenInvisible(boolean value) { + activateWhenInvisible.set(value); + } + + @Override + public boolean onKeyEvent(NUIKeyEvent event) { + if (event.getKey() == getKey()) { + if ((!isVisible() && !activateWhenInvisible.get()) || !isEnabled()) { + setActive(false); + return super.onKeyEvent(event); + } + + if (!event.isDown()) { + activateWidget(); + setActive(false); + } else { + setActive(true); + } + return true; + } + + return super.onKeyEvent(event); + } +} diff --git a/engine/src/main/java/org/destinationsol/ui/nui/widgets/UIWarnButton.java b/engine/src/main/java/org/destinationsol/ui/nui/widgets/UIWarnButton.java new file mode 100644 index 000000000..24b4c900c --- /dev/null +++ b/engine/src/main/java/org/destinationsol/ui/nui/widgets/UIWarnButton.java @@ -0,0 +1,87 @@ +/* + * Copyright 2021 The Terasology Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.destinationsol.ui.nui.widgets; + +import org.destinationsol.Const; +import org.joml.Math; +import org.terasology.nui.Canvas; +import org.terasology.nui.widgets.UIButton; + +/** + * A standard {@link UIButton} that has been adapted to use the {@link UIWarnButton#WARN_MODE} style mode + * when the user should be notified of an event e.g. a new item in their inventory. + */ +public class UIWarnButton extends KeyActivatedButton { + public static final String WARN_MODE = "warn"; + + // Warn colour code taken from SolInputManager + private static final int WARN_COUNTER_MAX = 2; + private static final float WARN_PERC_GROWTH_TIME = 1f; + private static final float WARN_PERC_MIN = 0f; + private static final float WARN_PERC_MAX = 1f; + + private int warnCounter = 0; + private float warnPercentage; + private boolean warnPercGrows; + private float warnAlpha = 1f; + + @Override + public void onDraw(Canvas canvas) { + if (warnCounter > 0) { + canvas.drawBackground(); + canvas.setMode(WARN_MODE); + canvas.setAlpha(warnAlpha); + canvas.drawBackground(); + canvas.setAlpha(1); + canvas.setMode(getMode()); + } else { + canvas.drawBackground(); + } + super.onDraw(canvas); + } + + @Override + public void update(float delta) { + super.update(delta); + + float dif = (warnPercGrows ? 1 : -1) * Const.REAL_TIME_STEP / WARN_PERC_GROWTH_TIME; + warnPercentage += dif; + if (warnPercentage < WARN_PERC_MIN || WARN_PERC_MAX < warnPercentage) { + warnPercentage = Math.clamp(WARN_PERC_MIN, WARN_PERC_MAX, warnPercentage); + warnPercGrows = !warnPercGrows; + } + warnAlpha = warnPercentage * .5f; + + if (warnCounter > 0) { + warnCounter--; + } + } + + /** + * Starts the "warn" phase of the button, causing it to pulsate briefly + * the colour specified for the mode {@link UIWarnButton#WARN_MODE}. + * + * This can be used to notify the user of an event, such as a new item that is now in their inventory. + */ + public void enableWarn() { + warnCounter = WARN_COUNTER_MAX; + } + + @Override + public boolean isSkinAppliedByCanvas() { + return false; + } +} diff --git a/engine/src/main/java/org/destinationsol/world/GalaxyBuilder.java b/engine/src/main/java/org/destinationsol/world/GalaxyBuilder.java new file mode 100644 index 000000000..95abd604a --- /dev/null +++ b/engine/src/main/java/org/destinationsol/world/GalaxyBuilder.java @@ -0,0 +1,216 @@ +/* + * Copyright 2021 The Terasology Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.destinationsol.world; + +import com.badlogic.gdx.math.Vector2; +import org.destinationsol.common.SolMath; +import org.destinationsol.common.SolRandom; +import org.destinationsol.game.context.Context; +import org.destinationsol.game.planet.SolarSystem; +import org.destinationsol.game.planet.SolarSystemConfigManager; +import org.destinationsol.modules.ModuleManager; +import org.destinationsol.world.generators.FeatureGenerator; +import org.destinationsol.world.generators.SolarSystemGenerator; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.lang.reflect.Modifier; +import java.util.ArrayList; +import java.util.List; + +/** + * This class is the starting point for world generation. When a new world is created, this class first retrieves + * all Generator classes and then initiates each SolarSystem's build process. Two types of world generation classes are + * retrieved: those that subclass SolarSystemGenerator and those that subclass FeatureGenerator. + */ +public class GalaxyBuilder { + public static final float MAX_ANGLE_WITHIN_WORLD = 180; + public static final float MAX_WORLD_RADIUS = 100_000; + private static final Logger logger = LoggerFactory.getLogger(GalaxyBuilder.class); + //These ArrayLists hold class types of any class which extends SolarSystemGenerator or FeatureGenerator, respectively + private ArrayList> solarSystemGeneratorTypes = new ArrayList<>(); + private ArrayList> featureGeneratorTypes = new ArrayList<>(); + private ArrayList activeSolarSystemGenerators = new ArrayList<>(); + //This ArrayList will hold the final SolarSystem objects that each SolarSystemGenerator will return + private ArrayList builtSolarSystems = new ArrayList<>(); + private Context context; + private ModuleManager moduleManager; + private SolarSystemConfigManager solarSystemConfigManager; + private final int numberOfSystems; + + public GalaxyBuilder(Context context, int numSystems) { + this.context = context; + this.moduleManager = context.get(ModuleManager.class); + this.solarSystemConfigManager = context.get(SolarSystemConfigManager.class); + solarSystemConfigManager.loadDefaultSolarSystemConfigs(); + numberOfSystems = numSystems; + + populateSolarSystemGeneratorList(); + populateFeatureGeneratorList(); + } + + /** + * This method uses reflection to retrieve all SolarSystemGenerator classes. They are added to the list + * of SolarSystemGenerators. + */ + private void populateSolarSystemGeneratorList() { + //It is necessary to use an iterator as getSubtypesOf() returns an Iterable + moduleManager.getEnvironment().getSubtypesOf(SolarSystemGenerator.class).iterator().forEachRemaining(solarSystemGeneratorTypes::add); + } + + /** + * This method uses reflection to retrieve all concrete FeatureGenerator classes. They are added to the list + * of FeatureGenerators. + */ + private void populateFeatureGeneratorList() { + + for (Class generator : moduleManager.getEnvironment().getSubtypesOf(FeatureGenerator.class)) { + if (!Modifier.isAbstract(generator.getModifiers())) { + featureGeneratorTypes.add(generator); + } + } + } + + /** + * This method builds the world using random types of SolarSystemGenerators. This is the default method of generating + * worlds in Destination: Sol. Each SolarSystem produced we be a random type of SolarSystem from among the generators + * available. + */ + public void buildWithRandomSolarSystemGenerators() { + activeSolarSystemGenerators.addAll(initializeRandomSolarSystemGenerators()); + positionSolarSystems(); + buildSolarSystems(); + } + + /** + * This method initializes the SolarSystemGenerators. How many generators are initialized depends on the number + * of SolarSystems the world is set to have. When there are multiple types of SolarSystemGenerators available, this + * method chooses randomly from the list of all generators to decide which to create. + *

    + * A Class variable is used in this method to allow new instances to be made of each type of available SolarSystemGenerator. + *

    + * This method calls setFeatureGenerators() on each SolarSystemGenerator to give each SolarSystem access to other + * FeatureGenerators (Planets, Mazes, etc.) so they can be initialized and incorporated into the SolarSystem. + */ + public ArrayList initializeRandomSolarSystemGenerators() { + ArrayList generatorArrayList = new ArrayList<>(); + for (int i = 0; i < numberOfSystems; i++) { + Class solarSystemGenerator = solarSystemGeneratorTypes.get(SolRandom.seededRandomInt(solarSystemGeneratorTypes.size())); + try { + SolarSystemGenerator generator = solarSystemGenerator.newInstance(); + generator.setContext(context); + generator.setFeatureGeneratorTypes(featureGeneratorTypes); + generator.setSolarSystemConfigManager(solarSystemConfigManager); + generator.setSolarSystemNumber(i); + generatorArrayList.add(generator); + } catch (Exception e) { + e.printStackTrace(); + } + } + return generatorArrayList; + } + + /** + * This method iterates through the loop of SolarSystemGenerators that have been initialized and assigns each of + * them a position in the world. + */ + private void positionSolarSystems() { + for (SolarSystemGenerator generator : activeSolarSystemGenerators) { + try { + calculateSolarSystemPosition(activeSolarSystemGenerators, generator, generator.getRadius()); + } catch (RuntimeException e) { + e.printStackTrace(); + } + + //Printout of generator position for testing (as these positions don't have a representation in the game yet) + logger.info(generator + " position: " + generator.getPosition().x + ", " + generator.getPosition().y); + } + } + + /** + * This method initiates the build process of each SolarSystemGenerator instance. + */ + private void buildSolarSystems() { + for (SolarSystemGenerator solarSystemGenerator : activeSolarSystemGenerators) { + builtSolarSystems.add(solarSystemGenerator.build()); + } + } + + /** + * This method runs a loop which tests 20 random angles at increasing radii starting from the center of the world + * and working outward until an open spot for the System is found. The tested spot is considered 'open' if placing + * a SolarSystem there will not cause it to overlap with any others. + * TODO Implement logic to allow system to be positioned within a particular annulus + */ + private void calculateSolarSystemPosition(List systems, SolarSystemGenerator solarSystemGenerator, float bodyRadius) throws RuntimeException { + Vector2 result = SolMath.getVec(); + float distance = 0; + float counter = 0; + + //This loop should find a position for the SolarSystem well before the counter reaches MAX_WORLD_RADIUS + while (counter < MAX_WORLD_RADIUS) { + //test 20 spots at each radius + for (int i = 0; i < 20; i++) { + calculateRandomWorldPositionAtDistance(result, distance); + //check for overlap with each SolarSystem which already has been placed + if (isPositionAvailable(systems, bodyRadius, result)) { + solarSystemGenerator.getPosition().add(result); + solarSystemGenerator.setPositioned(true); + SolMath.free(result); + return; + } + } + distance += SolarSystemGenerator.SUN_RADIUS; + counter++; + } + SolMath.free(result); + throw new RuntimeException("Could not find position for SolarSystem"); + } + + private boolean isPositionAvailable(List systems, float bodyRadius, Vector2 result) { + for (SolarSystemGenerator system : systems) { + if (system.getPositioned() && system.getPosition().dst(result) < system.getRadius() + bodyRadius) { + return false; + } + } + return true; + } + + private void calculateRandomWorldPositionAtDistance(Vector2 result, float distance) { + float angle = SolRandom.seededRandomFloat(MAX_ANGLE_WITHIN_WORLD); + SolMath.fromAl(result, angle, distance); + } + + public ArrayList> getSolarSystemGeneratorTypes() { + return solarSystemGeneratorTypes; + } + + public ArrayList getActiveSolarSystemGenerators() { + return activeSolarSystemGenerators; + } + + public ArrayList> getFeatureGeneratorTypes() { + return featureGeneratorTypes; + } + + public Context getContext() { + return context; + } + + public ArrayList getBuiltSolarSystems() { + return builtSolarSystems; + } +} diff --git a/engine/src/main/java/org/destinationsol/world/Orbital.java b/engine/src/main/java/org/destinationsol/world/Orbital.java new file mode 100644 index 000000000..a59828a05 --- /dev/null +++ b/engine/src/main/java/org/destinationsol/world/Orbital.java @@ -0,0 +1,83 @@ +/* + * Copyright 2021 The Terasology Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.destinationsol.world; + +import org.destinationsol.world.generators.FeatureGenerator; +import org.destinationsol.world.generators.MazeGenerator; +import org.destinationsol.world.generators.PlanetGenerator; + +import static org.destinationsol.world.generators.FeatureGenerator.ORBITAL_FEATURE_BUFFER; + +/** + * This class represents one 'ring' around a SolarSystem's center. It is used to keep track of what Features a SolarSystemGenerator + * should generate. It keeps track of where those Features will be placed, and whether or not a Feature has been chosen + * for a specific orbital. Each orbital has a width, which is the distance from the inner edge of the orbital to the + * outer edge. + */ +public class Orbital { + public static final float PLANET_ORBITAL_WIDTH = ORBITAL_FEATURE_BUFFER + PlanetGenerator.PLANET_MAX_DIAMETER + ORBITAL_FEATURE_BUFFER; + public static final float MAZE_ORBITAL_WIDTH = MazeGenerator.MAZE_BUFFER + MazeGenerator.MAX_MAZE_DIAMETER + MazeGenerator.MAZE_BUFFER; + + int positionInSolarSystem; + float width; + float startingDistanceFromSystemCenter; + FeatureGenerator featureGenerator; + + + public Orbital(int position) { + positionInSolarSystem = position; + } + + public void setPositionInSolarSystem(int positionInSolarSystem) { + this.positionInSolarSystem = positionInSolarSystem; + } + + public void setStartingDistanceFromSystemCenter(float startingDistanceFromSystemCenter) { + this.startingDistanceFromSystemCenter = startingDistanceFromSystemCenter; + } + + public void setWidth(float width) { + this.width = width; + } + + public void setFeatureGenerator(FeatureGenerator featureGenerator) { + this.featureGenerator = featureGenerator; + } + + public int getPositionInSolarSystem() { + return positionInSolarSystem; + } + + public float getStartingDistanceFromSystemCenter() { + return startingDistanceFromSystemCenter; + } + + public float getWidth() { + return width; + } + + public FeatureGenerator getFeatureGenerator() { + return featureGenerator; + } + + /** + * Each feature is placed in the center of the orbital ring, which is half of the orbitals width from the start + * @return distance from the center of the SolarSystem to place the Feature + */ + public float calculateDistanceFromCenterOfSystemForFeature() { + return getStartingDistanceFromSystemCenter() + (getWidth() / 2); + } +} diff --git a/engine/src/main/java/org/destinationsol/world/generators/BeltGenerator.java b/engine/src/main/java/org/destinationsol/world/generators/BeltGenerator.java new file mode 100644 index 000000000..b1ac4b231 --- /dev/null +++ b/engine/src/main/java/org/destinationsol/world/generators/BeltGenerator.java @@ -0,0 +1,138 @@ +/* + * Copyright 2021 The Terasology Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.destinationsol.world.generators; + +import org.destinationsol.game.ShipConfig; +import org.destinationsol.game.planet.BeltConfig; +import org.destinationsol.game.planet.BeltConfigManager; +import org.destinationsol.game.planet.SystemBelt; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * This class defines the general behavior for Belt generators (such as asteroid frequency). Any Belt will be + * created from a concrete implementation of this class, with behavior specific to that Belt defined there. + */ +public abstract class BeltGenerator extends FeatureGenerator { + /** This is the distance from the inner ring of the belt to the outer ring */ + protected static final float DEFAULT_BELT_HALF_WIDTH = 20f; + private static final float BELT_DEFAULT_FREQUENCY = .04f; + private static final Logger logger = LoggerFactory.getLogger(BeltGenerator.class); + + /** This delineates the distance that the center of the belt's width will be from the center of the SolarSystem. */ + private float distanceFromCenterOfSolarSystem; + private SystemBelt systemBelt; + private BeltConfigManager beltConfigManager; + private BeltConfig beltConfig; + private boolean isInFirstSolarSystem; + private float asteroidFrequency = BELT_DEFAULT_FREQUENCY; + + /** + * This method modifies how often asteroids will spawn within the belt. + * @param frequencyMultiplier factor by which to multiply asteroid frequency. Must be at least 0 + */ + protected void modifyBeltAsteroidFrequency(float frequencyMultiplier) { + if (frequencyMultiplier >= 0) { + asteroidFrequency *= frequencyMultiplier; + } else { + logger.error("Asteroid frequency cannot be negative."); + } + + } + + /** + * This method modifies how often inner belt enemies will spawn. + * @param frequencyMultiplier factor by which to multiply enemy frequency. Must be at least 0 + */ + protected void modifyInnerEnemiesFrequency(float frequencyMultiplier) { + if (frequencyMultiplier >= 0) { + for (ShipConfig shipConfig : beltConfig.innerTempEnemies) { + shipConfig.density *= frequencyMultiplier; + } + } else { + logger.error("Ship frequency cannot be negative"); + } + } + + /** + * This method modifies how often belt enemies will spawn. + * @param frequencyMultiplier factor by which to multiply enemy frequency. Must be at least 0 + */ + protected void modifyEnemiesFrequency(float frequencyMultiplier) { + if (frequencyMultiplier >= 0) { + + for (ShipConfig shipConfig : beltConfig.tempEnemies) { + shipConfig.density *= frequencyMultiplier; + } + } else { + logger.error("Ship frequency cannot be negative"); + } + } + + /** + * This method creates the SystemBelt object that is to be used by the game during play. This method should be called + * at the end of the build() method in any BeltGenerator implementation. + */ + protected void instantiateSystemBelt() { + systemBelt = new SystemBelt(getRadius(), getDistanceFromCenterOfSolarSystem(), getPosition(), getBeltConfig(), asteroidFrequency); + } + + + public float getDistanceFromCenterOfSolarSystem() { + return distanceFromCenterOfSolarSystem; + } + + public void setDistanceFromCenterOfSolarSystem(float distance) { + distanceFromCenterOfSolarSystem = distance; + } + + public float getAsteroidFrequency() { + return asteroidFrequency; + } + + public void setAsteroidFrequency(float asteroidFrequency) { + this.asteroidFrequency = asteroidFrequency; + } + + public BeltConfigManager getBeltConfigManager() { + return beltConfigManager; + } + + public void setBeltConfigManager(BeltConfigManager beltConfigManager) { + this.beltConfigManager = beltConfigManager; + } + + public BeltConfig getBeltConfig() { + return beltConfig; + } + + public void setBeltConfig(BeltConfig beltConfig) { + this.beltConfig = beltConfig; + } + + public SystemBelt getSystemBelt() { + return systemBelt; + } + + public boolean getIsInFirstSolarSystem() { + return isInFirstSolarSystem; + } + + public void setInFirstSolarSystem(boolean inFirstSolarSystem) { + isInFirstSolarSystem = inFirstSolarSystem; + } +} + diff --git a/engine/src/main/java/org/destinationsol/world/generators/BeltGeneratorImpl.java b/engine/src/main/java/org/destinationsol/world/generators/BeltGeneratorImpl.java new file mode 100644 index 000000000..86ea71b1d --- /dev/null +++ b/engine/src/main/java/org/destinationsol/world/generators/BeltGeneratorImpl.java @@ -0,0 +1,32 @@ +/* + * Copyright 2021 The Terasology Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.destinationsol.world.generators; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class BeltGeneratorImpl extends BeltGenerator { + private static final Logger logger = LoggerFactory.getLogger(BeltGeneratorImpl.class); + + @Override + public void build() { + setRadius(DEFAULT_BELT_HALF_WIDTH); + + setBeltConfig(getBeltConfigManager().getRandomBeltConfig(getIsInFirstSolarSystem())); + + instantiateSystemBelt(); + } +} diff --git a/engine/src/main/java/org/destinationsol/world/generators/DenseBeltGenerator.java b/engine/src/main/java/org/destinationsol/world/generators/DenseBeltGenerator.java new file mode 100644 index 000000000..2d9839c37 --- /dev/null +++ b/engine/src/main/java/org/destinationsol/world/generators/DenseBeltGenerator.java @@ -0,0 +1,35 @@ +/* + * Copyright 2021 The Terasology Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.destinationsol.world.generators; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class DenseBeltGenerator extends BeltGenerator { + private static final Logger logger = LoggerFactory.getLogger(DenseBeltGenerator.class); + + @Override + public void build() { + setRadius(DEFAULT_BELT_HALF_WIDTH * 1.3f); + + setBeltConfig(getBeltConfigManager().getRandomBeltConfig(getIsInFirstSolarSystem())); + + modifyBeltAsteroidFrequency(5f); + modifyInnerEnemiesFrequency(2f); + + instantiateSystemBelt(); + } +} diff --git a/engine/src/main/java/org/destinationsol/world/generators/FeatureGenerator.java b/engine/src/main/java/org/destinationsol/world/generators/FeatureGenerator.java new file mode 100644 index 000000000..63259dca4 --- /dev/null +++ b/engine/src/main/java/org/destinationsol/world/generators/FeatureGenerator.java @@ -0,0 +1,72 @@ +/* + * Copyright 2021 The Terasology Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.destinationsol.world.generators; + +import com.badlogic.gdx.math.Vector2; +import org.destinationsol.world.Orbital; + +/** + * This class represents the abstract version of any feature which will populate the game's SolarSystems, such as Planets, + * Mazes, or anything else which a user may wish to implement. Extend this class with a concrete class to create a + * general Feature, or extend the child {@link PlanetGenerator} or {@link MazeGenerator} classes to create custom + * versions of those elements. +*/ +public abstract class FeatureGenerator { + public static final float ORBITAL_FEATURE_BUFFER = 8f; + private Vector2 position = new Vector2(); + private float radius; + private boolean positioned; + private Orbital orbital; + + public abstract void build(); + + public void setPosition(Vector2 position) { + this.position.set(position); + setPositioned(true); + } + + public Vector2 getPosition() { + return position; + } + + public void setRadius(float radius) { + this.radius = radius; + } + + public float getRadius() { + return radius; + } + + public void setPositioned(boolean positioned) { + this.positioned = positioned; + } + + public boolean getPositioned() { + return positioned; + } + + public void setOrbital(Orbital orbital) { + this.orbital = orbital; + } + + public Orbital getOrbital() { + return orbital; + } + + public float getDiameter() { + return 2 * radius; + } +} diff --git a/engine/src/main/java/org/destinationsol/world/generators/LargeSolarSystemGenerator.java b/engine/src/main/java/org/destinationsol/world/generators/LargeSolarSystemGenerator.java new file mode 100644 index 000000000..f85f58b1d --- /dev/null +++ b/engine/src/main/java/org/destinationsol/world/generators/LargeSolarSystemGenerator.java @@ -0,0 +1,45 @@ +/* + * Copyright 2021 The Terasology Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.destinationsol.world.generators; + +import org.destinationsol.common.SolRandom; +import org.destinationsol.game.planet.SolarSystem; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class LargeSolarSystemGenerator extends SolarSystemGenerator { + @Override + public SolarSystem build() { + getSolarSystemConfigManager().loadDefaultSolarSystemConfigs(); + setSolarSystemConfigUsingDefault(); + setName(SolRandom.seededRandomElement(getDefaultSolarSystemNames())); + initializeRandomDefaultFeatureGenerators(.8f); + calculateFeaturePositions(); + buildFeatureGenerators(); + + return createInstantiatedSolarSystem(); + } + + @Override + public SolarSystemSize getSolarSystemSize() { + return SolarSystemSize.LARGE; + } + + @Override + public int getCustomFeaturesCount() { + return 0; + } +} diff --git a/engine/src/main/java/org/destinationsol/world/generators/MazeGenerator.java b/engine/src/main/java/org/destinationsol/world/generators/MazeGenerator.java new file mode 100644 index 000000000..efa02c4ba --- /dev/null +++ b/engine/src/main/java/org/destinationsol/world/generators/MazeGenerator.java @@ -0,0 +1,138 @@ +/* + * Copyright 2021 The Terasology Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.destinationsol.world.generators; + +import org.destinationsol.common.SolRandom; +import org.destinationsol.game.ShipConfig; +import org.destinationsol.game.maze.Maze; +import org.destinationsol.game.maze.MazeConfig; +import org.destinationsol.game.maze.MazeConfigManager; +import org.destinationsol.game.maze.MazeLayout; +import org.destinationsol.game.maze.MazeLayoutManager; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * This class defines the general behavior for Maze generators (such as having a layout, or a radius). Any Maze will be + * created from a concrete implementation of this class, with behavior specific to that Maze defined there. + */ +public abstract class MazeGenerator extends FeatureGenerator { + protected static final float MAX_MAZE_RADIUS = 40f; + private static final Logger logger = LoggerFactory.getLogger(MazeGenerator.class); + public static final float MAX_MAZE_DIAMETER = 80f; + public static final float MAZE_BUFFER = 10f; + private MazeConfigManager mazeConfigManager; + private MazeConfig mazeConfig; + private Maze maze; + private MazeLayoutManager mazeLayoutManager = new MazeLayoutManager(); + private MazeLayout mazeLayout; + private boolean hasSetLayout; + + /** + * This method modifies how often inner maze enemies will spawn. + * @param frequencyMultiplier factor by which to multiply enemy frequency. Must be at least 0. + */ + protected void modifyInnerEnemiesFrequency(float frequencyMultiplier) { + if (frequencyMultiplier >= 0) { + for (ShipConfig shipConfig : mazeConfig.innerEnemies) { + shipConfig.density *= frequencyMultiplier; + } + } else { + logger.error("Ship frequency cannot be negative"); + } + } + + /** + * This method modifies how often outer maze enemies will spawn. + * @param frequencyMultiplier factor by which to multiply enemy frequency. Must be at least 0. + */ + protected void modifyOuterEnemiesFrequency(float frequencyMultiplier) { + if (frequencyMultiplier >= 0) { + for (ShipConfig shipConfig : mazeConfig.outerEnemies) { + shipConfig.density *= frequencyMultiplier; + } + } else { + logger.error("Ship frequency cannot be negative"); + } + } + + /** + * This method modifies how often maze bosses will spawn. + * @param frequencyMultiplier factor by which to multiply enemy frequency. Must be at least 0. + */ + protected void modifyBossFrequency(float frequencyMultiplier) { + if (frequencyMultiplier >= 0) { + for (ShipConfig shipConfig : mazeConfig.bosses) { + shipConfig.density *= frequencyMultiplier; + } + } else { + logger.error("Ship frequency cannot be negative"); + } + } + + public void setMazeConfig(MazeConfig mazeConfig) { + this.mazeConfig = mazeConfig; + } + + public MazeConfig getMazeConfig() { + return mazeConfig; + } + + public MazeConfig getRandomMazeConfig() { + return SolRandom.seededRandomElement(mazeConfigManager.configs); + } + + /** + * This method creates the Maze object that is to be used by the game during play. This method should be called + * at the end of the build() method in any MazeGenerator implementation. + */ + protected void instantiateMaze() { + if (layoutIsSet()) { + maze = new Maze(getMazeConfig(), getPosition(), getRadius(), getMazeLayout()); + } else { + maze = new Maze(getMazeConfig(), getPosition(), getRadius()); + } + } + + public void setMazeConfigManager(MazeConfigManager mazeConfigManager) { + this.mazeConfigManager = mazeConfigManager; + } + + public Maze getMaze() { + return maze; + } + + protected MazeLayoutManager getMazeLayoutManager() { + return mazeLayoutManager; + } + + protected float calculateDefaultMazeSize() { + return SolRandom.seededRandomFloat(.7f, 1) * MAX_MAZE_RADIUS; + } + + protected void setMazeLayout(MazeLayout mazeLayout) { + this.mazeLayout = mazeLayout; + hasSetLayout = true; + } + + public MazeLayout getMazeLayout() { + return mazeLayout; + } + + protected boolean layoutIsSet() { + return hasSetLayout; + } +} diff --git a/engine/src/main/java/org/destinationsol/world/generators/MazeGeneratorImpl.java b/engine/src/main/java/org/destinationsol/world/generators/MazeGeneratorImpl.java new file mode 100644 index 000000000..cb669b609 --- /dev/null +++ b/engine/src/main/java/org/destinationsol/world/generators/MazeGeneratorImpl.java @@ -0,0 +1,31 @@ +/* + * Copyright 2021 The Terasology Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.destinationsol.world.generators; + +/** + * This class is a concrete implementation of a MazeGenerator and handles its creation. This class defines the + * behavior specific to the default Mazes in Destination: Sol. + */ +public class MazeGeneratorImpl extends MazeGenerator { + + @Override + public void build() { + setRadius(calculateDefaultMazeSize()); + setMazeConfig(getRandomMazeConfig()); + + instantiateMaze(); + } +} diff --git a/engine/src/main/java/org/destinationsol/world/generators/PlanetGenerator.java b/engine/src/main/java/org/destinationsol/world/generators/PlanetGenerator.java new file mode 100644 index 000000000..095a9d132 --- /dev/null +++ b/engine/src/main/java/org/destinationsol/world/generators/PlanetGenerator.java @@ -0,0 +1,377 @@ +/* + * Copyright 2021 The Terasology Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.destinationsol.world.generators; + +import com.badlogic.gdx.math.Vector2; +import org.destinationsol.common.SolMath; +import org.destinationsol.common.SolRandom; +import org.destinationsol.game.ShipConfig; +import org.destinationsol.game.SolNames; +import org.destinationsol.game.planet.DecoConfig; +import org.destinationsol.game.planet.Planet; +import org.destinationsol.game.planet.PlanetConfig; +import org.destinationsol.game.planet.PlanetConfigManager; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.List; + +/** + * This class defines the general behavior for Planet generators (such as ground, sky, gravity, etc). Any Planet will be + * created from a concrete implementation of this class, with behavior specific to that Planet defined there. + */ +public abstract class PlanetGenerator extends FeatureGenerator { + public static final float PLANET_MAX_DIAMETER = 78f; + public static final float PLANET_SPEED = .2f; + public static final float PLANET_GROUND_SPEED = .2f; + protected static final float DEFAULT_MAX_GROUND_HEIGHT = 25f; + protected static final float DEFAULT_ATMOSPHERE_HEIGHT = 14f; + private static final Logger logger = LoggerFactory.getLogger(PlanetGenerator.class); + protected SolNames solNames = new SolNames(); + private Planet planet; + private Vector2 solarSystemPosition = new Vector2(); + private String name; + private boolean isInFirstSolarSystem; + private boolean isInnerPlanet; + private PlanetConfig planetConfig; + private float groundHeight; + //distance from ground of planet to atmosphere + private float atmosphereHeight; + private float angleInSolarSystem; + private float distanceFromSolarSystemCenter; + private float initialPlanetAngle; + //This is the speed the Planet orbits around the SolarSystem at + private float orbitSolarSystemSpeed; + //This is the speed the Planet spins around it's axis at + private float planetRotationSpeed; + + private PlanetConfigManager planetConfigManager; + + /** + * This method sets the Planet variable for the PlanetGenerator. It should be called at the end of the build() method, + * after the settings of the planet have been set. This Planet be used after the world-gen phase in the runtime code. + */ + protected void instantiatePlanet() { + planet = new Planet(getSolarSystemPosition(), getAngleInSolarSystem(), getDistanceFromSolarSystemCenter(), + getInitialPlanetAngle(), orbitSolarSystemSpeed, planetRotationSpeed, getGroundHeight(), + false, getPlanetConfig(), name); + } + + /** + * This returns a PlanetConfig using logic to determine Planet difficulty. + * @return the PlanetConfig with the correct difficulty + */ + protected PlanetConfig getPlanetConfigDefaultSettings() { + return getPlanetConfigManager().getRandom(!getIsInnerPlanet() && getIsInFirstSolarSystem(), + getIsInnerPlanet() && !getIsInFirstSolarSystem()); + } + + /** + * This calculates the proper speed for a planet to orbit around the center of the SolarSystem. It is randomized + * slightly, so not all planets orbit at the same speed. + * @return float representing orbit speed + */ + protected float calculateDefaultPlanetOrbitSpeed() { + return SolMath.arcToAngle(PLANET_SPEED, getDistanceFromSolarSystemCenter()) * SolMath.toInt(SolRandom.seededTest(.5f)); + } + + /** + * This calculates the proper speed for a planet to rotate around its axis. It is randomized slightly, so not all + * planets rotate at the same speed. + * @return float representing rotation speed + */ + protected float calculateDefaultPlanetRotationSpeed() { + return SolMath.arcToAngle(PLANET_GROUND_SPEED, getGroundHeight()) * SolMath.toInt(SolRandom.seededTest(.5f)); + } + + /** + * This method modifies the density of low orbit ships that generate on the Planet. The density represents how + * frequently the ships spawn + * @param densityMultiplier amount by which the current density should be multiplied. Must be at least 0 + */ + protected void modifyLowOrbitShipsDensity(float densityMultiplier) { + if (densityMultiplier >= 0) { + for (ShipConfig shipConfig : getPlanetConfig().lowOrbitEnemies) { + shipConfig.density *= densityMultiplier; + } + } else { + logger.error("Ship density multiplier must be at least 0"); + } + } + + /** + * This method modifies the density of high orbit ships that generate on the Planet. The density represents how + * frequently the ships spawn + * @param densityMultiplier amount by which the current density should be multiplied. Must be at least 0 + */ + protected void modifyHighOrbitShipsDensity(float densityMultiplier) { + if (densityMultiplier >= 0) { + for (ShipConfig shipConfig : getPlanetConfig().highOrbitEnemies) { + shipConfig.density *= densityMultiplier; + } + } else { + logger.error("Ship density multiplier must be at least 0"); + } + } + + /** + * This method modifies the density of ground enemies (turrets) that generate on the Planet. The density represents how + * frequently the turrets spawn + * @param densityMultiplier amount by which the current density should be multiplied. Must be at least 0 + */ + protected void modifyGroundEnemiesDensity(float densityMultiplier) { + if (densityMultiplier >= 0) { + for (ShipConfig shipConfig : getPlanetConfig().groundEnemies) { + shipConfig.density *= densityMultiplier; + } + } else { + logger.error("Ship density multiplier must be at least 0"); + } + } + + /** + * This method modifies the percentage of the atmosphere at which low orbit ships start spawning. + * @param atmospherePercentageMultiplier amount by which the current atmosphere percentage should be multiplied + */ + protected void modifyLowOrbitShipsAtmospherePercentage(float atmospherePercentageMultiplier) { + getPlanetConfig().lowOrbitalEnemiesBuilder.setAtmospherePercentage( + getPlanetConfig().lowOrbitalEnemiesBuilder.getAtmospherePercentage() * atmospherePercentageMultiplier); + } + + /** + * This method modifies the percentage of the atmosphere at which high orbit ships start spawning. + * @param atmospherePercentageMultiplier amount by which the current atmosphere percentage should be multiplied + */ + protected void modifyHighOrbitShipsAtmospherePercentage(float atmospherePercentageMultiplier) { + getPlanetConfig().highOrbitalEnemiesBuilder.setAtmospherePercentage( + getPlanetConfig().highOrbitalEnemiesBuilder.getAtmospherePercentage() * atmospherePercentageMultiplier); + } + + /** + * This method modifies the distance from which low orbit ships will detect a player + * @param detectionDistanceMultiplier amount by which the current detection distance should be multiplied + */ + protected void modifyLowOrbitShipsDetectionDistance(float detectionDistanceMultiplier) { + getPlanetConfig().lowOrbitalEnemiesBuilder.setDetectionDistance( + getPlanetConfig().lowOrbitalEnemiesBuilder.getDetectionDistance() * detectionDistanceMultiplier); + } + + /** + * This method modifies the distance from which high orbit ships will detect a player + * @param detectionDistanceMultiplier amount by which the current detection distance should be multiplied + */ + protected void modifyHighOrbitShipsDetectionDistance(float detectionDistanceMultiplier) { + getPlanetConfig().highOrbitalEnemiesBuilder.setDetectionDistance( + getPlanetConfig().highOrbitalEnemiesBuilder.getDetectionDistance() * detectionDistanceMultiplier); + } + + /** + * This method modifies the density of clouds that generate above the Planet. The density represents how + * frequently the clouds spawn + * @param cloudDensityMultiplier amount by which the current density should be multiplied. Must be at least 0 + */ + protected void modifyCloudDensity(float cloudDensityMultiplier) { + if (cloudDensityMultiplier >= 0) { + getPlanetConfig().cloudBuilder.setCloudDensity( + getPlanetConfig().cloudBuilder.getCloudDensity() * cloudDensityMultiplier); + } else { + logger.error("Cloud density multiplier must be at least 0"); + } + } + + /** + * This method modifies the percentage of the atmosphere at which clouds start spawning. + * @param startingAtmospherePercentage the height at which clouds should start spawning + */ + protected void setCloudsStartingAtmospherePercentage(float startingAtmospherePercentage) { + if (startingAtmospherePercentage >= 0 && startingAtmospherePercentage < 1) { + getPlanetConfig().cloudBuilder.setAtmosphereStartingPercentage(startingAtmospherePercentage); + } else { + logger.error("Starting atmosphere percentage for clouds must be at least 0 and less than 1"); + } + } + + /** + * This method modifies the percentage of the atmosphere at which clouds stop spawning. + * @param endingAtmospherePercentage the height at which clouds should stop spawning + */ + protected void setCloudsEndingAtmospherePercentage(float endingAtmospherePercentage) { + if (endingAtmospherePercentage >= 0 && endingAtmospherePercentage < 1) { + getPlanetConfig().cloudBuilder.setAtmosphereEndingPercentage(endingAtmospherePercentage); + } else { + logger.error("Ending atmosphere percentage for clouds must be at least 0 and less than 1"); + } + } + + /** + * This method sets the smallest width that a cloud should spawn with, in terms of percentage of the + * default width. + * @param startingWidthPercentage the lowest percentage width a cloud will spawn with + */ + protected void setCloudsWidthStartingPercentage(float startingWidthPercentage) { + if (startingWidthPercentage >= 0) { + getPlanetConfig().cloudBuilder.setCloudWidthStartingPercentage(startingWidthPercentage); + } else { + logger.error("Starting width percentage for clouds must be at least 0"); + } + } + + /** + * This method sets the largest width that a cloud should spawn with, in terms of percentage of the + * default width. + * @param endingWidthPercentage the largest percentage width a cloud will spawn with + */ + protected void setCloudsWidthEndingPercentage(float endingWidthPercentage) { + if (endingWidthPercentage >= 0) { + getPlanetConfig().cloudBuilder.setCloudWidthEndingPercentage(endingWidthPercentage); + } else { + logger.error("Ending width percentage for clouds must be at least 0"); + } + } + + /** + * This allows access to the decoration config files of the Planet. Modifying these allows for changing the look + * of decorations without making an entire new Planet config + * @return the Planet's decoration config list + */ + protected List getDecorationConfigs() { + return planetConfig.deco; + } + + public float getGroundHeightUsingDefault() { + return SolRandom.seededRandomFloat(.5f, 1) * DEFAULT_MAX_GROUND_HEIGHT; + } + + public void setAtmosphereHeight(float atmosphereHeight) { + this.atmosphereHeight = atmosphereHeight; + } + + public float getAtmosphereHeight() { + return atmosphereHeight; + } + + public void setGroundHeight(float groundHeight) { + this.groundHeight = groundHeight; + } + + public float getGroundHeight() { + return groundHeight; + } + + protected void calculateRadius() { + setRadius(getGroundHeight() + getAtmosphereHeight()); + } + + public void setAngleInSolarSystem(float angleInSolarSystem) { + this.angleInSolarSystem = angleInSolarSystem; + } + + public float getAngleInSolarSystem() { + return angleInSolarSystem; + } + + public void setDistanceFromSolarSystemCenter(float distanceFromSolarSystemCenter) { + this.distanceFromSolarSystemCenter = distanceFromSolarSystemCenter; + } + + public float getDistanceFromSolarSystemCenter() { + return distanceFromSolarSystemCenter; + } + + public void setPlanetConfig(PlanetConfig planetConfig) { + this.planetConfig = planetConfig; + } + + public PlanetConfig getPlanetConfig() { + return planetConfig; + } + + public PlanetConfigManager getPlanetConfigManager() { + return planetConfigManager; + } + + public void setPlanetConfigManager(PlanetConfigManager planetConfigManager) { + this.planetConfigManager = planetConfigManager; + } + + public void setIsInFirstSolarSystem(boolean isInfirstSolarSystem) { + this.isInFirstSolarSystem = isInfirstSolarSystem; + } + + public boolean getIsInFirstSolarSystem() { + return isInFirstSolarSystem; + } + + public void setIsInnerPlanet(boolean isInnerPlanet) { + this.isInnerPlanet = isInnerPlanet; + } + + public boolean getIsInnerPlanet() { + return isInnerPlanet; + } + + public void setInitialPlanetAngle(float initialPlanetAngle) { + this.initialPlanetAngle = initialPlanetAngle; + } + + public float getInitialPlanetAngle() { + return initialPlanetAngle; + } + + public Vector2 getSolarSystemPosition() { + return solarSystemPosition; + } + + public void setSolarSystemPosition(Vector2 solarSystemPosition) { + this.solarSystemPosition.set(solarSystemPosition); + } + + /** + * Sets the speed the planet will rotate around its axis. + * @param planetRotationSpeed rotation speed + */ + public void setPlanetRotationSpeed(float planetRotationSpeed) { + this.planetRotationSpeed = planetRotationSpeed; + } + + public float getPlanetRotationSpeed() { + return planetRotationSpeed; + } + + /** + * Sets the speed the planet will orbit around the center of the SolarSystem. + * @param orbitSolarSystemSpeed orbit speed + */ + public void setOrbitSolarSystemSpeed(float orbitSolarSystemSpeed) { + this.orbitSolarSystemSpeed = orbitSolarSystemSpeed; + } + + public float getOrbitSolarSystemSpeed() { + return orbitSolarSystemSpeed; + } + + public void setName(String name) { + this.name = name; + } + + public String getName() { + return name; + } + + public Planet getPlanet() { + return planet; + } +} diff --git a/engine/src/main/java/org/destinationsol/world/generators/PlanetGeneratorImpl.java b/engine/src/main/java/org/destinationsol/world/generators/PlanetGeneratorImpl.java new file mode 100644 index 000000000..9980b3eeb --- /dev/null +++ b/engine/src/main/java/org/destinationsol/world/generators/PlanetGeneratorImpl.java @@ -0,0 +1,43 @@ +/* + * Copyright 2021 The Terasology Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.destinationsol.world.generators; + +import org.destinationsol.common.SolRandom; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * This class is a concrete implementation of a PlanetGenerator and handles its creation. This class defines the + * behavior specific to the default Planets of Destination: Sol. + */ +public class PlanetGeneratorImpl extends PlanetGenerator { + + @Override + public void build() { + //sets the PlanetConfig for either an easy, medium, or hard planet. + setPlanetConfig(getPlanetConfigDefaultSettings()); + + setGroundHeight(getGroundHeightUsingDefault()); + setAtmosphereHeight(DEFAULT_ATMOSPHERE_HEIGHT); + calculateRadius(); + + setOrbitSolarSystemSpeed(calculateDefaultPlanetOrbitSpeed()); + setPlanetRotationSpeed(calculateDefaultPlanetRotationSpeed()); + setName(SolRandom.seededRandomElement(solNames.planets.get(getPlanetConfig().moduleName))); + + instantiatePlanet(); + } +} diff --git a/engine/src/main/java/org/destinationsol/world/generators/SmallMazeGenerator.java b/engine/src/main/java/org/destinationsol/world/generators/SmallMazeGenerator.java new file mode 100644 index 000000000..d5ad74bab --- /dev/null +++ b/engine/src/main/java/org/destinationsol/world/generators/SmallMazeGenerator.java @@ -0,0 +1,28 @@ +/* + * Copyright 2021 The Terasology Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.destinationsol.world.generators; + +public class SmallMazeGenerator extends MazeGenerator { + + @Override + public void build() { + setRadius(calculateDefaultMazeSize() * 0.6f); + setMazeConfig(getRandomMazeConfig()); + + modifyOuterEnemiesFrequency(1.21f); + instantiateMaze(); + } +} diff --git a/engine/src/main/java/org/destinationsol/world/generators/SmallPlanetGenerator.java b/engine/src/main/java/org/destinationsol/world/generators/SmallPlanetGenerator.java new file mode 100644 index 000000000..14491687c --- /dev/null +++ b/engine/src/main/java/org/destinationsol/world/generators/SmallPlanetGenerator.java @@ -0,0 +1,50 @@ +/* + * Copyright 2021 The Terasology Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.destinationsol.world.generators; + +import org.destinationsol.common.SolRandom; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * This class is a concrete implementation of a PlanetGenerator and handles preparing a Planet to be built. + * This class creates planets that are similar to the default Planets of Destination: Sol, but smaller, + * with different clouds, turrets, and more high orbit enemies. + */ +public class SmallPlanetGenerator extends PlanetGenerator { + + @Override + public void build() { + //sets the PlanetConfig for either an easy, medium, or hard planet. + setPlanetConfig(getPlanetConfigDefaultSettings()); + + setGroundHeight(getGroundHeightUsingDefault() * .6f); + setAtmosphereHeight(DEFAULT_ATMOSPHERE_HEIGHT); + calculateRadius(); + + setOrbitSolarSystemSpeed(calculateDefaultPlanetOrbitSpeed()); + setPlanetRotationSpeed(calculateDefaultPlanetRotationSpeed()); + setName(SolRandom.seededRandomElement(solNames.planets.get(getPlanetConfig().moduleName))); + + modifyCloudDensity(1.4f); + modifyHighOrbitShipsDensity(1.35f); + setCloudsStartingAtmospherePercentage(0.25f); + setCloudsEndingAtmospherePercentage(0.8f); + setCloudsWidthEndingPercentage(3f); + modifyGroundEnemiesDensity(1.2f); + instantiatePlanet(); + } +} diff --git a/engine/src/main/java/org/destinationsol/world/generators/SolarSystemGenerator.java b/engine/src/main/java/org/destinationsol/world/generators/SolarSystemGenerator.java new file mode 100644 index 000000000..d94c315e9 --- /dev/null +++ b/engine/src/main/java/org/destinationsol/world/generators/SolarSystemGenerator.java @@ -0,0 +1,573 @@ +/* + * Copyright 2021 The Terasology Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.destinationsol.world.generators; + +import com.badlogic.gdx.math.Vector2; +import org.destinationsol.Const; +import org.destinationsol.common.SolMath; +import org.destinationsol.common.SolRandom; +import org.destinationsol.game.SolNames; +import org.destinationsol.game.context.Context; +import org.destinationsol.game.maze.Maze; +import org.destinationsol.game.maze.MazeConfigManager; +import org.destinationsol.game.planet.BeltConfigManager; +import org.destinationsol.game.planet.Planet; +import org.destinationsol.game.planet.PlanetConfigManager; +import org.destinationsol.game.planet.SolarSystem; +import org.destinationsol.game.planet.SolarSystemConfig; +import org.destinationsol.game.planet.SolarSystemConfigManager; +import org.destinationsol.game.planet.SystemBelt; +import org.destinationsol.world.Orbital; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.ArrayList; +import java.util.List; + +/** + * This class defines the general behavior for Planet generators (such as belts, radius etc). Any SolarSystem in the game + * will be created from a concrete implementation of this class, with its specific implementation defined there. + * Every SolarSystem is given access to all the available FeatureGenerators (PlanetGenerators, MazeGenerators, etc). + * Particular implementations can decide which of those FeatureGenerators will be used to populate the SolarSystem. + */ +public abstract class SolarSystemGenerator { + public static final float MAX_ANGLE_IN_SYSTEM = 180; + public static final float SUN_RADIUS = 2f * (Const.MAX_GROUND_HEIGHT + Const.ATM_HEIGHT); + private static final Logger logger = LoggerFactory.getLogger(SolarSystemGenerator.class); + + /** + * This enum represents the three available sizes of SolarSystems. They can have either 3, 5, or 7 orbital objects + */ + public enum SolarSystemSize { + SMALL(3), MEDIUM(5), LARGE(7); + + private final int numberOfOrbitals; + + SolarSystemSize(int orbitals) { + numberOfOrbitals = orbitals; + } + + public int getNumberOfOrbitals() { + return numberOfOrbitals; + } + } + + //This field is protected to allow subclasses to access it + protected ArrayList> featureGeneratorTypes = new ArrayList<>(); + ArrayList activeFeatureGenerators = new ArrayList<>(); + ArrayList solarSystemOrbitals = new ArrayList<>(); + Context context; + //This class is included to give access to the game's default names if desired + protected SolNames solNames = new SolNames(); + private SolarSystemConfigManager solarSystemConfigManager; + private SolarSystemConfig solarSystemConfig; + private SolarSystemSize solarSystemSize; + private Vector2 position = new Vector2(); + private String name; + private float radius; + private boolean positioned; + private int solarSystemNumber; + private int planetCount; + private int possibleBeltCount; + private int mazeCount; + private int customFeaturesCount; + + public SolarSystemGenerator() { + solarSystemSize = getSolarSystemSize(); + + //There cannot be more custom features than orbitals available + if (customFeaturesCount < solarSystemSize.getNumberOfOrbitals()) { + customFeaturesCount = getCustomFeaturesCount(); + } else { + customFeaturesCount = solarSystemSize.getNumberOfOrbitals(); + } + + if (solarSystemSize.equals(SolarSystemSize.SMALL) || solarSystemSize.equals(SolarSystemSize.MEDIUM)) { + //Custom Features will replace planets, depending on how many are being used + planetCount = solarSystemSize.getNumberOfOrbitals() - getCustomFeaturesCount(); + possibleBeltCount = 1; + mazeCount = 2; + } else { + planetCount = solarSystemSize.getNumberOfOrbitals() - getCustomFeaturesCount(); + possibleBeltCount = 2; + mazeCount = 3; + } + + for (int i = 0; i < solarSystemSize.getNumberOfOrbitals(); i++) { + solarSystemOrbitals.add(new Orbital(i)); + } + sizeSolarSystemOrbitals(); + this.radius = calculateSolarSystemRadius(); + } + + /** + * This method determines the width of each Orbital in the SolarSystem. It also determines how far away each Orbital + * will be from the center of the SolarSystem + */ + private void sizeSolarSystemOrbitals() { + float distanceFromSolarSystemCenter = SUN_RADIUS; + for (Orbital solarSystemOrbital : solarSystemOrbitals) { + solarSystemOrbital.setStartingDistanceFromSystemCenter(distanceFromSolarSystemCenter); + solarSystemOrbital.setWidth(Orbital.PLANET_ORBITAL_WIDTH); + distanceFromSolarSystemCenter += solarSystemOrbital.getWidth(); + } + //An extra Orbital is added to represent the Mazes + solarSystemOrbitals.add(new Orbital(solarSystemOrbitals.size())); + solarSystemOrbitals.get(solarSystemOrbitals.size() - 1).setStartingDistanceFromSystemCenter(distanceFromSolarSystemCenter); + solarSystemOrbitals.get(solarSystemOrbitals.size() - 1).setWidth(Orbital.MAZE_ORBITAL_WIDTH); + } + + /** + * This method is intended to first set up the SolarSystem during world generation and then initialize all the + * FeatureGenerators of that SolarSystem + */ + public abstract SolarSystem build(); + + /** + * This should be implemented so that SolarSystemGenerator implementations can choose what size SolarSystem to generate. + * The options are Small (3 orbital objects), Medium (5 orbital objects), and Large (7 orbital objects) + * + * @return size of the solar system (SolarSystemSize enum type) + */ + public abstract SolarSystemSize getSolarSystemSize(); + + /** + * Override this method to tell the GalaxyBuilder how many non-default Features you want your SolarSystem to generate. + * + * @return number of custom features + */ + public abstract int getCustomFeaturesCount(); + + /** + * This method calculates the radius for this SolarSystem. It uses the Features that are included in this system + * to determine what the radius should be. + */ + protected float calculateSolarSystemRadius() { + float solarSystemRadius = SUN_RADIUS; + for (Orbital orbital : solarSystemOrbitals) { + solarSystemRadius += orbital.getWidth(); + logger.info("Orbital " + orbital.getPositionInSolarSystem() + ", distance: " + orbital.getStartingDistanceFromSystemCenter() + ", width: " + orbital.getWidth()); + } + return solarSystemRadius; + } + + /** + * This places mazes within the outer orbital of the solar system. It checks to make sure they are placed at least 15 + * degrees apart so they do not overlap + */ + private void calculateMazePositions() { + for (FeatureGenerator generator : activeFeatureGenerators) { + Vector2 result = SolMath.getVec(); + List usedAnglesInSolarSystem = new ArrayList<>(); + if (MazeGenerator.class.isAssignableFrom(generator.getClass())) { + //set the outermost orbital to have a MazeGenerator + solarSystemOrbitals.get(solarSystemOrbitals.size() - 1).setFeatureGenerator(generator); + float angle = SolRandom.seededRandomFloat(MAX_ANGLE_IN_SYSTEM); + float distanceToPutMaze = (solarSystemOrbitals.get(solarSystemOrbitals.size() - 1).calculateDistanceFromCenterOfSystemForFeature() + + getRadius()) / 2; + SolMath.fromAl(result, angle, distanceToPutMaze); + if (isGoodAngle(angle, usedAnglesInSolarSystem, 15)) { + result = result.add(position); + generator.setPosition(result); + usedAnglesInSolarSystem.add(angle); + } + } + SolMath.free(result); + } + } + + /** + * This method goes through every active PlanetGenerator and assigns a position to it in the SolarSystem. That + * position will be based of a random starting angle in the system, which is generated by the PlanetGenerator. It adds + * a small gap between the orbit of each planet, so they do not touch. The width of each orbit is based on the Planet's + * radius, which is determined by the PlanetGenerator. + */ + private void calculatePlanetPositions() { + int orbitalPosition = 0; + for (FeatureGenerator featureGenerator : activeFeatureGenerators) { + Vector2 result = SolMath.getVec(); + if (PlanetGenerator.class.isAssignableFrom(featureGenerator.getClass())) { + PlanetGenerator generator = (PlanetGenerator) featureGenerator; + Orbital orbital = solarSystemOrbitals.get(orbitalPosition); + orbital.setFeatureGenerator(generator); + + generator.setAngleInSolarSystem(SolRandom.seededRandomFloat(MAX_ANGLE_IN_SYSTEM)); + generator.setInitialPlanetAngle(SolRandom.seededRandomFloat(MAX_ANGLE_IN_SYSTEM)); + generator.setDistanceFromSolarSystemCenter(orbital.calculateDistanceFromCenterOfSystemForFeature()); + + SolMath.fromAl(result, generator.getAngleInSolarSystem(), generator.getDistanceFromSolarSystemCenter()); + result.add(position); + generator.setPosition(result); + generator.setSolarSystemPosition(this.getPosition()); + generator.setIsInnerPlanet(generator.getDistanceFromSolarSystemCenter() < this.radius / 2); + generator.setIsInFirstSolarSystem(getSolarSystemNumber() == 0); + + logger.info(generator + " distance from center: " + generator.getDistanceFromSolarSystemCenter()); + orbitalPosition++; + } + SolMath.free(result); + } + } + + /** + * This method is used when inserting a Belt between Planets within a SolarSystem. It takes the position of the + * planet before where the best will be placed, adds half of the belt width, and then places the Belt at that position. + * Then it moves the Planets which are outside of the Belt to be further away. + */ + private void calculateBeltPositions() { + int beltsPlaced = 0; + //this list is necessary to keep track of which planets are replaced. They cannot be removed while iterating through the list of generators + ArrayList featureGeneratorsToRemove = new ArrayList<>(); + for (FeatureGenerator featureGenerator : activeFeatureGenerators) { + if (BeltGenerator.class.isAssignableFrom(featureGenerator.getClass()) && beltsPlaced < (getPlanetCount() - 1)) { + int orbitInsertionPosition = chooseOrbitInsertionPosition(); + float distanceFromSolarSystemCenter = solarSystemOrbitals.get(orbitInsertionPosition).calculateDistanceFromCenterOfSystemForFeature(); + ((BeltGenerator) featureGenerator).setDistanceFromCenterOfSolarSystem(distanceFromSolarSystemCenter); + + /* Since a belt will be placed at a random orbital, but it isn't guaranteed that a belt will be placed, + first each orbital (except the maze orbitals) have Planets inserted into them, and then when a belt + is placed, a planet is removed and a maze set in its place */ + featureGeneratorsToRemove.add(solarSystemOrbitals.get(orbitInsertionPosition).getFeatureGenerator()); + solarSystemOrbitals.get(orbitInsertionPosition).setFeatureGenerator(featureGenerator); + logger.info("Distance for belt: " + distanceFromSolarSystemCenter); + + //Belt position is equal to SolarSystem position as belts wrap around the entire SolarSystem + featureGenerator.setPosition(getPosition()); + } + } + activeFeatureGenerators.removeAll(featureGeneratorsToRemove); + } + + /** + * Call this method to position all of the default objects in the game. + */ + protected void calculateFeaturePositions() { + calculateMazePositions(); + calculatePlanetPositions(); + calculateBeltPositions(); + } + + /** + * This will create new instances of PlanetGenerator implementations from the list of available feature generators. + * It will only choose FeatureGenerators which are subclasses of {@link PlanetGenerator}. + * It will continue to make new instances until the correct number of Planets is reached + */ + protected void initializeRandomPlanetGenerators() { + int planetsLeft = getPlanetCount(); + while (planetsLeft > 0) { + int index = SolRandom.seededRandomInt(featureGeneratorTypes.size()); + if ((PlanetGenerator.class.isAssignableFrom(featureGeneratorTypes.get(index)))) { + try { + PlanetGenerator newFeatureGenerator = (PlanetGenerator) featureGeneratorTypes.get(index).newInstance(); + newFeatureGenerator.setPlanetConfigManager(context.get(PlanetConfigManager.class)); + activeFeatureGenerators.add(newFeatureGenerator); + planetsLeft--; + } catch (Exception e) { + e.printStackTrace(); + } + } + } + } + + /** + * This will create new instances of MazeGenerator implementations from the list of available feature generators. + * It will only choose FeatureGenerators which are subclasses of {@link MazeGenerator}. + * It will continue to make new instances until the correct number of Mazes is reached + */ + protected void initializeRandomMazeGenerators() { + //we will initialize up to 12 mazes to ensure they fit around the SolarSystem + int mazesLeft = Math.min(getMazeCount(), 12); + while (mazesLeft > 0) { + int index = SolRandom.seededRandomInt(featureGeneratorTypes.size()); + if (MazeGenerator.class.isAssignableFrom(featureGeneratorTypes.get(index))) { + try { + MazeGenerator newFeatureGenerator = (MazeGenerator) featureGeneratorTypes.get(index).newInstance(); + newFeatureGenerator.setMazeConfigManager(context.get(MazeConfigManager.class)); + activeFeatureGenerators.add(newFeatureGenerator); + mazesLeft--; + } catch (Exception e) { + e.printStackTrace(); + } + } + } + } + + /** + * This method will initialize a BeltGenerator of a random available type. It can be that the SolarSystem does + * not necessarily generate a belt for every possible belt in the beltCount (as is the game's default implementation). + * The chance of each count in the beltCount actually becoming a belt is set by the beltChance parameter + * + * @param beltChance chance each belt possibility will actually generate a belt + */ + protected void initializeRandomBeltGenerators(float beltChance) { + int beltsLeft = getPossibleBeltCount(); + while (beltsLeft > 0) { + int index = SolRandom.seededRandomInt(featureGeneratorTypes.size()); + if ((BeltGenerator.class.isAssignableFrom(featureGeneratorTypes.get(index)))) { + try { + if (SolRandom.seededTest(beltChance)) { + BeltGenerator newFeatureGenerator = (BeltGenerator) featureGeneratorTypes.get(index).newInstance(); + newFeatureGenerator.setBeltConfigManager(context.get(BeltConfigManager.class)); + newFeatureGenerator.setInFirstSolarSystem(getSolarSystemNumber() == 0); + activeFeatureGenerators.add(newFeatureGenerator); + } + beltsLeft--; + } catch (Exception e) { + e.printStackTrace(); + } + } + } + } + + protected void initializeRandomDefaultFeatureGenerators(float beltChance) { + initializeRandomPlanetGenerators(); + initializeRandomMazeGenerators(); + initializeRandomBeltGenerators(beltChance); + } + + /** + * This will create new instances of FeatureGenerator implementations from the list of available feature generators. + * It will only choose FeatureGenerators which are not subclasses of MazeGenerator, PlanetGenerator, and BeltGenerator. + * It will continue to make new instances until the correct number of features is reached + */ + protected void initializeRandomOtherFeatureGenerators() { + int featuresLeft = getOtherFeaturesCount(); + while (featuresLeft > 0) { + int index = SolRandom.seededRandomInt(featureGeneratorTypes.size()); + if (isOtherGeneratorType(index)) { + try { + FeatureGenerator newFeatureGenerator = featureGeneratorTypes.get(index).newInstance(); + activeFeatureGenerators.add(newFeatureGenerator); + featuresLeft--; + } catch (Exception e) { + e.printStackTrace(); + } + } + } + } + + public void buildFeatureGenerators() { + for (FeatureGenerator featureGenerator : activeFeatureGenerators) { + featureGenerator.build(); + } + } + + /** + * This method returns the Planet objects instantiated by the PlanetGenerators of this SolarSystem. It is most useful + * after the build() method is called on each PlanetGenerator + * @return List of Planets + */ + ArrayList getInstantiatedPlanets() { + ArrayList planets = new ArrayList<>(); + for (FeatureGenerator featureGenerator : activeFeatureGenerators) { + if (PlanetGenerator.class.isAssignableFrom(featureGenerator.getClass())) { + planets.add(((PlanetGenerator) featureGenerator).getPlanet()); + } + } + return planets; + } + + /** + * This method returns the Maze objects instantiated by the MazeGenerators of this SolarSystem. It is most useful + * after the build() method is called on each MazeGenerator + * @return List of Mazes + */ + ArrayList getInstantiatedMazes() { + ArrayList mazes = new ArrayList<>(); + for (FeatureGenerator featureGenerator : activeFeatureGenerators) { + if (MazeGenerator.class.isAssignableFrom(featureGenerator.getClass())) { + mazes.add(((MazeGenerator) featureGenerator).getMaze()); + } + } + return mazes; + } + + /** + * This method returns the SystemBelt objects instantiated by the BeltGenerators of this SolarSystem. It is most useful + * after the build() method is called on each BeltGenerator + * @return List of Belts + */ + ArrayList getInstantiatedBelts() { + ArrayList belts = new ArrayList<>(); + for (FeatureGenerator featureGenerator : activeFeatureGenerators) { + if (BeltGenerator.class.isAssignableFrom(featureGenerator.getClass())) { + belts.add(((BeltGenerator) featureGenerator).getSystemBelt()); + } + } + return belts; + } + + /** + * This method is used to choose a valid position to insert a belt into. It chooses a position that is between two planets + * (not on the edge of the system and not previously used for a belt) + * + * @return position to use + */ + private int chooseOrbitInsertionPosition() { + int orbitPosition = 0; + boolean positionChosen = false; + while (!positionChosen) { + orbitPosition = SolRandom.seededRandomInt(1, solarSystemOrbitals.size() - 1); + if (!BeltGenerator.class.isAssignableFrom(solarSystemOrbitals.get(orbitPosition).getFeatureGenerator().getClass())) { + positionChosen = true; + } + } + return orbitPosition; + } + + /** + * This method checks if an angle is not within a certain amount of degrees to any other angle in the passed in list + * + * @param anglesToCheckAgainst angles to compare to + * @param angleToCheck angle to check + * @param degrees how many degrees apart to ensure angles are between + * @return whether angles are within specified amount of degrees or not + */ + private boolean isGoodAngle(float angleToCheck, List anglesToCheckAgainst, int degrees) { + for (Float oldAngle : anglesToCheckAgainst) { + //This assures that the angles are at least the specified degrees apart + if (oldAngle - angleToCheck < degrees || oldAngle - angleToCheck > (360 - degrees)) { + return false; + } + } + return true; + } + + /** + * This tests if a particular Generator from the list of Generator types is not one of the default Generators + * + * @param index index of generator in list + * @return true if not one of the default types + */ + private boolean isOtherGeneratorType(int index) { + return !BeltGenerator.class.isAssignableFrom(featureGeneratorTypes.get(index)) + && !MazeGenerator.class.isAssignableFrom(featureGeneratorTypes.get(index)) + && !PlanetGenerator.class.isAssignableFrom(featureGeneratorTypes.get(index)); + } + + public void setFeatureGeneratorTypes(ArrayList> generators) { + featureGeneratorTypes.addAll(generators); + } + + public void setPosition(Vector2 position) { + this.position = SolMath.getVec(position); + SolMath.free(position); + setPositioned(true); + } + + public void setSolarSystemConfigManager(SolarSystemConfigManager solarSystemConfigManager) { + this.solarSystemConfigManager = solarSystemConfigManager; + } + + public SolarSystemConfigManager getSolarSystemConfigManager() { + return solarSystemConfigManager; + } + + public void setSolarSystemConfig(SolarSystemConfig solarSystemConfig) { + this.solarSystemConfig = solarSystemConfig; + } + + public SolarSystemConfig getSolarSystemConfig() { + return solarSystemConfig; + } + + /** + * This method creates a SolarSystem object from the details set by the Generator. + * @return The SolarSystem object + */ + public SolarSystem createInstantiatedSolarSystem() { + SolarSystem solarSystem = new SolarSystem(getPosition(), getSolarSystemConfig(), getName(), getRadius()); + solarSystem.getPlanets().addAll(getInstantiatedPlanets()); + solarSystem.getMazes().addAll(getInstantiatedMazes()); + solarSystem.getBelts().addAll(getInstantiatedBelts()); + return solarSystem; + } + + /** + * Sets the SolarSystemConfig to a Config using default difficulty settings + */ + public void setSolarSystemConfigUsingDefault() { + setSolarSystemConfig(getSolarSystemConfigManager().getRandomSolarSystemConfig(getSolarSystemNumber() > 0)); + } + + public Vector2 getPosition() { + return position; + } + + public void setRadius(float radius) { + this.radius = radius; + } + + public float getRadius() { + return radius; + } + + public void setPositioned(boolean positioned) { + this.positioned = positioned; + } + + public void setSolarSystemNumber(int solarSystemNumber) { + this.solarSystemNumber = solarSystemNumber; + } + + public boolean getPositioned() { + return positioned; + } + + public ArrayList getActiveFeatureGenerators() { + return activeFeatureGenerators; + } + + public void setName(String name) { + this.name = name; + } + + public int getPlanetCount() { + return planetCount; + } + + public int getPossibleBeltCount() { + return possibleBeltCount; + } + + public int getMazeCount() { + return mazeCount; + } + + public int getOtherFeaturesCount() { + return customFeaturesCount; + } + + public int getSolarSystemNumber() { + return solarSystemNumber; + } + + public String getName() { + return name; + } + + public ArrayList getDefaultSolarSystemNames() { + return solNames.systems; + } + + public void setContext(Context context) { + this.context = context; + } + + public Context getContext() { + return context; + } +} diff --git a/engine/src/main/java/org/destinationsol/world/generators/SolarSystemGeneratorImpl.java b/engine/src/main/java/org/destinationsol/world/generators/SolarSystemGeneratorImpl.java new file mode 100644 index 000000000..af5dc7811 --- /dev/null +++ b/engine/src/main/java/org/destinationsol/world/generators/SolarSystemGeneratorImpl.java @@ -0,0 +1,54 @@ +/* + * Copyright 2021 The Terasology Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.destinationsol.world.generators; + +import org.destinationsol.common.SolRandom; +import org.destinationsol.game.planet.SolarSystem; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * This class is a concrete implementation of a SolarSystemGenerator and handles creation of elements + * specific to this type of SolarSystem (such as how many Planets to generate, how large to make + * the SolarSystem, etc). + *

    + * This class also has access to the featureGenerators list from {@link SolarSystemGenerator}. + * This allows it to choose which FeatureGenerators to use in populating the SolarSystem. + */ +public class SolarSystemGeneratorImpl extends SolarSystemGenerator { + + @Override + public SolarSystemSize getSolarSystemSize() { + return SolarSystemSize.MEDIUM; + } + + @Override + public int getCustomFeaturesCount() { + return 0; + } + + @Override + public SolarSystem build() { + getSolarSystemConfigManager().loadDefaultSolarSystemConfigs(); + setSolarSystemConfigUsingDefault(); + setName(SolRandom.seededRandomElement(getDefaultSolarSystemNames())); + initializeRandomDefaultFeatureGenerators(.8f); + calculateFeaturePositions(); + buildFeatureGenerators(); + + return createInstantiatedSolarSystem(); + } +} diff --git a/engine/src/main/java/org/destinationsol/world/generators/SpiralMazeGenerator.java b/engine/src/main/java/org/destinationsol/world/generators/SpiralMazeGenerator.java new file mode 100644 index 000000000..09d217595 --- /dev/null +++ b/engine/src/main/java/org/destinationsol/world/generators/SpiralMazeGenerator.java @@ -0,0 +1,29 @@ +/* + * Copyright 2021 The Terasology Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.destinationsol.world.generators; + +public class SpiralMazeGenerator extends MazeGenerator { + + @Override + public void build() { + setRadius(20f); + getMazeLayoutManager().load("spiralMazeLayout"); + setMazeLayout(getMazeLayoutManager().getLayout("spiral")); + setMazeConfig(getRandomMazeConfig()); + + instantiateMaze(); + } +} diff --git a/engine/src/main/resources/org/destinationsol/assets/collisionMeshes/miscCollisionMeshes.json b/engine/src/main/resources/org/destinationsol/assets/collisionMeshes/miscCollisionMeshes.json index 2ca4e57bb..495c0d396 100644 --- a/engine/src/main/resources/org/destinationsol/assets/collisionMeshes/miscCollisionMeshes.json +++ b/engine/src/main/resources/org/destinationsol/assets/collisionMeshes/miscCollisionMeshes.json @@ -295,7 +295,7 @@ ] }, { - "name": "engine:shard_0", + "name": "engine:rubble_0", "origin": { "x": 0, "y": 0 @@ -338,7 +338,7 @@ ] }, { - "name": "engine:shard_1", + "name": "engine:rubble_1", "origin": { "x": 0, "y": 0 @@ -368,7 +368,7 @@ ] }, { - "name": "engine:shard_2", + "name": "engine:rubble_2", "origin": { "x": 0, "y": 0 diff --git a/engine/src/main/resources/org/destinationsol/assets/schemas/schemaMazeLayouts.json b/engine/src/main/resources/org/destinationsol/assets/schemas/schemaMazeLayouts.json new file mode 100644 index 000000000..a8df0576a --- /dev/null +++ b/engine/src/main/resources/org/destinationsol/assets/schemas/schemaMazeLayouts.json @@ -0,0 +1,17 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "type" : "object", + "description": "A maze layout defines the structure a maze will be built with", + "required": [ + "name", + "inner" + ], + "properties": { + "name" : { + "type": "string" + }, + "inner" : { + "type": "array" + } + } +} \ No newline at end of file diff --git a/engine/src/main/resources/org/destinationsol/assets/skins/default.skin b/engine/src/main/resources/org/destinationsol/assets/skins/default.skin index 189d3cea0..30e1c583e 100644 --- a/engine/src/main/resources/org/destinationsol/assets/skins/default.skin +++ b/engine/src/main/resources/org/destinationsol/assets/skins/default.skin @@ -311,8 +311,11 @@ "text-color": "FFFF00FF" }, "disabled": { - "background": "button", + "background": "buttonDisabled", "text-color": "BBBBBBFF" + }, + "warn": { + "background": "buttonWarn" } } }, diff --git a/engine/src/main/resources/org/destinationsol/assets/skins/mainGameScreen.skin b/engine/src/main/resources/org/destinationsol/assets/skins/mainGameScreen.skin new file mode 100644 index 000000000..c7be7742e --- /dev/null +++ b/engine/src/main/resources/org/destinationsol/assets/skins/mainGameScreen.skin @@ -0,0 +1,17 @@ +{ + "inherit": "engine:default", + "families": { + "sideUIButton": { + "elements": { + "UIButton": { + "min-width": 160, + "min-height": 64 + } + }, + "font": "engine:main#2" + }, + "controlsUIButton": { + "font": "engine:main#2" + } + } +} diff --git a/engine/src/main/resources/org/destinationsol/assets/textures/smallGameObjects/shard_0.png b/engine/src/main/resources/org/destinationsol/assets/textures/smallGameObjects/rubble_0.png similarity index 100% rename from engine/src/main/resources/org/destinationsol/assets/textures/smallGameObjects/shard_0.png rename to engine/src/main/resources/org/destinationsol/assets/textures/smallGameObjects/rubble_0.png diff --git a/engine/src/main/resources/org/destinationsol/assets/textures/smallGameObjects/shard_1.png b/engine/src/main/resources/org/destinationsol/assets/textures/smallGameObjects/rubble_1.png similarity index 100% rename from engine/src/main/resources/org/destinationsol/assets/textures/smallGameObjects/shard_1.png rename to engine/src/main/resources/org/destinationsol/assets/textures/smallGameObjects/rubble_1.png diff --git a/engine/src/main/resources/org/destinationsol/assets/textures/smallGameObjects/shard_2.png b/engine/src/main/resources/org/destinationsol/assets/textures/smallGameObjects/rubble_2.png similarity index 100% rename from engine/src/main/resources/org/destinationsol/assets/textures/smallGameObjects/shard_2.png rename to engine/src/main/resources/org/destinationsol/assets/textures/smallGameObjects/rubble_2.png diff --git a/engine/src/main/resources/org/destinationsol/assets/textures/ui/nui/buttonDisabled.png b/engine/src/main/resources/org/destinationsol/assets/textures/ui/nui/buttonDisabled.png new file mode 100644 index 0000000000000000000000000000000000000000..6615815fdbf92fc1a7502b27f8afaa05e3c6e869 GIT binary patch literal 241 zcmeAS@N?(olHy`uVBq!ia0vp^4M6O`!3HERU8}DLQae0d978JRyuIYe$RNOQz~RV+ z{p}e?KHP|HvNb!tvwFhTI`$9K86WWoq&HYFACXiz$56=DVeBwxpoRDa6__Fx<*wWc P^aF#ZtDnm{r-UW|Ey+yj literal 0 HcmV?d00001 diff --git a/engine/src/main/resources/org/destinationsol/assets/textures/ui/nui/buttonWarn.png b/engine/src/main/resources/org/destinationsol/assets/textures/ui/nui/buttonWarn.png new file mode 100644 index 0000000000000000000000000000000000000000..99938e81303d152593c36a64848ab1bd243dd0b8 GIT binary patch literal 239 zcmeAS@N?(olHy`uVBq!ia0vp^4M6O`!3HERU8}DLQrkRT978JRyuGxMkwJjrfPu}q z=W`M>iX7X|RUeZ}S$m)HPilh&^ASmfa}0%S9mWoG7$5Nnqz|yr9cG!OOm*x%UT=Xu OVDNPHb6Mw<&;$U drawables; - private static final SolObject SHARD_CONSTANT; + private static final SolObject RUBBLE_CONSTANT; static { InitializationUtilities.init(); - SHARD_CONSTANT = createShard(); + RUBBLE_CONSTANT = createRubble(); } - private static SolObject createShard() { + private static SolObject createRubble() { drawables = new ArrayList<>(1); - Gdx.app.postRunnable(() -> drawables.add(new RectSprite(Assets.listTexturesMatching("engine:shard_.*").get(0), 1, 1, 1, new Vector2(), DrawableLevel.PART_FG_0, 0, 0, Color.WHITE, false))); + Gdx.app.postRunnable(() -> drawables.add(new RectSprite(Assets.listTexturesMatching("engine:rubble_.*").get(0), 1, 1, 1, new Vector2(), DrawableLevel.PART_FG_0, 0, 0, Color.WHITE, false))); return new Rubble(BodyUtilities.createDummyBody(), drawables); } @@ -57,25 +57,25 @@ private static SolObject createShard() { public void getPosition() { // Default position of dummy bodies is (1f, 0f) // Epsilon testing because of float accuracy - assertTrue(SHARD_CONSTANT.getPosition().epsilonEquals(1f, 0f, 0.01f)); + assertTrue(RUBBLE_CONSTANT.getPosition().epsilonEquals(1f, 0f, 0.01f)); } @Test public void toFarObject() { - // For performance reasons, shards should not persist while offscreen. + // For performance reasons, rubbles should not persist while offscreen. // They are pretty tiny in terms of gameplay, after all, so they don't even need to persist - assertNull(SHARD_CONSTANT.toFarObject()); + assertNull(RUBBLE_CONSTANT.toFarObject()); } @Test public void getDrawables() { - assertEquals(SHARD_CONSTANT.getDrawables(), drawables); + assertEquals(RUBBLE_CONSTANT.getDrawables(), drawables); } @Test public void getAngle() { // 30° is the default angle of dummyBody - assertEquals(SHARD_CONSTANT.getAngle(), 30f, 0.25f); + assertEquals(RUBBLE_CONSTANT.getAngle(), 30f, 0.25f); } @Test @@ -84,36 +84,36 @@ public void getSpeed() { body.setLinearVelocity(1f, 2f); final Rubble rubble = new Rubble(body, drawables); assertTrue(rubble.getVelocity().epsilonEquals(1f, 2f, 0.01f)); - assertTrue(SHARD_CONSTANT.getVelocity().epsilonEquals(0f, 0f, 0.01f)); + assertTrue(RUBBLE_CONSTANT.getVelocity().epsilonEquals(0f, 0f, 0.01f)); } @Test public void handleContact() { - // Shards are not big enough to cause damage or get damage or anything, so this just shouldn't crash - SHARD_CONSTANT.handleContact(new Rubble(BodyUtilities.createDummyBody(), drawables), 10f, InitializationUtilities.game, new Vector2(0f, 0f)); + // Rubbles are not big enough to cause damage or get damage or anything, so this just shouldn't crash + RUBBLE_CONSTANT.handleContact(new Rubble(BodyUtilities.createDummyBody(), drawables), 10f, InitializationUtilities.game, new Vector2(0f, 0f)); } @Test public void isMetal() { - // Shards are so tiny that no sound should be played when one hits anything - assertNull(SHARD_CONSTANT.isMetal()); + // Rubbles are so tiny that no sound should be played when one hits anything + assertNull(RUBBLE_CONSTANT.isMetal()); } @Test public void hasBody() { - assertTrue(SHARD_CONSTANT.hasBody()); + assertTrue(RUBBLE_CONSTANT.hasBody()); } @Test public void update() { // Just should not throw exception - all the moving and stuff is handled by body, this has just to exist - SHARD_CONSTANT.update(InitializationUtilities.game); + RUBBLE_CONSTANT.update(InitializationUtilities.game); } @Test public void shouldBeRemoved() { // This should persist for as long as seen/loaded - assertFalse(SHARD_CONSTANT.shouldBeRemoved(InitializationUtilities.game)); + assertFalse(RUBBLE_CONSTANT.shouldBeRemoved(InitializationUtilities.game)); } @Test @@ -125,14 +125,14 @@ public void onRemove() { @Test public void receiveDmg() { - // Shards have no health, and thus receiveDamage() just should not crash - SHARD_CONSTANT.receiveDmg(100, InitializationUtilities.game, null, DmgType.BULLET); + // Rubbles have no health, and thus receiveDamage() just should not crash + RUBBLE_CONSTANT.receiveDmg(100, InitializationUtilities.game, null, DmgType.BULLET); } @Test public void receivesGravity() { - // When ship is shattered in gravity, its shards should fall to the ground - assertTrue(SHARD_CONSTANT.receivesGravity()); + // When ship is shattered in gravity, its Rubbles should fall to the ground + assertTrue(RUBBLE_CONSTANT.receivesGravity()); } @Disabled diff --git a/engine/src/test/java/org/destinationsol/world/GalaxyBuilderTest.java b/engine/src/test/java/org/destinationsol/world/GalaxyBuilderTest.java new file mode 100644 index 000000000..387b2a183 --- /dev/null +++ b/engine/src/test/java/org/destinationsol/world/GalaxyBuilderTest.java @@ -0,0 +1,144 @@ +/* + * Copyright 2021 The Terasology Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.destinationsol.world; + +import com.badlogic.gdx.Gdx; +import com.badlogic.gdx.graphics.GL20; +import com.badlogic.gdx.physics.box2d.Box2D; +import org.destinationsol.assets.sound.OggSoundManager; +import org.destinationsol.files.HullConfigManager; +import org.destinationsol.game.AbilityCommonConfigs; +import org.destinationsol.game.GameColors; +import org.destinationsol.game.context.Context; +import org.destinationsol.game.context.internal.ContextImpl; +import org.destinationsol.game.item.ItemManager; +import org.destinationsol.game.maze.MazeConfigManager; +import org.destinationsol.game.particle.EffectTypes; +import org.destinationsol.game.planet.BeltConfigManager; +import org.destinationsol.game.planet.PlanetConfigManager; +import org.destinationsol.game.planet.SolarSystemConfigManager; +import org.destinationsol.modules.ModuleManager; +import org.destinationsol.testingUtilities.MockGL; +import org.destinationsol.testsupport.AssetsHelperInitializer; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertTrue; + +public class GalaxyBuilderTest implements AssetsHelperInitializer { + private Context context; + private ModuleManager moduleManager; + GalaxyBuilder galaxyBuilder; + private GameColors gameColors; + private EffectTypes effectTypes; + private OggSoundManager soundManager; + private AbilityCommonConfigs abilityCommonConfigs; + + + @BeforeEach + public void setUp() throws Exception { + context = new ContextImpl(); + moduleManager = new ModuleManager(); + moduleManager.init(); + context.put(ModuleManager.class, moduleManager); + + setupMockGL(); + + setupConfigManagers(); + } + + private void setupMockGL() { + GL20 mockGL = new MockGL(); + Gdx.gl = mockGL; + Gdx.gl20 = mockGL; + Box2D.init(); + } + + private void setupConfigManagers() { + ItemManager itemManager = setupItemManager(); + HullConfigManager hullConfigManager = setupHullConfigManager(itemManager); + + PlanetConfigManager planetConfigManager = new PlanetConfigManager(hullConfigManager, gameColors,itemManager); + planetConfigManager.loadDefaultPlanetConfigs(); + context.put(PlanetConfigManager.class, planetConfigManager); + + MazeConfigManager mazeConfigManager = new MazeConfigManager(hullConfigManager, itemManager); + mazeConfigManager.loadDefaultMazeConfigs(); + context.put(MazeConfigManager.class, mazeConfigManager); + + BeltConfigManager beltConfigManager = new BeltConfigManager(hullConfigManager, itemManager); + beltConfigManager.loadDefaultBeltConfigs(); + context.put(BeltConfigManager.class, beltConfigManager); + + SolarSystemConfigManager solarSystemConfigManager = new SolarSystemConfigManager(hullConfigManager, itemManager); + context.put(SolarSystemConfigManager.class, solarSystemConfigManager); + } + + private ItemManager setupItemManager() { + gameColors = new GameColors(); + effectTypes = new EffectTypes(); + soundManager = new OggSoundManager(context); + return new ItemManager(soundManager, effectTypes, gameColors); + } + + private HullConfigManager setupHullConfigManager(ItemManager itemManager) { + abilityCommonConfigs = new AbilityCommonConfigs(effectTypes, gameColors, soundManager); + return new HullConfigManager(itemManager, abilityCommonConfigs); + } + + @Test + void populatesSolarSystemsList() { + int testNumberSystems = 2; + galaxyBuilder = new GalaxyBuilder(context, testNumberSystems); + galaxyBuilder.buildWithRandomSolarSystemGenerators(); + assertTrue(galaxyBuilder.getSolarSystemGeneratorTypes().size() > 0); + + } + + @Test + void populatesFeatureGeneratorsList() { + int testNumberSystems = 2; + galaxyBuilder = new GalaxyBuilder(context, testNumberSystems); + galaxyBuilder.buildWithRandomSolarSystemGenerators(); + assertTrue(galaxyBuilder.getFeatureGeneratorTypes().size() > 0); + } + + @Test + void createsCorrectNumberOfSolarSystemGenerators() { + int testNumberSystems = 2; + galaxyBuilder = new GalaxyBuilder(context, testNumberSystems); + galaxyBuilder.buildWithRandomSolarSystemGenerators(); + assertEquals(galaxyBuilder.getActiveSolarSystemGenerators().size(), 2); + } + + @Test + void createsCorrectNumberOfSolarSystems() { + int testNumberSystems = 2; + galaxyBuilder = new GalaxyBuilder(context, testNumberSystems); + galaxyBuilder.buildWithRandomSolarSystemGenerators(); + assertEquals(galaxyBuilder.getBuiltSolarSystems().size(), 2); + } + + @Test + void setsContext() { + int testNumberSystems = 2; + galaxyBuilder = new GalaxyBuilder(context, testNumberSystems); + assertNotNull(galaxyBuilder.getContext()); + } + +} diff --git a/engine/src/test/java/org/destinationsol/world/generators/BeltGeneratorTest.java b/engine/src/test/java/org/destinationsol/world/generators/BeltGeneratorTest.java new file mode 100644 index 000000000..66bee1e08 --- /dev/null +++ b/engine/src/test/java/org/destinationsol/world/generators/BeltGeneratorTest.java @@ -0,0 +1,144 @@ +/* + * Copyright 2021 The Terasology Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.destinationsol.world.generators; + +import com.badlogic.gdx.Gdx; +import com.badlogic.gdx.graphics.GL20; +import com.badlogic.gdx.physics.box2d.Box2D; +import org.destinationsol.assets.sound.OggSoundManager; +import org.destinationsol.files.HullConfigManager; +import org.destinationsol.game.AbilityCommonConfigs; +import org.destinationsol.game.GameColors; +import org.destinationsol.game.context.Context; +import org.destinationsol.game.context.internal.ContextImpl; +import org.destinationsol.game.item.ItemManager; +import org.destinationsol.game.maze.MazeConfigManager; +import org.destinationsol.game.particle.EffectTypes; +import org.destinationsol.game.planet.BeltConfigManager; +import org.destinationsol.game.planet.PlanetConfigManager; +import org.destinationsol.game.planet.SolarSystemConfigManager; +import org.destinationsol.modules.ModuleManager; +import org.destinationsol.testingUtilities.MockGL; +import org.destinationsol.testsupport.AssetsHelperInitializer; +import org.destinationsol.world.GalaxyBuilder; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import java.util.ArrayList; + +import static org.junit.jupiter.api.Assertions.assertTrue; + +public class BeltGeneratorTest implements AssetsHelperInitializer { + private Context context; + private ModuleManager moduleManager; + private GalaxyBuilder galaxyBuilder; + private GameColors gameColors; + private EffectTypes effectTypes; + private OggSoundManager soundManager; + private AbilityCommonConfigs abilityCommonConfigs; + private SolarSystemGenerator solarSystemGenerator; + private BeltGenerator beltGenerator; + + @BeforeEach + public void setUp() throws Exception { + context = new ContextImpl(); + moduleManager = getModuleManager(); + moduleManager.init(); + context.put(ModuleManager.class, moduleManager); + + setupMockGL(); + + setupConfigManagers(); + + galaxyBuilder = new GalaxyBuilder(context, 1); + + ArrayList solarSystemGenerators = galaxyBuilder.initializeRandomSolarSystemGenerators(); + solarSystemGenerator = solarSystemGenerators.get(0); + setupSolarSystemGenerator(); + ArrayList activeFeatureGenerators = solarSystemGenerators.get(0).getActiveFeatureGenerators(); + beltGenerator = (BeltGenerator) activeFeatureGenerators.get(activeFeatureGenerators.size() - 1); + } + + private void setupMockGL() { + GL20 mockGL = new MockGL(); + Gdx.gl = mockGL; + Gdx.gl20 = mockGL; + Box2D.init(); + } + + private void setupConfigManagers() { + ItemManager itemManager = setupItemManager(); + HullConfigManager hullConfigManager = setupHullConfigManager(itemManager); + + PlanetConfigManager planetConfigManager = new PlanetConfigManager(hullConfigManager, gameColors,itemManager); + planetConfigManager.loadDefaultPlanetConfigs(); + context.put(PlanetConfigManager.class, planetConfigManager); + + SolarSystemConfigManager solarSystemConfigManager = new SolarSystemConfigManager(hullConfigManager, itemManager); + context.put(SolarSystemConfigManager.class, solarSystemConfigManager); + + MazeConfigManager mazeConfigManager = new MazeConfigManager(hullConfigManager, itemManager); + mazeConfigManager.loadDefaultMazeConfigs(); + context.put(MazeConfigManager.class, mazeConfigManager); + + BeltConfigManager beltConfigManager = new BeltConfigManager(hullConfigManager, itemManager); + beltConfigManager.loadDefaultBeltConfigs(); + context.put(BeltConfigManager.class, beltConfigManager); + } + + private ItemManager setupItemManager() { + gameColors = new GameColors(); + effectTypes = new EffectTypes(); + soundManager = new OggSoundManager(context); + return new ItemManager(soundManager, effectTypes, gameColors); + } + + private HullConfigManager setupHullConfigManager(ItemManager itemManager) { + abilityCommonConfigs = new AbilityCommonConfigs(effectTypes, gameColors, soundManager); + return new HullConfigManager(itemManager, abilityCommonConfigs); + } + + private void setupSolarSystemGenerator() { + solarSystemGenerator.initializeRandomDefaultFeatureGenerators(1f); + solarSystemGenerator.calculateFeaturePositions(); + solarSystemGenerator.buildFeatureGenerators(); + } + + @Test + void beltPositionIsSolarSystemPosition() { + assertTrue(beltGenerator.getPosition().equals(solarSystemGenerator.getPosition())); + } + + @Test + void beltHasPositiveWidth() { + assertTrue(beltGenerator.getRadius() > 0); + } + + @Test + void beltBeginsWithinSolarSystem() { + assertTrue(beltGenerator.getDistanceFromCenterOfSolarSystem() < solarSystemGenerator.getRadius()); + } + + @Test + void beltHasNonNegativeAsteroidFrequency() { + assertTrue(beltGenerator.getAsteroidFrequency() >= 0); + } + + @Test + void beltHasConfigWithEnemies() { + assertTrue(beltGenerator.getBeltConfig().tempEnemies.size() > 0); + } +} diff --git a/engine/src/test/java/org/destinationsol/world/generators/MazeGeneratorTest.java b/engine/src/test/java/org/destinationsol/world/generators/MazeGeneratorTest.java new file mode 100644 index 000000000..ca52b6859 --- /dev/null +++ b/engine/src/test/java/org/destinationsol/world/generators/MazeGeneratorTest.java @@ -0,0 +1,139 @@ +/* + * Copyright 2021 The Terasology Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.destinationsol.world.generators; + +import com.badlogic.gdx.Gdx; +import com.badlogic.gdx.graphics.GL20; +import com.badlogic.gdx.physics.box2d.Box2D; +import org.destinationsol.assets.sound.OggSoundManager; +import org.destinationsol.files.HullConfigManager; +import org.destinationsol.game.AbilityCommonConfigs; +import org.destinationsol.game.GameColors; +import org.destinationsol.game.context.Context; +import org.destinationsol.game.context.internal.ContextImpl; +import org.destinationsol.game.item.ItemManager; +import org.destinationsol.game.maze.MazeConfigManager; +import org.destinationsol.game.particle.EffectTypes; +import org.destinationsol.game.planet.BeltConfigManager; +import org.destinationsol.game.planet.PlanetConfigManager; +import org.destinationsol.game.planet.SolarSystemConfigManager; +import org.destinationsol.modules.ModuleManager; +import org.destinationsol.testingUtilities.MockGL; +import org.destinationsol.testsupport.AssetsHelperInitializer; +import org.destinationsol.world.GalaxyBuilder; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import java.util.ArrayList; + +import static org.junit.jupiter.api.Assertions.assertTrue; + +public class MazeGeneratorTest implements AssetsHelperInitializer { + private Context context; + private ModuleManager moduleManager; + private GalaxyBuilder galaxyBuilder; + private GameColors gameColors; + private EffectTypes effectTypes; + private OggSoundManager soundManager; + private AbilityCommonConfigs abilityCommonConfigs; + private SolarSystemGenerator solarSystemGenerator; + private MazeGenerator mazeGenerator; + + @BeforeEach + public void setUp() throws Exception { + context = new ContextImpl(); + moduleManager = getModuleManager(); + moduleManager.init(); + context.put(ModuleManager.class, moduleManager); + + setupMockGL(); + + setupConfigManagers(); + + galaxyBuilder = new GalaxyBuilder(context, 1); + + ArrayList solarSystemGenerators = galaxyBuilder.initializeRandomSolarSystemGenerators(); + solarSystemGenerator = solarSystemGenerators.get(0); + setupSolarSystemGenerator(); + ArrayList activeFeatureGenerators = solarSystemGenerators.get(0).getActiveFeatureGenerators(); + for (FeatureGenerator featureGenerator : activeFeatureGenerators) { + if (MazeGenerator.class.isAssignableFrom(featureGenerator.getClass())) { + mazeGenerator = (MazeGenerator) featureGenerator; + } + } + } + + private void setupMockGL() { + GL20 mockGL = new MockGL(); + Gdx.gl = mockGL; + Gdx.gl20 = mockGL; + Box2D.init(); + } + + private void setupConfigManagers() { + ItemManager itemManager = setupItemManager(); + HullConfigManager hullConfigManager = setupHullConfigManager(itemManager); + + PlanetConfigManager planetConfigManager = new PlanetConfigManager(hullConfigManager, gameColors,itemManager); + planetConfigManager.loadDefaultPlanetConfigs(); + context.put(PlanetConfigManager.class, planetConfigManager); + + SolarSystemConfigManager solarSystemConfigManager = new SolarSystemConfigManager(hullConfigManager, itemManager); + context.put(SolarSystemConfigManager.class, solarSystemConfigManager); + + MazeConfigManager mazeConfigManager = new MazeConfigManager(hullConfigManager, itemManager); + mazeConfigManager.loadDefaultMazeConfigs(); + context.put(MazeConfigManager.class, mazeConfigManager); + + BeltConfigManager beltConfigManager = new BeltConfigManager(hullConfigManager, itemManager); + beltConfigManager.loadDefaultBeltConfigs(); + context.put(BeltConfigManager.class, beltConfigManager); + } + + private ItemManager setupItemManager() { + gameColors = new GameColors(); + effectTypes = new EffectTypes(); + soundManager = new OggSoundManager(context); + return new ItemManager(soundManager, effectTypes, gameColors); + } + + private HullConfigManager setupHullConfigManager(ItemManager itemManager) { + abilityCommonConfigs = new AbilityCommonConfigs(effectTypes, gameColors, soundManager); + return new HullConfigManager(itemManager, abilityCommonConfigs); + } + + private void setupSolarSystemGenerator() { + solarSystemGenerator.initializeRandomDefaultFeatureGenerators(1f); + solarSystemGenerator.calculateFeaturePositions(); + solarSystemGenerator.buildFeatureGenerators(); + } + + @Test + void mazeIsNearEdgeOfSolarSystem() { + assertTrue(mazeGenerator.getPosition().dst(solarSystemGenerator.getPosition()) > (solarSystemGenerator.getRadius() * 0.8f)); + } + + @Test + void mazeHasConfigWithBosses() { + assertTrue(mazeGenerator.getMazeConfig().bosses.size() > 0); + } + + @Test + void mazeHasPositiveRadius() { + assertTrue(mazeGenerator.getRadius() > 0); + } + +} diff --git a/engine/src/test/java/org/destinationsol/world/generators/PlanetGeneratorTest.java b/engine/src/test/java/org/destinationsol/world/generators/PlanetGeneratorTest.java new file mode 100644 index 000000000..0ce61acd8 --- /dev/null +++ b/engine/src/test/java/org/destinationsol/world/generators/PlanetGeneratorTest.java @@ -0,0 +1,150 @@ +/* + * Copyright 2021 The Terasology Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.destinationsol.world.generators; + +import com.badlogic.gdx.Gdx; +import com.badlogic.gdx.graphics.GL20; +import com.badlogic.gdx.physics.box2d.Box2D; +import org.destinationsol.assets.sound.OggSoundManager; +import org.destinationsol.files.HullConfigManager; +import org.destinationsol.game.AbilityCommonConfigs; +import org.destinationsol.game.GameColors; +import org.destinationsol.game.context.Context; +import org.destinationsol.game.context.internal.ContextImpl; +import org.destinationsol.game.item.ItemManager; +import org.destinationsol.game.maze.MazeConfigManager; +import org.destinationsol.game.particle.EffectTypes; +import org.destinationsol.game.planet.BeltConfigManager; +import org.destinationsol.game.planet.PlanetConfigManager; +import org.destinationsol.game.planet.SolarSystemConfigManager; +import org.destinationsol.modules.ModuleManager; +import org.destinationsol.testingUtilities.MockGL; +import org.destinationsol.testsupport.AssetsHelperInitializer; +import org.destinationsol.world.GalaxyBuilder; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import java.util.ArrayList; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertTrue; + +public class PlanetGeneratorTest implements AssetsHelperInitializer { + private Context context; + private ModuleManager moduleManager; + private GalaxyBuilder galaxyBuilder; + private GameColors gameColors; + private EffectTypes effectTypes; + private OggSoundManager soundManager; + private AbilityCommonConfigs abilityCommonConfigs; + private SolarSystemGenerator solarSystemGenerator; + private PlanetGenerator planetGenerator; + + @BeforeEach + public void setUp() throws Exception { + context = new ContextImpl(); + moduleManager = getModuleManager(); + moduleManager.init(); + context.put(ModuleManager.class, moduleManager); + + setupMockGL(); + + setupConfigManagers(); + + galaxyBuilder = new GalaxyBuilder(context, 1); + + ArrayList solarSystemGenerators = galaxyBuilder.initializeRandomSolarSystemGenerators(); + solarSystemGenerator = solarSystemGenerators.get(0); + setupSolarSystemGenerator(); + planetGenerator = (PlanetGenerator) solarSystemGenerators.get(0).getActiveFeatureGenerators().get(1); + } + + private void setupMockGL() { + GL20 mockGL = new MockGL(); + Gdx.gl = mockGL; + Gdx.gl20 = mockGL; + Box2D.init(); + } + + private void setupConfigManagers() { + ItemManager itemManager = setupItemManager(); + HullConfigManager hullConfigManager = setupHullConfigManager(itemManager); + + PlanetConfigManager planetConfigManager = new PlanetConfigManager(hullConfigManager, gameColors,itemManager); + planetConfigManager.loadDefaultPlanetConfigs(); + context.put(PlanetConfigManager.class, planetConfigManager); + + SolarSystemConfigManager solarSystemConfigManager = new SolarSystemConfigManager(hullConfigManager, itemManager); + context.put(SolarSystemConfigManager.class, solarSystemConfigManager); + + MazeConfigManager mazeConfigManager = new MazeConfigManager(hullConfigManager, itemManager); + mazeConfigManager.loadDefaultMazeConfigs(); + context.put(MazeConfigManager.class, mazeConfigManager); + + BeltConfigManager beltConfigManager = new BeltConfigManager(hullConfigManager, itemManager); + beltConfigManager.loadDefaultBeltConfigs(); + context.put(BeltConfigManager.class, beltConfigManager); + } + + private ItemManager setupItemManager() { + gameColors = new GameColors(); + effectTypes = new EffectTypes(); + soundManager = new OggSoundManager(context); + return new ItemManager(soundManager, effectTypes, gameColors); + } + + private HullConfigManager setupHullConfigManager(ItemManager itemManager) { + abilityCommonConfigs = new AbilityCommonConfigs(effectTypes, gameColors, soundManager); + return new HullConfigManager(itemManager, abilityCommonConfigs); + } + + private void setupSolarSystemGenerator() { + solarSystemGenerator.initializeRandomDefaultFeatureGenerators(1f); + solarSystemGenerator.calculateFeaturePositions(); + solarSystemGenerator.buildFeatureGenerators(); + } + + @Test + void planetDiameterIsWithinRange() { + assertTrue(planetGenerator.getDiameter() < PlanetGenerator.PLANET_MAX_DIAMETER && planetGenerator.getDiameter() > 0); + } + + @Test + void planetRadiusIsGroundHeightPlusAtmosphereHeight() { + assertEquals(planetGenerator.getRadius(), planetGenerator.getGroundHeight() + planetGenerator.getAtmosphereHeight()); + } + + @Test + void planetHasConfig() { + assertNotNull(planetGenerator.getPlanetConfig()); + } + + @Test + void planetHasName() { + assertTrue(planetGenerator.getName().length() > 0); + } + + @Test + void planetHasNonzeroRotationSpeed() { + assertTrue(planetGenerator.getPlanetRotationSpeed() != 0); + } + + @Test + void planetHasNonzeroOrbitSpeed() { + assertTrue(planetGenerator.getPlanetRotationSpeed() != 0); + } +} diff --git a/engine/src/test/java/org/destinationsol/world/generators/SolarSystemGeneratorTest.java b/engine/src/test/java/org/destinationsol/world/generators/SolarSystemGeneratorTest.java new file mode 100644 index 000000000..2ebb12a0c --- /dev/null +++ b/engine/src/test/java/org/destinationsol/world/generators/SolarSystemGeneratorTest.java @@ -0,0 +1,200 @@ +/* + * Copyright 2021 The Terasology Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.destinationsol.world.generators; + +import com.badlogic.gdx.Gdx; +import com.badlogic.gdx.graphics.GL20; +import com.badlogic.gdx.physics.box2d.Box2D; +import org.destinationsol.files.HullConfigManager; +import org.destinationsol.game.AbilityCommonConfigs; +import org.destinationsol.game.GameColors; +import org.destinationsol.game.context.Context; +import org.destinationsol.game.context.internal.ContextImpl; +import org.destinationsol.game.item.ItemManager; +import org.destinationsol.game.maze.MazeConfigManager; +import org.destinationsol.game.particle.EffectTypes; +import org.destinationsol.assets.sound.OggSoundManager; +import org.destinationsol.game.planet.BeltConfigManager; +import org.destinationsol.game.planet.PlanetConfigManager; +import org.destinationsol.game.planet.SolarSystemConfigManager; +import org.destinationsol.modules.ModuleManager; +import org.destinationsol.testingUtilities.MockGL; +import org.destinationsol.testsupport.AssetsHelperInitializer; +import org.destinationsol.world.GalaxyBuilder; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import java.util.ArrayList; + +import static org.destinationsol.world.generators.MazeGenerator.MAZE_BUFFER; +import static org.destinationsol.world.generators.PlanetGenerator.PLANET_MAX_DIAMETER; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; + +public class SolarSystemGeneratorTest implements AssetsHelperInitializer { + private Context context; + private ModuleManager moduleManager; + private GalaxyBuilder galaxyBuilder; + private GameColors gameColors; + private EffectTypes effectTypes; + private OggSoundManager soundManager; + private AbilityCommonConfigs abilityCommonConfigs; + private SolarSystemGenerator solarSystemGenerator; + + @BeforeEach + public void setUp() throws Exception { + context = new ContextImpl(); + moduleManager = getModuleManager(); + moduleManager.init(); + context.put(ModuleManager.class, moduleManager); + + setupMockGL(); + + setupConfigManagers(); + + galaxyBuilder = new GalaxyBuilder(context, 1); + + ArrayList solarSystemGenerators = galaxyBuilder.initializeRandomSolarSystemGenerators(); + solarSystemGenerator = solarSystemGenerators.get(0); + setupSolarSystemGenerator(); + } + + private void setupMockGL() { + GL20 mockGL = new MockGL(); + Gdx.gl = mockGL; + Gdx.gl20 = mockGL; + Box2D.init(); + } + + private void setupConfigManagers() { + ItemManager itemManager = setupItemManager(); + HullConfigManager hullConfigManager = setupHullConfigManager(itemManager); + + PlanetConfigManager planetConfigManager = new PlanetConfigManager(hullConfigManager, gameColors,itemManager); + planetConfigManager.loadDefaultPlanetConfigs(); + context.put(PlanetConfigManager.class, planetConfigManager); + + MazeConfigManager mazeConfigManager = new MazeConfigManager(hullConfigManager, itemManager); + mazeConfigManager.loadDefaultMazeConfigs(); + context.put(MazeConfigManager.class, mazeConfigManager); + + BeltConfigManager beltConfigManager = new BeltConfigManager(hullConfigManager, itemManager); + beltConfigManager.loadDefaultBeltConfigs(); + context.put(BeltConfigManager.class, beltConfigManager); + + SolarSystemConfigManager solarSystemConfigManager = new SolarSystemConfigManager(hullConfigManager, itemManager); + context.put(SolarSystemConfigManager.class, solarSystemConfigManager); + } + + private ItemManager setupItemManager() { + gameColors = new GameColors(); + effectTypes = new EffectTypes(); + soundManager = new OggSoundManager(context); + return new ItemManager(soundManager, effectTypes, gameColors); + } + + private HullConfigManager setupHullConfigManager(ItemManager itemManager) { + abilityCommonConfigs = new AbilityCommonConfigs(effectTypes, gameColors, soundManager); + return new HullConfigManager(itemManager, abilityCommonConfigs); + } + + private void setupSolarSystemGenerator() { + solarSystemGenerator.initializeRandomDefaultFeatureGenerators(1f); + solarSystemGenerator.buildFeatureGenerators(); + solarSystemGenerator.calculateFeaturePositions(); + } + + @Test + void hasCorrectPlanetCountForDefaultSolarSystem() { + if (solarSystemGenerator.getClass().equals(SolarSystemGeneratorImpl.class)) { + assertEquals(solarSystemGenerator.getPlanetCount(), 5); + } + } + + @Test + void hasCorrectMazeCountForDefaultSolarSystem() { + if (solarSystemGenerator.getClass().equals(SolarSystemGeneratorImpl.class)) { + assertEquals(solarSystemGenerator.getMazeCount(), 2); + } + } + + @Test + void hasCorrectPossibleBeltCountForDefaultSolarSystem() { + if (solarSystemGenerator.getClass().equals(SolarSystemGeneratorImpl.class)) { + assertEquals(solarSystemGenerator.getPossibleBeltCount(), 1); + } + } + + @Test + void hasCorrectRadius() { + float radiusFromFeatures = 0; + radiusFromFeatures += SolarSystemGenerator.SUN_RADIUS; + for (FeatureGenerator featureGenerator : solarSystemGenerator.getActiveFeatureGenerators()) { + if (!featureGenerator.getClass().getSuperclass().equals(MazeGenerator.class)) { + radiusFromFeatures += FeatureGenerator.ORBITAL_FEATURE_BUFFER; + radiusFromFeatures += PLANET_MAX_DIAMETER; + radiusFromFeatures += FeatureGenerator.ORBITAL_FEATURE_BUFFER; + } + } + //This only needs to be added once, not for each MazeGenerator. This is because each Maze is in the same orbital + radiusFromFeatures += MAZE_BUFFER + MazeGenerator.MAX_MAZE_DIAMETER + MAZE_BUFFER; + //This value will tend to be off by 0.0001 even if calculated correctly, so we are testing if they are very close + assertTrue(solarSystemGenerator.getRadius() - radiusFromFeatures < 1f); + + } + + @Test + void mazesAreCorrectDistanceFromSolarSystemCenter() { + float actualMazeDistance = 0; + float expectedMazeDistance = 0; + expectedMazeDistance = solarSystemGenerator.getRadius() - MAZE_BUFFER - (MazeGenerator.MAX_MAZE_DIAMETER / 2); + + for (FeatureGenerator featureGenerator : solarSystemGenerator.getActiveFeatureGenerators()) { + if (featureGenerator.getClass().getSuperclass().equals(MazeGenerator.class)) { + actualMazeDistance = featureGenerator.getPosition().dst(solarSystemGenerator.getPosition()); + //This value will tend to be off by 0.0001 even if calculated correctly, so we are testing if they are very close + assertTrue(expectedMazeDistance - actualMazeDistance < 1f); + } + } + } + + @Test + void beltPositionEqualsSolarSystemPosition() { + for (FeatureGenerator featureGenerator : solarSystemGenerator.getActiveFeatureGenerators()) { + if (featureGenerator.getClass().getSuperclass().equals(BeltGenerator.class)) { + assertEquals(featureGenerator.getPosition(), solarSystemGenerator.getPosition()); + } + } + } + + @Test + void planetsAreInsideSolarSystem() { + for (FeatureGenerator featureGenerator : solarSystemGenerator.getActiveFeatureGenerators()) { + if (featureGenerator.getClass().getSuperclass().equals(PlanetGenerator.class)) { + assertTrue(featureGenerator.getPosition().dst(solarSystemGenerator.getPosition()) < solarSystemGenerator.getRadius()); + } + } + } + + @Test + void beltsAreInsideSolarSystem() { + for (FeatureGenerator featureGenerator : solarSystemGenerator.getActiveFeatureGenerators()) { + if (featureGenerator.getClass().getSuperclass().equals(BeltGenerator.class)) { + assertTrue(featureGenerator.getPosition().dst(solarSystemGenerator.getPosition()) < solarSystemGenerator.getRadius()); + } + } + } +} diff --git a/modules/core/assets/mazes/spiralMazeLayout.json b/modules/core/assets/mazes/spiralMazeLayout.json new file mode 100644 index 000000000..ecd911c62 --- /dev/null +++ b/modules/core/assets/mazes/spiralMazeLayout.json @@ -0,0 +1,15 @@ +{ + "name" : "spiral", + "inner": [ + [true, true, true, true, true, true, true, true, true, true], + [true, false, false, false, false, false, false, false, false, false], + [true, false, true, true, true, true, true, true, true, true], + [true, false, true, false, false, false, false, false, false, true], + [true, false, true, false, true, true, true, true, false, true], + [true, false, true, false, true, false, false, true, false, true], + [true, false, true, false, false, false, false, true, false, true], + [true, false, true, true, true, true, true, true, false, true], + [true, false, false, false, false, false, false, false, false, true], + [true, true, true, true, true, true, true, true, true, true] + ] +} \ No newline at end of file From 44cc049c0871b907d1697ac844f7b7ddeed98fad Mon Sep 17 00:00:00 2001 From: Michael Pollind Date: Sat, 20 Nov 2021 09:33:57 -0800 Subject: [PATCH 28/38] resolve build problems with service registry --- .../GameConfigurationServiceRegistry.java | 6 +- .../SolGameServiceRegistry.java | 68 +++++++++---------- .../java/org/destinationsol/game/SolGame.java | 8 ++- .../ui/nui/screens/MainGameScreen.java | 4 ++ .../world/generators/FeatureGenerator.java | 2 + .../generators/LargeSolarSystemGenerator.java | 4 +- 6 files changed, 54 insertions(+), 38 deletions(-) diff --git a/engine/src/main/java/org/destinationsol/GameConfigurationServiceRegistry.java b/engine/src/main/java/org/destinationsol/GameConfigurationServiceRegistry.java index f19d1a41f..46df02f48 100644 --- a/engine/src/main/java/org/destinationsol/GameConfigurationServiceRegistry.java +++ b/engine/src/main/java/org/destinationsol/GameConfigurationServiceRegistry.java @@ -7,7 +7,8 @@ import org.destinationsol.game.planet.PlanetConfigManager; import org.destinationsol.game.planet.SolarSystemConfigManager; import org.destinationsol.world.GalaxyBuilder; -import org.destinationsol.world.generators.SolarSystemGenerator; +import org.destinationsol.world.generators.LargeSolarSystemGenerator; +import org.destinationsol.world.generators.SolarSystemGeneratorImpl; import org.terasology.context.Lifetime; import org.terasology.gestalt.di.ServiceRegistry; @@ -16,7 +17,8 @@ public class GameConfigurationServiceRegistry extends ServiceRegistry { public GameConfigurationServiceRegistry(WorldConfig worldConfig) { this.with(WorldConfig.class).use(() -> worldConfig).lifetime(Lifetime.Singleton); this.with(GalaxyBuilder.class).lifetime(Lifetime.Singleton); - this.with(SolarSystemGenerator.class).lifetime(Lifetime.Singleton); + this.with(LargeSolarSystemGenerator.class).lifetime(Lifetime.Singleton); + this.with(SolarSystemGeneratorImpl.class).lifetime(Lifetime.Singleton); this.with(HullConfigManager.class).lifetime(Lifetime.Singleton); this.with(MazeConfigManager.class).lifetime(Lifetime.Singleton); this.with(PlanetConfigManager.class).lifetime(Lifetime.Singleton); diff --git a/engine/src/main/java/org/destinationsol/SolGameServiceRegistry.java b/engine/src/main/java/org/destinationsol/SolGameServiceRegistry.java index f7a609045..0484ab20c 100644 --- a/engine/src/main/java/org/destinationsol/SolGameServiceRegistry.java +++ b/engine/src/main/java/org/destinationsol/SolGameServiceRegistry.java @@ -52,41 +52,41 @@ public class SolGameServiceRegistry extends ServiceRegistry { public SolGameServiceRegistry(boolean isTutorial) { - this.with(SolGame.class).lifetime(Lifetime.Singleton); - if (isTutorial) { - this.with(TutorialManager.class).lifetime(Lifetime.Singleton); - } + this.with(SolGame.class).lifetime(Lifetime.Singleton); + if (isTutorial) { + this.with(TutorialManager.class).lifetime(Lifetime.Singleton); + } - this.with(EntitySystemManager.class); - this.with(SerialisationManager.class).lifetime(Lifetime.Singleton); + this.with(EntitySystemManager.class); + this.with(SerialisationManager.class).lifetime(Lifetime.Singleton); - this.with(DrawableManager.class).lifetime(Lifetime.Singleton); - this.with(PlanetManager.class).lifetime(Lifetime.Singleton); - this.with(ChunkManager.class).lifetime(Lifetime.Singleton); - this.with(PartMan.class).lifetime(Lifetime.Singleton); - this.with(AsteroidBuilder.class).lifetime(Lifetime.Singleton); - this.with(LootBuilder.class).lifetime(Lifetime.Singleton); - this.with(ShipBuilder.class).lifetime(Lifetime.Singleton); - this.with(GridDrawer.class).lifetime(Lifetime.Singleton); - this.with(FarBackgroundManagerOld.class).lifetime(Lifetime.Singleton); - this.with(FactionManager.class).lifetime(Lifetime.Singleton); - this.with(MapDrawer.class).lifetime(Lifetime.Singleton); - this.with(RubbleBuilder.class).lifetime(Lifetime.Singleton); - this.with(ItemManager.class).lifetime(Lifetime.Singleton); - this.with(EffectTypes.class).lifetime(Lifetime.Singleton); - this.with(StarPort.Builder.class).lifetime(Lifetime.Singleton); - this.with(DrawableDebugger.class).lifetime(Lifetime.Singleton); - this.with(SpecialSounds.class).lifetime(Lifetime.Singleton); - this.with(SpecialEffects.class).lifetime(Lifetime.Singleton); - this.with(GameColors.class).lifetime(Lifetime.Singleton); - this.with(BeaconHandler.class).lifetime(Lifetime.Singleton); - this.with(MountDetectDrawer.class).lifetime(Lifetime.Singleton); - this.with(GalaxyFiller.class).lifetime(Lifetime.Singleton); - this.with(SolContactListener.class).lifetime(Lifetime.Singleton); - this.with(GameScreens.class).lifetime(Lifetime.Singleton); - this.with(SolCam.class).lifetime(Lifetime.Singleton); - this.with(ObjectManager.class).lifetime(Lifetime.Singleton); - this.with(GameDrawer.class).lifetime(Lifetime.Singleton); - this.with(AbilityCommonConfigs.class).lifetime(Lifetime.Singleton); + this.with(DrawableManager.class).lifetime(Lifetime.Singleton); + this.with(PlanetManager.class).lifetime(Lifetime.Singleton); + this.with(ChunkManager.class).lifetime(Lifetime.Singleton); + this.with(PartMan.class).lifetime(Lifetime.Singleton); + this.with(AsteroidBuilder.class).lifetime(Lifetime.Singleton); + this.with(LootBuilder.class).lifetime(Lifetime.Singleton); + this.with(ShipBuilder.class).lifetime(Lifetime.Singleton); + this.with(GridDrawer.class).lifetime(Lifetime.Singleton); + this.with(FarBackgroundManagerOld.class).lifetime(Lifetime.Singleton); + this.with(FactionManager.class).lifetime(Lifetime.Singleton); + this.with(MapDrawer.class).lifetime(Lifetime.Singleton); + this.with(RubbleBuilder.class).lifetime(Lifetime.Singleton); + this.with(ItemManager.class).lifetime(Lifetime.Singleton); + this.with(EffectTypes.class).lifetime(Lifetime.Singleton); + this.with(StarPort.Builder.class).lifetime(Lifetime.Singleton); + this.with(DrawableDebugger.class).lifetime(Lifetime.Singleton); + this.with(SpecialSounds.class).lifetime(Lifetime.Singleton); + this.with(SpecialEffects.class).lifetime(Lifetime.Singleton); + this.with(GameColors.class).lifetime(Lifetime.Singleton); + this.with(BeaconHandler.class).lifetime(Lifetime.Singleton); + this.with(MountDetectDrawer.class).lifetime(Lifetime.Singleton); + this.with(GalaxyFiller.class).lifetime(Lifetime.Singleton); + this.with(SolContactListener.class).lifetime(Lifetime.Singleton); + this.with(GameScreens.class).lifetime(Lifetime.Singleton); + this.with(SolCam.class).lifetime(Lifetime.Singleton); + this.with(ObjectManager.class).lifetime(Lifetime.Singleton); + this.with(GameDrawer.class).lifetime(Lifetime.Singleton); + this.with(AbilityCommonConfigs.class).lifetime(Lifetime.Singleton); } } diff --git a/engine/src/main/java/org/destinationsol/game/SolGame.java b/engine/src/main/java/org/destinationsol/game/SolGame.java index e0a906218..dd9720676 100644 --- a/engine/src/main/java/org/destinationsol/game/SolGame.java +++ b/engine/src/main/java/org/destinationsol/game/SolGame.java @@ -170,7 +170,7 @@ public MainGameScreen getMainGameScreen() { } @Inject - public SolGame(SolApplication solApplication) { + public SolGame(SolApplication solApplication, PlanetConfigManager planetConfigManager, MazeConfigManager mazeConfigManager, BeltConfigManager beltConfigManager) { FactionInfo.init(); this.solApplication = solApplication; boolean isMobile = solApplication.isMobile(); @@ -180,6 +180,12 @@ public SolGame(SolApplication solApplication) { } else { mainGameScreen = (MainGameScreen) Assets.getAssetHelper().get(new ResourceUrn(NUI_MAIN_GAME_SCREEN_MOBILE_URI), UIElement.class).get().getRootWidget(); } + // TODO: resolve hack to set solApplication + mainGameScreen.setSolApplication(solApplication); + + planetConfigManager.loadDefaultPlanetConfigs(); + mazeConfigManager.loadDefaultMazeConfigs(); + beltConfigManager.loadDefaultBeltConfigs(); timeFactor = 1; } diff --git a/engine/src/main/java/org/destinationsol/ui/nui/screens/MainGameScreen.java b/engine/src/main/java/org/destinationsol/ui/nui/screens/MainGameScreen.java index 846ede144..af773309c 100644 --- a/engine/src/main/java/org/destinationsol/ui/nui/screens/MainGameScreen.java +++ b/engine/src/main/java/org/destinationsol/ui/nui/screens/MainGameScreen.java @@ -61,6 +61,10 @@ public MainGameScreen() { } + public void setSolApplication(SolApplication application) { + this.solApplication = application; + } + @Override public void initialise() { consoleScreen = (ConsoleScreen) Assets.getAssetHelper().get(new ResourceUrn("engine:console"), UIElement.class).get().getRootWidget(); diff --git a/engine/src/main/java/org/destinationsol/world/generators/FeatureGenerator.java b/engine/src/main/java/org/destinationsol/world/generators/FeatureGenerator.java index 63259dca4..9c241a6bc 100644 --- a/engine/src/main/java/org/destinationsol/world/generators/FeatureGenerator.java +++ b/engine/src/main/java/org/destinationsol/world/generators/FeatureGenerator.java @@ -17,6 +17,7 @@ import com.badlogic.gdx.math.Vector2; import org.destinationsol.world.Orbital; +import org.terasology.context.annotation.IndexInherited; /** * This class represents the abstract version of any feature which will populate the game's SolarSystems, such as Planets, @@ -24,6 +25,7 @@ * general Feature, or extend the child {@link PlanetGenerator} or {@link MazeGenerator} classes to create custom * versions of those elements. */ +@IndexInherited public abstract class FeatureGenerator { public static final float ORBITAL_FEATURE_BUFFER = 8f; private Vector2 position = new Vector2(); diff --git a/engine/src/main/java/org/destinationsol/world/generators/LargeSolarSystemGenerator.java b/engine/src/main/java/org/destinationsol/world/generators/LargeSolarSystemGenerator.java index 2df30c5db..ba82eca0a 100644 --- a/engine/src/main/java/org/destinationsol/world/generators/LargeSolarSystemGenerator.java +++ b/engine/src/main/java/org/destinationsol/world/generators/LargeSolarSystemGenerator.java @@ -18,9 +18,11 @@ import org.destinationsol.common.SolRandom; import org.destinationsol.game.planet.SolarSystem; -public class LargeSolarSystemGenerator extends SolarSystemGenerator { +import javax.inject.Inject; +public class LargeSolarSystemGenerator extends SolarSystemGenerator { + @Inject public LargeSolarSystemGenerator() { } From 9e013e8224b077d6e23358cc1487554970c0cd82 Mon Sep 17 00:00:00 2001 From: Benjamin Amos Date: Mon, 22 Nov 2021 21:50:25 +0000 Subject: [PATCH 29/38] test: fix RubbleTest race condition --- .../org/destinationsol/game/RubbleTest.java | 38 +++++++++++++------ .../world/GalaxyBuilderTest.java | 6 +-- .../world/generators/BeltGeneratorTest.java | 29 ++++++++------ .../world/generators/MazeGeneratorTest.java | 29 ++++++++------ .../world/generators/PlanetGeneratorTest.java | 9 +++-- .../generators/SolarSystemGeneratorTest.java | 29 ++++++++------ 6 files changed, 87 insertions(+), 53 deletions(-) diff --git a/engine/src/test/java/org/destinationsol/game/RubbleTest.java b/engine/src/test/java/org/destinationsol/game/RubbleTest.java index 599eab253..257acbdd4 100644 --- a/engine/src/test/java/org/destinationsol/game/RubbleTest.java +++ b/engine/src/test/java/org/destinationsol/game/RubbleTest.java @@ -17,6 +17,7 @@ import com.badlogic.gdx.Gdx; import com.badlogic.gdx.graphics.Color; +import com.badlogic.gdx.graphics.GL20; import com.badlogic.gdx.math.Vector2; import com.badlogic.gdx.physics.box2d.Body; import org.destinationsol.assets.Assets; @@ -24,9 +25,14 @@ import org.destinationsol.game.drawables.DrawableLevel; import org.destinationsol.game.drawables.RectSprite; import org.destinationsol.testingUtilities.BodyUtilities; -import org.destinationsol.testingUtilities.InitializationUtilities; +import org.destinationsol.testingUtilities.MockGL; +import org.destinationsol.testsupport.AssetsHelperInitializer; +import org.destinationsol.testsupport.Box2DInitializer; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; +import org.mockito.Mockito; import java.util.ArrayList; @@ -36,20 +42,25 @@ import static org.junit.jupiter.api.Assertions.assertTrue; import static org.junit.jupiter.api.Assertions.fail; -public class RubbleTest { +public class RubbleTest implements AssetsHelperInitializer, Box2DInitializer { private static ArrayList drawables; - private static final SolObject RUBBLE_CONSTANT; + private static SolObject RUBBLE_CONSTANT; + private SolGame game; - static { - InitializationUtilities.init(); + @BeforeEach + public void setUp() { + GL20 mockGL = new MockGL(); + Gdx.gl = mockGL; + Gdx.gl20 = mockGL; + game = Mockito.mock(SolGame.class); RUBBLE_CONSTANT = createRubble(); } private static SolObject createRubble() { drawables = new ArrayList<>(1); - Gdx.app.postRunnable(() -> drawables.add(new RectSprite(Assets.listTexturesMatching("engine:rubble_.*").get(0), 1, 1, 1, new Vector2(), DrawableLevel.PART_FG_0, 0, 0, Color.WHITE, false))); + drawables.add(new RectSprite(Assets.listTexturesMatching("engine:rubble_.*").get(0), 1, 1, 1, new Vector2(), DrawableLevel.PART_FG_0, 0, 0, Color.WHITE, false)); return new Rubble(BodyUtilities.createDummyBody(), drawables); } @@ -90,7 +101,7 @@ public void getSpeed() { @Test public void handleContact() { // Rubbles are not big enough to cause damage or get damage or anything, so this just shouldn't crash - RUBBLE_CONSTANT.handleContact(new Rubble(BodyUtilities.createDummyBody(), drawables), 10f, InitializationUtilities.game, new Vector2(0f, 0f)); + RUBBLE_CONSTANT.handleContact(new Rubble(BodyUtilities.createDummyBody(), drawables), 10f, game, new Vector2(0f, 0f)); } @Test @@ -107,26 +118,26 @@ public void hasBody() { @Test public void update() { // Just should not throw exception - all the moving and stuff is handled by body, this has just to exist - RUBBLE_CONSTANT.update(InitializationUtilities.game); + RUBBLE_CONSTANT.update(game); } @Test public void shouldBeRemoved() { // This should persist for as long as seen/loaded - assertFalse(RUBBLE_CONSTANT.shouldBeRemoved(InitializationUtilities.game)); + assertFalse(RUBBLE_CONSTANT.shouldBeRemoved(game)); } @Test public void onRemove() { // TODO onRemove() should free its resources. How to test that? // I guess this just should not crash - new Rubble(BodyUtilities.createDummyBody(), drawables).onRemove(InitializationUtilities.game); + new Rubble(BodyUtilities.createDummyBody(), drawables).onRemove(game); } @Test public void receiveDmg() { // Rubbles have no health, and thus receiveDamage() just should not crash - RUBBLE_CONSTANT.receiveDmg(100, InitializationUtilities.game, null, DmgType.BULLET); + RUBBLE_CONSTANT.receiveDmg(100, game, null, DmgType.BULLET); } @Test @@ -141,4 +152,9 @@ public void receiveForce() { // TODO I don't quite know what does this even do, so better leave this for sb else fail("Implement this test!"); } + + @AfterEach + public void finish() { + RUBBLE_CONSTANT.onRemove(game); + } } diff --git a/engine/src/test/java/org/destinationsol/world/GalaxyBuilderTest.java b/engine/src/test/java/org/destinationsol/world/GalaxyBuilderTest.java index ff9dd83f1..ba14e57c6 100644 --- a/engine/src/test/java/org/destinationsol/world/GalaxyBuilderTest.java +++ b/engine/src/test/java/org/destinationsol/world/GalaxyBuilderTest.java @@ -35,6 +35,7 @@ import org.destinationsol.testsupport.AssetsHelperInitializer; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.mockito.Mockito; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNotNull; @@ -53,8 +54,7 @@ public class GalaxyBuilderTest implements AssetsHelperInitializer { @BeforeEach public void setUp() throws Exception { context = new ContextImpl(); -// moduleManager = new ModuleManager(); - moduleManager.init(); + moduleManager = getModuleManager(); context.put(ModuleManager.class, moduleManager); setupMockGL(); @@ -92,7 +92,7 @@ private void setupConfigManagers() { private ItemManager setupItemManager() { gameColors = new GameColors(); effectTypes = new EffectTypes(); -// soundManager = new OggSoundManager(context); + soundManager = Mockito.mock(OggSoundManager.class); return new ItemManager(soundManager, effectTypes, gameColors); } diff --git a/engine/src/test/java/org/destinationsol/world/generators/BeltGeneratorTest.java b/engine/src/test/java/org/destinationsol/world/generators/BeltGeneratorTest.java index 64bfed8c7..ace63988e 100644 --- a/engine/src/test/java/org/destinationsol/world/generators/BeltGeneratorTest.java +++ b/engine/src/test/java/org/destinationsol/world/generators/BeltGeneratorTest.java @@ -22,8 +22,7 @@ import org.destinationsol.files.HullConfigManager; import org.destinationsol.game.AbilityCommonConfigs; import org.destinationsol.game.GameColors; -import org.destinationsol.game.context.Context; -import org.destinationsol.game.context.internal.ContextImpl; +import org.destinationsol.game.WorldConfig; import org.destinationsol.game.item.ItemManager; import org.destinationsol.game.maze.MazeConfigManager; import org.destinationsol.game.particle.EffectTypes; @@ -36,13 +35,19 @@ import org.destinationsol.world.GalaxyBuilder; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.mockito.Mockito; +import org.terasology.context.Lifetime; +import org.terasology.gestalt.di.BeanContext; +import org.terasology.gestalt.di.DefaultBeanContext; +import org.terasology.gestalt.di.ServiceRegistry; import java.util.ArrayList; import static org.junit.jupiter.api.Assertions.assertTrue; public class BeltGeneratorTest implements AssetsHelperInitializer { - private Context context; + private ServiceRegistry registry; + private BeanContext context; private ModuleManager moduleManager; private GalaxyBuilder galaxyBuilder; private GameColors gameColors; @@ -54,16 +59,16 @@ public class BeltGeneratorTest implements AssetsHelperInitializer { @BeforeEach public void setUp() throws Exception { - context = new ContextImpl(); + registry = new ServiceRegistry(); moduleManager = getModuleManager(); - moduleManager.init(); - context.put(ModuleManager.class, moduleManager); + registry.with(ModuleManager.class).use(() -> moduleManager).lifetime(Lifetime.Singleton); setupMockGL(); setupConfigManagers(); -// galaxyBuilder = new GalaxyBuilder(context, 1); + context = new DefaultBeanContext(registry); + galaxyBuilder = new GalaxyBuilder(new WorldConfig(), moduleManager, context.getBean(SolarSystemConfigManager.class), context); ArrayList solarSystemGenerators = galaxyBuilder.initializeRandomSolarSystemGenerators(); solarSystemGenerator = solarSystemGenerators.get(0); @@ -85,24 +90,24 @@ private void setupConfigManagers() { PlanetConfigManager planetConfigManager = new PlanetConfigManager(hullConfigManager, gameColors,itemManager); planetConfigManager.loadDefaultPlanetConfigs(); - context.put(PlanetConfigManager.class, planetConfigManager); + registry.with(PlanetConfigManager.class).use(() -> planetConfigManager).lifetime(Lifetime.Singleton); SolarSystemConfigManager solarSystemConfigManager = new SolarSystemConfigManager(hullConfigManager, itemManager); - context.put(SolarSystemConfigManager.class, solarSystemConfigManager); + registry.with(SolarSystemConfigManager.class).use(() -> solarSystemConfigManager).lifetime(Lifetime.Singleton); MazeConfigManager mazeConfigManager = new MazeConfigManager(hullConfigManager, itemManager); mazeConfigManager.loadDefaultMazeConfigs(); - context.put(MazeConfigManager.class, mazeConfigManager); + registry.with(MazeConfigManager.class).use(() -> mazeConfigManager).lifetime(Lifetime.Singleton); BeltConfigManager beltConfigManager = new BeltConfigManager(hullConfigManager, itemManager); beltConfigManager.loadDefaultBeltConfigs(); - context.put(BeltConfigManager.class, beltConfigManager); + registry.with(BeltConfigManager.class).use(() -> beltConfigManager).lifetime(Lifetime.Singleton); } private ItemManager setupItemManager() { gameColors = new GameColors(); effectTypes = new EffectTypes(); -// soundManager = new OggSoundManager(context); + soundManager = Mockito.mock(OggSoundManager.class); return new ItemManager(soundManager, effectTypes, gameColors); } diff --git a/engine/src/test/java/org/destinationsol/world/generators/MazeGeneratorTest.java b/engine/src/test/java/org/destinationsol/world/generators/MazeGeneratorTest.java index 27ef4b884..4379e57f6 100644 --- a/engine/src/test/java/org/destinationsol/world/generators/MazeGeneratorTest.java +++ b/engine/src/test/java/org/destinationsol/world/generators/MazeGeneratorTest.java @@ -22,8 +22,7 @@ import org.destinationsol.files.HullConfigManager; import org.destinationsol.game.AbilityCommonConfigs; import org.destinationsol.game.GameColors; -import org.destinationsol.game.context.Context; -import org.destinationsol.game.context.internal.ContextImpl; +import org.destinationsol.game.WorldConfig; import org.destinationsol.game.item.ItemManager; import org.destinationsol.game.maze.MazeConfigManager; import org.destinationsol.game.particle.EffectTypes; @@ -36,13 +35,19 @@ import org.destinationsol.world.GalaxyBuilder; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.mockito.Mockito; +import org.terasology.context.Lifetime; +import org.terasology.gestalt.di.BeanContext; +import org.terasology.gestalt.di.DefaultBeanContext; +import org.terasology.gestalt.di.ServiceRegistry; import java.util.ArrayList; import static org.junit.jupiter.api.Assertions.assertTrue; public class MazeGeneratorTest implements AssetsHelperInitializer { - private Context context; + private ServiceRegistry registry; + private BeanContext context; private ModuleManager moduleManager; private GalaxyBuilder galaxyBuilder; private GameColors gameColors; @@ -54,16 +59,16 @@ public class MazeGeneratorTest implements AssetsHelperInitializer { @BeforeEach public void setUp() throws Exception { - context = new ContextImpl(); + registry = new ServiceRegistry(); moduleManager = getModuleManager(); - moduleManager.init(); - context.put(ModuleManager.class, moduleManager); + registry.with(ModuleManager.class).use(() -> moduleManager).lifetime(Lifetime.Singleton); setupMockGL(); setupConfigManagers(); -// galaxyBuilder = new GalaxyBuilder(context, 1); + context = new DefaultBeanContext(registry); + galaxyBuilder = new GalaxyBuilder(new WorldConfig(), moduleManager, context.getBean(SolarSystemConfigManager.class), context); ArrayList solarSystemGenerators = galaxyBuilder.initializeRandomSolarSystemGenerators(); solarSystemGenerator = solarSystemGenerators.get(0); @@ -89,24 +94,24 @@ private void setupConfigManagers() { PlanetConfigManager planetConfigManager = new PlanetConfigManager(hullConfigManager, gameColors,itemManager); planetConfigManager.loadDefaultPlanetConfigs(); - context.put(PlanetConfigManager.class, planetConfigManager); + registry.with(PlanetConfigManager.class).use(() -> planetConfigManager).lifetime(Lifetime.Singleton); SolarSystemConfigManager solarSystemConfigManager = new SolarSystemConfigManager(hullConfigManager, itemManager); - context.put(SolarSystemConfigManager.class, solarSystemConfigManager); + registry.with(SolarSystemConfigManager.class).use(() -> solarSystemConfigManager).lifetime(Lifetime.Singleton); MazeConfigManager mazeConfigManager = new MazeConfigManager(hullConfigManager, itemManager); mazeConfigManager.loadDefaultMazeConfigs(); - context.put(MazeConfigManager.class, mazeConfigManager); + registry.with(MazeConfigManager.class).use(() -> mazeConfigManager).lifetime(Lifetime.Singleton); BeltConfigManager beltConfigManager = new BeltConfigManager(hullConfigManager, itemManager); beltConfigManager.loadDefaultBeltConfigs(); - context.put(BeltConfigManager.class, beltConfigManager); + registry.with(BeltConfigManager.class).use(() -> beltConfigManager).lifetime(Lifetime.Singleton); } private ItemManager setupItemManager() { gameColors = new GameColors(); effectTypes = new EffectTypes(); -// soundManager = new OggSoundManager(context); + soundManager = Mockito.mock(OggSoundManager.class); return new ItemManager(soundManager, effectTypes, gameColors); } diff --git a/engine/src/test/java/org/destinationsol/world/generators/PlanetGeneratorTest.java b/engine/src/test/java/org/destinationsol/world/generators/PlanetGeneratorTest.java index 313f1660b..9ef48d556 100644 --- a/engine/src/test/java/org/destinationsol/world/generators/PlanetGeneratorTest.java +++ b/engine/src/test/java/org/destinationsol/world/generators/PlanetGeneratorTest.java @@ -38,6 +38,7 @@ import org.destinationsol.world.GalaxyBuilder; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.mockito.Mockito; import org.terasology.context.Lifetime; import org.terasology.gestalt.di.DefaultBeanContext; import org.terasology.gestalt.di.ServiceRegistry; @@ -64,8 +65,11 @@ public class PlanetGeneratorTest implements AssetsHelperInitializer { public void setUp() throws Exception { ServiceRegistry registry = new ServiceRegistry(); + setupMockGL(); + ItemManager itemManager = setupItemManager(); HullConfigManager hullConfigManager = setupHullConfigManager(itemManager); + registry.with(GameColors.class).use(() -> gameColors).lifetime(Lifetime.Singleton); registry.with(ItemManager.class).use(() -> itemManager).lifetime(Lifetime.Singleton); registry.with(HullConfigManager.class).use(() -> hullConfigManager).lifetime(Lifetime.Singleton); registry.with(PlanetConfigManager.class).lifetime(Lifetime.Singleton); @@ -81,10 +85,9 @@ public void setUp() throws Exception { DefaultBeanContext context = new DefaultBeanContext(registry); context.getBean(MazeConfigManager.class).loadDefaultMazeConfigs(); context.getBean(PlanetConfigManager.class).loadDefaultPlanetConfigs(); + context.getBean(BeltConfigManager.class).loadDefaultBeltConfigs(); context.getBean(ModuleManager.class).init(); - setupMockGL(); - galaxyBuilder = context.getBean(GalaxyBuilder.class); ArrayList solarSystemGenerators = galaxyBuilder.initializeRandomSolarSystemGenerators(); @@ -104,7 +107,7 @@ private void setupMockGL() { private ItemManager setupItemManager() { gameColors = new GameColors(); effectTypes = new EffectTypes(); -// soundManager = new OggSoundManager(context); + soundManager = Mockito.mock(OggSoundManager.class); return new ItemManager(soundManager, effectTypes, gameColors); } diff --git a/engine/src/test/java/org/destinationsol/world/generators/SolarSystemGeneratorTest.java b/engine/src/test/java/org/destinationsol/world/generators/SolarSystemGeneratorTest.java index ba590d95d..9a7650929 100644 --- a/engine/src/test/java/org/destinationsol/world/generators/SolarSystemGeneratorTest.java +++ b/engine/src/test/java/org/destinationsol/world/generators/SolarSystemGeneratorTest.java @@ -21,8 +21,7 @@ import org.destinationsol.files.HullConfigManager; import org.destinationsol.game.AbilityCommonConfigs; import org.destinationsol.game.GameColors; -import org.destinationsol.game.context.Context; -import org.destinationsol.game.context.internal.ContextImpl; +import org.destinationsol.game.WorldConfig; import org.destinationsol.game.item.ItemManager; import org.destinationsol.game.maze.MazeConfigManager; import org.destinationsol.game.particle.EffectTypes; @@ -36,6 +35,11 @@ import org.destinationsol.world.GalaxyBuilder; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.mockito.Mockito; +import org.terasology.context.Lifetime; +import org.terasology.gestalt.di.BeanContext; +import org.terasology.gestalt.di.DefaultBeanContext; +import org.terasology.gestalt.di.ServiceRegistry; import java.util.ArrayList; @@ -45,7 +49,8 @@ import static org.junit.jupiter.api.Assertions.assertTrue; public class SolarSystemGeneratorTest implements AssetsHelperInitializer { - private Context context; + private ServiceRegistry registry; + private BeanContext context; private ModuleManager moduleManager; private GalaxyBuilder galaxyBuilder; private GameColors gameColors; @@ -56,16 +61,16 @@ public class SolarSystemGeneratorTest implements AssetsHelperInitializer { @BeforeEach public void setUp() throws Exception { - context = new ContextImpl(); + registry = new ServiceRegistry(); moduleManager = getModuleManager(); - moduleManager.init(); - context.put(ModuleManager.class, moduleManager); + registry.with(ModuleManager.class).use(() -> moduleManager).lifetime(Lifetime.Singleton); setupMockGL(); setupConfigManagers(); -// galaxyBuilder = new GalaxyBuilder(context, 1); + context = new DefaultBeanContext(registry); + galaxyBuilder = new GalaxyBuilder(new WorldConfig(), moduleManager, context.getBean(SolarSystemConfigManager.class), context); ArrayList solarSystemGenerators = galaxyBuilder.initializeRandomSolarSystemGenerators(); solarSystemGenerator = solarSystemGenerators.get(0); @@ -85,24 +90,24 @@ private void setupConfigManagers() { PlanetConfigManager planetConfigManager = new PlanetConfigManager(hullConfigManager, gameColors,itemManager); planetConfigManager.loadDefaultPlanetConfigs(); - context.put(PlanetConfigManager.class, planetConfigManager); + registry.with(PlanetConfigManager.class).use(() -> planetConfigManager).lifetime(Lifetime.Singleton); MazeConfigManager mazeConfigManager = new MazeConfigManager(hullConfigManager, itemManager); mazeConfigManager.loadDefaultMazeConfigs(); - context.put(MazeConfigManager.class, mazeConfigManager); + registry.with(MazeConfigManager.class).use(() -> mazeConfigManager).lifetime(Lifetime.Singleton); BeltConfigManager beltConfigManager = new BeltConfigManager(hullConfigManager, itemManager); beltConfigManager.loadDefaultBeltConfigs(); - context.put(BeltConfigManager.class, beltConfigManager); + registry.with(BeltConfigManager.class).use(() -> beltConfigManager).lifetime(Lifetime.Singleton); SolarSystemConfigManager solarSystemConfigManager = new SolarSystemConfigManager(hullConfigManager, itemManager); - context.put(SolarSystemConfigManager.class, solarSystemConfigManager); + registry.with(SolarSystemConfigManager.class).use(() -> solarSystemConfigManager).lifetime(Lifetime.Singleton); } private ItemManager setupItemManager() { gameColors = new GameColors(); effectTypes = new EffectTypes(); -// soundManager = new OggSoundManager(context); + soundManager = Mockito.mock(OggSoundManager.class); return new ItemManager(soundManager, effectTypes, gameColors); } From a22b061f3cc8ea77ad58a56474b1850f24daae9b Mon Sep 17 00:00:00 2001 From: Michael Pollind Date: Mon, 22 Nov 2021 21:19:07 -0800 Subject: [PATCH 30/38] chore: address changes --- build.gradle | 2 +- engine/build.gradle | 13 ++++--------- .../java/org/destinationsol/ContextWrapper.java | 7 ++++--- .../java/org/destinationsol/SolApplication.java | 3 +-- .../entitysystem/ComponentSystemManager.java | 7 ------- .../main/java/org/destinationsol/game/SolGame.java | 10 +++------- .../org/destinationsol/game/screens/MapScreen.java | 2 -- .../game/screens/ShipMixedControl.java | 1 - .../game/screens/ShipMouseControl.java | 1 - .../java/org/destinationsol/ui/TutorialManager.java | 4 ---- templates/build.gradle | 3 --- 11 files changed, 13 insertions(+), 40 deletions(-) diff --git a/build.gradle b/build.gradle index 954658a59..40346eaaf 100644 --- a/build.gradle +++ b/build.gradle @@ -28,7 +28,7 @@ allprojects { gdxVersion = '1.9.8' roboVMVersion = '2.3.3' gestaltVersion = '8.0.0-SNAPSHOT' - nuiVersion = '3.1.0-SNAPSHOT' + nuiVersion = '4.0.0-SNAPSHOT' } } diff --git a/engine/build.gradle b/engine/build.gradle index b96b528a8..960b300fb 100644 --- a/engine/build.gradle +++ b/engine/build.gradle @@ -15,11 +15,6 @@ buildscript { dependencies { classpath 'dom4j:dom4j:1.6.1' - - // HACK: Needed for NUI and gestalt entity-component reflections - classpath group: 'org.terasology.nui', name: 'nui', version: '3.1.0-SNAPSHOT' - classpath group: 'javax.servlet', name: 'javax.servlet-api', version: '3.0.1' - classpath "org.terasology.gestalt:gestalt-entity-system:$gestaltVersion" } } @@ -44,10 +39,10 @@ dependencies { implementation "net.jcip:jcip-annotations:1.0" - api group: 'org.terasology.nui', name: 'nui', version: '4.0.0-SNAPSHOT' - api group: 'org.terasology.nui', name: 'nui-libgdx', version: '4.0.0-SNAPSHOT' - api group: 'org.terasology.nui', name: 'nui-gestalt', version: '4.0.0-SNAPSHOT' - api group: 'org.terasology.nui', name: 'nui-reflect', version: '4.0.0-SNAPSHOT' + api "org.terasology.nui:nui:$nuiVersion" + api "org.terasology.nui:nui-libgdx:$nuiVersion" + api "org.terasology.nui:nui-gestalt:$nuiVersion" + api "org.terasology.nui:nui-reflect:$nuiVersion" implementation group: 'com.google.protobuf', name: 'protobuf-java', version: '3.4.0' diff --git a/engine/src/main/java/org/destinationsol/ContextWrapper.java b/engine/src/main/java/org/destinationsol/ContextWrapper.java index ebc8b9b0f..58aa7b8cd 100644 --- a/engine/src/main/java/org/destinationsol/ContextWrapper.java +++ b/engine/src/main/java/org/destinationsol/ContextWrapper.java @@ -23,6 +23,7 @@ import javax.inject.Inject; +@Deprecated public class ContextWrapper implements Context { private static final Logger logger = LoggerFactory.getLogger(ContextWrapper.class); @@ -38,18 +39,18 @@ public T get(Class type) { try { return (T) context.getBean(type); } catch (BeanResolutionException e){ - logger.warn("Bean [{}] no found",type); + logger.warn("Bean [{}] not found",type); return null; } } @Override public void put(Class type, U object) { - throw new RuntimeException("Unsupported"); + throw new RuntimeException("Cannot insert values into wrapped context: please use the BeanContext directly"); } @Override public void remove(Class type, U object) { - throw new RuntimeException("Unsupported"); + throw new RuntimeException("Cannot insert values into wrapped context: please use the BeanContext directly"); } } diff --git a/engine/src/main/java/org/destinationsol/SolApplication.java b/engine/src/main/java/org/destinationsol/SolApplication.java index 30b8d7476..587228d31 100644 --- a/engine/src/main/java/org/destinationsol/SolApplication.java +++ b/engine/src/main/java/org/destinationsol/SolApplication.java @@ -113,7 +113,6 @@ public class SolApplication implements ApplicationListener { private SolGame solGame; private ParameterAdapterManager parameterAdapterManager; private NUIManager nuiManager; -// private Context context; // TODO: Make this non-static. public static DisplayDimensions displayDimensions; @@ -131,7 +130,7 @@ public class SolApplication implements ApplicationListener { @Inject protected SolApplication() { - throw new RuntimeException("Unimplemented"); + throw new RuntimeException("Can't be instantiated from the Context"); } public SolApplication(float targetFPS, ServiceRegistry platformServices) { diff --git a/engine/src/main/java/org/destinationsol/entitysystem/ComponentSystemManager.java b/engine/src/main/java/org/destinationsol/entitysystem/ComponentSystemManager.java index 59ad64894..022e826a4 100644 --- a/engine/src/main/java/org/destinationsol/entitysystem/ComponentSystemManager.java +++ b/engine/src/main/java/org/destinationsol/entitysystem/ComponentSystemManager.java @@ -15,14 +15,7 @@ */ package org.destinationsol.entitysystem; -import com.google.common.collect.Lists; -import org.destinationsol.game.context.Context; -import org.destinationsol.modules.ModuleManager; -import org.destinationsol.util.InjectionHelper; -import org.terasology.gestalt.module.ModuleEnvironment; - import javax.inject.Inject; -import java.util.ArrayList; import java.util.List; public class ComponentSystemManager { diff --git a/engine/src/main/java/org/destinationsol/game/SolGame.java b/engine/src/main/java/org/destinationsol/game/SolGame.java index dd9720676..d575df1c1 100644 --- a/engine/src/main/java/org/destinationsol/game/SolGame.java +++ b/engine/src/main/java/org/destinationsol/game/SolGame.java @@ -193,13 +193,9 @@ public SolGame(SolApplication solApplication, PlanetConfigManager planetConfigMa public void createUpdateSystems() { // the ordering of update aware systems is very important, switching them up can cause bugs! - updateSystems = new TreeMap>(); - List defaultSystems = new ArrayList(); - defaultSystems.addAll(Arrays.asList(planetManager, solCam, chunkManager, mountDetectDrawer, objectManager, mapDrawer, soundManager, beaconHandler, drawableDebugger)); - if (tutorialManager.isPresent()) { - tutorialManager.get().init(); - defaultSystems.add(tutorialManager.get()); - } + updateSystems = new TreeMap<>(); + List defaultSystems = new ArrayList<>(Arrays.asList(planetManager, solCam, chunkManager, mountDetectDrawer, objectManager, mapDrawer, soundManager, beaconHandler, drawableDebugger)); + tutorialManager.ifPresent(defaultSystems::add); updateSystems.put(0, defaultSystems); List defaultPausedSystems = new ArrayList(); diff --git a/engine/src/main/java/org/destinationsol/game/screens/MapScreen.java b/engine/src/main/java/org/destinationsol/game/screens/MapScreen.java index eb59ca2de..aaa9e60f2 100644 --- a/engine/src/main/java/org/destinationsol/game/screens/MapScreen.java +++ b/engine/src/main/java/org/destinationsol/game/screens/MapScreen.java @@ -78,7 +78,6 @@ public class MapScreen extends SolUiBaseScreen { @Override public void updateCustom(SolApplication solApplication, SolInputManager.InputPointer[] inputPointers, boolean clickedOutside) { -// Context context = solApplication.getContext(); SolGame game = solApplication.getGame(); GameOptions gameOptions = solApplication.getOptions(); boolean justClosed = closeControl.isJustOff(); @@ -124,7 +123,6 @@ public void updateCustom(SolApplication solApplication, SolInputManager.InputPoi if (isPickingWaypointSpot) { if (inputPointers[0].isJustUnPressed() && !addWaypointControl.isJustOff()) { -// SolCam camera = context.get(SolCam.class); float camAngle = game.getCam().getAngle(); Vector2 mapCamPos = game.getCam().getPosition().add(mapDrawer.getMapDrawPositionAdditive()); Vector2 clickPosition = new Vector2(inputPointers[0].x, inputPointers[0].y); diff --git a/engine/src/main/java/org/destinationsol/game/screens/ShipMixedControl.java b/engine/src/main/java/org/destinationsol/game/screens/ShipMixedControl.java index 57c567b65..e3a096d8a 100644 --- a/engine/src/main/java/org/destinationsol/game/screens/ShipMixedControl.java +++ b/engine/src/main/java/org/destinationsol/game/screens/ShipMixedControl.java @@ -63,7 +63,6 @@ public class ShipMixedControl implements ShipUiControl { @Override public void update(SolApplication solApplication, boolean enabled) { -// Context context = solApplication.getContext(); GameOptions gameOptions = solApplication.getOptions(); blur(); SolGame game = solApplication.getGame(); diff --git a/engine/src/main/java/org/destinationsol/game/screens/ShipMouseControl.java b/engine/src/main/java/org/destinationsol/game/screens/ShipMouseControl.java index 11d39fefc..6655e2139 100644 --- a/engine/src/main/java/org/destinationsol/game/screens/ShipMouseControl.java +++ b/engine/src/main/java/org/destinationsol/game/screens/ShipMouseControl.java @@ -44,7 +44,6 @@ public class ShipMouseControl implements ShipUiControl { @Override public void update(SolApplication solApplication, boolean enabled) { -// Context context = solApplication.getContext(); SolGame game = solApplication.getGame(); Hero hero = game.getHero(); myCursor = null; diff --git a/engine/src/main/java/org/destinationsol/ui/TutorialManager.java b/engine/src/main/java/org/destinationsol/ui/TutorialManager.java index 50121d900..c50ec587f 100644 --- a/engine/src/main/java/org/destinationsol/ui/TutorialManager.java +++ b/engine/src/main/java/org/destinationsol/ui/TutorialManager.java @@ -57,10 +57,6 @@ public TutorialManager(GameScreens screens, GameOptions gameOptions, Provider Date: Thu, 25 Nov 2021 20:23:48 +0000 Subject: [PATCH 31/38] fix(android): fix the game running on Android --- .../main/java/org/destinationsol/desktop/SolDesktop.java | 9 +++++++++ .../org/destinationsol/modules/FacadeModuleConfig.java | 7 +++++++ .../java/org/destinationsol/modules/ModuleManager.java | 9 ++++++++- .../ui/nui/screens/UIShipControlsScreen.java | 3 +++ .../testingUtilities/InitializationUtilities.java | 3 +++ .../org/destinationsol/testsupport/TestModuleConfig.java | 7 +++++++ 6 files changed, 37 insertions(+), 1 deletion(-) diff --git a/desktop/src/main/java/org/destinationsol/desktop/SolDesktop.java b/desktop/src/main/java/org/destinationsol/desktop/SolDesktop.java index 456657b7d..97ce2e947 100644 --- a/desktop/src/main/java/org/destinationsol/desktop/SolDesktop.java +++ b/desktop/src/main/java/org/destinationsol/desktop/SolDesktop.java @@ -33,7 +33,10 @@ import org.terasology.context.Lifetime; import org.terasology.crashreporter.CrashReporter; import org.terasology.gestalt.di.ServiceRegistry; +import org.terasology.gestalt.module.Module; import org.terasology.gestalt.module.ModuleEnvironment; +import org.terasology.gestalt.module.ModuleFactory; +import org.terasology.gestalt.module.ModulePathScanner; import org.terasology.gestalt.module.sandbox.JavaModuleClassLoader; import java.awt.Graphics2D; @@ -220,6 +223,7 @@ private static void setScreenDimensions(Lwjgl3ApplicationConfiguration applicati private static class DesktopServices extends ServiceRegistry { public DesktopServices() { this.with(FacadeModuleConfig.class).lifetime(Lifetime.Singleton).use(DesktopModuleConfig::new); + this.with(ModulePathScanner.class).lifetime(Lifetime.Singleton); } } @@ -239,6 +243,11 @@ public ModuleEnvironment.ClassLoaderSupplier getClassLoaderSupplier() { return JavaModuleClassLoader::create; } + @Override + public Module createEngineModule() { + return new ModuleFactory().createPackageModule("org.destinationsol"); + } + @Override public Class[] getAPIClasses() { return new Class[0]; diff --git a/engine/src/main/java/org/destinationsol/modules/FacadeModuleConfig.java b/engine/src/main/java/org/destinationsol/modules/FacadeModuleConfig.java index 649bd2f8a..c1cc24770 100644 --- a/engine/src/main/java/org/destinationsol/modules/FacadeModuleConfig.java +++ b/engine/src/main/java/org/destinationsol/modules/FacadeModuleConfig.java @@ -1,5 +1,6 @@ package org.destinationsol.modules; +import org.terasology.gestalt.module.Module; import org.terasology.gestalt.module.ModuleEnvironment; import java.io.File; @@ -28,6 +29,12 @@ public interface FacadeModuleConfig { */ ModuleEnvironment.ClassLoaderSupplier getClassLoaderSupplier(); + /** + * Constructs the engine module from the base classpath and returns it. + * @return the constructed engine module. + */ + Module createEngineModule(); + /** * Returns a list of classes that should be accessible from within the sandbox. * Any classes not part of the built-in list or this one cannot be used in module code. diff --git a/engine/src/main/java/org/destinationsol/modules/ModuleManager.java b/engine/src/main/java/org/destinationsol/modules/ModuleManager.java index 0dc1a688d..ec2ab511b 100644 --- a/engine/src/main/java/org/destinationsol/modules/ModuleManager.java +++ b/engine/src/main/java/org/destinationsol/modules/ModuleManager.java @@ -191,6 +191,13 @@ public class ModuleManager implements AutoCloseable { org.terasology.context.DefaultAnnotationMetadata.class, org.terasology.context.AnnotationValue.class, org.terasology.context.DefaultAnnotationValue.class, + org.terasology.context.annotation.Index.class, + org.terasology.context.annotation.IndexInherited.class, + org.terasology.context.annotation.RegisterSystem.class, + org.terasology.context.annotation.UsedByGeneratedCode.class, + org.terasology.context.annotation.Service.class, + org.terasology.context.annotation.Scoped.class, + org.terasology.context.annotation.Transient.class, org.terasology.gestalt.di.exceptions.DependencyResolutionException.class, org.terasology.context.exception.DependencyInjectionException.class, javax.inject.Inject.class, @@ -224,7 +231,7 @@ public ModuleManager(BeanContext beanContext, ModuleFactory moduleFactory, Modul public void init() throws Exception { try { - engineModule = moduleFactory.createPackageModule("org.destinationsol"); + engineModule = moduleConfig.createEngineModule(); Module nuiModule = moduleFactory.createPackageModule(new ModuleMetadata(new Name("nui"), new Version("2.0.0")),"org.terasology.nui"); // scan for all standard modules diff --git a/engine/src/main/java/org/destinationsol/ui/nui/screens/UIShipControlsScreen.java b/engine/src/main/java/org/destinationsol/ui/nui/screens/UIShipControlsScreen.java index b2886da3e..6f367fb99 100644 --- a/engine/src/main/java/org/destinationsol/ui/nui/screens/UIShipControlsScreen.java +++ b/engine/src/main/java/org/destinationsol/ui/nui/screens/UIShipControlsScreen.java @@ -17,6 +17,7 @@ import org.destinationsol.GameOptions; import org.destinationsol.SolApplication; +import org.destinationsol.common.In; import org.destinationsol.game.Hero; import org.destinationsol.game.item.Gun; import org.destinationsol.game.screens.ShipUiControl; @@ -47,7 +48,9 @@ public class UIShipControlsScreen extends NUIScreenLayer implements ShipUiContro private boolean controlsEnabled; @Inject + @In // TODO: Remove the @In annotation when gestalt-di works with UI screens. protected SolApplication solApplication; + @Inject public UIShipControlsScreen() { diff --git a/engine/src/test/java/org/destinationsol/testingUtilities/InitializationUtilities.java b/engine/src/test/java/org/destinationsol/testingUtilities/InitializationUtilities.java index 3b6fc21f9..366707678 100644 --- a/engine/src/test/java/org/destinationsol/testingUtilities/InitializationUtilities.java +++ b/engine/src/test/java/org/destinationsol/testingUtilities/InitializationUtilities.java @@ -58,6 +58,9 @@ public static void init() { .with(FacadeModuleConfig.class) .lifetime(Lifetime.Singleton) .use(TestModuleConfig::new); + serviceRegistry + .with(ModulePathScanner.class) + .lifetime(Lifetime.Singleton); final HeadlessApplication application = new HeadlessApplication(new SolApplication(100, serviceRegistry), new HeadlessApplicationConfiguration()); game = ((SolApplication) application.getApplicationListener()).getGame(); diff --git a/engine/src/test/java/org/destinationsol/testsupport/TestModuleConfig.java b/engine/src/test/java/org/destinationsol/testsupport/TestModuleConfig.java index 650f02ade..b5cdf21c2 100644 --- a/engine/src/test/java/org/destinationsol/testsupport/TestModuleConfig.java +++ b/engine/src/test/java/org/destinationsol/testsupport/TestModuleConfig.java @@ -1,7 +1,9 @@ package org.destinationsol.testsupport; import org.destinationsol.modules.FacadeModuleConfig; +import org.terasology.gestalt.module.Module; import org.terasology.gestalt.module.ModuleEnvironment; +import org.terasology.gestalt.module.ModuleFactory; import org.terasology.gestalt.module.sandbox.JavaModuleClassLoader; import java.io.File; @@ -29,6 +31,11 @@ public ModuleEnvironment.ClassLoaderSupplier getClassLoaderSupplier() { return JavaModuleClassLoader::create; } + @Override + public Module createEngineModule() { + return new ModuleFactory().createPackageModule("org.destinationsol"); + } + @Override public Class[] getAPIClasses() { return new Class[0]; From eea3ef699d99f1042a16a54aaaec153571a0ec7e Mon Sep 17 00:00:00 2001 From: Michael Pollind Date: Fri, 26 Nov 2021 18:30:45 -0800 Subject: [PATCH 32/38] chore: implement workaround for preBegin --- .../java/org/destinationsol/CoreService.java | 2 -- .../org/destinationsol/SolApplication.java | 5 ++- .../entitysystem/ComponentSystemManager.java | 33 ------------------- .../java/org/destinationsol/game/SolGame.java | 5 +-- .../destinationsol/modules/ModuleManager.java | 7 ++++ 5 files changed, 10 insertions(+), 42 deletions(-) delete mode 100644 engine/src/main/java/org/destinationsol/entitysystem/ComponentSystemManager.java diff --git a/engine/src/main/java/org/destinationsol/CoreService.java b/engine/src/main/java/org/destinationsol/CoreService.java index 9149373d0..d9e647cea 100644 --- a/engine/src/main/java/org/destinationsol/CoreService.java +++ b/engine/src/main/java/org/destinationsol/CoreService.java @@ -5,7 +5,6 @@ import org.destinationsol.assets.AssetHelper; import org.destinationsol.assets.music.OggMusicManager; import org.destinationsol.assets.sound.OggSoundManager; -import org.destinationsol.entitysystem.ComponentSystemManager; import org.destinationsol.game.DebugOptions; import org.destinationsol.game.screens.RightPaneLayout; import org.destinationsol.menu.MenuLayout; @@ -30,7 +29,6 @@ public CoreService(SolApplication application) { return new GameOptions(isMobile, null); }); this.with(ModuleManager.class).lifetime(Lifetime.Singleton); - this.with(ComponentSystemManager.class).lifetime(Lifetime.Singleton); this.with(OggMusicManager.class).lifetime(Lifetime.Singleton); this.with(OggSoundManager.class).lifetime(Lifetime.Singleton); diff --git a/engine/src/main/java/org/destinationsol/SolApplication.java b/engine/src/main/java/org/destinationsol/SolApplication.java index 587228d31..53c14b424 100644 --- a/engine/src/main/java/org/destinationsol/SolApplication.java +++ b/engine/src/main/java/org/destinationsol/SolApplication.java @@ -31,7 +31,6 @@ import org.destinationsol.common.SolColor; import org.destinationsol.common.SolMath; import org.destinationsol.common.SolRandom; -import org.destinationsol.entitysystem.ComponentSystemManager; import org.destinationsol.entitysystem.EntitySystemManager; import org.destinationsol.entitysystem.SerialisationManager; import org.destinationsol.game.DebugOptions; @@ -332,9 +331,9 @@ private void draw() { public void play(boolean tut, String shipName, boolean isNewGame, WorldConfig worldConfig) { gameContext = appContext.getNestedContainer(new GameConfigurationServiceRegistry(worldConfig), new SolGameServiceRegistry(tut), new ContextWrapperService()); - appContext.getBean(ComponentSystemManager.class).preBegin(); + ModuleManager moduleManager = appContext.getBean(ModuleManager.class); solGame = gameContext.getBean(SolGame.class); - gameContext.getBean(ComponentSystemManager.class).preBegin(); + moduleManager.preBegin(); entitySystemManager = gameContext.getBean(EntitySystemManager.class); solGame.createUpdateSystems(); diff --git a/engine/src/main/java/org/destinationsol/entitysystem/ComponentSystemManager.java b/engine/src/main/java/org/destinationsol/entitysystem/ComponentSystemManager.java deleted file mode 100644 index 022e826a4..000000000 --- a/engine/src/main/java/org/destinationsol/entitysystem/ComponentSystemManager.java +++ /dev/null @@ -1,33 +0,0 @@ -/* - * Copyright 2020 The Terasology Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.destinationsol.entitysystem; - -import javax.inject.Inject; -import java.util.List; - -public class ComponentSystemManager { - - private final List componentSystems; - - @Inject - public ComponentSystemManager(List componentSystems) { - this.componentSystems = componentSystems; - } - - public void preBegin() { - componentSystems.forEach(ComponentSystem::preBegin); - } -} diff --git a/engine/src/main/java/org/destinationsol/game/SolGame.java b/engine/src/main/java/org/destinationsol/game/SolGame.java index d575df1c1..05894976b 100644 --- a/engine/src/main/java/org/destinationsol/game/SolGame.java +++ b/engine/src/main/java/org/destinationsol/game/SolGame.java @@ -45,7 +45,6 @@ import org.destinationsol.game.item.SolItem; import org.destinationsol.game.maze.Maze; import org.destinationsol.game.maze.MazeConfigManager; -import org.destinationsol.game.particle.EffectTypes; import org.destinationsol.game.particle.PartMan; import org.destinationsol.game.particle.SpecialEffects; import org.destinationsol.game.planet.BeltConfigManager; @@ -53,7 +52,6 @@ import org.destinationsol.game.planet.PlanetConfigManager; import org.destinationsol.game.planet.PlanetManager; import org.destinationsol.game.planet.SolarSystem; -import org.destinationsol.game.planet.SolarSystemConfigManager; import org.destinationsol.game.planet.SunSingleton; import org.destinationsol.game.planet.SystemBelt; import org.destinationsol.game.screens.GameScreens; @@ -68,10 +66,9 @@ import org.destinationsol.ui.UiDrawer; import org.destinationsol.ui.Waypoint; import org.destinationsol.ui.nui.screens.MainGameScreen; -import org.destinationsol.util.InjectionHelper; -import org.terasology.gestalt.di.BeanContext; import org.destinationsol.world.GalaxyBuilder; import org.terasology.gestalt.assets.ResourceUrn; +import org.terasology.gestalt.di.BeanContext; import org.terasology.gestalt.entitysystem.entity.EntityRef; import org.terasology.nui.asset.UIElement; diff --git a/engine/src/main/java/org/destinationsol/modules/ModuleManager.java b/engine/src/main/java/org/destinationsol/modules/ModuleManager.java index ec2ab511b..7a1f2421e 100644 --- a/engine/src/main/java/org/destinationsol/modules/ModuleManager.java +++ b/engine/src/main/java/org/destinationsol/modules/ModuleManager.java @@ -16,6 +16,7 @@ package org.destinationsol.modules; import com.google.common.collect.Sets; +import org.destinationsol.entitysystem.ComponentSystem; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.terasology.gestalt.di.BeanContext; @@ -37,6 +38,7 @@ import java.lang.reflect.InvocationTargetException; import java.lang.reflect.ReflectPermission; import java.security.Policy; +import java.util.List; import java.util.Set; /** @@ -286,6 +288,11 @@ public ModuleEnvironment getEnvironment() { return environment; } + public void preBegin() { + List componentSystems = getEnvironment().getBeans(ComponentSystem.class); + componentSystems.forEach(ComponentSystem::preBegin); + } + //TODO: REMOVE THIS public static ModuleEnvironment getEnvironmentStatic() { return environment; From 9990d4e4087b49f2b4cfc3099f47c79f9c5c5964 Mon Sep 17 00:00:00 2001 From: Michael Pollind Date: Fri, 26 Nov 2021 22:23:56 -0800 Subject: [PATCH 33/38] chore: resolve preBegin --- .../main/java/org/destinationsol/SolApplication.java | 11 ++++++++++- .../org/destinationsol/modules/ModuleManager.java | 5 ----- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/engine/src/main/java/org/destinationsol/SolApplication.java b/engine/src/main/java/org/destinationsol/SolApplication.java index 53c14b424..b38190507 100644 --- a/engine/src/main/java/org/destinationsol/SolApplication.java +++ b/engine/src/main/java/org/destinationsol/SolApplication.java @@ -22,6 +22,7 @@ import com.badlogic.gdx.graphics.GL20; import com.badlogic.gdx.math.Vector2; import com.badlogic.gdx.physics.box2d.Box2D; +import com.google.common.collect.Sets; import org.destinationsol.assets.AssetHelper; import org.destinationsol.assets.Assets; import org.destinationsol.assets.music.OggMusicManager; @@ -31,6 +32,7 @@ import org.destinationsol.common.SolColor; import org.destinationsol.common.SolMath; import org.destinationsol.common.SolRandom; +import org.destinationsol.entitysystem.ComponentSystem; import org.destinationsol.entitysystem.EntitySystemManager; import org.destinationsol.entitysystem.SerialisationManager; import org.destinationsol.game.DebugOptions; @@ -78,6 +80,7 @@ import java.io.PrintWriter; import java.io.StringWriter; import java.util.HashSet; +import java.util.List; import java.util.Set; @API @@ -333,7 +336,13 @@ public void play(boolean tut, String shipName, boolean isNewGame, WorldConfig wo gameContext = appContext.getNestedContainer(new GameConfigurationServiceRegistry(worldConfig), new SolGameServiceRegistry(tut), new ContextWrapperService()); ModuleManager moduleManager = appContext.getBean(ModuleManager.class); solGame = gameContext.getBean(SolGame.class); - moduleManager.preBegin(); + + //TODO: rework how system will trigger preBegin + Set systems = Sets.newHashSet(); + systems.addAll(gameContext.getBeans(ComponentSystem.class)); + systems.addAll(moduleManager.getEnvironment().getBeans(ComponentSystem.class)); + systems.forEach(ComponentSystem::preBegin); + entitySystemManager = gameContext.getBean(EntitySystemManager.class); solGame.createUpdateSystems(); diff --git a/engine/src/main/java/org/destinationsol/modules/ModuleManager.java b/engine/src/main/java/org/destinationsol/modules/ModuleManager.java index 7a1f2421e..fad354ab0 100644 --- a/engine/src/main/java/org/destinationsol/modules/ModuleManager.java +++ b/engine/src/main/java/org/destinationsol/modules/ModuleManager.java @@ -288,11 +288,6 @@ public ModuleEnvironment getEnvironment() { return environment; } - public void preBegin() { - List componentSystems = getEnvironment().getBeans(ComponentSystem.class); - componentSystems.forEach(ComponentSystem::preBegin); - } - //TODO: REMOVE THIS public static ModuleEnvironment getEnvironmentStatic() { return environment; From 5a2416cab2284adf5aa68b597424b34a057f9158 Mon Sep 17 00:00:00 2001 From: darkweird Date: Tue, 26 Apr 2022 17:41:15 +0300 Subject: [PATCH 34/38] fix(di): restore playable state for desktop * Create BeanClassFactory for injecting to Asset related classes * Provide @Inject for every Asset related class * using scanner for scan `assets` and `ui` packages (im too lazy to explicitly write all them in service) --- build.gradle | 1 + .../org/destinationsol/BeanClassFactory.java | 20 ++++++ .../java/org/destinationsol/CoreService.java | 31 +++++++-- .../org/destinationsol/SolApplication.java | 64 +++++++++---------- .../destinationsol/assets/AssetHelper.java | 45 ++++++++----- .../assets/emitters/EmitterFactory.java | 2 + .../assets/emitters/EmitterFileFormat.java | 2 + .../assets/fonts/FontFactory.java | 7 ++ .../assets/fonts/FontFileFormat.java | 2 + .../assets/fonts/ScaledFontProducer.java | 14 ++-- .../assets/json/JsonDeltaFileFormat.java | 2 + .../assets/json/JsonFactory.java | 6 ++ .../assets/json/JsonFileFormat.java | 2 + .../assets/music/OggMusicFactory.java | 2 + .../assets/music/OggMusicFileFormat.java | 2 + .../assets/music/OggMusicManager.java | 8 ++- .../assets/sound/OggSoundFactory.java | 2 + .../assets/sound/OggSoundFileFormat.java | 2 + .../assets/sound/OggSoundInfoFormat.java | 2 + .../assets/sound/OggSoundManager.java | 2 + .../assets/textures/DSTextureFactory.java | 2 + .../assets/textures/DSTextureFileFormat.java | 2 + .../destinationsol/assets/ui/UIFormat.java | 38 +++++++---- .../assets/ui/UISkinFormat.java | 14 ++-- .../java/org/destinationsol/game/SolGame.java | 2 - .../game/console/ConsoleImpl.java | 11 ++-- .../game/screens/ConsoleScreen.java | 5 +- .../background/MenuBackgroundManager.java | 3 + .../destinationsol/ui/SolInputManager.java | 4 ++ .../org/destinationsol/ui/nui/NUIManager.java | 3 + .../ui/nui/screens/ConsoleScreen.java | 7 +- .../ui/nui/screens/MainGameScreen.java | 15 ++--- .../ui/nui/screens/UIShipControlsScreen.java | 10 ++- .../nui/screens/mainMenu/CreditsScreen.java | 11 +++- .../nui/screens/mainMenu/InputMapScreen.java | 11 +++- .../nui/screens/mainMenu/LoadingScreen.java | 10 ++- .../nui/screens/mainMenu/MainMenuScreen.java | 12 +++- .../nui/screens/mainMenu/NewGameScreen.java | 13 ++-- .../nui/screens/mainMenu/NewShipScreen.java | 11 +++- .../nui/screens/mainMenu/OptionsScreen.java | 13 ++-- .../screens/mainMenu/ResolutionScreen.java | 13 ++-- 41 files changed, 293 insertions(+), 135 deletions(-) create mode 100644 engine/src/main/java/org/destinationsol/BeanClassFactory.java diff --git a/build.gradle b/build.gradle index 90f106c3c..26da8113e 100644 --- a/build.gradle +++ b/build.gradle @@ -39,6 +39,7 @@ repositories { // Good ole Maven central mavenCentral() + mavenLocal() // Repos for LibGDX maven { url "https://oss.sonatype.org/content/repositories/snapshots/" } diff --git a/engine/src/main/java/org/destinationsol/BeanClassFactory.java b/engine/src/main/java/org/destinationsol/BeanClassFactory.java new file mode 100644 index 000000000..c66000a74 --- /dev/null +++ b/engine/src/main/java/org/destinationsol/BeanClassFactory.java @@ -0,0 +1,20 @@ +package org.destinationsol; + +import org.terasology.gestalt.di.BeanContext; +import org.terasology.gestalt.util.reflection.ClassFactory; + +import javax.inject.Provider; +import java.util.Optional; + +public class BeanClassFactory implements ClassFactory { + private final Provider beanContext; + + public BeanClassFactory(Provider beanContext) { + this.beanContext = beanContext; + } + + @Override + public Optional instantiateClass(Class type) { + return (Optional) beanContext.get().findBean(type); + } +} \ No newline at end of file diff --git a/engine/src/main/java/org/destinationsol/CoreService.java b/engine/src/main/java/org/destinationsol/CoreService.java index d9e647cea..56b2ad038 100644 --- a/engine/src/main/java/org/destinationsol/CoreService.java +++ b/engine/src/main/java/org/destinationsol/CoreService.java @@ -6,16 +6,25 @@ import org.destinationsol.assets.music.OggMusicManager; import org.destinationsol.assets.sound.OggSoundManager; import org.destinationsol.game.DebugOptions; +import org.destinationsol.game.console.Console; +import org.destinationsol.game.console.ConsoleImpl; import org.destinationsol.game.screens.RightPaneLayout; import org.destinationsol.menu.MenuLayout; +import org.destinationsol.menu.background.MenuBackgroundManager; import org.destinationsol.modules.ModuleManager; import org.destinationsol.ui.DisplayDimensions; import org.destinationsol.ui.SolInputManager; import org.destinationsol.ui.SolLayouts; import org.destinationsol.ui.UiDrawer; +import org.destinationsol.ui.nui.NUIManager; import org.terasology.context.Lifetime; import org.terasology.gestalt.di.ServiceRegistry; +import org.terasology.gestalt.di.scanners.StandardScanner; import org.terasology.gestalt.entitysystem.component.management.ComponentManager; +import org.terasology.nui.reflection.WidgetLibrary; +import org.terasology.reflection.copy.CopyStrategyLibrary; +import org.terasology.reflection.reflect.ReflectFactory; +import org.terasology.reflection.reflect.ReflectionReflectFactory; public class CoreService extends ServiceRegistry { public CoreService(SolApplication application) { @@ -30,12 +39,8 @@ public CoreService(SolApplication application) { }); this.with(ModuleManager.class).lifetime(Lifetime.Singleton); - this.with(OggMusicManager.class).lifetime(Lifetime.Singleton); - this.with(OggSoundManager.class).lifetime(Lifetime.Singleton); - this.with(SolInputManager.class).lifetime(Lifetime.Singleton); - this.with(ComponentManager.class).lifetime(Lifetime.Singleton).use(ComponentManager::new); - this.with(AssetHelper.class).lifetime(Lifetime.Singleton).use(AssetHelper::new); + this.with(AssetHelper.class).lifetime(Lifetime.Singleton); this.with(DisplayDimensions.class).lifetime(Lifetime.Singleton).use(() -> new DisplayDimensions(Gdx.graphics.getWidth(), Gdx.graphics.getHeight())); @@ -43,5 +48,21 @@ public CoreService(SolApplication application) { this.with(SolLayouts.class).lifetime(Lifetime.Singleton); this.with(RightPaneLayout.class).lifetime(Lifetime.Singleton); this.with(MenuLayout.class).lifetime(Lifetime.Singleton); + + this.with(NUIManager.class).lifetime(Lifetime.Singleton); + this.with(MenuBackgroundManager.class).lifetime(Lifetime.Singleton); + + + this.with(ReflectFactory.class).lifetime(Lifetime.Singleton).use(ReflectionReflectFactory.class); + this.with(CopyStrategyLibrary.class).lifetime(Lifetime.Singleton); + + this.with(WidgetLibrary.class).lifetime(Lifetime.Singleton); + this.with(SolInputManager.class).lifetime(Lifetime.Singleton); + this.registerScanner(new StandardScanner("org.destinationsol.assets")); + this.registerScanner(new StandardScanner("org.destinationsol.ui.nui")); + + // TODO seems this is should be GameService before game + this.with(Console.class).lifetime(Lifetime.Singleton).use(ConsoleImpl.class); } + } diff --git a/engine/src/main/java/org/destinationsol/SolApplication.java b/engine/src/main/java/org/destinationsol/SolApplication.java index 6ad76c23b..f4a12fa84 100644 --- a/engine/src/main/java/org/destinationsol/SolApplication.java +++ b/engine/src/main/java/org/destinationsol/SolApplication.java @@ -68,6 +68,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.terasology.context.annotation.API; +import org.terasology.gestalt.assets.module.ModuleAwareAssetTypeManagerImpl; import org.terasology.gestalt.di.BeanContext; import org.terasology.gestalt.di.DefaultBeanContext; import org.terasology.gestalt.di.ServiceRegistry; @@ -75,22 +76,22 @@ import org.terasology.gestalt.entitysystem.entity.EntityRef; import org.terasology.gestalt.module.ModuleServiceRegistry; import org.terasology.gestalt.module.sandbox.StandardPermissionProviderFactory; +import org.terasology.nui.reflection.WidgetLibrary; import javax.inject.Inject; import java.io.PrintWriter; import java.io.StringWriter; import java.util.HashSet; -import java.util.List; import java.util.Set; @API public class SolApplication implements ApplicationListener { private static final Logger logger = LoggerFactory.getLogger(SolApplication.class); - + // TODO: Make this non-static. + public static DisplayDimensions displayDimensions; + // TODO: Make this non-static. + private static Set resizeSubscribers; private final float targetFPS; - - private EntitySystemManager entitySystemManager; - @Inject protected OggMusicManager musicManager; @Inject @@ -103,10 +104,8 @@ public class SolApplication implements ApplicationListener { protected CommonDrawer commonDrawer; @Inject protected SolLayouts layouts; - + private EntitySystemManager entitySystemManager; private MenuBackgroundManager menuBackgroundManager; - - private FactionDisplay factionDisplay; private MenuScreens menuScreens; private GameOptions options; @@ -115,20 +114,13 @@ public class SolApplication implements ApplicationListener { private SolGame solGame; private ParameterAdapterManager parameterAdapterManager; private NUIManager nuiManager; - - // TODO: Make this non-static. - public static DisplayDimensions displayDimensions; - private float timeAccumulator = 0; private boolean isMobile; - private ComponentManager componentManager; - private BeanContext appContext; private BeanContext gameContext; - - // TODO: Make this non-static. - private static Set resizeSubscribers; + //TODO remove this line - it is for debugging purposes + private boolean entityCreated = false; @Inject protected SolApplication() { @@ -148,23 +140,34 @@ public SolApplication(float targetFPS, ServiceRegistry platformServices) { new ContextWrapperService()); } + // TODO: Make this non-static. + public static void addResizeSubscriber(ResizeSubscriber resizeSubscriber) { + resizeSubscribers.add(resizeSubscriber); + } + @Override public void create() { isMobile = Gdx.app.getType() == Application.ApplicationType.Android || Gdx.app.getType() == Application.ApplicationType.iOS; if (isMobile) { DebugOptions.read(null); } - options = new GameOptions(isMobile(), null); + options = appContext.getBean(GameOptions.class); componentManager = appContext.getBean(ComponentManager.class); try { appContext.getBean(ModuleManager.class).init(); } catch (Exception e) { - logger.error("Cannot initialize modules"); + logger.error("Cannot initialize modules"); } AssetHelper helper = appContext.getBean(AssetHelper.class); - helper.init(appContext.getBean(ModuleManager.class).getEnvironment(), componentManager, isMobile); - Assets.initialize(helper); + + helper.init(appContext.getBean(ModuleManager.class).getEnvironment(), + appContext.getBean(WidgetLibrary.class), + new ModuleAwareAssetTypeManagerImpl( + new BeanClassFactory(() -> this.appContext) + ), + componentManager, + isMobile); appContext.getBean(ModuleManager.class).printAvailableModules(); @@ -175,8 +178,8 @@ public void create() { parameterAdapterManager = ParameterAdapterManager.createCore(this); - nuiManager = new NUIManager(this, appContext.getBean(Context.class), commonDrawer, options); - menuBackgroundManager = new MenuBackgroundManager(displayDimensions); + nuiManager = appContext.getBean(NUIManager.class); + menuBackgroundManager = appContext.getBean(MenuBackgroundManager.class); menuScreens = new MenuScreens(layouts, isMobile(), options, nuiManager); nuiManager.pushScreen(menuScreens.main); @@ -267,15 +270,12 @@ private void update() { SolMath.checkVectorsTaken(null); } - //TODO remove this line - it is for debugging purposes - private boolean entityCreated = false; - private void draw() { Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); commonDrawer.begin(); if (solGame != null) { - solGame.getDrawableManager().draw(solGame, new ContextWrapper(gameContext) ); + solGame.getDrawableManager().draw(solGame, new ContextWrapper(gameContext)); //This event causes each entity with a `Renderable` component to be rendered onscreen entitySystemManager.sendEvent(new RenderEvent(), new Renderable(), new Position()); @@ -333,7 +333,10 @@ private void draw() { public void play(boolean tut, String shipName, boolean isNewGame, WorldConfig worldConfig) { - gameContext = appContext.getNestedContainer(new GameConfigurationServiceRegistry(worldConfig), new SolGameServiceRegistry(tut), new ContextWrapperService()); + gameContext = appContext.getNestedContainer( + new GameConfigurationServiceRegistry(worldConfig), + new SolGameServiceRegistry(tut), + new ContextWrapperService()); ModuleManager moduleManager = appContext.getBean(ModuleManager.class); solGame = gameContext.getBean(SolGame.class); @@ -428,9 +431,4 @@ public MenuBackgroundManager getMenuBackgroundManager() { public NUIManager getNuiManager() { return nuiManager; } - - // TODO: Make this non-static. - public static void addResizeSubscriber(ResizeSubscriber resizeSubscriber) { - resizeSubscribers.add(resizeSubscriber); - } } diff --git a/engine/src/main/java/org/destinationsol/assets/AssetHelper.java b/engine/src/main/java/org/destinationsol/assets/AssetHelper.java index cfa83d89d..c9cdb2c9d 100644 --- a/engine/src/main/java/org/destinationsol/assets/AssetHelper.java +++ b/engine/src/main/java/org/destinationsol/assets/AssetHelper.java @@ -16,11 +16,11 @@ package org.destinationsol.assets; import org.destinationsol.assets.music.AndroidOggMusicFileFormat; -import org.destinationsol.assets.sound.AndroidOggSoundFileFormat; -import org.destinationsol.assets.sound.OggSoundData; -import org.destinationsol.assets.music.OggMusicData; import org.destinationsol.assets.music.OggMusic; +import org.destinationsol.assets.music.OggMusicData; +import org.destinationsol.assets.sound.AndroidOggSoundFileFormat; import org.destinationsol.assets.sound.OggSound; +import org.destinationsol.assets.sound.OggSoundData; import org.destinationsol.assets.ui.UIFormat; import org.destinationsol.assets.ui.UISkinFormat; import org.slf4j.Logger; @@ -31,9 +31,9 @@ import org.terasology.gestalt.assets.ResourceUrn; import org.terasology.gestalt.assets.format.producer.AssetFileDataProducer; import org.terasology.gestalt.assets.module.ModuleAwareAssetTypeManager; -import org.terasology.gestalt.assets.module.ModuleAwareAssetTypeManagerImpl; import org.terasology.gestalt.assets.module.ModuleDependencyResolutionStrategy; import org.terasology.gestalt.assets.module.ModuleEnvironmentDependencyProvider; +import org.terasology.gestalt.di.BeanContext; import org.terasology.gestalt.entitysystem.component.management.ComponentManager; import org.terasology.gestalt.entitysystem.component.management.ComponentTypeIndex; import org.terasology.gestalt.entitysystem.prefab.Prefab; @@ -43,25 +43,33 @@ import org.terasology.nui.UIWidget; import org.terasology.nui.asset.UIElement; import org.terasology.nui.reflection.WidgetLibrary; -import org.terasology.nui.skin.UISkin; import org.terasology.nui.skin.UISkinAsset; -import org.terasology.reflection.copy.CopyStrategyLibrary; -import org.terasology.reflection.reflect.ReflectFactory; -import org.terasology.reflection.reflect.ReflectionReflectFactory; +import javax.inject.Inject; +import javax.inject.Provider; +import javax.inject.Singleton; import java.io.IOException; +import java.util.List; import java.util.Optional; import java.util.Set; +@Singleton public class AssetHelper { private static final Logger logger = LoggerFactory.getLogger(AssetHelper.class); + private final BeanContext beanContext; private ModuleAwareAssetTypeManager assetTypeManager; - public AssetHelper() { + @Inject + public AssetHelper(BeanContext beanContext) { + this.beanContext = beanContext; } - public void init(ModuleEnvironment environment, ComponentManager componentManager, boolean isMobile) { - assetTypeManager = new ModuleAwareAssetTypeManagerImpl(); + public void init(ModuleEnvironment environment, + WidgetLibrary widgetLibrary, + ModuleAwareAssetTypeManager assetTypeManager, + ComponentManager componentManager, + boolean isMobile) { + this.assetTypeManager = assetTypeManager; if (isMobile) { AssetType soundType = assetTypeManager.createAssetType(OggSound.class, OggSound::new, "sounds"); @@ -72,27 +80,30 @@ public void init(ModuleEnvironment environment, ComponentManager componentManage } assetTypeManager.getAssetFileDataProducer( - assetTypeManager.createAssetType(Prefab.class, Prefab::new, "prefabs")) + assetTypeManager.createAssetType(Prefab.class, Prefab::new, "prefabs")) .addAssetFormat(new PrefabJsonFormat.Builder( new ComponentTypeIndex(environment, new ModuleDependencyResolutionStrategy( new ModuleEnvironmentDependencyProvider(environment))), - componentManager, assetTypeManager.getAssetManager()).create()); + componentManager, assetTypeManager.getAssetManager()).create()); // The NUI widgets are loaded here so that they can be found when reading the UI JSON files (in UIFormat.UIWidgetTypeAdapter) - ReflectFactory reflectFactory = new ReflectionReflectFactory(); - WidgetLibrary widgetLibrary = new WidgetLibrary(environment, reflectFactory, new CopyStrategyLibrary(reflectFactory)); +// ReflectFactory reflectFactory = new ReflectionReflectFactory(); for (Class widgetClass : environment.getSubtypesOf(UIWidget.class)) { Name moduleName = environment.getModuleProviding(widgetClass); widgetLibrary.register(new ResourceUrn(moduleName, new Name(widgetClass.getSimpleName())), widgetClass); } + // TODO inject this assetTypeManager.createAssetType(UISkinAsset.class, UISkinAsset::new, "skins"); - ((AssetFileDataProducer)assetTypeManager.getAssetType(UISkinAsset.class).get().getProducers().get(0)).addAssetFormat(new UISkinFormat(widgetLibrary)); + ((AssetFileDataProducer) assetTypeManager.getAssetType(UISkinAsset.class).get().getProducers().get(0)).addAssetFormat(new UISkinFormat(widgetLibrary)); + // TODO inject this assetTypeManager.createAssetType(UIElement.class, UIElement::new, "ui"); - ((AssetFileDataProducer)assetTypeManager.getAssetType(UIElement.class).get().getProducers().get(0)).addAssetFormat(new UIFormat(widgetLibrary)); + ((AssetFileDataProducer) assetTypeManager.getAssetType(UIElement.class).get().getProducers().get(0)).addAssetFormat(new UIFormat(widgetLibrary,beanContext)); assetTypeManager.switchEnvironment(environment); + Assets.initialize(this); + } public , U extends AssetData> Optional get(ResourceUrn urn, Class type) { diff --git a/engine/src/main/java/org/destinationsol/assets/emitters/EmitterFactory.java b/engine/src/main/java/org/destinationsol/assets/emitters/EmitterFactory.java index db8bc46ce..58e667200 100644 --- a/engine/src/main/java/org/destinationsol/assets/emitters/EmitterFactory.java +++ b/engine/src/main/java/org/destinationsol/assets/emitters/EmitterFactory.java @@ -15,10 +15,12 @@ */ package org.destinationsol.assets.emitters; +import org.terasology.context.annotation.Service; import org.terasology.gestalt.assets.AssetFactory; import org.terasology.gestalt.assets.AssetType; import org.terasology.gestalt.assets.ResourceUrn; +@Service public class EmitterFactory implements AssetFactory { @Override diff --git a/engine/src/main/java/org/destinationsol/assets/emitters/EmitterFileFormat.java b/engine/src/main/java/org/destinationsol/assets/emitters/EmitterFileFormat.java index 4f20dec94..4e1460f6d 100644 --- a/engine/src/main/java/org/destinationsol/assets/emitters/EmitterFileFormat.java +++ b/engine/src/main/java/org/destinationsol/assets/emitters/EmitterFileFormat.java @@ -24,6 +24,7 @@ import org.terasology.gestalt.assets.format.AssetDataFile; import org.terasology.gestalt.assets.module.annotations.RegisterAssetFileFormat; +import javax.inject.Inject; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; @@ -31,6 +32,7 @@ @RegisterAssetFileFormat public class EmitterFileFormat extends AbstractAssetFileFormat { + @Inject public EmitterFileFormat() { super("emitter"); } diff --git a/engine/src/main/java/org/destinationsol/assets/fonts/FontFactory.java b/engine/src/main/java/org/destinationsol/assets/fonts/FontFactory.java index cdc16d186..ef86c97f9 100644 --- a/engine/src/main/java/org/destinationsol/assets/fonts/FontFactory.java +++ b/engine/src/main/java/org/destinationsol/assets/fonts/FontFactory.java @@ -15,12 +15,19 @@ */ package org.destinationsol.assets.fonts; +import org.terasology.context.annotation.Service; import org.terasology.gestalt.assets.AssetFactory; import org.terasology.gestalt.assets.AssetType; import org.terasology.gestalt.assets.ResourceUrn; +import javax.inject.Inject; + public class FontFactory implements AssetFactory { + @Inject + public FontFactory() { + } + @Override public Font build(ResourceUrn urn, AssetType type, FontData data) { return new Font(urn, type, data); diff --git a/engine/src/main/java/org/destinationsol/assets/fonts/FontFileFormat.java b/engine/src/main/java/org/destinationsol/assets/fonts/FontFileFormat.java index 225b08d2b..f9d4d0f6b 100644 --- a/engine/src/main/java/org/destinationsol/assets/fonts/FontFileFormat.java +++ b/engine/src/main/java/org/destinationsol/assets/fonts/FontFileFormat.java @@ -26,11 +26,13 @@ import org.terasology.gestalt.assets.format.AssetDataFile; import org.terasology.gestalt.assets.module.annotations.RegisterAssetFileFormat; +import javax.inject.Inject; import java.io.IOException; import java.util.List; @RegisterAssetFileFormat public class FontFileFormat extends AbstractAssetFileFormat { + @Inject public FontFileFormat() { super("font"); } diff --git a/engine/src/main/java/org/destinationsol/assets/fonts/ScaledFontProducer.java b/engine/src/main/java/org/destinationsol/assets/fonts/ScaledFontProducer.java index ac9e3f8ad..d0ca1476c 100644 --- a/engine/src/main/java/org/destinationsol/assets/fonts/ScaledFontProducer.java +++ b/engine/src/main/java/org/destinationsol/assets/fonts/ScaledFontProducer.java @@ -16,12 +16,13 @@ package org.destinationsol.assets.fonts; import com.badlogic.gdx.graphics.g2d.BitmapFont; +import org.destinationsol.assets.AssetHelper; import org.terasology.gestalt.assets.AssetDataProducer; import org.terasology.gestalt.assets.ResourceUrn; -import org.terasology.gestalt.assets.management.AssetManager; import org.terasology.gestalt.assets.module.annotations.RegisterAssetDataProducer; import org.terasology.gestalt.naming.Name; +import javax.inject.Inject; import java.io.IOException; import java.util.Collections; import java.util.Optional; @@ -39,14 +40,15 @@ public class ScaledFontProducer implements AssetDataProducer { /** * The asset manager used to obtain the base font data. */ - private final AssetManager assetManager; + private final AssetHelper assetHelper; /** * Creates a new {@link ScaledFontProducer} to produce scaled fonts assets depending on the ResourceUrn provided. - * @param assetManager the asset manager to use when obtaining base font data + * @param assetHelper the asset manager to use when obtaining base font data */ - public ScaledFontProducer(AssetManager assetManager) { - this.assetManager = assetManager; + @Inject + public ScaledFontProducer(AssetHelper assetHelper) { + this.assetHelper = assetHelper; // TODO provide AssetManager } @Override @@ -71,7 +73,7 @@ public Optional getAssetData(ResourceUrn urn) throws IOException { } float scale = Float.parseFloat(urn.getFragmentName().toString()); - Optional fontAsset = assetManager.getAsset(urn.getRootUrn(), Font.class); + Optional fontAsset = assetHelper.get(urn.getRootUrn(), Font.class); if (!fontAsset.isPresent()) { return Optional.empty(); } diff --git a/engine/src/main/java/org/destinationsol/assets/json/JsonDeltaFileFormat.java b/engine/src/main/java/org/destinationsol/assets/json/JsonDeltaFileFormat.java index 1d0785d51..8aa060c66 100644 --- a/engine/src/main/java/org/destinationsol/assets/json/JsonDeltaFileFormat.java +++ b/engine/src/main/java/org/destinationsol/assets/json/JsonDeltaFileFormat.java @@ -24,10 +24,12 @@ import org.terasology.gestalt.assets.format.AssetDataFile; import org.terasology.gestalt.assets.module.annotations.RegisterAssetDeltaFileFormat; +import javax.inject.Inject; import java.io.IOException; @RegisterAssetDeltaFileFormat public class JsonDeltaFileFormat extends AbstractAssetAlterationFileFormat { + @Inject public JsonDeltaFileFormat() { super("json"); } diff --git a/engine/src/main/java/org/destinationsol/assets/json/JsonFactory.java b/engine/src/main/java/org/destinationsol/assets/json/JsonFactory.java index 29fb3ab48..907d38aba 100644 --- a/engine/src/main/java/org/destinationsol/assets/json/JsonFactory.java +++ b/engine/src/main/java/org/destinationsol/assets/json/JsonFactory.java @@ -19,8 +19,14 @@ import org.terasology.gestalt.assets.AssetType; import org.terasology.gestalt.assets.ResourceUrn; +import javax.inject.Inject; + public class JsonFactory implements AssetFactory { + @Inject + public JsonFactory() { + } + @Override public Json build(ResourceUrn urn, AssetType type, JsonData data) { return new Json(urn, type, data); diff --git a/engine/src/main/java/org/destinationsol/assets/json/JsonFileFormat.java b/engine/src/main/java/org/destinationsol/assets/json/JsonFileFormat.java index 5b90e721f..7a6be754f 100644 --- a/engine/src/main/java/org/destinationsol/assets/json/JsonFileFormat.java +++ b/engine/src/main/java/org/destinationsol/assets/json/JsonFileFormat.java @@ -23,11 +23,13 @@ import org.terasology.gestalt.assets.format.AssetDataFile; import org.terasology.gestalt.assets.module.annotations.RegisterAssetFileFormat; +import javax.inject.Inject; import java.io.IOException; import java.util.List; @RegisterAssetFileFormat public class JsonFileFormat extends AbstractAssetFileFormat { + @Inject public JsonFileFormat() { super("json"); } diff --git a/engine/src/main/java/org/destinationsol/assets/music/OggMusicFactory.java b/engine/src/main/java/org/destinationsol/assets/music/OggMusicFactory.java index 89bf78bc5..4e7b585cd 100644 --- a/engine/src/main/java/org/destinationsol/assets/music/OggMusicFactory.java +++ b/engine/src/main/java/org/destinationsol/assets/music/OggMusicFactory.java @@ -15,10 +15,12 @@ */ package org.destinationsol.assets.music; +import org.terasology.context.annotation.Service; import org.terasology.gestalt.assets.AssetFactory; import org.terasology.gestalt.assets.AssetType; import org.terasology.gestalt.assets.ResourceUrn; +@Service public class OggMusicFactory implements AssetFactory { @Override diff --git a/engine/src/main/java/org/destinationsol/assets/music/OggMusicFileFormat.java b/engine/src/main/java/org/destinationsol/assets/music/OggMusicFileFormat.java index 846283dc3..07c4e2c34 100644 --- a/engine/src/main/java/org/destinationsol/assets/music/OggMusicFileFormat.java +++ b/engine/src/main/java/org/destinationsol/assets/music/OggMusicFileFormat.java @@ -24,11 +24,13 @@ import org.terasology.gestalt.assets.format.AssetDataFile; import org.terasology.gestalt.assets.module.annotations.RegisterAssetFileFormat; +import javax.inject.Inject; import java.io.IOException; import java.util.List; @RegisterAssetFileFormat public class OggMusicFileFormat extends AbstractAssetFileFormat { + @Inject public OggMusicFileFormat() { super("ogg"); } diff --git a/engine/src/main/java/org/destinationsol/assets/music/OggMusicManager.java b/engine/src/main/java/org/destinationsol/assets/music/OggMusicManager.java index 47cdd02e9..c4c3619fb 100644 --- a/engine/src/main/java/org/destinationsol/assets/music/OggMusicManager.java +++ b/engine/src/main/java/org/destinationsol/assets/music/OggMusicManager.java @@ -26,6 +26,7 @@ import org.terasology.gestalt.assets.ResourceUrn; import javax.inject.Inject; +import javax.inject.Singleton; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -38,15 +39,17 @@ * This class does not rely on external updates; once a music set is set to be played, it will play, even looping, * until another is chosen. By default, music does not play concurrently. */ +@Singleton public class OggMusicManager { public static final String NO_MUSIC = ""; public static final String MENU_MUSIC_SET = "menu"; public static final String GAME_MUSIC_SET = "game"; - private final Map> musicMap; + private final Map> musicMap = new HashMap<>();; private Music currentlyPlaying; private String currentlyRegisteredModule; private String currentMusicSet = NO_MUSIC; private Logger logger = LoggerFactory.getLogger(OggMusicManager.class); + private final GameOptions options; /** * Registers engine music. @@ -54,7 +57,8 @@ public class OggMusicManager { */ @Inject public OggMusicManager(GameOptions options) { - musicMap = new HashMap<>(); + this.options = options; + registerMusic(GAME_MUSIC_SET, "engine:cimmerianDawn"); registerMusic(GAME_MUSIC_SET, "engine:intoTheDark"); registerMusic(GAME_MUSIC_SET, "engine:spaceTheatre"); diff --git a/engine/src/main/java/org/destinationsol/assets/sound/OggSoundFactory.java b/engine/src/main/java/org/destinationsol/assets/sound/OggSoundFactory.java index 3596fe4f1..0c39f383a 100644 --- a/engine/src/main/java/org/destinationsol/assets/sound/OggSoundFactory.java +++ b/engine/src/main/java/org/destinationsol/assets/sound/OggSoundFactory.java @@ -15,10 +15,12 @@ */ package org.destinationsol.assets.sound; +import org.terasology.context.annotation.Service; import org.terasology.gestalt.assets.AssetFactory; import org.terasology.gestalt.assets.AssetType; import org.terasology.gestalt.assets.ResourceUrn; +@Service public class OggSoundFactory implements AssetFactory { @Override diff --git a/engine/src/main/java/org/destinationsol/assets/sound/OggSoundFileFormat.java b/engine/src/main/java/org/destinationsol/assets/sound/OggSoundFileFormat.java index b154bbbc6..08d90cedd 100644 --- a/engine/src/main/java/org/destinationsol/assets/sound/OggSoundFileFormat.java +++ b/engine/src/main/java/org/destinationsol/assets/sound/OggSoundFileFormat.java @@ -24,11 +24,13 @@ import org.terasology.gestalt.assets.format.AssetDataFile; import org.terasology.gestalt.assets.module.annotations.RegisterAssetFileFormat; +import javax.inject.Inject; import java.io.IOException; import java.util.List; @RegisterAssetFileFormat public class OggSoundFileFormat extends AbstractAssetFileFormat { + @Inject public OggSoundFileFormat() { super("ogg"); } diff --git a/engine/src/main/java/org/destinationsol/assets/sound/OggSoundInfoFormat.java b/engine/src/main/java/org/destinationsol/assets/sound/OggSoundInfoFormat.java index 2de0f0846..798b50c0b 100644 --- a/engine/src/main/java/org/destinationsol/assets/sound/OggSoundInfoFormat.java +++ b/engine/src/main/java/org/destinationsol/assets/sound/OggSoundInfoFormat.java @@ -21,12 +21,14 @@ import org.terasology.gestalt.assets.format.AssetDataFile; import org.terasology.gestalt.assets.module.annotations.RegisterAssetSupplementalFileFormat; +import javax.inject.Inject; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; @RegisterAssetSupplementalFileFormat public class OggSoundInfoFormat extends AbstractAssetAlterationFileFormat { + @Inject public OggSoundInfoFormat() { super("soundinfo"); } diff --git a/engine/src/main/java/org/destinationsol/assets/sound/OggSoundManager.java b/engine/src/main/java/org/destinationsol/assets/sound/OggSoundManager.java index c0b3c9675..8b92f0f47 100644 --- a/engine/src/main/java/org/destinationsol/assets/sound/OggSoundManager.java +++ b/engine/src/main/java/org/destinationsol/assets/sound/OggSoundManager.java @@ -35,6 +35,7 @@ import javax.inject.Inject; import javax.inject.Provider; +import javax.inject.Singleton; import java.util.HashMap; import java.util.Map; @@ -57,6 +58,7 @@ * sound will be accepted only when loopTime time units has passed since the beginning of the sound's prior playback, or * the request is from different object. */ +@Singleton public class OggSoundManager implements UpdateAwareSystem { /** * A container for all the sounds that have been so far loaded in the game. Sounds are loaded on as needed basis, diff --git a/engine/src/main/java/org/destinationsol/assets/textures/DSTextureFactory.java b/engine/src/main/java/org/destinationsol/assets/textures/DSTextureFactory.java index 8bfa7d654..68d61bc46 100644 --- a/engine/src/main/java/org/destinationsol/assets/textures/DSTextureFactory.java +++ b/engine/src/main/java/org/destinationsol/assets/textures/DSTextureFactory.java @@ -15,10 +15,12 @@ */ package org.destinationsol.assets.textures; +import org.terasology.context.annotation.Service; import org.terasology.gestalt.assets.AssetFactory; import org.terasology.gestalt.assets.AssetType; import org.terasology.gestalt.assets.ResourceUrn; +@Service public class DSTextureFactory implements AssetFactory { @Override diff --git a/engine/src/main/java/org/destinationsol/assets/textures/DSTextureFileFormat.java b/engine/src/main/java/org/destinationsol/assets/textures/DSTextureFileFormat.java index ea88b9ded..f3f5b9118 100644 --- a/engine/src/main/java/org/destinationsol/assets/textures/DSTextureFileFormat.java +++ b/engine/src/main/java/org/destinationsol/assets/textures/DSTextureFileFormat.java @@ -24,10 +24,12 @@ import org.terasology.gestalt.assets.format.AssetDataFile; import org.terasology.gestalt.assets.module.annotations.RegisterAssetFileFormat; +import javax.inject.Inject; import java.util.List; @RegisterAssetFileFormat public class DSTextureFileFormat extends AbstractAssetFileFormat { + @Inject public DSTextureFileFormat() { super("png"); } diff --git a/engine/src/main/java/org/destinationsol/assets/ui/UIFormat.java b/engine/src/main/java/org/destinationsol/assets/ui/UIFormat.java index 8ae6df85e..3e0effe06 100644 --- a/engine/src/main/java/org/destinationsol/assets/ui/UIFormat.java +++ b/engine/src/main/java/org/destinationsol/assets/ui/UIFormat.java @@ -34,8 +34,9 @@ import org.terasology.gestalt.assets.ResourceUrn; import org.terasology.gestalt.assets.format.AbstractAssetFileFormat; import org.terasology.gestalt.assets.format.AssetDataFile; -import org.terasology.gestalt.assets.management.AssetManager; import org.terasology.gestalt.assets.module.annotations.RegisterAssetFileFormat; +import org.terasology.gestalt.di.BeanContext; +import org.terasology.gestalt.di.exceptions.BeanResolutionException; import org.terasology.input.Keyboard; import org.terasology.nui.Color; import org.terasology.nui.LayoutHint; @@ -52,6 +53,7 @@ import org.terasology.reflection.metadata.ClassMetadata; import org.terasology.reflection.metadata.FieldMetadata; +import javax.inject.Inject; import java.io.IOException; import java.io.InputStreamReader; import java.lang.reflect.Modifier; @@ -76,12 +78,14 @@ public class UIFormat extends AbstractAssetFileFormat { public static final String TYPE_FIELD = "type"; private static final Logger logger = LoggerFactory.getLogger(UIFormat.class); - private static WidgetLibrary library; + private final WidgetLibrary library; + private final BeanContext beanContext; - public UIFormat(WidgetLibrary library) { + @Inject + public UIFormat(WidgetLibrary library, BeanContext beanContext) { super("ui"); - - UIFormat.library = library; + this.library = library; + this.beanContext = beanContext; } @Override @@ -148,7 +152,7 @@ public Vector2i deserialize(JsonElement json, Type typeOfT, JsonDeserializationC * Each contained widget may have a "layoutInfo" attribute providing the layout hint for its container. * */ - private static final class UIWidgetTypeAdapter implements JsonDeserializer { + private final class UIWidgetTypeAdapter implements JsonDeserializer { @Override public UIWidget deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { if (json.isJsonPrimitive() && json.getAsJsonPrimitive().isString()) { @@ -169,11 +173,19 @@ public UIWidget deserialize(JsonElement json, Type typeOfT, JsonDeserializationC id = jsonObject.get(ID_FIELD).getAsString(); } - UIWidget element = elementMetadata.newInstance(); + UIWidget element; + try { + // try injectable variant + element = beanContext.getBean(elementMetadata.getType()); + } catch (BeanResolutionException e) { + logger.warn("UIWidget type {} is not injectable (if it is should -" + + " mark it with @Service or it's constructor with @Inject", elementMetadata.getId()); + element = elementMetadata.newInstance(); + } if (id != null) { FieldMetadata fieldMetadata = elementMetadata.getField(ID_FIELD); if (fieldMetadata == null) { - logger.warn("UIWidget type {} lacks id field", elementMetadata.getUri()); + logger.warn("UIWidget type {} lacks id field", elementMetadata.getId()); } else { fieldMetadata.setValue(element, id); } @@ -184,9 +196,9 @@ public UIWidget deserialize(JsonElement json, Type typeOfT, JsonDeserializationC for (Entry entry : jsonObject.entrySet()) { String name = entry.getKey(); if (!ID_FIELD.equals(name) - && !CONTENTS_FIELD.equals(name) - && !TYPE_FIELD.equals(name) - && !LAYOUT_INFO_FIELD.equals(name)) { + && !CONTENTS_FIELD.equals(name) + && !TYPE_FIELD.equals(name) + && !LAYOUT_INFO_FIELD.equals(name)) { unknownFields.add(name); } } @@ -226,7 +238,7 @@ public UIWidget deserialize(JsonElement json, Type typeOfT, JsonDeserializationC UILayout layout = (UILayout) element; Class layoutHintType = (Class) - ReflectionUtil.getTypeParameter(elementMetadata.getType().getGenericSuperclass(), 0); + ReflectionUtil.getTypeParameter(elementMetadata.getType().getGenericSuperclass(), 0); if (jsonObject.has(CONTENTS_FIELD)) { for (JsonElement child : jsonObject.getAsJsonArray(CONTENTS_FIELD)) { UIWidget childElement = context.deserialize(child, UIWidget.class); @@ -235,7 +247,7 @@ public UIWidget deserialize(JsonElement json, Type typeOfT, JsonDeserializationC if (child.isJsonObject()) { JsonObject childObject = child.getAsJsonObject(); if (layoutHintType != null && !layoutHintType.isInterface() && !Modifier.isAbstract(layoutHintType.getModifiers()) - && childObject.has(LAYOUT_INFO_FIELD)) { + && childObject.has(LAYOUT_INFO_FIELD)) { hint = context.deserialize(childObject.get(LAYOUT_INFO_FIELD), layoutHintType); } } diff --git a/engine/src/main/java/org/destinationsol/assets/ui/UISkinFormat.java b/engine/src/main/java/org/destinationsol/assets/ui/UISkinFormat.java index 27fcc4438..5905deab1 100644 --- a/engine/src/main/java/org/destinationsol/assets/ui/UISkinFormat.java +++ b/engine/src/main/java/org/destinationsol/assets/ui/UISkinFormat.java @@ -22,7 +22,7 @@ import org.terasology.nui.UITextureRegion; import org.terasology.nui.UIWidget; import org.terasology.nui.asset.font.Font; -import org.terasology.nui.skin.UISkin; +import org.terasology.nui.reflection.WidgetLibrary; import org.terasology.nui.skin.UISkinAsset; import org.terasology.nui.skin.UISkinBuilder; import org.terasology.nui.skin.UISkinData; @@ -30,6 +30,7 @@ import org.terasology.reflection.metadata.ClassLibrary; import org.terasology.reflection.metadata.ClassMetadata; +import javax.inject.Inject; import java.io.IOException; import java.io.InputStreamReader; import java.lang.reflect.Type; @@ -45,9 +46,10 @@ public class UISkinFormat extends AbstractAssetFileFormat { private static final Logger logger = LoggerFactory.getLogger(UISkinFormat.class); private Gson gson; - private static ClassLibrary widgetClassLibrary; + private ClassLibrary widgetClassLibrary; - public UISkinFormat(ClassLibrary widgetClassLibrary) { + @Inject + public UISkinFormat(WidgetLibrary widgetClassLibrary) { super("skin"); gson = new GsonBuilder() .registerTypeAdapter(UISkinData.class, new UISkinTypeAdapter()) @@ -59,7 +61,7 @@ public UISkinFormat(ClassLibrary widgetClassLibrary) { .enableComplexMapKeySerialization() .serializeNulls() .create(); - UISkinFormat.widgetClassLibrary = widgetClassLibrary; + this.widgetClassLibrary = widgetClassLibrary; } @Override @@ -102,7 +104,7 @@ public UISkinData deserialize(JsonElement json, Type typeOfT, JsonDeserializatio } } - private static class DefaultInfo extends FamilyInfo { + private class DefaultInfo extends FamilyInfo { public String inherit; public Map families; @@ -124,7 +126,7 @@ public void apply(UISkinBuilder builder) { } } - private static class FamilyInfo extends StyleInfo { + private class FamilyInfo extends StyleInfo { public Map elements; public void apply(UISkinBuilder builder) { diff --git a/engine/src/main/java/org/destinationsol/game/SolGame.java b/engine/src/main/java/org/destinationsol/game/SolGame.java index c904e91e6..92c23b698 100644 --- a/engine/src/main/java/org/destinationsol/game/SolGame.java +++ b/engine/src/main/java/org/destinationsol/game/SolGame.java @@ -177,8 +177,6 @@ public SolGame(SolApplication solApplication, PlanetConfigManager planetConfigMa } else { mainGameScreen = (MainGameScreen) solApplication.getNuiManager().createScreen(NUI_MAIN_GAME_SCREEN_MOBILE_URI); } - // TODO: resolve hack to set solApplication - mainGameScreen.setSolApplication(solApplication); planetConfigManager.loadDefaultPlanetConfigs(); mazeConfigManager.loadDefaultMazeConfigs(); diff --git a/engine/src/main/java/org/destinationsol/game/console/ConsoleImpl.java b/engine/src/main/java/org/destinationsol/game/console/ConsoleImpl.java index 7d6b3d08c..9d79a7e6f 100644 --- a/engine/src/main/java/org/destinationsol/game/console/ConsoleImpl.java +++ b/engine/src/main/java/org/destinationsol/game/console/ConsoleImpl.java @@ -22,6 +22,7 @@ import com.google.common.collect.Lists; import com.google.common.collect.Maps; import com.google.common.collect.Sets; +import org.destinationsol.assets.Assets; import org.destinationsol.game.SolGame; import org.destinationsol.game.console.annotations.RegisterCommands; import org.destinationsol.game.console.exceptions.CommandExecutionException; @@ -32,6 +33,8 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import javax.inject.Inject; +import javax.inject.Singleton; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; @@ -49,8 +52,6 @@ public class ConsoleImpl implements Console { private static final int MAX_COMMAND_HISTORY = 30; private static final Logger logger = LoggerFactory.getLogger(ConsoleImpl.class); - public static Console instance; - private final CircularBuffer messageHistory = CircularBuffer.create(MAX_MESSAGE_HISTORY); private final CircularBuffer localCommandHistory = CircularBuffer.create(MAX_COMMAND_HISTORY); private final Map commandRegistry = Maps.newHashMap(); @@ -59,10 +60,10 @@ public class ConsoleImpl implements Console { private BitmapFont font; - public ConsoleImpl(BitmapFont font, Context context) { - this.font = font; + @Inject + public ConsoleImpl(Context context) { + this.font = Assets.getFont("engine:main").getBitmapFont(); this.context = context; - instance = this; } private static String cleanCommand(String rawCommand) { diff --git a/engine/src/main/java/org/destinationsol/game/screens/ConsoleScreen.java b/engine/src/main/java/org/destinationsol/game/screens/ConsoleScreen.java index ddfd5e0c6..2e952f77a 100644 --- a/engine/src/main/java/org/destinationsol/game/screens/ConsoleScreen.java +++ b/engine/src/main/java/org/destinationsol/game/screens/ConsoleScreen.java @@ -22,6 +22,7 @@ import com.badlogic.gdx.math.Vector2; import org.destinationsol.SolApplication; import org.destinationsol.assets.Assets; +import org.destinationsol.common.In; import org.destinationsol.common.SolColor; import org.destinationsol.game.SolGame; import org.destinationsol.game.console.Console; @@ -40,6 +41,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import javax.inject.Inject; import java.util.ArrayList; import java.util.Iterator; import java.util.List; @@ -102,10 +104,11 @@ public class ConsoleScreen implements SolUiScreen, ConsoleSubscriber { private TabCompletionEngine completionEngine; private StringBuilder inputLine; + @Inject public ConsoleScreen(Context context) { font = Assets.getFont("engine:main").getBitmapFont(); - this.console = new ConsoleImpl(font, context); + this.console = new ConsoleImpl( context); exitControl = new SolUiControl(null, true, Input.Keys.ESCAPE); commandHistoryUpControl = new SolUiControl(null, true, Input.Keys.UP); diff --git a/engine/src/main/java/org/destinationsol/menu/background/MenuBackgroundManager.java b/engine/src/main/java/org/destinationsol/menu/background/MenuBackgroundManager.java index afc8df7a8..40c5b9762 100644 --- a/engine/src/main/java/org/destinationsol/menu/background/MenuBackgroundManager.java +++ b/engine/src/main/java/org/destinationsol/menu/background/MenuBackgroundManager.java @@ -22,6 +22,8 @@ import org.destinationsol.ui.DisplayDimensions; import org.destinationsol.ui.UiDrawer; +import javax.inject.Inject; + /** *

    General Menu background manager

    * Manages menu viewport, world, and the menu world's objects. @@ -36,6 +38,7 @@ public class MenuBackgroundManager { OrthographicCamera backgroundCamera; + @Inject public MenuBackgroundManager(DisplayDimensions displayDimensions) { world = new World(new Vector2(0, 0), true); diff --git a/engine/src/main/java/org/destinationsol/ui/SolInputManager.java b/engine/src/main/java/org/destinationsol/ui/SolInputManager.java index 8340411ff..570452b16 100644 --- a/engine/src/main/java/org/destinationsol/ui/SolInputManager.java +++ b/engine/src/main/java/org/destinationsol/ui/SolInputManager.java @@ -35,11 +35,13 @@ import org.destinationsol.game.context.Context; import javax.inject.Inject; +import javax.inject.Singleton; import java.util.ArrayList; import java.util.List; import static com.badlogic.gdx.graphics.Pixmap.Format.RGBA8888; +@Singleton public class SolInputManager { private static final float CURSOR_SZ = .07f; private static final float WARN_PERC_GROWTH_TIME = 1f; @@ -69,11 +71,13 @@ public class SolInputManager { private float warnPercentage; private boolean warnPercGrows; private Boolean scrolledUp; + private OggSoundManager soundManager; public boolean touchDragged; @Inject public SolInputManager(OggSoundManager soundManager, Context context) { this.context = context; + this.soundManager =soundManager; inputPointers = new InputPointer[POINTER_COUNT]; for (int i = 0; i < POINTER_COUNT; i++) { inputPointers[i] = new InputPointer(); diff --git a/engine/src/main/java/org/destinationsol/ui/nui/NUIManager.java b/engine/src/main/java/org/destinationsol/ui/nui/NUIManager.java index 669c2702d..7566e5f2b 100644 --- a/engine/src/main/java/org/destinationsol/ui/nui/NUIManager.java +++ b/engine/src/main/java/org/destinationsol/ui/nui/NUIManager.java @@ -57,6 +57,7 @@ import org.terasology.nui.widgets.UIButton; import org.terasology.nui.widgets.UIText; +import javax.inject.Inject; import java.io.Closeable; import java.util.Deque; import java.util.Iterator; @@ -69,6 +70,7 @@ * It manages the rendering and update cycles of NUI widgets, which are contained in {@link NUIScreenLayer} * containers. Each NUIScreenLayer manages its own UI-specific logic and rendering. */ + public class NUIManager { /** * This LibGDX renderer used for NUI. It shares a SpriteBatch with the main game, although not a ShapeRenderer. @@ -135,6 +137,7 @@ public class NUIManager { * @param commonDrawer used to directly access the game's LibGDX {@link com.badlogic.gdx.graphics.g2d.SpriteBatch} * @param options used to initialise the UI scale with its previously-saved value */ + @Inject public NUIManager(SolApplication solApplication, Context context, CommonDrawer commonDrawer, GameOptions options, UiDrawer uiDrawer) { NUIInputProcessor.CONSUME_INPUT = false; this.context = context; diff --git a/engine/src/main/java/org/destinationsol/ui/nui/screens/ConsoleScreen.java b/engine/src/main/java/org/destinationsol/ui/nui/screens/ConsoleScreen.java index 7e4a4d7a6..cab9ae0c7 100644 --- a/engine/src/main/java/org/destinationsol/ui/nui/screens/ConsoleScreen.java +++ b/engine/src/main/java/org/destinationsol/ui/nui/screens/ConsoleScreen.java @@ -31,6 +31,7 @@ import org.terasology.nui.layouts.ScrollableArea; import org.terasology.nui.widgets.UIText; +import javax.inject.Inject; import java.util.List; /** @@ -43,6 +44,11 @@ public class ConsoleScreen extends NUIScreenLayer { private boolean welcomePrinted; private boolean screenClosed; + @Inject + public ConsoleScreen(Console console) { + this.console = console; + } + private InteractionListener screenListener = new BaseInteractionListener() { @Override public boolean onMouseClick(NUIMouseClickEvent event) { @@ -55,7 +61,6 @@ public boolean onMouseClick(NUIMouseClickEvent event) { @Override public void initialise() { - console = ConsoleImpl.instance; final ScrollableArea scrollArea = find("scrollArea", ScrollableArea.class); scrollArea.moveToBottom(); diff --git a/engine/src/main/java/org/destinationsol/ui/nui/screens/MainGameScreen.java b/engine/src/main/java/org/destinationsol/ui/nui/screens/MainGameScreen.java index 7980917bf..d17dca87a 100644 --- a/engine/src/main/java/org/destinationsol/ui/nui/screens/MainGameScreen.java +++ b/engine/src/main/java/org/destinationsol/ui/nui/screens/MainGameScreen.java @@ -17,7 +17,6 @@ import org.destinationsol.GameOptions; import org.destinationsol.SolApplication; -import org.destinationsol.assets.Assets; import org.destinationsol.game.FactionManager; import org.destinationsol.game.Hero; import org.destinationsol.game.SolGame; @@ -28,12 +27,10 @@ import org.destinationsol.ui.SolInputManager; import org.destinationsol.ui.nui.NUIScreenLayer; import org.destinationsol.ui.nui.widgets.UIWarnButton; -import org.terasology.gestalt.assets.ResourceUrn; import org.terasology.input.ButtonState; import org.terasology.input.Keyboard; import org.terasology.nui.AbstractWidget; import org.terasology.nui.UIWidget; -import org.terasology.nui.asset.UIElement; import org.terasology.nui.backends.libgdx.GDXInputUtil; import org.terasology.nui.events.NUIKeyEvent; @@ -54,15 +51,11 @@ public class MainGameScreen extends NUIScreenLayer { private UIWarnButton mercsButton; private ConsoleScreen consoleScreen; - @Inject - protected SolApplication solApplication; - - public MainGameScreen() { + private final SolApplication solApplication; - } - - public void setSolApplication(SolApplication application) { - this.solApplication = application; + @Inject + public MainGameScreen(SolApplication solApplication) { + this.solApplication = solApplication; } @Override diff --git a/engine/src/main/java/org/destinationsol/ui/nui/screens/UIShipControlsScreen.java b/engine/src/main/java/org/destinationsol/ui/nui/screens/UIShipControlsScreen.java index 6f367fb99..2d8c13bf0 100644 --- a/engine/src/main/java/org/destinationsol/ui/nui/screens/UIShipControlsScreen.java +++ b/engine/src/main/java/org/destinationsol/ui/nui/screens/UIShipControlsScreen.java @@ -17,7 +17,6 @@ import org.destinationsol.GameOptions; import org.destinationsol.SolApplication; -import org.destinationsol.common.In; import org.destinationsol.game.Hero; import org.destinationsol.game.item.Gun; import org.destinationsol.game.screens.ShipUiControl; @@ -47,13 +46,12 @@ public class UIShipControlsScreen extends NUIScreenLayer implements ShipUiContro private boolean downKeyHeld; private boolean controlsEnabled; - @Inject - @In // TODO: Remove the @In annotation when gestalt-di works with UI screens. - protected SolApplication solApplication; - @Inject - public UIShipControlsScreen() { + private final SolApplication solApplication; + @Inject + public UIShipControlsScreen(SolApplication solApplication) { + this.solApplication = solApplication; } @Override diff --git a/engine/src/main/java/org/destinationsol/ui/nui/screens/mainMenu/CreditsScreen.java b/engine/src/main/java/org/destinationsol/ui/nui/screens/mainMenu/CreditsScreen.java index 07df92df9..d4506ccc3 100644 --- a/engine/src/main/java/org/destinationsol/ui/nui/screens/mainMenu/CreditsScreen.java +++ b/engine/src/main/java/org/destinationsol/ui/nui/screens/mainMenu/CreditsScreen.java @@ -17,7 +17,6 @@ import org.destinationsol.Const; import org.destinationsol.SolApplication; -import org.destinationsol.common.In; import org.destinationsol.ui.nui.NUIManager; import org.destinationsol.ui.nui.NUIScreenLayer; import org.destinationsol.ui.nui.widgets.KeyActivatedButton; @@ -29,12 +28,13 @@ import org.terasology.nui.skin.UISkinBuilder; import org.terasology.nui.widgets.UILabel; +import javax.inject.Inject; import java.util.ArrayList; public class CreditsScreen extends NUIScreenLayer { private static final float MAX_AWAIT = 6f; - @In - private SolApplication solApplication; + + private final SolApplication solApplication; private UILabel creditsText; private ArrayList myPages = new ArrayList<>(); private UISkin textSkin; @@ -42,6 +42,11 @@ public class CreditsScreen extends NUIScreenLayer { private int pageIndex; private float pageProgressPercent; + @Inject + public CreditsScreen(SolApplication solApplication) { + this.solApplication = solApplication; + } + @Override public void initialise() { textColor = new Color(Color.white); diff --git a/engine/src/main/java/org/destinationsol/ui/nui/screens/mainMenu/InputMapScreen.java b/engine/src/main/java/org/destinationsol/ui/nui/screens/mainMenu/InputMapScreen.java index c6250ca43..6821bdcd1 100644 --- a/engine/src/main/java/org/destinationsol/ui/nui/screens/mainMenu/InputMapScreen.java +++ b/engine/src/main/java/org/destinationsol/ui/nui/screens/mainMenu/InputMapScreen.java @@ -17,7 +17,6 @@ import org.destinationsol.Const; import org.destinationsol.SolApplication; -import org.destinationsol.common.In; import org.destinationsol.menu.InputConfigItem; import org.destinationsol.menu.InputMapControllerScreen; import org.destinationsol.menu.InputMapKeyboardScreen; @@ -39,6 +38,7 @@ import org.terasology.nui.widgets.UIButton; import org.terasology.nui.widgets.UILabel; +import javax.inject.Inject; import java.util.Iterator; import java.util.List; @@ -48,8 +48,8 @@ */ public class InputMapScreen extends NUIScreenLayer { private static final Logger logger = LoggerFactory.getLogger(InputMapScreen.class); - @In - private SolApplication solApplication; + + private final SolApplication solApplication; private UILabel titleLabel; private ColumnLayout inputMapRows; private KeyActivatedButton nextButton; @@ -64,6 +64,11 @@ public class InputMapScreen extends NUIScreenLayer { private UIWidget selectedRow; private int page; + @Inject + public InputMapScreen(SolApplication solApplication) { + this.solApplication = solApplication; + } + @Override public void initialise() { titleLabel = find("title", UILabel.class); diff --git a/engine/src/main/java/org/destinationsol/ui/nui/screens/mainMenu/LoadingScreen.java b/engine/src/main/java/org/destinationsol/ui/nui/screens/mainMenu/LoadingScreen.java index ab9fb8818..a66ab880d 100644 --- a/engine/src/main/java/org/destinationsol/ui/nui/screens/mainMenu/LoadingScreen.java +++ b/engine/src/main/java/org/destinationsol/ui/nui/screens/mainMenu/LoadingScreen.java @@ -16,12 +16,13 @@ package org.destinationsol.ui.nui.screens.mainMenu; import org.destinationsol.SolApplication; -import org.destinationsol.common.In; import org.destinationsol.game.WorldConfig; import org.destinationsol.ui.nui.NUIScreenLayer; +import javax.inject.Inject; + public class LoadingScreen extends NUIScreenLayer { - @In + private SolApplication solApplication; private boolean loadTutorial; private boolean isNewGame; @@ -29,6 +30,11 @@ public class LoadingScreen extends NUIScreenLayer { private WorldConfig worldConfig; private boolean firstUpdate; + @Inject + public LoadingScreen(SolApplication solApplication) { + this.solApplication = solApplication; + } + @Override public void onAdded() { firstUpdate = false; diff --git a/engine/src/main/java/org/destinationsol/ui/nui/screens/mainMenu/MainMenuScreen.java b/engine/src/main/java/org/destinationsol/ui/nui/screens/mainMenu/MainMenuScreen.java index edd6666c6..48a03a7d7 100644 --- a/engine/src/main/java/org/destinationsol/ui/nui/screens/mainMenu/MainMenuScreen.java +++ b/engine/src/main/java/org/destinationsol/ui/nui/screens/mainMenu/MainMenuScreen.java @@ -19,21 +19,27 @@ import org.destinationsol.GameOptions; import org.destinationsol.SolApplication; import org.destinationsol.assets.music.OggMusicManager; -import org.destinationsol.common.In; import org.destinationsol.game.WorldConfig; import org.destinationsol.ui.nui.NUIManager; import org.destinationsol.ui.nui.NUIScreenLayer; import org.terasology.nui.Canvas; import org.terasology.nui.widgets.UIButton; +import javax.inject.Inject; + /** * The main menu screen. This is the first screen shown when you open the game. */ public class MainMenuScreen extends NUIScreenLayer { - @In - private SolApplication solApplication; + + private final SolApplication solApplication; private UIButton tutorialButton; + @Inject + public MainMenuScreen(SolApplication solApplication) { + this.solApplication = solApplication; + } + @Override public void initialise() { tutorialButton = find("tutorialButton", UIButton.class); diff --git a/engine/src/main/java/org/destinationsol/ui/nui/screens/mainMenu/NewGameScreen.java b/engine/src/main/java/org/destinationsol/ui/nui/screens/mainMenu/NewGameScreen.java index 557325774..307896a3e 100644 --- a/engine/src/main/java/org/destinationsol/ui/nui/screens/mainMenu/NewGameScreen.java +++ b/engine/src/main/java/org/destinationsol/ui/nui/screens/mainMenu/NewGameScreen.java @@ -16,25 +16,28 @@ package org.destinationsol.ui.nui.screens.mainMenu; import org.destinationsol.SolApplication; -import org.destinationsol.common.In; import org.destinationsol.game.SaveManager; import org.destinationsol.game.WorldConfig; import org.destinationsol.ui.nui.NUIManager; import org.destinationsol.ui.nui.NUIScreenLayer; import org.destinationsol.ui.nui.widgets.KeyActivatedButton; -import org.terasology.input.Keyboard; import org.terasology.nui.Canvas; -import org.terasology.nui.UIWidget; import org.terasology.nui.backends.libgdx.GDXInputUtil; import org.terasology.nui.widgets.UIButton; +import javax.inject.Inject; + public class NewGameScreen extends NUIScreenLayer { - @In - private SolApplication solApplication; + private final SolApplication solApplication; private KeyActivatedButton continueButton; private UIButton newGameButton; private KeyActivatedButton cancelButton; + @Inject + public NewGameScreen(SolApplication solApplication) { + this.solApplication = solApplication; + } + @Override public void initialise() { super.initialise(); diff --git a/engine/src/main/java/org/destinationsol/ui/nui/screens/mainMenu/NewShipScreen.java b/engine/src/main/java/org/destinationsol/ui/nui/screens/mainMenu/NewShipScreen.java index e67c58a2b..b8cb6d36d 100644 --- a/engine/src/main/java/org/destinationsol/ui/nui/screens/mainMenu/NewShipScreen.java +++ b/engine/src/main/java/org/destinationsol/ui/nui/screens/mainMenu/NewShipScreen.java @@ -19,7 +19,6 @@ import org.destinationsol.assets.Assets; import org.destinationsol.assets.json.Json; import org.destinationsol.assets.json.Validator; -import org.destinationsol.common.In; import org.destinationsol.game.WorldConfig; import org.destinationsol.game.planet.SystemsBuilder; import org.destinationsol.ui.nui.NUIManager; @@ -30,16 +29,22 @@ import org.terasology.nui.backends.libgdx.GDXInputUtil; import org.terasology.nui.widgets.UIButton; +import javax.inject.Inject; import java.util.ArrayList; import java.util.List; public class NewShipScreen extends NUIScreenLayer { - @In - private SolApplication solApplication; + + private final SolApplication solApplication; private int numberOfSystems = SystemsBuilder.DEFAULT_SYSTEM_COUNT; private int playerSpawnConfigIndex = 0; private List playerSpawnConfigNames = new ArrayList<>(); + @Inject + public NewShipScreen(SolApplication solApplication) { + this.solApplication = solApplication; + } + @Override public void initialise() { UIButton systemsButton = find("systemsButton", UIButton.class); diff --git a/engine/src/main/java/org/destinationsol/ui/nui/screens/mainMenu/OptionsScreen.java b/engine/src/main/java/org/destinationsol/ui/nui/screens/mainMenu/OptionsScreen.java index 4eec6080d..ed8baf27f 100644 --- a/engine/src/main/java/org/destinationsol/ui/nui/screens/mainMenu/OptionsScreen.java +++ b/engine/src/main/java/org/destinationsol/ui/nui/screens/mainMenu/OptionsScreen.java @@ -16,8 +16,6 @@ package org.destinationsol.ui.nui.screens.mainMenu; import org.destinationsol.SolApplication; -import org.destinationsol.common.In; -import org.destinationsol.menu.MenuScreens; import org.destinationsol.ui.nui.NUIManager; import org.destinationsol.ui.nui.NUIScreenLayer; import org.destinationsol.ui.nui.widgets.KeyActivatedButton; @@ -26,13 +24,20 @@ import org.terasology.nui.layouts.ColumnLayout; import org.terasology.nui.widgets.UIButton; +import javax.inject.Inject; + /** * The options screen allows the user to change configurable game settings through the UI. * It is accessible via the {@link MainMenuScreen}. */ public class OptionsScreen extends NUIScreenLayer { - @In - private SolApplication solApplication; + + private final SolApplication solApplication; + + @Inject + public OptionsScreen(SolApplication solApplication) { + this.solApplication = solApplication; + } @Override public void initialise() { diff --git a/engine/src/main/java/org/destinationsol/ui/nui/screens/mainMenu/ResolutionScreen.java b/engine/src/main/java/org/destinationsol/ui/nui/screens/mainMenu/ResolutionScreen.java index 8bfbcf796..82d363464 100644 --- a/engine/src/main/java/org/destinationsol/ui/nui/screens/mainMenu/ResolutionScreen.java +++ b/engine/src/main/java/org/destinationsol/ui/nui/screens/mainMenu/ResolutionScreen.java @@ -18,7 +18,6 @@ import com.badlogic.gdx.Gdx; import com.badlogic.gdx.Graphics; import org.destinationsol.SolApplication; -import org.destinationsol.common.In; import org.destinationsol.ui.nui.NUIManager; import org.destinationsol.ui.nui.NUIScreenLayer; import org.destinationsol.ui.nui.widgets.KeyActivatedButton; @@ -27,17 +26,23 @@ import org.terasology.nui.Canvas; import org.terasology.nui.backends.libgdx.GDXInputUtil; import org.terasology.nui.layouts.ColumnLayout; -import org.terasology.nui.layouts.relative.RelativeLayout; import org.terasology.nui.widgets.UIButton; +import javax.inject.Inject; + /** * The resolution screen allows the user to set the game's screen resolution, fullscreen modes and NUI scaling settings. * It can be accessed via the {@link OptionsScreen}. */ public class ResolutionScreen extends NUIScreenLayer { private static final Logger logger = LoggerFactory.getLogger(ResolutionScreen.class); - @In - private SolApplication solApplication; + + private final SolApplication solApplication; + + @Inject + public ResolutionScreen(SolApplication solApplication) { + this.solApplication = solApplication; + } @Override public void initialise() { From cbbf328e9c263517c1a5a6a9c4160cd707a56d57 Mon Sep 17 00:00:00 2001 From: darkweird Date: Wed, 27 Apr 2022 17:00:28 +0300 Subject: [PATCH 35/38] chore: remove mavenLocal and empty lines --- build.gradle | 1 - engine/src/main/java/org/destinationsol/CoreService.java | 1 - 2 files changed, 2 deletions(-) diff --git a/build.gradle b/build.gradle index 26da8113e..90f106c3c 100644 --- a/build.gradle +++ b/build.gradle @@ -39,7 +39,6 @@ repositories { // Good ole Maven central mavenCentral() - mavenLocal() // Repos for LibGDX maven { url "https://oss.sonatype.org/content/repositories/snapshots/" } diff --git a/engine/src/main/java/org/destinationsol/CoreService.java b/engine/src/main/java/org/destinationsol/CoreService.java index 56b2ad038..23699cf38 100644 --- a/engine/src/main/java/org/destinationsol/CoreService.java +++ b/engine/src/main/java/org/destinationsol/CoreService.java @@ -52,7 +52,6 @@ public CoreService(SolApplication application) { this.with(NUIManager.class).lifetime(Lifetime.Singleton); this.with(MenuBackgroundManager.class).lifetime(Lifetime.Singleton); - this.with(ReflectFactory.class).lifetime(Lifetime.Singleton).use(ReflectionReflectFactory.class); this.with(CopyStrategyLibrary.class).lifetime(Lifetime.Singleton); From ecc3f19469f1dd62bc08d05a4464959c7b370047 Mon Sep 17 00:00:00 2001 From: Benjamin Amos Date: Thu, 28 Apr 2022 20:58:30 +0100 Subject: [PATCH 36/38] fix: fix engine tests compilation --- .../org/destinationsol/SolApplication.java | 1 - .../assets/ui/UISkinFormat.java | 22 ++++++++++++++----- .../testsupport/AssetsHelperInitializer.java | 18 ++++++++++++--- 3 files changed, 32 insertions(+), 9 deletions(-) diff --git a/engine/src/main/java/org/destinationsol/SolApplication.java b/engine/src/main/java/org/destinationsol/SolApplication.java index f4a12fa84..02ce99257 100644 --- a/engine/src/main/java/org/destinationsol/SolApplication.java +++ b/engine/src/main/java/org/destinationsol/SolApplication.java @@ -349,7 +349,6 @@ public void play(boolean tut, String shipName, boolean isNewGame, WorldConfig wo entitySystemManager = gameContext.getBean(EntitySystemManager.class); solGame.createUpdateSystems(); - solGame.startGame(shipName, isNewGame, worldConfig, entitySystemManager); if (!isNewGame) { diff --git a/engine/src/main/java/org/destinationsol/assets/ui/UISkinFormat.java b/engine/src/main/java/org/destinationsol/assets/ui/UISkinFormat.java index 5905deab1..2ba76706a 100644 --- a/engine/src/main/java/org/destinationsol/assets/ui/UISkinFormat.java +++ b/engine/src/main/java/org/destinationsol/assets/ui/UISkinFormat.java @@ -52,7 +52,7 @@ public class UISkinFormat extends AbstractAssetFileFormat { public UISkinFormat(WidgetLibrary widgetClassLibrary) { super("skin"); gson = new GsonBuilder() - .registerTypeAdapter(UISkinData.class, new UISkinTypeAdapter()) + .registerTypeAdapter(UISkinData.class, new UISkinTypeAdapter(widgetClassLibrary)) .registerTypeAdapterFactory(new CaseInsensitiveEnumTypeAdapterFactory()) .registerTypeAdapter(UITextureRegion.class, new TextureRegionTypeAdapter()) .registerTypeAdapter(Optional.class, new OptionalTextureRegionTypeAdapter()) @@ -91,12 +91,19 @@ public UITextureRegion deserialize(JsonElement json, Type typeOfT, JsonDeseriali } private static class UISkinTypeAdapter implements JsonDeserializer { + private WidgetLibrary widgetLibrary; + + public UISkinTypeAdapter(WidgetLibrary widgetLibrary) { + this.widgetLibrary = widgetLibrary; + } + @Override public UISkinData deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { if (json.isJsonObject()) { UISkinBuilder builder = new UISkinBuilder(); DefaultInfo defaultInfo = null; defaultInfo = context.deserialize(json, DefaultInfo.class); + defaultInfo.setWidgetLibrary(widgetLibrary); defaultInfo.apply(builder); return new UISkinData(builder.build()); } @@ -104,7 +111,7 @@ public UISkinData deserialize(JsonElement json, Type typeOfT, JsonDeserializatio } } - private class DefaultInfo extends FamilyInfo { + private static class DefaultInfo extends FamilyInfo { public String inherit; public Map families; @@ -120,21 +127,22 @@ public void apply(UISkinBuilder builder) { if (families != null) { for (Map.Entry entry : families.entrySet()) { builder.setFamily(entry.getKey()); + entry.getValue().setWidgetLibrary(widgetLibrary); entry.getValue().apply(builder); } } } } - private class FamilyInfo extends StyleInfo { + private static class FamilyInfo extends StyleInfo { public Map elements; + protected ClassLibrary widgetLibrary; public void apply(UISkinBuilder builder) { super.apply(builder); if (elements != null) { for (Map.Entry entry : elements.entrySet()) { - ClassLibrary library = widgetClassLibrary; - ClassMetadata metadata = library.resolve(entry.getKey()); + ClassMetadata metadata = widgetLibrary.resolve(entry.getKey()); if (metadata != null) { builder.setElementClass(metadata.getType()); entry.getValue().apply(builder); @@ -145,6 +153,10 @@ public void apply(UISkinBuilder builder) { } } } + + public void setWidgetLibrary(ClassLibrary widgetLibrary) { + this.widgetLibrary = widgetLibrary; + } } private static class PartsInfo extends StyleInfo { diff --git a/engine/src/test/java/org/destinationsol/testsupport/AssetsHelperInitializer.java b/engine/src/test/java/org/destinationsol/testsupport/AssetsHelperInitializer.java index ec84bbad4..d1e528193 100644 --- a/engine/src/test/java/org/destinationsol/testsupport/AssetsHelperInitializer.java +++ b/engine/src/test/java/org/destinationsol/testsupport/AssetsHelperInitializer.java @@ -9,11 +9,17 @@ import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.parallel.ResourceLock; +import org.terasology.gestalt.assets.module.ModuleAwareAssetTypeManagerImpl; +import org.terasology.gestalt.di.BeanContext; import org.terasology.gestalt.di.DefaultBeanContext; import org.terasology.gestalt.entitysystem.component.management.ComponentManager; import org.terasology.gestalt.module.ModuleFactory; import org.terasology.gestalt.module.ModulePathScanner; import org.terasology.gestalt.module.TableModuleRegistry; +import org.terasology.nui.reflection.WidgetLibrary; +import org.terasology.reflection.copy.CopyStrategyLibrary; +import org.terasology.reflection.reflect.ReflectFactory; +import org.terasology.reflection.reflect.ReflectionReflectFactory; /** * Create partial game instance with {@link ModuleManager}, {@link Assets}, {@link ComponentManager}, {@link HeadlessApplication} @@ -48,14 +54,20 @@ default void initAssets() throws Exception { ComponentManager componentManager = new ComponentManager(); stateObject.setComponentManager(componentManager); + BeanContext beanContext = new DefaultBeanContext(); + ModuleFactory moduleFactory = new ModuleFactory(); - ModuleManager moduleManager = new ModuleManager(new DefaultBeanContext(), moduleFactory, new TableModuleRegistry(), + ModuleManager moduleManager = new ModuleManager(beanContext, moduleFactory, new TableModuleRegistry(), new ModulePathScanner(moduleFactory), new TestModuleConfig()); moduleManager.init(); stateObject.setModuleManager(moduleManager); - AssetHelper helper = new AssetHelper(); - helper.init(moduleManager.getEnvironment(), componentManager, false); + AssetHelper helper = new AssetHelper(beanContext); + ReflectFactory reflectFactory = new ReflectionReflectFactory(); + helper.init(moduleManager.getEnvironment(), new WidgetLibrary(moduleManager::getEnvironment, reflectFactory, + new CopyStrategyLibrary(reflectFactory)), + new ModuleAwareAssetTypeManagerImpl(), + componentManager, false); Assets.initialize(helper); } From 008d74c47376d6b04d3a9a8dc4cf60fefcba4e18 Mon Sep 17 00:00:00 2001 From: Benjamin Amos Date: Mon, 9 May 2022 19:33:21 +0100 Subject: [PATCH 37/38] fix: add ECS `EventReceiver` injection and fix associated tests --- .../EventReceiverServiceRegistry.java | 30 +++++++++++++++++++ .../org/destinationsol/SolApplication.java | 5 ++-- .../systems/AsteroidBodyCreationSystem.java | 6 ++-- .../entitysystem/EntitySystemManager.java | 10 +++++-- .../entitysystem/EventReceiver.java | 3 ++ .../java/org/destinationsol/game/SolGame.java | 8 ++++- .../game/screens/ConsoleScreen.java | 4 +-- .../game/screens/GameScreens.java | 3 +- .../systems/DestroyOnZeroHealthSystem.java | 4 ++- .../systems/RubbleBodyCreationSystem.java | 5 ++-- .../NonNegativeDamageTest.java | 11 +++++-- .../NonNegativeHealthTest.java | 14 +++++---- .../DamageSystemTests/OnDamageTest.java | 10 +++++-- .../ZeroHealthCausesDestructionTest.java | 21 ++++++------- .../DestroyAtZeroHealthTest.java | 15 ++++++---- .../DestructionTest.java | 11 +++++-- .../RemovalForOptimizationTest.java | 11 +++++-- .../LocationSystemTests/AngleUpdateTest.java | 11 +++++-- .../PositionUpdateTest.java | 10 +++++-- .../VelocityUpdateTest.java | 11 +++++-- 20 files changed, 146 insertions(+), 57 deletions(-) create mode 100644 engine/src/main/java/org/destinationsol/EventReceiverServiceRegistry.java diff --git a/engine/src/main/java/org/destinationsol/EventReceiverServiceRegistry.java b/engine/src/main/java/org/destinationsol/EventReceiverServiceRegistry.java new file mode 100644 index 000000000..7e20d1c97 --- /dev/null +++ b/engine/src/main/java/org/destinationsol/EventReceiverServiceRegistry.java @@ -0,0 +1,30 @@ +/* + * Copyright 2022 The Terasology Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.destinationsol; + +import org.destinationsol.entitysystem.EventReceiver; +import org.terasology.context.Lifetime; +import org.terasology.gestalt.di.ServiceRegistry; +import org.terasology.gestalt.module.ModuleEnvironment; + +public class EventReceiverServiceRegistry extends ServiceRegistry { + public EventReceiverServiceRegistry(ModuleEnvironment environment) { + for (Class receiver : environment.getSubtypesOf(EventReceiver.class)) { + this.with(receiver).lifetime(Lifetime.Singleton); + } + } +} diff --git a/engine/src/main/java/org/destinationsol/SolApplication.java b/engine/src/main/java/org/destinationsol/SolApplication.java index 02ce99257..976376fd8 100644 --- a/engine/src/main/java/org/destinationsol/SolApplication.java +++ b/engine/src/main/java/org/destinationsol/SolApplication.java @@ -332,12 +332,12 @@ private void draw() { } public void play(boolean tut, String shipName, boolean isNewGame, WorldConfig worldConfig) { - + ModuleManager moduleManager = appContext.getBean(ModuleManager.class); gameContext = appContext.getNestedContainer( new GameConfigurationServiceRegistry(worldConfig), + new EventReceiverServiceRegistry(moduleManager.getEnvironment()), new SolGameServiceRegistry(tut), new ContextWrapperService()); - ModuleManager moduleManager = appContext.getBean(ModuleManager.class); solGame = gameContext.getBean(SolGame.class); //TODO: rework how system will trigger preBegin @@ -347,6 +347,7 @@ public void play(boolean tut, String shipName, boolean isNewGame, WorldConfig wo systems.forEach(ComponentSystem::preBegin); entitySystemManager = gameContext.getBean(EntitySystemManager.class); + entitySystemManager.initialise(); solGame.createUpdateSystems(); solGame.startGame(shipName, isNewGame, worldConfig, entitySystemManager); diff --git a/engine/src/main/java/org/destinationsol/asteroids/systems/AsteroidBodyCreationSystem.java b/engine/src/main/java/org/destinationsol/asteroids/systems/AsteroidBodyCreationSystem.java index 1274c7901..c6dc9239d 100644 --- a/engine/src/main/java/org/destinationsol/asteroids/systems/AsteroidBodyCreationSystem.java +++ b/engine/src/main/java/org/destinationsol/asteroids/systems/AsteroidBodyCreationSystem.java @@ -20,7 +20,6 @@ import com.badlogic.gdx.physics.box2d.Body; import com.badlogic.gdx.physics.box2d.BodyDef; import com.badlogic.gdx.physics.box2d.FixtureDef; -import com.badlogic.gdx.physics.box2d.World; import org.destinationsol.Const; import org.destinationsol.asteroids.components.AsteroidMesh; import org.destinationsol.body.events.BodyCreatedEvent; @@ -28,6 +27,7 @@ import org.destinationsol.entitysystem.EntitySystemManager; import org.destinationsol.entitysystem.EventReceiver; import org.destinationsol.game.CollisionMeshLoader; +import org.destinationsol.game.ObjectManager; import org.destinationsol.game.UpdateAwareSystem; import org.destinationsol.location.components.Angle; import org.destinationsol.location.components.Position; @@ -59,7 +59,7 @@ public class AsteroidBodyCreationSystem implements EventReceiver { EntitySystemManager entitySystemManager; @Inject - World world; + ObjectManager objectManager; private final CollisionMeshLoader collisionMeshLoader = new CollisionMeshLoader("engine:asteroids"); @@ -83,7 +83,7 @@ public EventResult onGenerateBody(GenerateBodyEvent event, EntityRef entity) { bd.angularDamping = 0; bd.position.set(position); bd.linearDamping = 0; - Body body = world.createBody(bd); + Body body = objectManager.getWorld().createBody(bd); //This sets a reference to an entity in the Body, so that the entity can be retrieved from the body during collision handling. body.setUserData(entity); diff --git a/engine/src/main/java/org/destinationsol/entitysystem/EntitySystemManager.java b/engine/src/main/java/org/destinationsol/entitysystem/EntitySystemManager.java index 14d287ecc..518365ed3 100644 --- a/engine/src/main/java/org/destinationsol/entitysystem/EntitySystemManager.java +++ b/engine/src/main/java/org/destinationsol/entitysystem/EntitySystemManager.java @@ -17,6 +17,7 @@ import com.google.common.collect.Lists; import org.destinationsol.modules.ModuleManager; +import org.terasology.gestalt.di.BeanContext; import org.terasology.gestalt.entitysystem.component.Component; import org.terasology.gestalt.entitysystem.component.management.ComponentManager; import org.terasology.gestalt.entitysystem.component.store.ArrayComponentStore; @@ -40,10 +41,11 @@ public class EntitySystemManager { private static EntityManager entityManager; private final EventSystem eventSystem = new EventSystemImpl(); + private final BeanContext context; private static final EventReceiverMethodSupport eventReceiverMethodSupport = new EventReceiverMethodSupport(); @Inject - public EntitySystemManager(ModuleManager moduleManager, ComponentManager componentManager, List eventReceivers) { + public EntitySystemManager(ModuleManager moduleManager, ComponentManager componentManager, BeanContext context) { List> stores = Lists.newArrayList(); for (Class componentType : moduleManager.getEnvironment().getSubtypesOf(Component.class)) { //This filters out abstract components, which would create exceptions @@ -54,7 +56,11 @@ public EntitySystemManager(ModuleManager moduleManager, ComponentManager compone } entityManager = new CoreEntityManager(stores); - for (EventReceiver eventReceiver : eventReceivers) { + this.context = context; + } + + public void initialise() { + for (EventReceiver eventReceiver : context.getBeans(EventReceiver.class)) { eventReceiverMethodSupport.register(eventReceiver, eventSystem); } } diff --git a/engine/src/main/java/org/destinationsol/entitysystem/EventReceiver.java b/engine/src/main/java/org/destinationsol/entitysystem/EventReceiver.java index a61978f15..029c57d80 100644 --- a/engine/src/main/java/org/destinationsol/entitysystem/EventReceiver.java +++ b/engine/src/main/java/org/destinationsol/entitysystem/EventReceiver.java @@ -15,5 +15,8 @@ */ package org.destinationsol.entitysystem; +import org.terasology.context.annotation.IndexInherited; + +@IndexInherited public interface EventReceiver { } diff --git a/engine/src/main/java/org/destinationsol/game/SolGame.java b/engine/src/main/java/org/destinationsol/game/SolGame.java index 92c23b698..28d4708c8 100644 --- a/engine/src/main/java/org/destinationsol/game/SolGame.java +++ b/engine/src/main/java/org/destinationsol/game/SolGame.java @@ -67,6 +67,7 @@ import org.destinationsol.ui.Waypoint; import org.destinationsol.ui.nui.screens.MainGameScreen; import org.destinationsol.world.GalaxyBuilder; +import org.terasology.context.exception.BeanNotFoundException; import org.terasology.gestalt.assets.ResourceUrn; import org.terasology.gestalt.di.BeanContext; import org.terasology.gestalt.entitysystem.entity.EntityRef; @@ -206,7 +207,12 @@ public void createUpdateSystems() { } RegisterUpdateSystem registerAnnotation = updateSystemClass.getDeclaredAnnotation(RegisterUpdateSystem.class); UpdateAwareSystem system = (UpdateAwareSystem) updateSystemClass.newInstance(); - beanContext.inject(system); + try { + beanContext.inject(system); + } catch (BeanNotFoundException e) { + e.printStackTrace(); + continue; + } if (!registerAnnotation.paused()) { if (!updateSystems.containsKey(registerAnnotation.priority())) { ArrayList systems = new ArrayList(); diff --git a/engine/src/main/java/org/destinationsol/game/screens/ConsoleScreen.java b/engine/src/main/java/org/destinationsol/game/screens/ConsoleScreen.java index 2e952f77a..d406300e4 100644 --- a/engine/src/main/java/org/destinationsol/game/screens/ConsoleScreen.java +++ b/engine/src/main/java/org/destinationsol/game/screens/ConsoleScreen.java @@ -105,10 +105,10 @@ public class ConsoleScreen implements SolUiScreen, ConsoleSubscriber { private StringBuilder inputLine; @Inject - public ConsoleScreen(Context context) { + public ConsoleScreen(Console console) { font = Assets.getFont("engine:main").getBitmapFont(); - this.console = new ConsoleImpl( context); + this.console = console; exitControl = new SolUiControl(null, true, Input.Keys.ESCAPE); commandHistoryUpControl = new SolUiControl(null, true, Input.Keys.UP); diff --git a/engine/src/main/java/org/destinationsol/game/screens/GameScreens.java b/engine/src/main/java/org/destinationsol/game/screens/GameScreens.java index 48989610a..5da379640 100644 --- a/engine/src/main/java/org/destinationsol/game/screens/GameScreens.java +++ b/engine/src/main/java/org/destinationsol/game/screens/GameScreens.java @@ -16,6 +16,7 @@ package org.destinationsol.game.screens; import org.destinationsol.SolApplication; +import org.destinationsol.game.console.Console; import org.destinationsol.game.context.Context; import org.destinationsol.ui.SolLayouts; @@ -40,7 +41,7 @@ public GameScreens(SolApplication cmp, Context context) { inventoryScreen = new InventoryScreen(cmp.getOptions()); talkScreen = new TalkScreen(layouts.menuLayout, cmp.getOptions()); waypointCreationScreen = new WaypointCreationScreen(layouts.menuLayout, cmp.getOptions(), mapScreen); - consoleScreen = new ConsoleScreen(context); + consoleScreen = new ConsoleScreen(context.get(Console.class)); } // This was added for PlayerCreatorTest.java (used in PlayerCreator) diff --git a/engine/src/main/java/org/destinationsol/removal/systems/DestroyOnZeroHealthSystem.java b/engine/src/main/java/org/destinationsol/removal/systems/DestroyOnZeroHealthSystem.java index b1e5e43f3..9a4b205fe 100644 --- a/engine/src/main/java/org/destinationsol/removal/systems/DestroyOnZeroHealthSystem.java +++ b/engine/src/main/java/org/destinationsol/removal/systems/DestroyOnZeroHealthSystem.java @@ -21,6 +21,7 @@ import org.destinationsol.removal.events.ShouldBeDestroyedEvent; import org.destinationsol.removal.events.ZeroHealthEvent; import org.terasology.gestalt.entitysystem.entity.EntityRef; +import org.terasology.gestalt.entitysystem.event.EventResult; import org.terasology.gestalt.entitysystem.event.ReceiveEvent; import javax.inject.Inject; @@ -38,7 +39,8 @@ public DestroyOnZeroHealthSystem() { } @ReceiveEvent - public void onZeroHealth(ZeroHealthEvent event, EntityRef entity) { + public EventResult onZeroHealth(ZeroHealthEvent event, EntityRef entity) { entitySystemManager.sendEvent(new ShouldBeDestroyedEvent(), entity); + return EventResult.COMPLETE; } } diff --git a/engine/src/main/java/org/destinationsol/rubble/systems/RubbleBodyCreationSystem.java b/engine/src/main/java/org/destinationsol/rubble/systems/RubbleBodyCreationSystem.java index 59303c9c8..ae8f40f17 100644 --- a/engine/src/main/java/org/destinationsol/rubble/systems/RubbleBodyCreationSystem.java +++ b/engine/src/main/java/org/destinationsol/rubble/systems/RubbleBodyCreationSystem.java @@ -27,6 +27,7 @@ import org.destinationsol.entitysystem.EntitySystemManager; import org.destinationsol.entitysystem.EventReceiver; import org.destinationsol.game.CollisionMeshLoader; +import org.destinationsol.game.ObjectManager; import org.destinationsol.location.components.Angle; import org.destinationsol.location.components.Position; import org.destinationsol.rendering.RenderableElement; @@ -51,7 +52,7 @@ public class RubbleBodyCreationSystem implements EventReceiver { protected EntitySystemManager entitySystemManager; @Inject - protected World world; + protected ObjectManager objectManager; private final CollisionMeshLoader collisionMeshLoader = new CollisionMeshLoader("engine:miscCollisionMeshes"); @@ -75,7 +76,7 @@ public EventResult onGenerateBody(GenerateBodyEvent event, EntityRef entity) { bd.angularDamping = 0; bd.position.set(position); bd.linearDamping = 0; - Body body = world.createBody(bd); + Body body = objectManager.getWorld().createBody(bd); //This sets a reference to an entity in the Body, so that the entity can be retrieved from the body during collision handling. body.setUserData(entity); diff --git a/engine/src/test/java/org/destinationsol/systems/DamageSystemTests/NonNegativeDamageTest.java b/engine/src/test/java/org/destinationsol/systems/DamageSystemTests/NonNegativeDamageTest.java index 1de26f9a5..95ac1efaa 100644 --- a/engine/src/test/java/org/destinationsol/systems/DamageSystemTests/NonNegativeDamageTest.java +++ b/engine/src/test/java/org/destinationsol/systems/DamageSystemTests/NonNegativeDamageTest.java @@ -24,14 +24,13 @@ import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.terasology.gestalt.di.DefaultBeanContext; +import org.terasology.gestalt.di.ServiceRegistry; import org.terasology.gestalt.entitysystem.component.management.ComponentManager; import org.terasology.gestalt.entitysystem.entity.EntityRef; import org.terasology.gestalt.module.ModuleFactory; import org.terasology.gestalt.module.ModulePathScanner; import org.terasology.gestalt.module.TableModuleRegistry; -import java.util.Collections; - import static org.junit.jupiter.api.Assertions.assertEquals; /** @@ -48,7 +47,13 @@ public void setUp() throws Exception { moduleManager = new ModuleManager(new DefaultBeanContext(), moduleFactory, new TableModuleRegistry(), new ModulePathScanner(moduleFactory), new TestModuleConfig()); moduleManager.init(); - entitySystemManager = new EntitySystemManager(moduleManager, new ComponentManager(), Collections.singletonList(new DamageSystem())); + + ServiceRegistry systemsRegistry = new ServiceRegistry(); + systemsRegistry.with(DamageSystem.class); + systemsRegistry.with(EntitySystemManager.class).use(() -> entitySystemManager); + entitySystemManager = new EntitySystemManager(moduleManager, new ComponentManager(), + new DefaultBeanContext(systemsRegistry)); + entitySystemManager.initialise(); } @Test diff --git a/engine/src/test/java/org/destinationsol/systems/DamageSystemTests/NonNegativeHealthTest.java b/engine/src/test/java/org/destinationsol/systems/DamageSystemTests/NonNegativeHealthTest.java index 927955565..654e44802 100644 --- a/engine/src/test/java/org/destinationsol/systems/DamageSystemTests/NonNegativeHealthTest.java +++ b/engine/src/test/java/org/destinationsol/systems/DamageSystemTests/NonNegativeHealthTest.java @@ -24,17 +24,15 @@ import org.destinationsol.removal.systems.DestroyOnZeroHealthSystem; import org.destinationsol.testsupport.TestModuleConfig; import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; import org.terasology.gestalt.di.DefaultBeanContext; +import org.terasology.gestalt.di.ServiceRegistry; import org.terasology.gestalt.entitysystem.component.management.ComponentManager; import org.terasology.gestalt.entitysystem.entity.EntityRef; import org.terasology.gestalt.module.ModuleFactory; import org.terasology.gestalt.module.ModulePathScanner; import org.terasology.gestalt.module.TableModuleRegistry; -import java.util.Collections; - import static org.junit.jupiter.api.Assertions.assertEquals; /** @@ -50,7 +48,12 @@ public void setUp() throws Exception { moduleManager = new ModuleManager(new DefaultBeanContext(), moduleFactory, new TableModuleRegistry(), new ModulePathScanner(moduleFactory), new TestModuleConfig()); moduleManager.init(); - entitySystemManager = new EntitySystemManager(moduleManager, new ComponentManager(), Collections.singletonList(new DamageSystem())); + ServiceRegistry systemsRegistry = new ServiceRegistry(); + systemsRegistry.with(DamageSystem.class); + systemsRegistry.with(EntitySystemManager.class).use(() -> entitySystemManager); + entitySystemManager = new EntitySystemManager(moduleManager, new ComponentManager(), + new DefaultBeanContext(systemsRegistry)); + entitySystemManager.initialise(); } /** @@ -59,7 +62,6 @@ public void setUp() throws Exception { * so the behavior of its components is effectively unspecified. */ @Test - @Disabled public void testDamageDoesntMakeHealthBecomeNegative() { Health health; EntityRef entity = entitySystemManager.getEntityManager().createEntity(new Health()); @@ -72,6 +74,8 @@ public void testDamageDoesntMakeHealthBecomeNegative() { entitySystemManager.sendEvent(event, new Health()); + // Get the latest values for the health component + health = entity.getComponent(Health.class).get(); assertEquals(0, health.currentHealth); } diff --git a/engine/src/test/java/org/destinationsol/systems/DamageSystemTests/OnDamageTest.java b/engine/src/test/java/org/destinationsol/systems/DamageSystemTests/OnDamageTest.java index 6cd1739ec..c1b6747d4 100644 --- a/engine/src/test/java/org/destinationsol/systems/DamageSystemTests/OnDamageTest.java +++ b/engine/src/test/java/org/destinationsol/systems/DamageSystemTests/OnDamageTest.java @@ -25,14 +25,13 @@ import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.terasology.gestalt.di.DefaultBeanContext; +import org.terasology.gestalt.di.ServiceRegistry; import org.terasology.gestalt.entitysystem.component.management.ComponentManager; import org.terasology.gestalt.entitysystem.entity.EntityRef; import org.terasology.gestalt.module.ModuleFactory; import org.terasology.gestalt.module.ModulePathScanner; import org.terasology.gestalt.module.TableModuleRegistry; -import java.util.Collections; - import static org.junit.jupiter.api.Assertions.assertEquals; /** @@ -49,7 +48,12 @@ public void setUp() throws Exception { moduleManager = new ModuleManager(new DefaultBeanContext(), moduleFactory, new TableModuleRegistry(), new ModulePathScanner(moduleFactory), new TestModuleConfig()); moduleManager.init(); - entitySystemManager = new EntitySystemManager(moduleManager, new ComponentManager(), Collections.singletonList(new DamageSystem())); + ServiceRegistry systemsRegistry = new ServiceRegistry(); + systemsRegistry.with(DamageSystem.class); + systemsRegistry.with(EntitySystemManager.class).use(() -> entitySystemManager); + entitySystemManager = new EntitySystemManager(moduleManager, new ComponentManager(), + new DefaultBeanContext(systemsRegistry)); + entitySystemManager.initialise(); } @Test diff --git a/engine/src/test/java/org/destinationsol/systems/DamageSystemTests/ZeroHealthCausesDestructionTest.java b/engine/src/test/java/org/destinationsol/systems/DamageSystemTests/ZeroHealthCausesDestructionTest.java index bd7227f20..e46897311 100644 --- a/engine/src/test/java/org/destinationsol/systems/DamageSystemTests/ZeroHealthCausesDestructionTest.java +++ b/engine/src/test/java/org/destinationsol/systems/DamageSystemTests/ZeroHealthCausesDestructionTest.java @@ -16,30 +16,21 @@ package org.destinationsol.systems.DamageSystemTests; import org.destinationsol.entitysystem.EntitySystemManager; -import org.destinationsol.game.context.internal.ContextImpl; import org.destinationsol.health.components.Health; import org.destinationsol.health.events.DamageEvent; import org.destinationsol.health.systems.DamageSystem; -import org.destinationsol.modules.ModuleManager; import org.destinationsol.removal.components.SlatedForDeletion; import org.destinationsol.removal.events.DeletionEvent; -import org.destinationsol.removal.systems.DeletionUpdateSystem; import org.destinationsol.removal.systems.DestroyOnZeroHealthSystem; import org.destinationsol.removal.systems.DestructionSystem; import org.destinationsol.testsupport.AssetsHelperInitializer; import org.destinationsol.testsupport.Box2DInitializer; import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; import org.terasology.gestalt.di.DefaultBeanContext; +import org.terasology.gestalt.di.ServiceRegistry; import org.terasology.gestalt.entitysystem.component.management.ComponentManager; import org.terasology.gestalt.entitysystem.entity.EntityRef; -import org.terasology.gestalt.module.ModuleFactory; -import org.terasology.gestalt.module.ModulePathScanner; -import org.terasology.gestalt.module.TableModuleRegistry; - -import java.util.Arrays; -import java.util.Collections; import static org.junit.jupiter.api.Assertions.assertFalse; @@ -52,11 +43,17 @@ public class ZeroHealthCausesDestructionTest implements Box2DInitializer, Assets @BeforeEach public void setUp() throws Exception { - entitySystemManager = new EntitySystemManager(getModuleManager(),getComponentManager(), Arrays.asList(new DestroyOnZeroHealthSystem(), new DamageSystem(),new DestructionSystem())); + ServiceRegistry systemsRegistry = new ServiceRegistry(); + systemsRegistry.with(DestroyOnZeroHealthSystem.class); + systemsRegistry.with(DamageSystem.class); + systemsRegistry.with(DestructionSystem.class); + systemsRegistry.with(EntitySystemManager.class).use(() -> entitySystemManager); + entitySystemManager = new EntitySystemManager(getModuleManager(), new ComponentManager(), + new DefaultBeanContext(systemsRegistry)); + entitySystemManager.initialise(); } @Test - @Disabled("Reimplement with test-di... DestroyOnZero and Damage Systems using entity manager for sending events") public void testLethalDamageCausesDestruction() { EntityRef entity = entitySystemManager.getEntityManager().createEntity(new Health()); if (entity.getComponent(Health.class).isPresent()) { diff --git a/engine/src/test/java/org/destinationsol/systems/DestroyOnZeroHealthSystemTests/DestroyAtZeroHealthTest.java b/engine/src/test/java/org/destinationsol/systems/DestroyOnZeroHealthSystemTests/DestroyAtZeroHealthTest.java index a0ff310e4..a8e96e979 100644 --- a/engine/src/test/java/org/destinationsol/systems/DestroyOnZeroHealthSystemTests/DestroyAtZeroHealthTest.java +++ b/engine/src/test/java/org/destinationsol/systems/DestroyOnZeroHealthSystemTests/DestroyAtZeroHealthTest.java @@ -21,15 +21,15 @@ import org.destinationsol.removal.events.DeletionEvent; import org.destinationsol.removal.events.ZeroHealthEvent; import org.destinationsol.removal.systems.DestroyOnZeroHealthSystem; +import org.destinationsol.removal.systems.DestructionSystem; import org.destinationsol.testsupport.AssetsHelperInitializer; import org.destinationsol.testsupport.Box2DInitializer; import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; +import org.terasology.gestalt.di.DefaultBeanContext; +import org.terasology.gestalt.di.ServiceRegistry; import org.terasology.gestalt.entitysystem.entity.EntityRef; -import java.util.Collections; - import static org.junit.jupiter.api.Assertions.assertFalse; public class DestroyAtZeroHealthTest implements Box2DInitializer, AssetsHelperInitializer { @@ -38,11 +38,16 @@ public class DestroyAtZeroHealthTest implements Box2DInitializer, AssetsHelperIn @BeforeEach public void setUp() throws Exception { - entitySystemManager = new EntitySystemManager(getModuleManager(), getComponentManager(), Collections.singletonList(new DestroyOnZeroHealthSystem())); + ServiceRegistry systemsRegistry = new ServiceRegistry(); + systemsRegistry.with(DestroyOnZeroHealthSystem.class); + systemsRegistry.with(DestructionSystem.class); + systemsRegistry.with(EntitySystemManager.class).use(() -> entitySystemManager); + entitySystemManager = new EntitySystemManager(getModuleManager(), getComponentManager(), + new DefaultBeanContext(systemsRegistry)); + entitySystemManager.initialise(); } @Test - @Disabled("Reimplement with test-di... DamageSystems using entity manager for sending events") public void testZeroHealthCausesDestruction() { EntityRef entity = entitySystemManager.getEntityManager().createEntity(); diff --git a/engine/src/test/java/org/destinationsol/systems/DestructionSystemTests/DestructionTest.java b/engine/src/test/java/org/destinationsol/systems/DestructionSystemTests/DestructionTest.java index ec43c3d99..7b160b07b 100644 --- a/engine/src/test/java/org/destinationsol/systems/DestructionSystemTests/DestructionTest.java +++ b/engine/src/test/java/org/destinationsol/systems/DestructionSystemTests/DestructionTest.java @@ -25,10 +25,10 @@ import org.destinationsol.testsupport.Box2DInitializer; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.terasology.gestalt.di.DefaultBeanContext; +import org.terasology.gestalt.di.ServiceRegistry; import org.terasology.gestalt.entitysystem.entity.EntityRef; -import java.util.Collections; - import static org.junit.jupiter.api.Assertions.assertFalse; /** @@ -40,7 +40,12 @@ public class DestructionTest implements Box2DInitializer, AssetsHelperInitialize @BeforeEach public void setUp() throws Exception { - entitySystemManager = new EntitySystemManager(getModuleManager(), getComponentManager(), Collections.singletonList(new DestructionSystem())); + ServiceRegistry systemsRegistry = new ServiceRegistry(); + systemsRegistry.with(DestructionSystem.class); + systemsRegistry.with(EntitySystemManager.class).use(() -> entitySystemManager); + entitySystemManager = new EntitySystemManager(getModuleManager(), getComponentManager(), + new DefaultBeanContext(systemsRegistry)); + entitySystemManager.initialise(); } @Test diff --git a/engine/src/test/java/org/destinationsol/systems/DestructionSystemTests/RemovalForOptimizationTest.java b/engine/src/test/java/org/destinationsol/systems/DestructionSystemTests/RemovalForOptimizationTest.java index d3f9d3a48..9e8134413 100644 --- a/engine/src/test/java/org/destinationsol/systems/DestructionSystemTests/RemovalForOptimizationTest.java +++ b/engine/src/test/java/org/destinationsol/systems/DestructionSystemTests/RemovalForOptimizationTest.java @@ -26,10 +26,10 @@ import org.destinationsol.testsupport.Box2DInitializer; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.terasology.gestalt.di.DefaultBeanContext; +import org.terasology.gestalt.di.ServiceRegistry; import org.terasology.gestalt.entitysystem.entity.EntityRef; -import java.util.Collections; - import static org.junit.jupiter.api.Assertions.assertFalse; /** @@ -41,7 +41,12 @@ public class RemovalForOptimizationTest implements Box2DInitializer, AssetsHelpe @BeforeEach public void setUp() throws Exception { - entitySystemManager = new EntitySystemManager(getModuleManager(), getComponentManager(), Collections.singletonList(new DestructionSystem())); + ServiceRegistry systemsRegistry = new ServiceRegistry(); + systemsRegistry.with(DestructionSystem.class); + systemsRegistry.with(EntitySystemManager.class).use(() -> entitySystemManager); + entitySystemManager = new EntitySystemManager(getModuleManager(), getComponentManager(), + new DefaultBeanContext(systemsRegistry)); + entitySystemManager.initialise(); } @Test diff --git a/engine/src/test/java/org/destinationsol/systems/LocationSystemTests/AngleUpdateTest.java b/engine/src/test/java/org/destinationsol/systems/LocationSystemTests/AngleUpdateTest.java index a4a0046bf..928aeaf89 100644 --- a/engine/src/test/java/org/destinationsol/systems/LocationSystemTests/AngleUpdateTest.java +++ b/engine/src/test/java/org/destinationsol/systems/LocationSystemTests/AngleUpdateTest.java @@ -24,10 +24,10 @@ import org.destinationsol.testsupport.Box2DInitializer; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.terasology.gestalt.di.DefaultBeanContext; +import org.terasology.gestalt.di.ServiceRegistry; import org.terasology.gestalt.entitysystem.entity.EntityRef; -import java.util.Collections; - import static org.junit.jupiter.api.Assertions.assertEquals; public class AngleUpdateTest implements AssetsHelperInitializer, Box2DInitializer { @@ -36,7 +36,12 @@ public class AngleUpdateTest implements AssetsHelperInitializer, Box2DInitialize @BeforeEach public void setUp() throws Exception { - entitySystemManager = new EntitySystemManager(getModuleManager(), getComponentManager(), Collections.singletonList(new LocationSystem())); + ServiceRegistry systemsRegistry = new ServiceRegistry(); + systemsRegistry.with(LocationSystem.class); + systemsRegistry.with(EntitySystemManager.class).use(() -> entitySystemManager); + entitySystemManager = new EntitySystemManager(getModuleManager(), getComponentManager(), + new DefaultBeanContext(systemsRegistry)); + entitySystemManager.initialise(); } @Test diff --git a/engine/src/test/java/org/destinationsol/systems/LocationSystemTests/PositionUpdateTest.java b/engine/src/test/java/org/destinationsol/systems/LocationSystemTests/PositionUpdateTest.java index 36c23ca56..f33a92d60 100644 --- a/engine/src/test/java/org/destinationsol/systems/LocationSystemTests/PositionUpdateTest.java +++ b/engine/src/test/java/org/destinationsol/systems/LocationSystemTests/PositionUpdateTest.java @@ -27,14 +27,13 @@ import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.terasology.gestalt.di.DefaultBeanContext; +import org.terasology.gestalt.di.ServiceRegistry; import org.terasology.gestalt.entitysystem.component.management.ComponentManager; import org.terasology.gestalt.entitysystem.entity.EntityRef; import org.terasology.gestalt.module.ModuleFactory; import org.terasology.gestalt.module.ModulePathScanner; import org.terasology.gestalt.module.TableModuleRegistry; -import java.util.Collections; - import static org.junit.jupiter.api.Assertions.assertEquals; @@ -49,7 +48,12 @@ public void setUp() throws Exception { moduleManager = new ModuleManager(new DefaultBeanContext(), moduleFactory, new TableModuleRegistry(), new ModulePathScanner(moduleFactory), new TestModuleConfig()); moduleManager.init(); - entitySystemManager = new EntitySystemManager(moduleManager, new ComponentManager(), Collections.singletonList(new LocationSystem())); + ServiceRegistry systemsRegistry = new ServiceRegistry(); + systemsRegistry.with(LocationSystem.class); + systemsRegistry.with(EntitySystemManager.class).use(() -> entitySystemManager); + entitySystemManager = new EntitySystemManager(moduleManager, new ComponentManager(), + new DefaultBeanContext(systemsRegistry)); + entitySystemManager.initialise(); } @Test diff --git a/engine/src/test/java/org/destinationsol/systems/LocationSystemTests/VelocityUpdateTest.java b/engine/src/test/java/org/destinationsol/systems/LocationSystemTests/VelocityUpdateTest.java index 9778693d7..42f5e6b56 100644 --- a/engine/src/test/java/org/destinationsol/systems/LocationSystemTests/VelocityUpdateTest.java +++ b/engine/src/test/java/org/destinationsol/systems/LocationSystemTests/VelocityUpdateTest.java @@ -25,10 +25,10 @@ import org.destinationsol.testsupport.Box2DInitializer; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.terasology.gestalt.di.DefaultBeanContext; +import org.terasology.gestalt.di.ServiceRegistry; import org.terasology.gestalt.entitysystem.entity.EntityRef; -import java.util.Collections; - import static org.junit.jupiter.api.Assertions.assertEquals; public class VelocityUpdateTest implements AssetsHelperInitializer, Box2DInitializer { @@ -37,7 +37,12 @@ public class VelocityUpdateTest implements AssetsHelperInitializer, Box2DInitial @BeforeEach public void setUp() throws Exception { - entitySystemManager = new EntitySystemManager(getModuleManager(), getComponentManager(), Collections.singletonList(new LocationSystem())); + ServiceRegistry systemsRegistry = new ServiceRegistry(); + systemsRegistry.with(LocationSystem.class); + systemsRegistry.with(EntitySystemManager.class).use(() -> entitySystemManager); + entitySystemManager = new EntitySystemManager(getModuleManager(), getComponentManager(), + new DefaultBeanContext(systemsRegistry)); + entitySystemManager.initialise(); } @Test From 660fa7bcf8da59cfa9cf9abd375f6047f7903a47 Mon Sep 17 00:00:00 2001 From: darkweird Date: Tue, 24 May 2022 11:58:47 +0300 Subject: [PATCH 38/38] feature: make FocusManager as Injectable service and inject it in Nui. fix: Fix DI Loading NUI as transient service instead singleton --- .../main/java/org/destinationsol/CoreService.java | 6 +++++- .../org/destinationsol/assets/ui/UISkinFormat.java | 2 +- .../java/org/destinationsol/ui/nui/NUIManager.java | 13 +++++++------ .../org/destinationsol/ui/nui/NUIScreenLayer.java | 7 +++++-- 4 files changed, 18 insertions(+), 10 deletions(-) diff --git a/engine/src/main/java/org/destinationsol/CoreService.java b/engine/src/main/java/org/destinationsol/CoreService.java index 23699cf38..45c53f1dc 100644 --- a/engine/src/main/java/org/destinationsol/CoreService.java +++ b/engine/src/main/java/org/destinationsol/CoreService.java @@ -21,6 +21,8 @@ import org.terasology.gestalt.di.ServiceRegistry; import org.terasology.gestalt.di.scanners.StandardScanner; import org.terasology.gestalt.entitysystem.component.management.ComponentManager; +import org.terasology.nui.FocusManager; +import org.terasology.nui.FocusManagerImpl; import org.terasology.nui.reflection.WidgetLibrary; import org.terasology.reflection.copy.CopyStrategyLibrary; import org.terasology.reflection.reflect.ReflectFactory; @@ -50,6 +52,7 @@ public CoreService(SolApplication application) { this.with(MenuLayout.class).lifetime(Lifetime.Singleton); this.with(NUIManager.class).lifetime(Lifetime.Singleton); + this.with(FocusManager.class).lifetime(Lifetime.Singleton).use(FocusManagerImpl.class); this.with(MenuBackgroundManager.class).lifetime(Lifetime.Singleton); this.with(ReflectFactory.class).lifetime(Lifetime.Singleton).use(ReflectionReflectFactory.class); @@ -57,8 +60,9 @@ public CoreService(SolApplication application) { this.with(WidgetLibrary.class).lifetime(Lifetime.Singleton); this.with(SolInputManager.class).lifetime(Lifetime.Singleton); + this.registerScanner(new StandardScanner("org.destinationsol.assets")); - this.registerScanner(new StandardScanner("org.destinationsol.ui.nui")); + this.registerScanner(new StandardScanner("org.destinationsol.ui.nui.screens")); // TODO seems this is should be GameService before game this.with(Console.class).lifetime(Lifetime.Singleton).use(ConsoleImpl.class); diff --git a/engine/src/main/java/org/destinationsol/assets/ui/UISkinFormat.java b/engine/src/main/java/org/destinationsol/assets/ui/UISkinFormat.java index 2ba76706a..f488f4345 100644 --- a/engine/src/main/java/org/destinationsol/assets/ui/UISkinFormat.java +++ b/engine/src/main/java/org/destinationsol/assets/ui/UISkinFormat.java @@ -46,7 +46,7 @@ public class UISkinFormat extends AbstractAssetFileFormat { private static final Logger logger = LoggerFactory.getLogger(UISkinFormat.class); private Gson gson; - private ClassLibrary widgetClassLibrary; + private static ClassLibrary widgetClassLibrary; @Inject public UISkinFormat(WidgetLibrary widgetClassLibrary) { diff --git a/engine/src/main/java/org/destinationsol/ui/nui/NUIManager.java b/engine/src/main/java/org/destinationsol/ui/nui/NUIManager.java index 7566e5f2b..b06bdf241 100644 --- a/engine/src/main/java/org/destinationsol/ui/nui/NUIManager.java +++ b/engine/src/main/java/org/destinationsol/ui/nui/NUIManager.java @@ -138,10 +138,16 @@ public class NUIManager { * @param options used to initialise the UI scale with its previously-saved value */ @Inject - public NUIManager(SolApplication solApplication, Context context, CommonDrawer commonDrawer, GameOptions options, UiDrawer uiDrawer) { + public NUIManager(SolApplication solApplication, + Context context, + CommonDrawer commonDrawer, + GameOptions options, + UiDrawer uiDrawer, + FocusManager focusManager) { NUIInputProcessor.CONSUME_INPUT = false; this.context = context; this.uiDrawer = uiDrawer; + this.focusManager = focusManager; // TODO: Re-enable tabbing when it works TabbingManager.tabForwardInput = Keyboard.Key.NONE; @@ -152,7 +158,6 @@ public NUIManager(SolApplication solApplication, Context context, CommonDrawer c keyboard = new LibGDXKeyboardDevice(); canvasRenderer = new LibGDXCanvasRenderer(Gdx.graphics.getWidth(), Gdx.graphics.getHeight(), commonDrawer.getSpriteBatch(), new ShapeRenderer(), false, true); - focusManager = new FocusManagerImpl(); whiteTexture = Assets.getDSTexture(WHITE_TEXTURE_URN).getUiTexture(); skin = Assets.getSkin(DEFAULT_SKIN_URN); @@ -313,10 +318,6 @@ public NUIScreenLayer createScreen(String uri) { if (rootWidget instanceof NUIScreenLayer) { NUIScreenLayer screen = (NUIScreenLayer) rootWidget; if (!alreadyLoaded) { - // Populate all @In annotated fields in the screen class with values from the context. - InjectionHelper.inject(screen, context); - screen.setFocusManager(focusManager); - screen.setNuiManager(this); screen.initialise(); } return screen; diff --git a/engine/src/main/java/org/destinationsol/ui/nui/NUIScreenLayer.java b/engine/src/main/java/org/destinationsol/ui/nui/NUIScreenLayer.java index 84223b44e..6cda1c26e 100644 --- a/engine/src/main/java/org/destinationsol/ui/nui/NUIScreenLayer.java +++ b/engine/src/main/java/org/destinationsol/ui/nui/NUIScreenLayer.java @@ -26,6 +26,7 @@ import org.terasology.nui.UIWidget; import org.terasology.nui.events.NUIKeyEvent; +import javax.inject.Inject; import java.util.Arrays; import java.util.Collections; import java.util.Iterator; @@ -177,7 +178,8 @@ protected boolean escapeCloses() { * Primary usage is in {@link NUIManager#pushScreen} * @param focusManager the focus manager to use. */ - void setFocusManager(FocusManager focusManager) { + @Inject + public void setFocusManager(FocusManager focusManager) { this.focusManager = focusManager; } @@ -193,7 +195,8 @@ protected FocusManager getFocusManager() { * Sets the game's NUI Manager. * @param nuiManager the game's NUI Manager */ - void setNuiManager(NUIManager nuiManager) { + @Inject + public void setNuiManager(NUIManager nuiManager) { this.nuiManager = nuiManager; }