Commit 420833b2 authored by Marc BRUN's avatar Marc BRUN
Browse files

Added comments, fixes Diplomacy issues

parent e9674a07
No preview for this file type
No preview for this file type
No preview for this file type
No preview for this file type
No preview for this file type
No preview for this file type
No preview for this file type
No preview for this file type
No preview for this file type
No preview for this file type
No preview for this file type
No preview for this file type
No preview for this file type
No preview for this file type
No preview for this file type
No preview for this file type
......@@ -2,7 +2,16 @@ import java.util.ArrayList;
import java.util.LinkedList;
import java.util.Random;
/** La base est le centre de la tribu. Elle est créée en même temps que la tribu et est détruite quand la tribu n'a plus aucun membre.
<br/>Elle crée les membres de la tribu à partir de son ADN en consommant de l'or.
<br/>Les membres sont créés à des emplacements différents selon leur type :
<br/>- les fermiers, soigneurs, marchands et guerriers prennent le premier emplacement libre aux abords de la tribu, les guerriers étant nomades par la suite
<br/>- les bûcherons et mineurs d'or sont affectés à la forêt ou mine d'or la plus proche
<br/>- les tours sont affectées aux abords de la tribu, forêt ou mine d'or selon leur type
<br/>L'ADN ne contient des améliorations en plus des ordres de création. La base se charge de les exécuter.
@author marc
*/
public class Base extends Entity {
public static int size = (int)(Tile.size * 0.8);
......@@ -17,13 +26,18 @@ public class Base extends Entity {
getTile().occupant = this;
}
/** Harmonise l'utilisation d'ADN complet (early game) ou de probabilités (late game) pour les créations et améliorations à exécuter.
<br/>Appelle build(). */
public void create(){
DNA.BuildType buildType = null;
ArrayList<Object> features = null;
// early game
if(currentDNA < DNA.length){
buildType = tribe.dna.buildOrder.get(currentDNA).buildType;
features = tribe.dna.buildOrder.get(currentDNA).features;
}
// late game : on a fini de lire l'ADN, on passe aux probabilités (seul le buildType est contruit, on a pas d'information sur les features)
// les features sont utilisées seulement par les guerriers et tours et leur impact est faible en late game
else{
double dart = rand.nextDouble();
int choice = -1;
......@@ -43,6 +57,9 @@ public class Base extends Entity {
build(buildType, features);
}
/** Crée l'individu ou effectue l'amélioration correspondant au buildType en consommant le coût en or associé.
<br/>Si la tribu n'a pas assez d'or, rien n'est fait.
<br/>Construit des features aléatoires en late game. */
public void build(DNA.BuildType buildType, ArrayList<Object> features){
double[] costs = {1, 1, 1, 2, 1, 1, 1, 3, 2, 4, 2, 2, 0};
double cost = costs[buildType.ordinal()];
......@@ -58,7 +75,10 @@ public class Base extends Entity {
break;
case Lumberjack:
if(World.nbOfForest > 0){
if(tribe.forestTargetTile == null || tribe.forestTargetTile.type != Tile.Type.Forest) tribe.forestTargetTile = nearestTile(Tile.Type.Forest);
// tribe.forestTargetTile est la forêt la plus proche de la base.
// Recalculée uniquement lorsqu'elle n'est plus valide pour économiser les calculs.
if(tribe.forestTargetTile == null || tribe.forestTargetTile.type != Tile.Type.Forest)
tribe.forestTargetTile = nearestTile(Tile.Type.Forest);
if(currentDNA >= DNA.length){
features = new ArrayList<Object>();
features.add(new Boolean(rand.nextBoolean()));
......@@ -67,11 +87,15 @@ public class Base extends Entity {
tribe.members.add(l);
tribe.lumberjacks.add(l);
}
else tribe.resources.amounts[Resources.Type.Gold.ordinal()] += cost;
else // plus aucune forêt sur la carte : le bûcheron n'est pas créé, son coût est reversé à la tribu
tribe.resources.amounts[Resources.Type.Gold.ordinal()] += cost;
break;
case GoldMiner:
if(World.nbOfGold > 0){
if(tribe.goldTargetTile == null || tribe.goldTargetTile.type != Tile.Type.Gold) tribe.goldTargetTile = nearestTile(Tile.Type.Gold);
// tribe.goldTargetTile est la mine d'or la plus proche de la base.
// Recalculée uniquement lorsqu'elle n'est plus valide pour économiser les calculs.
if(tribe.goldTargetTile == null || tribe.goldTargetTile.type != Tile.Type.Gold)
tribe.goldTargetTile = nearestTile(Tile.Type.Gold);
if(currentDNA >= DNA.length){
features = new ArrayList<Object>();
features.add(new Boolean(rand.nextBoolean()));
......@@ -80,13 +104,16 @@ public class Base extends Entity {
tribe.members.add(g);
tribe.goldMiners.add(g);
}
else tribe.resources.amounts[Resources.Type.Gold.ordinal()] += cost;
else // plus aucune mine d'or sur la carte : le mineur n'est pas créé, son coût est reversé à la tribu
tribe.resources.amounts[Resources.Type.Gold.ordinal()] += cost;
break;
case Healer:
Healer h = new Healer(getNearestFreeTile(), tribe);
tribe.members.add(h);
tribe.healers.add(h);
break;
// Les améliorations économiques permettent aux tribus de créer des unités non productrices.
// Sans elles, le ratio production/consommation serait trop faible.
case FoodImprovement:
tribe.foodProduction += 0.1;
break;
......@@ -126,29 +153,40 @@ public class Base extends Entity {
features.add(Tower.Placement.values()[rand.nextInt(Tower.Placement.values().length)]);
}
Tile placement = null;
// On place la tour aux abords de la tribu en protection des fermiers
// ou vers les forêts ou mines d'or pour protéger nos bûcherons et mineurs et empêcher les autres tribus de les amasser.
switch((Tower.Placement)features.get(2)){
case NextCreation:
placement = getNearestFreeTile();
break;
case Gold:
if(tribe.goldTargetTile == null || tribe.goldTargetTile.type != Tile.Type.Gold) tribe.goldTargetTile = nearestTile(Tile.Type.Gold);
placement = tribe.goldTargetTile;
if(World.nbOfGold == 0)
placement = getNearestFreeTile();
else {
if(tribe.goldTargetTile == null || tribe.goldTargetTile.type != Tile.Type.Gold)
tribe.goldTargetTile = nearestTile(Tile.Type.Gold);
placement = tribe.goldTargetTile;
}
break;
case Forest:
if(tribe.forestTargetTile == null || tribe.forestTargetTile.type != Tile.Type.Forest) tribe.forestTargetTile = nearestTile(Tile.Type.Forest);
placement = tribe.forestTargetTile;
if(World.nbOfForest == 0)
placement = getNearestFreeTile();
else{
if(tribe.forestTargetTile == null || tribe.forestTargetTile.type != Tile.Type.Forest)
tribe.forestTargetTile = nearestTile(Tile.Type.Forest);
placement = tribe.forestTargetTile;
}
break;
}
if(placement == null) placement = getNearestFreeTile();
Tower to = new Tower(placement, tribe, features);
tribe.members.add(to);
tribe.towers.add(to);
break;
case TowerImprovement:
tribe.towerAttack += 0.1;
tribe.towerAdditionnalHP++;
tribe.towerAttack += 0.05;
tribe.towerAdditionnalHP += 0.5;
for(Tower tow : tribe.towers){
tow.hp++;
tow.hp += 0.5;
}
break;
case Trader:
......@@ -164,8 +202,29 @@ public class Base extends Entity {
}
}
/** On cherche s'il y a une place libre à côté du dernier endroit où on a construit/placé quelqu'un
<br/>S'il y a, on construit à cette place libre. Sinon, on fait un parcours en largeur (coûteux) à partir de la base. */
public Tile getNearestFreeTile(){
if(lastBuiltTile == null){
if(lastBuiltTile != null){
double minDist = 100000;
Tile closestFreeTile = null;
for(Tile t : lastBuiltTile.getNeighbors()){
double dist = World.dist(getTile().i, getTile().j, t.i, t.j);
if(dist < minDist && t.free){
minDist = dist;
closestFreeTile = t;
}
}
if(closestFreeTile == null){
lastBuiltTile = null;
return getNearestFreeTile();
}
else{
lastBuiltTile = closestFreeTile;
return closestFreeTile;
}
}
else {
LinkedList<Tile> toCheck = new LinkedList<Tile>();
ArrayList<Tile> checked = new ArrayList<Tile>();
Tile inCheck = null;
......@@ -188,25 +247,6 @@ public class Base extends Entity {
lastBuiltTile = inCheck;
return inCheck;
}
else {
double minDist = 100000;
Tile closestFreeTile = null;
for(Tile t : lastBuiltTile.getNeighbors()){
double dist = World.dist(getTile().i, getTile().j, t.i, t.j);
if(dist < minDist && t.free){
minDist = dist;
closestFreeTile = t;
}
}
if(closestFreeTile == null){
lastBuiltTile = null;
return getNearestFreeTile();
}
else{
lastBuiltTile = closestFreeTile;
return closestFreeTile;
}
}
}
public Base getNearestEnemyBase(){
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment