215 lines
7.7 KiB
Java
215 lines
7.7 KiB
Java
package Server;
|
|
|
|
import Server.Cards.BuildingCard;
|
|
import Server.Cards.CharacterCard;
|
|
import Server.Cards.CharacterType;
|
|
import Server.Cards.Trigger;
|
|
import Server.Utils.EventsManagerException;
|
|
|
|
|
|
import java.util.ArrayList;
|
|
import java.util.Arrays;
|
|
import java.util.List;
|
|
|
|
public class BuildingManager {
|
|
private static List<BuildingCard> activeBuildings;
|
|
|
|
public BuildingManager() {
|
|
activeBuildings = new ArrayList<>();
|
|
}
|
|
|
|
public void addActiveBuilding (BuildingCard buildingCard, Player player) {
|
|
buildingCard.setOwner(player);
|
|
activeBuildings.add(buildingCard);
|
|
}
|
|
|
|
public static BuildingCard playerHasBuilding(Player player, Trigger trigger) {
|
|
|
|
for (BuildingCard buildingCard : activeBuildings) {
|
|
if(buildingCard.getAbilityTrigger() == trigger && buildingCard.getOwner() == player) {
|
|
return buildingCard;
|
|
}
|
|
}
|
|
return null;
|
|
}
|
|
|
|
public static int numberOfTargets(Player player, List<BuildingCard> buildingCards) {
|
|
int numCard = 0;
|
|
for (BuildingCard buildingCard : buildingCards) {
|
|
|
|
List<CharacterCard> playerCharacters = player.getPlayerTribe().getCharacters();
|
|
|
|
for (CharacterCard card : playerCharacters) {
|
|
if (card.getCharacterType() == buildingCard.getEffectTarget()) {
|
|
numCard++;
|
|
}
|
|
}
|
|
}
|
|
return numCard;
|
|
}
|
|
|
|
public static List<BuildingCard> playerHasVariousBuildings(Player player, Trigger trigger) {
|
|
|
|
List<BuildingCard> buildingCards = new ArrayList<>();
|
|
|
|
for (BuildingCard buildingCard : activeBuildings) {
|
|
if(buildingCard.getAbilityTrigger() == trigger && buildingCard.getOwner() == player) {
|
|
buildingCards.add(buildingCard);
|
|
}
|
|
}
|
|
return buildingCards;
|
|
}
|
|
|
|
//When a player draw a characterCard, if said card complete a set of 6
|
|
//different character type, give the player 6 food
|
|
|
|
public static void foodForSix(Player player, CharacterCard characterCard) {
|
|
if(playerHasBuilding(player, Trigger.FOOD_FOR_SIX) == null){
|
|
return;
|
|
}
|
|
|
|
List<CharacterCard> playerTribe = player.getPlayerTribe().getCharacters();
|
|
int [] preDraw = new int[CharacterType.values().length];
|
|
int [] postDraw = new int[CharacterType.values().length];
|
|
|
|
for(CharacterCard card: playerTribe){
|
|
preDraw[card.getCharacterType().ordinal()]++;
|
|
postDraw[card.getCharacterType().ordinal()]++;
|
|
}
|
|
|
|
postDraw[characterCard.getCharacterType().ordinal()]++;
|
|
|
|
int minPre = Arrays.stream(preDraw).min().getAsInt();
|
|
int minPost = Arrays.stream(postDraw).min().getAsInt();
|
|
|
|
if(minPre < minPost){
|
|
player.addFood(6);
|
|
}
|
|
|
|
}
|
|
|
|
//the method return the discount received for the player based on the cards he owns
|
|
//the card providing the discount are indicated on the BuildingCard
|
|
public static int sustainDiscount(Player player) {
|
|
List<BuildingCard> buildingCards = playerHasVariousBuildings(player, Trigger.SUSTAIN_DISCOUNT);
|
|
if(buildingCards.isEmpty()){
|
|
return 0;
|
|
}
|
|
return numberOfTargets(player, buildingCards);
|
|
}
|
|
|
|
//if the player is going to lose during the shamanicRitual, the loss are nullif
|
|
public static boolean shamanNoLoss(Player player) {
|
|
return playerHasBuilding(player, Trigger.SHAMAN_NO_LOSS) != null;
|
|
}
|
|
|
|
//check if the player has a SHAMAN_DOUBLE_POINTS card
|
|
public static boolean shamanDoublePoints(Player player) {
|
|
return playerHasBuilding(player, Trigger.SHAMAN_DOUBLE_POINTS) != null;
|
|
}
|
|
|
|
//if the player has a BONUS_END_TURN buildingCard the player gain additional food
|
|
//after placing his totem on a tile whit food
|
|
public static int bonusEndTurn(Player player, int positionReward) {
|
|
if (playerHasBuilding(player, Trigger.BONUS_FOOD_ENDTURN) == null) return -1;
|
|
|
|
if (positionReward >= 1){
|
|
player.addFood(1);
|
|
return 1;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
//if the player has a BuildingCard whit FOOD_PER_INVENTORS, and he
|
|
//draws a copy of an inventor that is already in his tribe he gains 3 food
|
|
public static void foodPerInventors(Player player, CharacterCard characterCard) {
|
|
if(playerHasBuilding(player, Trigger.FOOD_PER_INVENTORS) == null){
|
|
return;
|
|
}
|
|
|
|
if(characterCard.getCharacterType()!= CharacterType.INVENTOR){
|
|
throw new EventsManagerException("Invalid character type");
|
|
}
|
|
|
|
List<CharacterCard> playerTribe = player.getPlayerTribe().getCharacters();
|
|
int numberOfInventors = 0;
|
|
|
|
for(CharacterCard card: playerTribe){
|
|
if(card.getIconValue() == characterCard.getIconValue() && card.getCharacterType() == CharacterType.INVENTOR){
|
|
numberOfInventors++;
|
|
}
|
|
}
|
|
|
|
if(numberOfInventors%2 == 1)
|
|
player.addFood(3);
|
|
}
|
|
|
|
//if the player has a SHAMAN_BONUS building the function return 3, else return 0
|
|
public static int shamanBonus(Player player) {
|
|
if (BuildingManager.playerHasBuilding(player, Trigger.SHAMAN_BONUS) == null) return 0;
|
|
return 3;
|
|
}
|
|
|
|
//return if HUNT_BONUS is active for the player
|
|
public static boolean hunterBonus(Player player) {
|
|
return playerHasBuilding(player, Trigger.HUNT_BONUS) != null;
|
|
}
|
|
|
|
//return if ENDGAME_BUILDER_BONUS is active for the player
|
|
public static boolean endgameBuilderBonus(Player player) {
|
|
return playerHasBuilding(player, Trigger.ENDGAME_BUILDER_BONUS) != null;
|
|
}
|
|
|
|
//return the amount of food gained if the player has a BuildingCard with
|
|
//PAINTING_FOOD_BONUS, a unit for each ARTIST in his tribe
|
|
public static void paintingFoodBonus(Player player) {
|
|
if(playerHasBuilding(player, Trigger.PAINTING_FOOD_BONUS) == null) return;
|
|
|
|
player.addFood(player.getPlayerTribe().artistsNumber());
|
|
}
|
|
|
|
//return the amount of buildingPoint if the player has a BuildingCard with
|
|
//ENDGAME_FOR_SIX, a unit for each set of 6 character of different Type
|
|
public static void endgameForSix(Player player) {
|
|
if(playerHasBuilding(player, Trigger.ENDGAME_FOR_SIX) == null) return;
|
|
|
|
List<CharacterCard> playerTribe = player.getPlayerTribe().getCharacters();
|
|
|
|
int [] typeDuplicates = new int[CharacterType.values().length];
|
|
|
|
for(CharacterCard card: playerTribe){
|
|
typeDuplicates[card.getCharacterType().ordinal()]++;
|
|
}
|
|
|
|
int minCharacterType = Arrays.stream(typeDuplicates).min().getAsInt();
|
|
|
|
player.addPrestigePoints(minCharacterType*6);
|
|
}
|
|
|
|
//add the bonus prestigePoints due to ENDGAME_BONUS_CHARACTER, the amount is based
|
|
//on the CharacterType indicated on the BuildingCards, 3 for each character of the same type
|
|
//A plater can own different BuildingCards with the same effect
|
|
public static void endgameBonusCharacter(Player player) {
|
|
List<BuildingCard> buildingCards = playerHasVariousBuildings(player, Trigger.ENDGAME_BONUS_CHARACTER);
|
|
if(buildingCards.isEmpty()){
|
|
return;
|
|
}
|
|
|
|
player.addPrestigePoints(numberOfTargets(player, buildingCards)* 3);
|
|
}
|
|
|
|
//return if EXTRA_DRAW is active for the player
|
|
public static boolean extraDraw(Player player) {
|
|
return playerHasBuilding(player, Trigger.EXTRA_DRAW) != null;
|
|
}
|
|
|
|
//return if the player has a BuildingCard with
|
|
//ENDGAME_BONUS_POINTS, then add 25 points if he has
|
|
public static void endgameBonusPoints(Player player) {
|
|
if(playerHasBuilding(player, Trigger.ENDGAME_BONUS_POINTS) == null) return;
|
|
|
|
player.addPrestigePoints(25);
|
|
}
|
|
}
|