@Override
	public void paint(Graphics g) {
		super.paint(g);
		Graphics2D g2d = (Graphics2D) g.create();
		g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);

		// White background
		g2d.setColor(Color.white);
		g2d.fillRect(0, 0, getWidth(), getHeight());

		// Draw Streets
		g2d.setColor(Color.black);
		g2d.setStroke(new BasicStroke(2, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND));
		for(Street s : streets)
			g2d.drawLine(s.startX(), s.startY(), s.endX(), s.endY());

		// Draw cities and tanks
		g2d.setStroke(new BasicStroke(0.01f));
		for(City c : cities){
			g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
			g2d.setColor(Color.darkGray);
			g2d.fillOval(c.x - cOff, c.y - cOff, cW, cW);

			Tank tank;
			if((tank = c.getTank()) != null){

				// Dont want to anti alias these drawings
				g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_OFF);

				// Tank position centred
				int tX = c.x + tXOff;
				int tY = c.y + tYOff;

				// Draw tank outline
				g2d.setColor(Color.black);
				for(int i = 0; i < tankOutX.length; i++)
					g2d.drawLine(tX + tankOutX[i], tY + tankOutY[i], tX + tankOutX[i], tY + tankOutY[i]);

				// Tank fill colour
				if(tank.friendly()) g2d.setColor(Color.green);
				else g2d.setColor(Color.red);

				// Highlight selected tank
				if(selectedTankCity != null && selectedTankCity.equals(c))
					g2d.setColor(g2d.getColor().darker().darker());

				// Draw tank fill
				for(int i = 0; i < tankInX.length; i++)
					g2d.drawLine(tankInX[i] + tX, tankInY[i] + tY, tankInX[i] + tX, tankInY[i] + tY);
			}

		}

		if(hoverShape != null){
			g2d.setColor(hoverFill);
			g2d.fill(hoverShape);
			g2d.setColor(hoverOutline);
			g2d.draw(hoverShape);
		}
	}