/* * Copyright (c) 2012. HappyDroids LLC, All rights reserved. */ package com.happydroids.droidtowers.gamestate.actions; import com.google.common.eventbus.Subscribe; import com.happydroids.droidtowers.entities.*; import com.happydroids.droidtowers.events.GridObjectEvent; import com.happydroids.droidtowers.grid.GameGrid; import com.happydroids.droidtowers.grid.GridPosition; import com.happydroids.droidtowers.math.GridPoint; import com.happydroids.droidtowers.types.ProviderType; import java.util.List; public class TransportCalculator extends GameGridAction { private static final String TAG = TransportCalculator.class.getSimpleName(); private final Class transportClasses[] = {Elevator.class, Stair.class, ParkingGarageRamp.class, ParkingGarageSpace.class}; public TransportCalculator(GameGrid gameGrid, float frequency) { super(gameGrid, frequency, false); gameGrid.events().register(this); } @Override public void run() { GridPosition[][] positions = gameGrid.positionCache().getPositions(); for (int i = 0, positionsLength = positions.length; i < positionsLength; i++) { GridPosition[] gridPositions = positions[i]; for (GridPosition gridPosition : gridPositions) { gridPosition.connectedToTransit = false; gridPosition.distanceFromTransit = 0f; } } for (GridObject gridObject : gameGrid.getObjects()) { gridObject.setConnectedToTransport(gridObject.provides(ProviderType.LOBBY)); } for (GridObject transport : gameGrid.getInstancesOf(transportClasses)) { if (!transport.isPlaced()) { continue; } List<GridPoint> gridPointsTouched = transport.getGridPointsTouched(); for (int i1 = 0, gridPointsTouchedSize = gridPointsTouched.size(); i1 < gridPointsTouchedSize; i1++) { GridPoint gridPoint = gridPointsTouched.get(i1); int x = gridPoint.x; int y = gridPoint.y; GridPosition gridPosition = gameGrid.positionCache().getPosition(x, y); if (gridPosition != null) { gridPosition.connectedToTransit = !(transport instanceof Elevator) || ((Elevator) transport).servicesFloor(gridPosition.y); if (gridPosition.connectedToTransit) { scanForRooms(x, y, -1, gridPosition.x); scanForRooms(x, y, 1, gridPosition.x); } } } } gameGrid.positionCache().normalizeTransitDistances(); } @Subscribe public void update(GridObjectEvent event) { if (isPaused()) { return; } reset(); } private void scanForRooms(int x, int y, int stepX, int transitX) { GridPosition gridPosition = gameGrid.positionCache().getPosition(x, y); while (gridPosition != null && gridPosition.size() > 0) { gridPosition.connectedToTransit = true; gridPosition.distanceFromTransit = Math.abs(x - transitX); for (GridObject gridObject : gridPosition.getObjects()) { if (gridObject instanceof Room) { Room room = (Room) gridObject; room.setConnectedToTransport(true); } } x += stepX; gridPosition = gameGrid.positionCache().getPosition(x, y); } } @Override public void pause() { super.pause(); gameGrid.events().unregister(this); } @Override public void unpause() { super.unpause(); gameGrid.events().register(this); } }