package nl.tudelft.bw4t.server.controller;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import eis.iilang.EnvironmentState;
import nl.tudelft.bw4t.map.BlockColor;
import nl.tudelft.bw4t.map.Path;
import nl.tudelft.bw4t.map.Zone;
import nl.tudelft.bw4t.map.renderer.AbstractMapController;
import nl.tudelft.bw4t.map.renderer.MapController;
import nl.tudelft.bw4t.map.renderer.MapRendererInterface;
import nl.tudelft.bw4t.map.view.ViewBlock;
import nl.tudelft.bw4t.map.view.ViewEPartner;
import nl.tudelft.bw4t.map.view.ViewEntity;
import nl.tudelft.bw4t.server.environment.BW4TEnvironment;
import nl.tudelft.bw4t.server.model.BW4TServerMap;
import nl.tudelft.bw4t.server.model.blocks.Block;
import nl.tudelft.bw4t.server.model.epartners.EPartner;
import nl.tudelft.bw4t.server.model.robots.handicap.IRobot;
import nl.tudelft.bw4t.server.model.zone.DropZone;
import nl.tudelft.bw4t.server.model.zone.Room;
import repast.simphony.space.Dimensions;
import repast.simphony.util.collections.IndexedIterable;
/**
* the {@link MapController} used by the server.
*/
public class ServerMapController extends AbstractMapController {
/**
* the repast context containing block and entities.
*/
private final BW4TServerMap serverMap;
/**
* make sure we focus on the map once we started the application.
*/
private boolean haveRequestedFocusAlready = false;
/**
* Instantiate the MapController with the given server map used.
*
* @param serverMap
* the server map containing the context and map
*/
public ServerMapController(BW4TServerMap serverMap) {
super(serverMap.getMap());
this.serverMap = serverMap;
getRenderSettings().setRenderEntityName(true);
Dimensions size = serverMap.getContinuousSpace().getDimensions();
getRenderSettings().setWorldDimensions((int) size.getWidth(),
(int) size.getHeight());
}
@Override
public List<BlockColor> getSequence() {
Set<DropZone> dropZone = serverMap
.getObjectsFromContext(DropZone.class);
if (dropZone.size() <= 0) {
return new ArrayList<>(0);
}
return dropZone.iterator().next().getSequence();
}
@Override
public int getSequenceIndex() {
Set<DropZone> dropZone = serverMap
.getObjectsFromContext(DropZone.class);
if (dropZone.size() <= 0) {
return 0;
}
return dropZone.iterator().next().getSequenceIndex();
}
@Override
public boolean isOccupied(Zone room) {
for (Object roomObj : serverMap.getContext().getObjects(Room.class)) {
Room sroom = (Room) roomObj;
if (sroom.getName().equals(room.getName())) {
return sroom.getOccupier() != null;
}
}
return false;
}
@Override
public Set<ViewBlock> getVisibleBlocks() {
IndexedIterable<Object> objects = serverMap.getContext().getObjects(Block.class);
Set<ViewBlock> blocks = new HashSet<>(objects.size());
for (Object block : objects) {
blocks.add(((Block) block).getView());
}
return blocks;
}
@Override
public void addVisibleBlock(ViewBlock b) {
throw new UnsupportedOperationException();
}
@Override
public Set<ViewEntity> getVisibleEntities() {
Set<ViewEntity> entities = new HashSet<>();
for (Object robot : serverMap.getContext().getObjects(IRobot.class)) {
IRobot robotTemp = (IRobot) robot;
if (robotTemp.isConnected()) {
entities.add(robotTemp.getView());
}
}
return entities;
}
@Override
public Set<ViewEPartner> getVisibleEPartners() {
IndexedIterable<Object> objects = serverMap.getContext().getObjects(EPartner.class);
Set<ViewEPartner> epartners = new HashSet<>(objects.size());
for (Object epartner : objects) {
EPartner epartnerTemp = (EPartner) epartner;
epartners.add(epartnerTemp.getView());
}
return epartners;
}
@Override
protected void updateRenderer(MapRendererInterface mri) {
if (BW4TEnvironment.getInstance().getState()
.equals(EnvironmentState.RUNNING)
&& !haveRequestedFocusAlready) {
mri.requestFocus();
haveRequestedFocusAlready = true;
}
mri.validate();
mri.repaint();
}
@Override
public Set<Path> getPaths() {
IndexedIterable<Object> objects = serverMap.getContext().getObjects(Path.class);
Set<Path> paths = new HashSet<>(objects.size());
for (Object pathTemp : objects) {
Path path = (Path) pathTemp;
paths.add(path);
}
return paths;
}
}