Skip to content

Commit

Permalink
Merge pull request #87 from EntelectChallenge/develop
Browse files Browse the repository at this point in the history
for release 1.1.2
  • Loading branch information
PetrusOrion committed May 31, 2018
2 parents a4bd822 + d2f134b commit 9282e81
Show file tree
Hide file tree
Showing 83 changed files with 2,817 additions and 378 deletions.
13 changes: 13 additions & 0 deletions dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
FROM openjdk:latest
ARG RELEASE=1.0.0
ENV DEBIAN_FRONTEND noninteractive
RUN wget https://github.com/EntelectChallenge/2018-TowerDefence/releases/download/${RELEASE}/starter-pack.zip -O temp.zip && \
apt-get update && apt-get install -y sudo make && \
adduser --disabled-password --gecos '' entelect && \
usermod -aG sudo entelect && \
echo '%sudo ALL=(ALL) NOPASSWD:ALL' >> /etc/sudoers && \
unzip temp.zip -d /home/entelect/ && \
rm temp.zip && \
chown -R entelect:entelect /home/entelect/starter-pack
USER entelect
WORKDIR /home/entelect/starter-pack
Original file line number Diff line number Diff line change
Expand Up @@ -14,11 +14,6 @@ public TowerDefenseGameEngine(String configLocation) {
@Override
public boolean isGameComplete(GameMap gameMap) {
TowerDefenseGameMap towerDefenseGameMap = (TowerDefenseGameMap) gameMap;
if (gameMap.getCurrentRound() > GameConfig.getMaxRounds()) {
return true;
}

return (towerDefenseGameMap.getDeadPlayers().size() > 0);
return gameMap.getCurrentRound() > GameConfig.getMaxRounds() || (towerDefenseGameMap.getDeadPlayers().size() > 0);
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,8 @@
import za.co.entelect.challenge.game.contracts.game.GamePlayer;
import za.co.entelect.challenge.game.contracts.game.GameRoundProcessor;
import za.co.entelect.challenge.game.contracts.map.GameMap;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

import java.util.ArrayList;
import java.util.Hashtable;
Expand All @@ -22,6 +24,8 @@

public class TowerDefenseRoundProcessor implements GameRoundProcessor {

private static final Logger log = LogManager.getLogger(TowerDefenseRoundProcessor.class);

private TowerDefenseGameMap towerDefenseGameMap;

@Override
Expand Down Expand Up @@ -70,21 +74,21 @@ private void processCommands(Hashtable<GamePlayer, RawCommand> commands) {
private int getBuildingGeneratedEnergyForPlayer(PlayerType player) {
return towerDefenseGameMap.getBuildings().stream()
.filter(b -> b.getPlayerType() == player && b.isConstructed())
.mapToInt(b -> b.getEnergyGeneratedPerTurn())
.mapToInt(Building::getEnergyGeneratedPerTurn)
.sum();
}

private void addResources() {
towerDefenseGameMap.getTowerDefensePlayers()
.forEach(p -> {
int energy = GameConfig.getRoundIncomeEnergy()
+ getBuildingGeneratedEnergyForPlayer(p.getPlayerType());
try {
int energy = GameConfig.getRoundIncomeEnergy()
+ getBuildingGeneratedEnergyForPlayer(p.getPlayerType());
p.addEnergy(energy);
p.addScore(energy * GameConfig.getEnergyScoreMultiplier());
} catch (Exception e) {
e.printStackTrace();
log.error(e);
}
p.addScore(energy * GameConfig.getEnergyScoreMultiplier());
});
}

Expand All @@ -103,24 +107,26 @@ private static boolean positionMatch(Cell a, Cell b) {
}

private void calculateMissileMovement() {

towerDefenseGameMap.getMissiles()
.forEach(missile -> IntStream.rangeClosed(1, missile.getSpeed()) // higher speed bullets
.forEach(i -> {
try {
towerDefenseGameMap.moveMissileSingleSpace(missile);
towerDefenseGameMap.getBuildings().stream()
.filter(b -> b.isConstructed() && positionMatch(missile, b))
.findAny()
.ifPresent(b -> {
b.damageSelf(missile);
towerDefenseGameMap.getPlayerByStream(missile.getPlayerType())
.forEach(player -> player.addScore(b.getDestroyMultiplier() * missile.getDamage()));
});
} catch (Exception e) {
e.printStackTrace();
}
})
.forEach(missile ->
IntStream.rangeClosed(1, missile.getSpeed()) // higher speed bullets
.forEach(i -> {
towerDefenseGameMap.moveMissileSingleSpace(missile);
towerDefenseGameMap.getBuildings().stream()
.filter(b -> b.isConstructed()
&& positionMatch(missile, b)
&& !b.isPlayers(missile.getPlayerType())
&& b.getHealth() > 0)
.forEach(b -> {
TowerDefensePlayer missileOwner = null;
try {
missileOwner = towerDefenseGameMap.getPlayer(missile.getPlayerType());
} catch (Exception e) {
log.error(e);
}
b.damageSelf(missile, missileOwner);
});
})
);
}

Expand Down Expand Up @@ -154,21 +160,27 @@ private void parseAndExecuteCommand(RawCommand command, GamePlayer player) {
towerDefenseGameMap.addErrorToErrorList(String.format(
"Unable to parse command entries, all parameters should be integers. Received:%s",
commandSting), towerDefensePlayer);

log.error(towerDefenseGameMap.getErrorList().get(towerDefenseGameMap.getErrorList().size() - 1));
} catch (IllegalArgumentException e) {
doNothingCommand.performCommand(towerDefenseGameMap, player);
towerDefenseGameMap.addErrorToErrorList(String.format(
"Unable to parse building type: Expected 0[Defense], 1[Attack], 2[Energy]. Received:%s",
commandLine[2]), towerDefensePlayer);

log.error(towerDefenseGameMap.getErrorList().get(towerDefenseGameMap.getErrorList().size() - 1));
} catch (InvalidCommandException e) {
doNothingCommand.performCommand(towerDefenseGameMap, player);
towerDefenseGameMap.addErrorToErrorList(
"Invalid command received: " + e.getMessage(), towerDefensePlayer);

log.error(towerDefenseGameMap.getErrorList().get(towerDefenseGameMap.getErrorList().size() - 1));
} catch (IndexOutOfBoundsException e) {
doNothingCommand.performCommand(towerDefenseGameMap, player);
towerDefenseGameMap.addErrorToErrorList(String.format(
"Out of map bounds, X:%s Y: %s", commandLine[0], commandLine[1]), towerDefensePlayer);

log.error(towerDefenseGameMap.getErrorList().get(towerDefenseGameMap.getErrorList().size() - 1));
}
}


}
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
public class GameDetails {

private int round;
private int maxRounds;
private int mapWidth;
private int mapHeight;
private int roundIncomeEnergy;
Expand All @@ -22,6 +23,7 @@ public class GameDetails {

public GameDetails(int round) {
this.round = round;
this.maxRounds = GameConfig.getMaxRounds();
this.mapWidth = GameConfig.getMapWidth();
this.mapHeight = GameConfig.getMapHeight();
this.roundIncomeEnergy = GameConfig.getRoundIncomeEnergy();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,16 @@
import org.apache.commons.lang3.StringUtils;
import za.co.entelect.challenge.config.GameConfig;
import za.co.entelect.challenge.core.entities.ThreeEntityCell;
import za.co.entelect.challenge.entities.Building;
import za.co.entelect.challenge.entities.TowerDefenseGameMap;
import za.co.entelect.challenge.entities.TowerDefensePlayer;
import za.co.entelect.challenge.enums.Direction;
import za.co.entelect.challenge.enums.PlayerType;
import za.co.entelect.challenge.game.contracts.game.GamePlayer;
import za.co.entelect.challenge.game.contracts.map.GameMap;
import za.co.entelect.challenge.game.contracts.renderer.GameMapRenderer;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

import java.util.ArrayList;
import java.util.Arrays;
Expand Down Expand Up @@ -45,6 +48,8 @@ public class TowerDefenseConsoleMapRenderer implements GameMapRenderer {
public static final String ANSI_PURPLE_BACKGROUND = "";
public static final String ANSI_CYAN_BACKGROUND = "";

private static final Logger log = LogManager.getLogger(TowerDefenseConsoleMapRenderer.class);

@Override
public String render(GameMap gameMap, GamePlayer player) {
if (gameMap instanceof TowerDefenseGameMap) {
Expand All @@ -53,7 +58,7 @@ public String render(GameMap gameMap, GamePlayer player) {
return renderMap(towerDefenseGameMap);
}

//TODO: throw exception
log.error("The game map is not a TowerDefenseGameMap");
return "";
}

Expand Down Expand Up @@ -82,7 +87,7 @@ public String renderMap(TowerDefenseGameMap towerDefenseGameMap) {
);

towerDefenseGameMap.getBuildings()
.forEach(b -> {
.forEach((Building b) -> {
String icon = b.isConstructed() ? b.getIcon() : b.getIcon().toLowerCase();
outputMap[b.getY()][b.getX()].setMiddle(
wrapPlayerColour(icon, b.getPlayerType())
Expand Down Expand Up @@ -115,20 +120,12 @@ public String renderMap(TowerDefenseGameMap towerDefenseGameMap) {
towerDefensePlayerA = towerDefenseGameMap.getPlayer(PlayerType.A);
towerDefensePlayerB = towerDefenseGameMap.getPlayer(PlayerType.B);
} catch (Exception e) {
e.printStackTrace();
log.error(e);
}

outputString.append(ANSI_BLUE_BRIGHT +
"Player " + towerDefensePlayerA.getPlayerType()
+ " Health=" + towerDefensePlayerA.getHealth()
+ ", Energy=" + towerDefensePlayerA.getEnergy()
+ ", Score=" + towerDefensePlayerA.getScore() + ANSI_RESET);
outputString.append(ANSI_BLUE_BRIGHT + "Player ").append(towerDefensePlayerA.getPlayerType()).append(" Health=").append(towerDefensePlayerA.getHealth()).append(", Energy=").append(towerDefensePlayerA.getEnergy()).append(", Score=").append(towerDefensePlayerA.getScore()).append(ANSI_RESET);
outputString.append("\n");
outputString.append(ANSI_RED_BRIGHT +
"Player " + towerDefensePlayerB.getPlayerType()
+ " Health=" + towerDefensePlayerB.getHealth()
+ ", Energy=" + towerDefensePlayerB.getEnergy()
+ ", Score=" + towerDefensePlayerB.getScore() + ANSI_RESET);
outputString.append(ANSI_RED_BRIGHT + "Player ").append(towerDefensePlayerB.getPlayerType()).append(" Health=").append(towerDefensePlayerB.getHealth()).append(", Energy=").append(towerDefensePlayerB.getEnergy()).append(", Score=").append(towerDefensePlayerB.getScore()).append(ANSI_RESET);

outputString.append("\n");

Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
package za.co.entelect.challenge.core.renderers;

import com.google.gson.Gson;
import za.co.entelect.challenge.core.entities.CellStateContainer;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import za.co.entelect.challenge.core.entities.PlayerData;
import za.co.entelect.challenge.core.entities.TowerDefenseJsonContainer;
import za.co.entelect.challenge.entities.TowerDefenseGameMap;
Expand All @@ -17,6 +18,8 @@ public class TowerDefenseJsonGameMapRenderer implements GameMapRenderer {

private TowerDefenseGameMap towerDefenseGameMap;

private static final Logger log = LogManager.getLogger(TowerDefenseJsonGameMapRenderer.class);

@Override
public String render(GameMap gameMap, GamePlayer player) {
if(gameMap instanceof TowerDefenseGameMap) {
Expand All @@ -31,13 +34,13 @@ public String render(GameMap gameMap, GamePlayer player) {
container = new TowerDefenseJsonContainer(RendererHelper.renderPlayerB(towerDefenseGameMap), getPlayerDataForPlayer(player), towerDefenseGameMap.getCurrentRound());
}
if (container == null){
//TODO: throw error (we need to add error handling on GameMapRenderer)
log.error("The container cannot be empty.");
return "";
}
return gson.toJson(container);
}

//TODO: throw exception
log.error("The gamemmap must be an instance of the tower defence game map");
return "";
}

Expand Down
Loading

0 comments on commit 9282e81

Please sign in to comment.