/* * Copyright (c) 2012. HappyDroids LLC, All rights reserved. */ package com.happydroids.droidtowers.gamestate.actions; import com.badlogic.gdx.utils.Array; import com.google.common.eventbus.Subscribe; import com.happydroids.droidtowers.entities.GridObject; import com.happydroids.droidtowers.entities.ServiceRoom; 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 java.util.List; import static com.happydroids.droidtowers.types.ProviderType.ELEVATOR; import static com.happydroids.droidtowers.types.ProviderType.SECURITY; public class CrimeCalculator extends GameGridAction { private static final String TAG = CrimeCalculator.class.getSimpleName(); public CrimeCalculator(GameGrid gameGrid, float frequency) { super(gameGrid, frequency, false); gameGrid.events().register(this); } @Subscribe public void update(GridObjectEvent event) { if (isPaused()) { return; } reset(); } @Override public void run() { for (GridPosition[] gridPositions : gameGrid.positionCache().getPositions()) { for (GridPosition gridPosition : gridPositions) { gridPosition.connectedToSecurity = false; gridPosition.distanceFromSecurity = 0f; gridPosition.normalizedDistanceFromSecurity = 0f; } } Array<GridObject> objects = gameGrid.getObjects(); for (int i = 0, objectsSize = objects.size; i < objectsSize; i++) { GridObject gridObject = objects.get(i); gridObject.setConnectedToSecurity(gridObject.provides(SECURITY, ELEVATOR)); } Array<GridObject> instancesOf = gameGrid.getInstancesOf(ServiceRoom.class); for (GridObject serviceRoom : instancesOf) { if (!serviceRoom.isPlaced()) { continue; } List<GridPoint> gridPointsTouched = serviceRoom.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.connectedToSecurity = true; scanForRooms(x, y, -1, gridPosition.x); scanForRooms(x, y, 1, gridPosition.x); } } } gameGrid.positionCache().normalizeSecurityDistances(); } private void scanForRooms(int x, int y, int stepX, int parentPosX) { GridPosition gridPosition = gameGrid.positionCache().getPosition(x, y); while (gridPosition != null && gridPosition.size() > 0) { gridPosition.connectedToSecurity = true; gridPosition.distanceFromSecurity = Math.abs(x - parentPosX); for (GridObject gridObject : gridPosition.getObjects()) { gridObject.setConnectedToSecurity(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); } }