package game;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.math.Vector2;
import game.gameplay.Character;
import game.gameplay.City;
import game.gameplay.Player;
import gui.Room;
import gui.screens.GameScreen;
import gui.screens.MapScreen;
import networks.InternetProviderNetwork;
import networks.Network;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
public class GamePlay {
private static final float ROOM_UPDATE_SPEED = 1;
private static final float CHARACTERMAP_UPDATE_SPEED = 3;
private static final float CHARACTER_UPDATE_SPEED = 1;
private final Internet internet;
private Player player;
private final GameScreen gameScreen;
private final HashMap<String, Character> characterMap;
private final HashMap<String, City> cityMap;
private Thread updateThread;
private boolean active;
public GamePlay(GameScreen screen, String name) {
this.gameScreen = screen;
cityMap = new HashMap<String, City>();
characterMap = new HashMap<String, Character>();
makeCities(1f, 4000);
makeCities(.4f, 6000);
makeCities(.2f, 8000);
internet = new Internet(cityMap);
makeCompanies();
makeAgencies();
makeHackers();
makePlayer(name);
startUpdateThread();
}
private void makeCompanies() {
}
private void makeAgencies() {
}
private void makeHackers() {
}
private void makePlayer(String name) {
List<City> citiesSuffled = new ArrayList<City>(cityMap.values());
Collections.shuffle(citiesSuffled);
City playerCity = null;
for (City c : citiesSuffled) {
playerCity = c;
for (Network n : playerCity.getNetworks().values()) {
if (n instanceof InternetProviderNetwork) {
break;
}
}
}
player = new Player(name, playerCity);
Room room = new Room(player, this, Room.RoomMap.room1);
gameScreen.setRoom(room);
gameScreen.setPlayer(player);
}
private void startUpdateThread() {
active = true;
updateThread = new Thread(new Runnable() {
public float timer = 0;
public long lastTime;
@Override
public void run() {
lastTime = System.currentTimeMillis();
updateCharacterMap();
while (active) {
try {
Thread.sleep(50);
} catch (InterruptedException e) {
Gdx.app.error("GamePlay Thread", "Insomnia", e);
e.printStackTrace();
}
float deltaTime = (System.currentTimeMillis() - lastTime) / 1000.0f;
timer += deltaTime;
if (timer % CHARACTERMAP_UPDATE_SPEED <= deltaTime) {
updateCharacterMap();
}
if (timer % CHARACTER_UPDATE_SPEED <= deltaTime) {
updateCharacters();
}
lastTime = System.currentTimeMillis();
}
}
});
updateThread.start();
}
private void updateCharacters() {
for (Character c : characterMap.values()) {
c.update();
}
}
private void updateCharacterMap() {
characterMap.clear();
for (Network n : internet.getNetworkMap().values()) {
Character c = n.getOwner();
characterMap.put(c.getName(), c);
}
}
private void makeCities(float minDensity, int minDist) {
float w = City.width / 2;
float h = City.height / 2;
int density = 500; // how close together to pick the possible city generation points (this should be smaller than the map density)
for (int y = 0; y < density; y++) {
l:
for (int x = 0; x < density; x++) { // maybe use separate threads to get the values and set them to arrays. e.g. float[250][5000] ten times
final Vector2 pos = new Vector2();
pos.x = (x - density / 2) * (MapScreen.NOISE_DISPLAY_SIZE - 5000) / density + w;
pos.y = (y - density / 2) * (MapScreen.NOISE_DISPLAY_SIZE - 5000) / density + h;
float f = (float) Noise.DENSITY.getValue(pos.x, 0, pos.y);
if (f < minDensity) {
continue;
}
for (City c : cityMap.values()) {
if (c.getPosition().dst(pos) < minDist) {
continue l;
}
}
final City city = new City(pos);
cityMap.put(city.getName(), city);
}
Gdx.app.debug("Generating Cities", (float) y / density * 100 + "% done");
}
}
public void dispose() {
active = false;
}
public HashMap<String, City> getCityMap() {
return cityMap;
}
public Internet getInternet() {
return internet;
}
public Player getPlayer() {
return player;
}
public HashMap<String, Character> getCharacterMap() {
return characterMap;
}
public GameScreen getGameScreen() {
return gameScreen;
}
}