package com.indignado.logicbricks.config;
import box2dLight.RayHandler;
import com.badlogic.gdx.assets.AssetManager;
import com.badlogic.gdx.graphics.Camera;
import com.badlogic.gdx.graphics.OrthographicCamera;
import com.badlogic.gdx.graphics.g2d.Batch;
import com.badlogic.gdx.graphics.g2d.SpriteBatch;
import com.badlogic.gdx.physics.box2d.World;
import com.badlogic.gdx.utils.ObjectMap;
import com.indignado.logicbricks.components.*;
import com.indignado.logicbricks.components.actuators.*;
import com.indignado.logicbricks.components.controllers.ConditionalControllerComponent;
import com.indignado.logicbricks.components.controllers.ControllerComponent;
import com.indignado.logicbricks.components.controllers.ScriptControllerComponent;
import com.indignado.logicbricks.components.sensors.*;
import com.indignado.logicbricks.core.Game;
import com.indignado.logicbricks.core.LogicBricksEngine;
import com.indignado.logicbricks.core.LogicBricksException;
import com.indignado.logicbricks.core.actuators.*;
import com.indignado.logicbricks.core.controllers.ConditionalController;
import com.indignado.logicbricks.core.controllers.Controller;
import com.indignado.logicbricks.core.controllers.ScriptController;
import com.indignado.logicbricks.core.sensors.*;
import com.indignado.logicbricks.systems.*;
import com.indignado.logicbricks.systems.actuators.*;
import com.indignado.logicbricks.systems.controllers.ConditionalControllerSystem;
import com.indignado.logicbricks.systems.controllers.ControllerSystem;
import com.indignado.logicbricks.systems.controllers.ScriptControllerSystem;
import com.indignado.logicbricks.systems.sensors.*;
import com.indignado.logicbricks.utils.builders.LBBuilders;
/**
* @author Rubentxu.
*/
public class GameContext implements ContextProviders {
public ObjectMap<Class,Object> context = new ObjectMap<>();
public <T> T get (Class<T> clazz) {
if (!context.containsKey(clazz)) throw new LogicBricksException("GameContext ",clazz.getSimpleName() + " not exist");
return (T) context.get(clazz);
}
public void load() {
context.put(Batch.class, provideBatch());
context.put(AssetManager.class, provideAssetManager());
context.put(World.class, providePhysics());
context.put(LogicBricksEngine.class, provideEngine());
registerDefaultClasses();
context.put(Camera.class, provideCamera());
context.put(RayHandler.class, provideRayHandler(get(World.class)));
context.put(LBBuilders.class, provideUtilBuilder(get(LogicBricksEngine.class),get(World.class), get(RayHandler.class)));
context.put(Game.class, provideGame(get(LogicBricksEngine.class), get(World.class)));
}
@Override
public Game provideGame(LogicBricksEngine engine, World physics) {
return new Game(engine, physics);
}
@Override
public AssetManager provideAssetManager() {
return new AssetManager();
}
@Override
public <T> T providePhysics() {
return (T) new World(Settings.GRAVITY,true);
}
@Override
public LogicBricksEngine provideEngine() {
LogicBricksEngine engine = new LogicBricksEngine(this);
return engine;
}
@Override
public Camera provideCamera() {
return new OrthographicCamera();
}
@Override
public Batch provideBatch() {
return new SpriteBatch();
}
@Override
public <T> LBBuilders provideUtilBuilder(LogicBricksEngine engine, T physics, RayHandler rayHandler) {
return new LBBuilders(engine, (World) physics, rayHandler);
}
@Override
public <T> RayHandler provideRayHandler(T physics) {
return new RayHandler((World) physics);
}
@Override
public void registerDefaultClasses() {
LogicBricksEngine engine = get(LogicBricksEngine.class);
engine.registerBricksClasses(AlwaysSensor.class, AlwaysSensorComponent.class, AlwaysSensorSystem.class);
engine.registerBricksClasses(CollisionSensor.class, CollisionSensorComponent.class, CollisionSensorSystem.class);
engine.registerBricksClasses(KeyboardSensor.class, KeyboardSensorComponent.class, KeyboardSensorSystem.class);
engine.registerBricksClasses(MouseSensor.class, MouseSensorComponent.class, MouseSensorSystem.class);
engine.registerBricksClasses(PropertySensor.class, PropertySensorComponent.class, PropertySensorSystem.class);
engine.registerBricksClasses(MessageSensor.class, MessageSensorComponent.class, MessageSensorSystem.class);
engine.registerBricksClasses(DelaySensor.class, DelaySensorComponent.class, DelaySensorSystem.class);
engine.registerBricksClasses(RadarSensor.class, RadarSensorComponent.class, RadarSensorSystem.class);
engine.registerBricksClasses(NearSensor.class, NearSensorComponent.class, NearSensorSystem.class);
engine.registerBricksClasses(RaySensor.class, RaySensorComponent.class, RaySensorSystem.class);
engine.registerBricksClasses(Controller.class, ControllerComponent.class, ControllerSystem.class);
engine.registerBricksClasses(ConditionalController.class, ConditionalControllerComponent.class, ConditionalControllerSystem.class);
engine.registerBricksClasses(ScriptController.class, ScriptControllerComponent.class, ScriptControllerSystem.class);
engine.registerBricksClasses(CameraActuator.class, CameraActuatorComponent.class, CameraActuatorSystem.class);
engine.registerBricksClasses(EditRigidBodyActuator.class, EditRigidBodyActuatorComponent.class, EditRigidBodyActuatorSystem.class);
engine.registerBricksClasses(EffectActuator.class, EffectActuatorComponent.class, EffectActuatorSystem.class);
engine.registerBricksClasses(InstanceEntityActuator.class, InstanceEntityActuatorComponent.class, InstanceEntityActuatorSystem.class);
engine.registerBricksClasses(MessageActuator.class, MessageActuatorComponent.class, MessageActuatorSystem.class);
engine.registerBricksClasses(MotionActuator.class, MotionActuatorComponent.class, MotionActuatorSystem.class);
engine.registerBricksClasses(PropertyActuator.class, PropertyActuatorComponent.class, PropertyActuatorSystem.class);
engine.registerBricksClasses(StateActuator.class, StateActuatorComponent.class, StateActuatorSystem.class);
engine.registerBricksClasses(TextureActuator.class, TextureActuatorComponent.class, TextureActuatorSystem.class);
engine.registerEngineClasses(BuoyancyComponent.class, BuoyancySystem.class);
engine.registerEngineClasses(RadialGravityComponent.class, RadialGravitySystem.class);
engine.registerEngineClasses(ViewsComponent.class, RenderingSystem.class, ViewSystem.class);
engine.registerEngineClasses(StateComponent.class, StateSystem.class);
engine.registerEngineClasses(LightComponent.class, LightRenderingSystem.class);
}
}