package com.spbsu.crawl.bl.crawlSystemView;
import com.spbsu.crawl.bl.events.*;
import com.spbsu.crawl.bl.map.PositionManager;
import com.spbsu.crawl.data.impl.PlayerInfoMessage;
import com.spbsu.crawl.data.impl.UpdateMapCellMessage;
import com.spbsu.crawl.data.impl.UpdateMapMessage;
import com.spbsu.crawl.data.impl.system.EmptyFieldsDefault;
import java.util.List;
/**
* Created by noxoomo on 14/07/16.
*/
//TODO: all diffs can be done via reflections, but needs rework
public class SystemView implements Subscribable<SystemViewListener> {
private final PositionManager positionManager = new PositionManager();
private final HeroView heroView = new HeroView();
private final MapView mapView = new MapView(positionManager);
private final PlayerActionView playerActionView = new PlayerActionView();
private final InventoryView inventoryView = new InventoryView();
private final StatusView statusView = new StatusView();
private final MobsView mobsView = new MobsView(positionManager);
private Updater updater = new Updater();
public HeroView heroView() {
return heroView;
}
public MapView mapView() {
return mapView;
}
public PlayerActionView playerActionView() {
return playerActionView;
}
public StatusView statusView() {
return statusView;
}
public InventoryView inventoryView() {
return inventoryView;
}
public Updater updater() {
return updater;
}
public class Updater {
private PlayerInfoMessage lastPlayerMessage;
public void message(final PlayerInfoMessage playerMessage) {
//for map info
this.lastPlayerMessage = playerMessage;
//status
if (EmptyFieldsDefault.notEmpty(playerMessage.statuses())) {
statusView().updater().updateStatus(playerMessage.statuses());
}
//items
if (EmptyFieldsDefault.notEmpty(playerMessage.items())) {
playerMessage.items().forEach((id, value) -> inventoryView().updater().item(Integer.valueOf(id), value));
}
//player
heroView.updater().message(playerMessage);
}
public void message(final UpdateMapMessage message) {
final List<UpdateMapCellMessage> cells = message.getCells();
for (int i = 1; i < cells.size(); ++i) {
if (EmptyFieldsDefault.isEmpty(cells.get(i).x())) {
cells.get(i).setPoint(cells.get(i - 1).x() + 1, cells.get(i - 1).y());
}
}
updateMap(message);
}
private void clear() {
positionManager.clear();
;
mapView.updater().clear();
mobsView.updater().clear();
}
private void updateMap(final UpdateMapMessage mapMessage) {
if (mapMessage.isForceFullRedraw()) {
if (EmptyFieldsDefault.notEmpty(lastPlayerMessage.depth())) {
mapView.updater().updateLevel(lastPlayerMessage.depth());
}
clear();
}
mapView.updater().update(mapMessage.getCells());
mobsView.updater().update(mapMessage.getCells());
}
}
public void subscribe(final SystemViewListener listener) {
if (listener instanceof MapListener) {
mapView().subscribe((MapListener) listener);
}
if (listener instanceof HeroListener) {
heroView().subscribe((HeroListener) listener);
}
if (listener instanceof PlayerActionListener) {
playerActionView().subscribe((PlayerActionListener) listener);
}
if (listener instanceof InventoryListener) {
inventoryView().subscribe((InventoryListener) listener);
}
if (listener instanceof StatusListener) {
statusView().subscribe((StatusListener) listener);
}
}
}