/*
* Copyright (C) 2014-2016 Helix Engine Developers
* (http://github.com/fauu/HelixEngine)
*
* This software is licensed under the GNU General Public License
* (version 3 or later). See the COPYING file in this distribution.
*
* You should have received a copy of the GNU Library General Public License
* along with this software. If not, see <http://www.gnu.org/licenses/>.
*
* Authored by: Piotr Grabowski <fau999@gmail.com>
*/
package com.github.fauu.helix.editor.system;
import com.artemis.Aspect;
import com.artemis.ComponentMapper;
import com.artemis.Entity;
import com.artemis.annotations.Wire;
import com.artemis.managers.TagManager;
import com.artemis.systems.EntityProcessingSystem;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.Input;
import com.badlogic.gdx.assets.AssetManager;
import com.badlogic.gdx.graphics.g2d.TextureAtlas;
import com.github.fauu.helix.TilePermission;
import com.github.fauu.helix.component.DimensionsComponent;
import com.github.fauu.helix.component.DisplayableComponent;
import com.github.fauu.helix.component.TilesComponent;
import com.github.fauu.helix.component.VisibilityComponent;
import com.github.fauu.helix.datum.Tile;
import com.github.fauu.helix.datum.TileAreaPassage;
import com.github.fauu.helix.editor.HelixEditor;
import com.github.fauu.helix.editor.displayable.TilePermissionsGridDisplayable;
import com.github.fauu.helix.editor.event.AreaLoadedEvent;
import com.github.fauu.helix.editor.event.AreaUnloadedEvent;
import com.github.fauu.helix.manager.AreaManager;
import com.github.fauu.helix.util.IntVector2;
import com.google.common.eventbus.Subscribe;
import java.util.HashMap;
public class TilePermissionsEditingSystem extends EntityProcessingSystem {
private static final String atlasPath = "texture-atlas/tile-permissions.atlas";
@Wire
private AreaManager areaManager;
@Wire
private TagManager tagManager;
@Wire
private ComponentMapper<DimensionsComponent> dimensionsMapper;
@Wire
private ComponentMapper<DisplayableComponent> displayableMapper;
@Wire
private ComponentMapper<TilesComponent> tilesMapper;
@Wire
private TileHighlightingSystem tileHighlightingSystem;
@Wire
private AssetManager assetManager;
private Tile highlightedTile;
private Tile lastUpdatedTile;
private boolean running;
@SuppressWarnings("unchecked")
public TilePermissionsEditingSystem() {
super(Aspect.getAspectForAll(TilesComponent.class));
}
@Override
protected void initialize() {
HelixEditor.getInstance().getWorldEventBus().register(this);
areaManager = world.getManager(AreaManager.class);
tagManager = world.getManager(TagManager.class);
assetManager.load(atlasPath, TextureAtlas.class);
assetManager.finishLoading();
}
private void createGrid() {
Entity area = areaManager.getArea();
Entity grid = world.createEntity()
.edit()
.add(new DimensionsComponent(dimensionsMapper.get(area).get()))
.add(new DisplayableComponent(
new TilePermissionsGridDisplayable(
tilesMapper.get(area).get(),
assetManager.get(atlasPath, TextureAtlas.class))))
.add(new VisibilityComponent())
.getEntity();
tagManager.register("tilePermissionsGrid", grid);
}
@Override
protected void process(Entity e) {
Tile highlightedTile = tileHighlightingSystem.getHighlightedTile();
if (highlightedTile != this.highlightedTile) {
this.highlightedTile = highlightedTile;
}
if (lastUpdatedTile != highlightedTile &&
highlightedTile != null &&
Gdx.input.isButtonPressed(Input.Buttons.LEFT)) {
Entity area = areaManager.getArea();
Tile[][] tiles = tilesMapper.get(area).get();
for (int y = 0; y < tiles.length; y++) {
for (int x = 0; x < tiles[y].length; x++) {
Tile tile = tiles[y][x];
if (tile == highlightedTile) {
HelixEditor editor = HelixEditor.getInstance();
TilePermission selectedTilePermission
= editor.getTilePermissionListState().getSelected();
tile.setPermissions(selectedTilePermission);
if (selectedTilePermission == TilePermission.PASSAGE) {
String selectedAreaName
= editor.getTilePassageAreaListState().getSelected();
IntVector2 targetPosition
= editor.getTilePassageTargetPositionFieldState()
.getPosition();
tile.setAreaPassage(
new TileAreaPassage(selectedAreaName, targetPosition));
}
HashMap<Integer, Tile> updatedTilesWithIndex = new HashMap<>();
updatedTilesWithIndex.put(x + y * tiles.length, tile);
Entity grid = tagManager.getEntity("tilePermissionsGrid");
TilePermissionsGridDisplayable gridDisplayable
= (TilePermissionsGridDisplayable)
displayableMapper.get(grid).get();
gridDisplayable.updateTiles(updatedTilesWithIndex);
lastUpdatedTile = tile;
break;
}
}
}
}
}
@Override
public boolean checkProcessing() {
return running;
}
@Subscribe
public void areaLodaded(AreaLoadedEvent e) {
createGrid();
running = true;
}
@Subscribe
public void areaUnloaded(AreaUnloadedEvent e) {
running = false;
tagManager.getEntity("tilePermissionsGrid").deleteFromWorld();
}
}