package com.spbsu.crawl.bl.crawlSystemView;
import com.spbsu.crawl.bl.events.MapListener;
import com.spbsu.crawl.bl.map.Position;
import com.spbsu.crawl.bl.map.PositionManager;
import com.spbsu.crawl.bl.map.TerrainType;
import com.spbsu.crawl.data.impl.UpdateMapCellMessage;
import com.spbsu.crawl.data.impl.system.EmptyFieldsDefault;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class MapView extends Subscribable.Stub<MapListener> implements Subscribable<MapListener> {
private final PositionManager positionManager;
private Map<Position, TerrainType> layer = new HashMap<>();
private Updater updater = new Updater();
public MapView(final PositionManager positionManager) {
this.positionManager = positionManager;
}
public void observeCell(final int x, final int y,
final TerrainType type) {
final Position position = positionManager.getOrCreate(x, y);
TerrainType terrain = layer.getOrDefault(position, null);
if (terrain != type) {
layer.put(position, type);
listeners().forEach(lst -> lst.tile(position, type));
}
}
public Updater updater() {
return updater;
}
public int knownCells() {
return layer.size();
}
/**
* User: noxoomo
*/
public class Updater {
public Updater() {
}
void updateLevel(final String newLevel) {
if (EmptyFieldsDefault.notEmpty(newLevel)) {
listeners().forEach(lst -> lst.changeLevel(newLevel));
}
}
void clear() {
layer.clear();
listeners().forEach(MapListener::resetPosition);
}
private void cellHandler(final UpdateMapCellMessage cellMessage) {
observeCell(cellMessage.x(), cellMessage.y(), TerrainType.fromMessage(cellMessage));
}
void update(final List<UpdateMapCellMessage> cells) {
cells.stream()
.filter(cell -> cell.getDungeonFeatureType() != 0)
.forEach(this::cellHandler);
}
}
}