package com.tacoid.superflu.entities;
import java.util.Random;
public class Ville implements Entity {
protected Zone zone;
protected String nom;
protected int x;
protected int y;
private int habitantsSains;
private int habitantsInfectes;
private int habitantsImmunises;
private int habitantsMorts;
private int stockVaccins = 0;
private int stockVaccinsMax = 500000;
private int stockTraitements = 0;
private int stockTraitementsMax = 100000;
public Ville(Zone zone, String nom, int x, int y) {
Random r = new Random();
this.zone = zone;
this.nom = nom;
this.x = x;
this.y = y;
this.habitantsSains = 200000 + r.nextInt(300000);
this.habitantsInfectes = 0;
this.habitantsImmunises = 0;
this.habitantsMorts = 0;
}
public static int distance_carre_sens1(Ville depart, Ville arrivee) {
return (arrivee.x - depart.x) * (arrivee.x - depart.x)
+ (arrivee.y - depart.y) * (arrivee.y - depart.y);
}
public static int distance_carre_sens2(Ville depart, Ville arrivee) {
int depart_x, arrivee_x;
if (depart.getX() < arrivee.getX()) {
depart_x = depart.getX() + 1024;
arrivee_x = arrivee.getX();
} else {
depart_x = depart.getX();
arrivee_x = arrivee.getX() + 1024;
}
return (arrivee_x - depart_x) * (arrivee_x - depart_x)
+ (arrivee.y - depart.y) * (arrivee.y - depart.y);
}
public static int distance_carre(Ville depart, Ville arrivee) {
int d1 = distance_carre_sens1(depart, arrivee);
int d2 = distance_carre_sens2(depart, arrivee);
return Math.min(d1, d2);
}
public void ajouteStockVaccin(int quantite) {
stockVaccins += quantite;
if (stockVaccins > stockVaccinsMax) {
stockVaccins = stockVaccinsMax;
}
}
public void ajouteStockTraitement(int quantite) {
stockTraitements += quantite;
if (stockTraitements > stockTraitementsMax) {
stockTraitements = stockTraitementsMax;
}
}
public void retireStockVaccin(int quantite) {
stockVaccins -= quantite;
if (stockVaccins < 0) {
stockVaccins = 0;
}
}
public void retireStockTraitement(int quantite) {
stockTraitements -= quantite;
if (stockTraitements < 0) {
stockTraitements = 0;
}
}
public String getNom() {
return nom;
}
public int getHabitants() {
return habitantsSains + habitantsImmunises + habitantsInfectes;
}
public int getHabitantsSains() {
return habitantsSains;
}
public int getHabitantsImmunises() {
return habitantsImmunises;
}
public int getHabitantsInfectes() {
return habitantsInfectes;
}
public int getHabitantsMorts() {
return habitantsMorts;
}
public void ajouteHabitantsInfectes(int habitantsInfectes) {
this.habitantsInfectes += habitantsInfectes;
}
public void ajouteHabitantsImmunises(int habitantsImmunises) {
this.habitantsImmunises += habitantsImmunises;
}
public void ajouteHabitantsSains(int habitantsSains) {
this.habitantsSains += habitantsSains;
}
public void retireHabitantsInfectes(int habitantsInfectes) {
this.habitantsInfectes -= habitantsInfectes;
}
public void retireHabitantsImmunises(int habitantsImmunises) {
this.habitantsImmunises -= habitantsImmunises;
}
public void retireHabitantsSains(int habitantsSains) {
this.habitantsSains -= habitantsSains;
}
public int getPourcentageInfectes() {
return (int) (100 * ((double) habitantsInfectes / getHabitants()));
}
public boolean isMine(Joueur joueur) {
boolean bool = false;
if (joueur != null) {
for (Zone z : joueur.getZones()) {
if (zone.getId() == z.getId()) {
bool = true;
break;
}
}
}
return bool;
}
/**
* Mise à jour des données de la ville.
*/
public void update(int delta) {
double transmission = 0.025;
double perteImmunite = 0.00001;
double mortalite = 0.000005;
this.stockVaccins = (int) Math.round(this.stockVaccins * Math.pow(0.995, Math.floor(delta / 10000.0f)));
this.stockTraitements = (int) Math.round(this.stockTraitements * Math.pow(0.997, Math.floor(delta / 10000.0f)));
if (getHabitants() > 0) {
// Infection :
if (habitantsInfectes > 0) {
double nouveauxHabitantsInfectes = (habitantsInfectes * transmission * ((double) habitantsSains / getHabitants())) * delta/1000.0f;
if (nouveauxHabitantsInfectes >= 1) {
habitantsSains -= nouveauxHabitantsInfectes;
habitantsInfectes += nouveauxHabitantsInfectes;
} else {
if (Math.random() < nouveauxHabitantsInfectes) {
habitantsSains -= 1;
habitantsInfectes += 1;
}
}
}
// Utilisation des traitements :
if (this.stockTraitements > 0) {
int nouveauxHabitantsImmunises = Math.min(this.habitantsInfectes, this.stockTraitements);
this.stockTraitements -= nouveauxHabitantsImmunises;
this.habitantsInfectes -= nouveauxHabitantsImmunises;
this.habitantsImmunises += nouveauxHabitantsImmunises;
}
// Perte immunité :
if (this.habitantsImmunises > 0) {
double perte = habitantsImmunises * perteImmunite * delta;
if (perte >= 1) {
this.habitantsImmunises -= perte;
this.habitantsSains += perte;
} else {
if (Math.random() < perte) {
habitantsSains -= 1;
habitantsInfectes += 1;
}
}
}
// Utilisation des vaccins (sur les personnes saines) :
if (this.stockVaccins > 0) {
int nouveauxHabitantsImmunises = Math.min(this.habitantsSains, this.stockVaccins);
this.stockVaccins -= nouveauxHabitantsImmunises;
this.habitantsSains -= nouveauxHabitantsImmunises;
this.habitantsImmunises += nouveauxHabitantsImmunises;
}
// Mortalité :
if (this.habitantsInfectes > 0) {
double nouveauxHabitantsMorts = habitantsInfectes * mortalite * delta;
if (nouveauxHabitantsMorts >= 1) {
habitantsInfectes -= nouveauxHabitantsMorts;
habitantsMorts += nouveauxHabitantsMorts;
} else {
if (Math.random() < nouveauxHabitantsMorts) {
habitantsInfectes -= 1;
habitantsMorts += 1;
}
}
}
}
}
public int getX() {
return x;
}
public int getY() {
return y;
}
public int getStockVaccins() {
return stockVaccins;
}
public int getStockVaccinsMax() {
return stockVaccinsMax;
}
public int getStockTraitements() {
return stockTraitements;
}
public int getStockTraitementsMax() {
return stockTraitementsMax;
}
public Zone getZone() {
return zone;
}
@Override
public String toString() {
return nom + ":\n" + "-Sains = " + this.habitantsSains + "\n"
+ "-Malades =" + this.habitantsInfectes + "\n" + "-Morts = "
+ this.habitantsMorts + "\n";
}
public boolean isUsine() {
return false;
}
}