package swag49.web.controller;
import com.google.common.base.Function;
import com.google.common.collect.Collections2;
import com.google.common.collect.Sets;
import org.slf4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.support.SessionStatus;
import org.springframework.web.client.RestTemplate;
import swag49.dao.DataAccessObject;
import swag49.gamelogic.MapLogic;
import swag49.gamelogic.exceptions.NotEnoughMoneyException;
import swag49.model.*;
import swag49.model.ResourceType;
import swag49.model.helper.ResourceValueHelper;
import swag49.transfer.model.*;
import swag49.util.Log;
import swag49.web.model.*;
import javax.annotation.Nullable;
import java.util.*;
import java.util.Map;
@Controller
@Scope("session")
@RequestMapping(value = "/map")
public class MapController {
private static final String userManagement = "http://localhost:8080/user/swag";
private static final String tokenService = "/token/";
private static final int VIEWSIZE = 3;
@Log
private static Logger logger;
@Autowired
@Qualifier("mapDAO")
private DataAccessObject<swag49.model.Map, Long> mapDAO;
@Autowired
@Qualifier("troopActionDAO")
private DataAccessObject<TroopAction, Long> troopActionDAO;
@Autowired
@Qualifier("buildActionDAO")
private DataAccessObject<BuildAction, Long> buildActionDAO;
@Autowired
@Qualifier("troopUpgradeActionDAO")
private DataAccessObject<TroopUpgradeAction, Long> troopUpgradeActionDAO;
@Autowired
@Qualifier("playerDAO")
private DataAccessObject<Player, Long> playerDAO;
@Autowired
@Qualifier("tileDAO")
private DataAccessObject<Tile, Tile.Id> tileDAO;
@Autowired
@Qualifier("buildingTypeDAO")
private DataAccessObject<BuildingType, Long> buildingTypeDAO;
@Autowired
@Qualifier("buildingLevelDAO")
private DataAccessObject<BuildingLevel, BuildingLevel.Id> buildingLevelDAO;
@Autowired
@Qualifier("squareDAO")
private DataAccessObject<Square, Square.Id> squareDAO;
@Autowired
@Qualifier("baseDAO")
private DataAccessObject<Base, Long> baseDAO;
@Autowired
@Qualifier("troopTypeDAO")
private DataAccessObject<TroopType, Long> troopTypeDAO;
@Autowired
@Qualifier("troopLevelDAO")
private DataAccessObject<TroopLevel, TroopLevel.Id> troopLevelDAO;
@Autowired
@Qualifier("troopDAO")
private DataAccessObject<Troop, Long> troopDAO;
@Autowired
@Qualifier("buildingDAO")
private DataAccessObject<Building, Square.Id> buildingDAO;
@Autowired
@Qualifier("troopBuildActionDAO")
private DataAccessObject<TroopBuildAction, Long> troopBuildActionDAO;
@Autowired
private RestTemplate restTemplate;
@Autowired
private NodeContext nodeContext;
@Autowired
private MapLogic mapLogic;
private UUID userToken;
private String userID;
private String userName;
private static final String NOTENOUGHRESOURCES = "notenoughmoney";
private static final String ERROR = "error";
//TODO: GET MAP AND PLAYER
private swag49.model.Map map;
private Player player;
private int mapLength;
@Transactional("swag49.map")
public boolean loggedIn() {
if (this.userID == null) {
return false;
}
return true;
}
//@PostConstruct
@Transactional("swag49.map")
public void init() {
swag49.model.Map example = new swag49.model.Map();
example.setUrl(nodeContext.getMapNodeUrl());
example.setConsistsOf(null);
logger.error("Map url {}", nodeContext.getMapNodeUrl());
Collection<swag49.model.Map> maps = mapDAO.queryByExample(example);
if (maps != null && maps.size() == 1) {
map = maps.iterator().next();
mapLength = (int) Math.sqrt(map.getConsistsOf().size());
logger.debug("Map with id " + map.getId() + " found");
} else {
logger.error("Error while finding map");
}
}
@Transactional("swag49.map")
private void lazyInit() {
if (map == null)
init();
}
@RequestMapping(value = "/authenticate", method = RequestMethod.POST)
@Transactional("swag49.map")
public String initPlayer(@ModelAttribute("tokenDTO") TokenDTO token) {
lazyInit();
System.out.println("Got request with token: " + token);
UUID userToken = token.getToken();
// verify token
Map<String, UUID> vars = new HashMap<String, UUID>();
vars.put("token", userToken);
TokenDTO tokenDTO = restTemplate.getForObject(userManagement + tokenService + "{token}",
TokenDTO.class, vars);
System.out.println("Got TokenDTO: " + tokenDTO);
if (tokenDTO != null) {
this.userToken = tokenDTO.getToken();
this.userID = tokenDTO.getUserId();
this.userName = tokenDTO.getUserName();
}
if (map != null) {
//test if a player for that user exists
Player example = new Player();
example.setPlays(map);
example.setUserId(this.userID);
example.setActions(null);
example.setOwns(null);
example.setTroops(null);
Collection<Player> playerValues = playerDAO.queryByExample(example);
if (playerValues != null && playerValues.size() == 1) {
player = playerValues.iterator().next();
player.setOnline(true);
player = playerDAO.update(player);
logger.info("Player " + player.getId() + " found");
} else if (playerValues != null && playerValues.size() == 0) {
// create new player & create start conditions ( map, resources, units, etc)
player = new Player();
player.setUserId(userID);
player.setPlays(map);
player.setOnline(true);
player.setDeleted(false);
player.setResources(new ResourceValue());
player.setIncome(new ResourceValue());
player.setUpkeep(new ResourceValue());
player = playerDAO.create(player);
Base base = mapLogic.initializePlayer(map, player);
//create a start unit
TroopType type = new TroopType();
type.setName("Swordsman");
type = troopTypeDAO.queryByExample(type).get(0);
TroopLevel.Id levelId = new TroopLevel.Id(1, type.getId());
TroopLevel level = troopLevelDAO.get(levelId);
Tile tile = base.getLocatedOn();
Troop startUnit = new Troop(type, level, tile, player);
startUnit = troopDAO.create(startUnit);
tile.getTroops().add(startUnit);
tileDAO.update(tile);
ResourceValueHelper.add(player.getUpkeep(), level.getUpkeepCosts());
//create additional start units
startUnit = new Troop(type, level, tile, player);
startUnit = troopDAO.create(startUnit);
tile.getTroops().add(startUnit);
startUnit = troopDAO.create(startUnit);
tile.getTroops().add(startUnit);
startUnit = troopDAO.create(startUnit);
tile.getTroops().add(startUnit);
ResourceValueHelper.add(player.getUpkeep(), level.getUpkeepCosts());
tileDAO.update(tile);
playerDAO.update(player);
logger.info("Player " + player.getId() + " initialized");
} else {
return ERROR;
}
}
return "redirect:./";
}
@Transactional("swag49.map")
public String buildTest() {
lazyInit();
try {
logger.info("Start build Test");
player = playerDAO.get(player.getId());
Base base = player.getOwns().iterator().next();
BuildingType goldMineType = new BuildingType();
goldMineType.setName("Goldmine");
goldMineType = buildingTypeDAO.queryByExample(goldMineType).get(0);
Square emptySquare = null;
for (Square square : base.getConsistsOf()) {
if (square.getBuilding() == null) {
emptySquare = square;
break;
}
}
logger.info("End build Test");
mapLogic.build(emptySquare, goldMineType);
} catch (Exception e) {
e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
}
return "home";
}
@RequestMapping(value = "/")
public String handle(Map<String, Object> map) {
lazyInit();
map.put("userID", this.userID);
return "home";
}
@RequestMapping(value = "/messaging", method = RequestMethod.GET)
@Transactional("swag49.map")
public String messaging() {
lazyInit();
if (!loggedIn())
return "redirect:" + nodeContext.getUserNodeUrl() + "/swag/user/";
//buildTest();
return "redirect:../messaging/";
}
@RequestMapping(value = "/statistics", method = RequestMethod.GET)
public String statistics() {
lazyInit();
if (!loggedIn())
return "redirect:" + nodeContext.getUserNodeUrl() + "/swag/user/";
return "redirect:../statistics/";
}
@RequestMapping(value = "/sendtroops", method = RequestMethod.GET)
@Transactional("swag49.map")
public String getSendTroopsOverview(@RequestParam(value = "x", defaultValue = "-1") int x,
@RequestParam(value = "y", defaultValue = "-1") int y,
Model model) {
lazyInit();
//TODO: besser machen
player = playerDAO.get(player.getId());
map = mapDAO.get(map.getId());
if (!loggedIn())
return "redirect:" + nodeContext.getUserNodeUrl() + "/swag/user/";
Troop sampleTroop = new Troop();
sampleTroop.setOwner(player);
List<Troop> troops = troopDAO.queryByExample(sampleTroop);
//HashMap<Tile.Id, ArrayList<Troop>> troopsPerTile = Maps.newHashMap();
ArrayList<TileDTO> tileList = new ArrayList<TileDTO>();
for (Troop troop : troops) {
Tile tile = troop.getPosition();
if (tile == null) //then the troops are moving
continue;
if (troop.getActive() == false) //troops are upgrading
continue;
SendTroopDTO troopDTO = new SendTroopDTO();
troopDTO.setSendMe(false);
troopDTO.setId(troop.getId());
troopDTO.setName(troop.getType().getName());
boolean existed = false;
for (TileDTO exTile : tileList) {
if (exTile.equals(tile)) {
exTile.getTroops().add(troopDTO);
existed = true;
}
}
if (existed == false) {
TileDTO newTile = new TileDTO();
newTile.setMapId(map.getId());
newTile.setX(tile.getId().getX());
newTile.setY(tile.getId().getY());
ArrayList<SendTroopDTO> sendTroops = new ArrayList<SendTroopDTO>();
sendTroops.add(troopDTO);
newTile.setTroops(sendTroops);
tileList.add(newTile);
}
}
TroopsPerTileDTO dto = new TroopsPerTileDTO();
dto.setTileList(tileList);
dto.setX(x);
dto.setY(y);
model.addAttribute("troopsPerTile", dto);
// model.addAttribute("troopsPerTile", tileList);
return "sendtroops";
}
@RequestMapping(value = "/sendTroops", method = RequestMethod.POST)
@Transactional("swag49.map")
public String handleSendTroops(@ModelAttribute("troopsPerTile") TroopsPerTileDTO troopsPerTile,
BindingResult bingBindingResult,
Map<String, Object> modelMap,
Model model) {
player = playerDAO.get(player.getId());
map = mapDAO.get(map.getId());
if (!loggedIn())
return "redirect:" + nodeContext.getUserNodeUrl() + "/swag/user/";
if (bingBindingResult.hasErrors()) {
modelMap.put("view", false);
return "redirect:map";
}
Tile tile = tileDAO.get(new Tile.Id(map.getId(), troopsPerTile.getX(), troopsPerTile.getY()));
HashSet<Troop> troopsToSend = new HashSet<Troop>();
for (TileDTO tileDto : troopsPerTile.getTileList()) {
for (SendTroopDTO sendTroopDto : tileDto.getTroops()) {
if (sendTroopDto.getSendMe() == true) {
Troop sendTroop = troopDAO.get(sendTroopDto.getId());
troopsToSend.add(sendTroop);
}
}
}
try {
mapLogic.sendTroops(tile, troopsToSend, troopsPerTile.isFoundBase());
} catch (Exception e) {
e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
}
//return getMapOverview(-1,-1,-1,-1, model);
return "redirect:";
}
@RequestMapping(value = "/tile", method = RequestMethod.GET)
@Transactional("swag49.map")
public String getTileOverview(@RequestParam(value = "x", defaultValue = "-1") int x,
@RequestParam(value = "y", defaultValue = "-1") int y, Model model) {
lazyInit();
//TODO: besser machen
player = playerDAO.get(player.getId());
map = mapDAO.get(map.getId());
if (!loggedIn())
return "redirect:" + nodeContext.getUserNodeUrl() + "/swag/user/";
Tile tile = new Tile(map, x, y);
tile = tileDAO.get(tile.getId());
TileOverviewDTOFull tileInfo = new TileOverviewDTOFull(tile.getId().getX(), tile.getId().getY());
tileInfo.setBase(tile.getBase());
tileInfo.setTroops(Sets.<TroopDTO>newHashSet(Collections2.transform(tile.getTroops(),
new Function<Troop, TroopDTO>() {
@Override
public TroopDTO apply(@Nullable Troop input) {
if (input == null) return null;
return new TroopDTO(input.getType().getName(), input.getIsOfLevel().getLevel(),
input.getIsOfLevel().getStrength(), input.getIsOfLevel().getDefense(),
input.getIsOfLevel().getSpeed(), input.getIsOfLevel().getCargo_capacity(),
input.getId(), input.getActive());
}
})));
if (tile.getBase() != null) {
// tileInfo.setHasBase(true);
Base base = tile.getBase();
if (base.getOwner().getUserId().equals(player.getUserId())) {
tileInfo.setEnemyTerritory(false);
List<SquareDTO> squareDTOList = new ArrayList<SquareDTO>();
for (Square square : base.getConsistsOf()) {
SquareDTO dto = new SquareDTO();
dto.setBaseId(square.getId().getBaseId());
dto.setPosition(square.getId().getPosition());
Building building = square.getBuilding();
if (building != null) {
BuildingDTO buildingDTO = new BuildingDTO();
buildingDTO.setLevel(building.getIsOfLevel().getLevel());
buildingDTO.setResourceProduction(new ResourceValueDTO(building.getIsOfLevel().getResourceProduction().getAmount_gold(),
building.getIsOfLevel().getResourceProduction().getAmount_wood(),
building.getIsOfLevel().getResourceProduction().getAmount_stone(),
building.getIsOfLevel().getResourceProduction().getAmount_crops()));
buildingDTO.setUpkeepCosts(new ResourceValueDTO(building.getIsOfLevel().getUpkeepCosts().getAmount_gold(),
building.getIsOfLevel().getUpkeepCosts().getAmount_wood(),
building.getIsOfLevel().getUpkeepCosts().getAmount_stone(),
building.getIsOfLevel().getUpkeepCosts().getAmount_crops()));
buildingDTO.setName(building.getType().getName());
buildingDTO.setCanUpgrade(building.getActive());
BuildingLevel nextLevel = buildingLevelDAO.get(new BuildingLevel.Id(building.getIsOfLevel().getLevel() + 1, building.getType().getId()));
if (nextLevel != null) {
buildingDTO.setUpgradeCosts(new ResourceValueDTO(nextLevel.getBuildCosts().getAmount_gold(),
nextLevel.getBuildCosts().getAmount_wood(),
nextLevel.getBuildCosts().getAmount_stone(),
nextLevel.getBuildCosts().getAmount_crops()));
buildingDTO.setUpgradeDuration(nextLevel.getUpgradeDuration());
}
dto.setBuilding(buildingDTO);
} else {
dto.setBuilding(null);
}
squareDTOList.add(dto);
}
Collections.sort(squareDTOList, new Comparator<SquareDTO>() {
@Override
public int compare(SquareDTO o1, SquareDTO o2) {
return o1.getPosition() - o2.getPosition();
}
});
tileInfo.setSquares(squareDTOList);
} else {
tileInfo.setEnemyTerritory(true);
}
tileInfo.setBaseId(base.getId());
} else {
// tileInfo.setHasBase(false);
tileInfo.setEnemyTerritory(false);
}
if (tile.getTroops() != null) {
// if(!tile.getTroops().isEmpty())
// tileInfo.setHasTroops(true);
// else
// tileInfo.setHasTroops(false);
} else {
// tileInfo.setHasTroops(true);
}
ResourceType specialResource = tile.getSpecial();
if (specialResource == null)
specialResource = ResourceType.NONE;
String specialResourceString = specialResource.toString();
tileInfo.setSpecialResource(specialResourceString);
model.addAttribute("tileInfo", tileInfo);
model.addAttribute("message", new String(""));
model.addAttribute("x", x);
model.addAttribute("y", y);
return "tile";
}
public UUID getUserToken() {
return userToken;
}
public String getUserID() {
return userID;
}
public String getUserName() {
return userName;
}
@RequestMapping(value = "/buildingupgrade", method = RequestMethod.GET)
@Transactional("swag49.map")
public String getUpgradeBuilding(@RequestParam(value = "baseId", defaultValue = "-1") long baseId,
@RequestParam(value = "position", defaultValue = "-1") int position,
@RequestParam(value = "x", defaultValue = "-1") int x,
@RequestParam(value = "y", defaultValue = "-1") int y,
Model model) {
lazyInit();
if (!loggedIn())
return "redirect:" + nodeContext.getUserNodeUrl() + "/swag/user/";
player = playerDAO.get(player.getId());
Building building2 = buildingDAO.get(new Square.Id(baseId, position));
if (building2 != null) {
try {
mapLogic.upgradeBuilding(building2);
} catch (NotEnoughMoneyException e) {
return NOTENOUGHRESOURCES;
} catch (Exception e) {
logger.error("Error during /buildingupgrade", e);
return ERROR;
}
Tile tile = new Tile(map, x, y);
tile = tileDAO.get(tile.getId());
TileOverviewDTOFull tileInfo = new TileOverviewDTOFull(tile.getId().getX(), tile.getId().getY());
tileInfo.setBase(tile.getBase());
tileInfo.setTroops(Sets.<TroopDTO>newHashSet(Collections2.transform(tile.getTroops(),
new Function<Troop, TroopDTO>() {
@Override
public TroopDTO apply(@Nullable Troop input) {
if (input == null) return null;
return new TroopDTO(input.getType().getName(), input.getIsOfLevel().getLevel(),
input.getIsOfLevel().getStrength(), input.getIsOfLevel().getDefense(),
input.getIsOfLevel().getSpeed(), input.getIsOfLevel().getCargo_capacity(),
input.getId(), input.getActive());
}
})));
if (tile.getBase() != null) {
// tileInfo.setHasBase(true);
Base base = tile.getBase();
if (base.getOwner().getUserId().equals(player.getUserId())) {
tileInfo.setEnemyTerritory(false);
List<SquareDTO> squareDTOList = new ArrayList<SquareDTO>();
for (Square square : base.getConsistsOf()) {
SquareDTO dto = new SquareDTO();
dto.setBaseId(square.getId().getBaseId());
dto.setPosition(square.getId().getPosition());
Building building = square.getBuilding();
if (building != null) {
BuildingDTO buildingDTO = new BuildingDTO();
buildingDTO.setLevel(building.getIsOfLevel().getLevel());
buildingDTO.setResourceProduction(new ResourceValueDTO(building.getIsOfLevel().getResourceProduction().getAmount_gold(),
building.getIsOfLevel().getResourceProduction().getAmount_wood(),
building.getIsOfLevel().getResourceProduction().getAmount_stone(),
building.getIsOfLevel().getResourceProduction().getAmount_crops()));
buildingDTO.setUpkeepCosts(new ResourceValueDTO(building.getIsOfLevel().getUpkeepCosts().getAmount_gold(),
building.getIsOfLevel().getUpkeepCosts().getAmount_wood(),
building.getIsOfLevel().getUpkeepCosts().getAmount_stone(),
building.getIsOfLevel().getUpkeepCosts().getAmount_crops()));
buildingDTO.setName(building.getType().getName());
buildingDTO.setCanUpgrade(building.getActive());
BuildingLevel nextLevel = buildingLevelDAO.get(new BuildingLevel.Id(building.getIsOfLevel().getLevel() + 1, building.getType().getId()));
if (nextLevel != null) {
buildingDTO.setUpgradeCosts(new ResourceValueDTO(nextLevel.getBuildCosts().getAmount_gold(),
nextLevel.getBuildCosts().getAmount_wood(),
nextLevel.getBuildCosts().getAmount_stone(),
nextLevel.getBuildCosts().getAmount_crops()));
buildingDTO.setUpgradeDuration(nextLevel.getUpgradeDuration());
}
dto.setBuilding(buildingDTO);
} else {
dto.setBuilding(null);
}
squareDTOList.add(dto);
}
Collections.sort(squareDTOList, new Comparator<SquareDTO>() {
@Override
public int compare(SquareDTO o1, SquareDTO o2) {
return o1.getPosition() - o2.getPosition();
}
});
tileInfo.setSquares(squareDTOList);
} else {
tileInfo.setEnemyTerritory(true);
}
tileInfo.setBaseId(base.getId());
} else {
// tileInfo.setHasBase(false);
tileInfo.setEnemyTerritory(false);
}
if (tile.getTroops() != null) {
// if(!tile.getTroops().isEmpty())
// tileInfo.setHasTroops(true);
// else
// tileInfo.setHasTroops(false);
} else {
// tileInfo.setHasTroops(true);
}
ResourceType specialResource = tile.getSpecial();
if (specialResource == null)
specialResource = ResourceType.NONE;
String specialResourceString = specialResource.toString();
tileInfo.setSpecialResource(specialResourceString);
model.addAttribute("tileInfo", tileInfo);
model.addAttribute("x", x);
model.addAttribute("y", y);
model.addAttribute("showLastBase", false);
model.addAttribute("message", new String("Building upgrade progress started"));
// model.addAttribute("showLastBase", true);
return "tile";
} else {
return "error";
}
}
@RequestMapping(value = "/troopupgrade", method = RequestMethod.GET)
@Transactional("swag49.map")
public String getUpgradeTroops(@RequestParam(value = "troopId", defaultValue = "-1") long troopId,
Model model) {
lazyInit();
if (!loggedIn())
return "redirect:" + nodeContext.getUserNodeUrl() + "/swag/user/";
player = playerDAO.get(player.getId());
Troop troop2 = troopDAO.get(troopId);
if (troop2 != null) {
//get next Level
TroopLevel.Id id2 = new TroopLevel.Id(troop2.getIsOfLevel().getLevel() + 1, troop2.getType().getId());
TroopLevel nextLevel2 = troopLevelDAO.get(id2);
try {
mapLogic.upgradeTroop(player, troop2, nextLevel2);
} catch (NotEnoughMoneyException nem) {
return NOTENOUGHRESOURCES;
} catch (Exception e) {
logger.error("Error during /troopupgrade", e);
return ERROR;
}
Base base = baseDAO.get(troop2.getPosition().getBase().getId());
if (base == null || !base.getOwner().getId().equals(player.getId())) {
return ERROR;
}
ArrayList<TroopDTO> troops = new ArrayList<TroopDTO>();
for (Troop troop : base.getLocatedOn().getTroops()) {
TroopDTO dto = new TroopDTO(troop.getType().getName(), troop.getIsOfLevel().getLevel(),
troop.getIsOfLevel().getStrength(), troop.getIsOfLevel().getDefense(),
troop.getIsOfLevel().getSpeed(), troop.getIsOfLevel().getCargo_capacity(), troop.getId(),
troop.getActive());
//set upgrade
//get current TroopTypeLevel
TroopLevel currentLevel = troop.getIsOfLevel();
//get next Level
TroopLevel.Id id = new TroopLevel.Id(currentLevel.getLevel() + 1, currentLevel.getId().getTroopTypeId());
TroopLevel nextLevel = troopLevelDAO.get(id);
if (nextLevel == null || troop.getActive() != Boolean.TRUE)
dto.setCanUpgrade(false);
else {
dto.setCanUpgrade(true);
dto.setUpgradeCost(new ResourceValueDTO(nextLevel.getBuildCosts().getAmount_gold(),
nextLevel.getBuildCosts().getAmount_wood(), nextLevel.getBuildCosts().getAmount_stone(),
nextLevel.getBuildCosts().getAmount_crops()));
}
troops.add(dto);
}
model.addAttribute("troops", troops);
model.addAttribute("back_x", base.getLocatedOn().getId().getX());
model.addAttribute("back_y", base.getLocatedOn().getId().getY());
model.addAttribute("baseId", troop2.getPosition().getBase().getId());
model.addAttribute("message", new String("Upgrade progress started"));
return "troopoverview";
// return "redirect: ../troopoverview.html?baseId=" + troop.getPosition().getBase().getId();
} else {
return ERROR;
}
}
@RequestMapping(value = "/traintroops", method = RequestMethod.GET)
@Transactional("swag49.map")
public String getTrainTroopOverview(@RequestParam(value = "baseId", defaultValue = "-1") long baseId,
Model model) {
lazyInit();
if (!loggedIn())
return "redirect:" + nodeContext.getUserNodeUrl() + "/swag/user/";
Base base = baseDAO.get(baseId);
if (base == null || !base.getOwner().getId().equals(player.getId())) {
return ERROR;
}
player = playerDAO.get(player.getId());
map = mapDAO.get(map.getId());
TroopType troopTypeExample = new TroopType();
troopTypeExample.setLevels(null);
List<TroopType> troopTypes = troopTypeDAO.queryByExample(troopTypeExample);
List<TroopTypeDTO> troopTypeDTOList = new ArrayList<TroopTypeDTO>();
for (TroopType type : troopTypes) {
TroopTypeDTO dto = new TroopTypeDTO(type.getName(), type.getCanFoundBase(), null, type.getId());
ResourceValueDTO costs = null;
for (TroopLevel level : type.getLevels()) {
if (level.getLevel() == 1) {
costs = new ResourceValueDTO(level.getBuildCosts().getAmount_gold(),
level.getBuildCosts().getAmount_wood(), level.getBuildCosts().getAmount_stone(),
level.getBuildCosts().getAmount_crops());
break;
}
}
dto.setCosts(costs);
troopTypeDTOList.add(dto);
}
model.addAttribute("troops", troopTypeDTOList);
model.addAttribute("baseId", baseId);
model.addAttribute("message", new String(""));
return "traintroops";
}
@RequestMapping(value = "/train", method = RequestMethod.GET)
@Transactional("swag49.map")
public String getTrainTroopOverview(@RequestParam(value = "baseId", defaultValue = "-1") long baseId,
@RequestParam(value = "troopTypeId", defaultValue = "-1") long troopTypeId,
Model model) {
lazyInit();
if (!loggedIn())
return "redirect:" + nodeContext.getUserNodeUrl() + "/swag/user/";
Base base2 = baseDAO.get(baseId);
if (base2 == null || !base2.getOwner().getId().equals(player.getId())) {
return ERROR;
}
TroopType type2 = troopTypeDAO.get(Long.valueOf(troopTypeId));
player = playerDAO.get(player.getId());
map = mapDAO.get(map.getId());
TroopLevel.Id id = new TroopLevel.Id(1, type2.getId());
TroopLevel level2 = troopLevelDAO.get(id);
if (!ResourceValueHelper.geq(player.getResources(), level2.getBuildCosts())) {
return NOTENOUGHRESOURCES;
}
try {
mapLogic.buildTroop(player, type2, level2, base2.getLocatedOn(), 1);
} catch (NotEnoughMoneyException e2) {
logger.error("Error during train", e2);
return ERROR;
} catch (Exception e) {
logger.error("Error during train", e);
return ERROR;
}
Base base = baseDAO.get(baseId);
if (base == null || !base.getOwner().getId().equals(player.getId())) {
return ERROR;
}
player = playerDAO.get(player.getId());
map = mapDAO.get(map.getId());
TroopType troopTypeExample = new TroopType();
troopTypeExample.setLevels(null);
List<TroopType> troopTypes = troopTypeDAO.queryByExample(troopTypeExample);
List<TroopTypeDTO> troopTypeDTOList = new ArrayList<TroopTypeDTO>();
for (TroopType type : troopTypes) {
TroopTypeDTO dto = new TroopTypeDTO(type.getName(), type.getCanFoundBase(), null, type.getId());
ResourceValueDTO costs = null;
for (TroopLevel level : type.getLevels()) {
if (level.getLevel() == 1) {
costs = new ResourceValueDTO(level.getBuildCosts().getAmount_gold(),
level.getBuildCosts().getAmount_wood(), level.getBuildCosts().getAmount_stone(),
level.getBuildCosts().getAmount_crops());
break;
}
}
dto.setCosts(costs);
troopTypeDTOList.add(dto);
}
model.addAttribute("troops", troopTypeDTOList);
model.addAttribute("baseId", baseId);
model.addAttribute("message", new String("Training process started"));
return "traintroops";
}
@RequestMapping(value = "/actions", method = RequestMethod.GET)
@Transactional("swag49.map")
public String getActionOverview(Model model) {
lazyInit();
if (!loggedIn())
return "redirect:" + nodeContext.getUserNodeUrl() + "/swag/user/";
Date now = new Date();
player = playerDAO.get(player.getId());
//troop actions
TroopAction troopAction = new TroopAction();
troopAction.setPlayer(player);
Set<TroopAction> troopActionsList = new HashSet<TroopAction>(troopActionDAO.queryByExample(troopAction));
List<TroopActionDTO> troopActionDTOList = new ArrayList<TroopActionDTO>();
for (TroopAction action : troopActionsList) {
if (action.getEndDate().after(now)) {
TroopActionDTO dto = new TroopActionDTO();
dto.setDestination(action.getSource().getId().getX(), action.getSource().getId().getY());
dto.setIsAbortable(action.getIsAbortable());
dto.setStartDate(action.getStartDate());
dto.setEndDate(action.getEndDate());
dto.setId(action.getId());
troopActionDTOList.add(dto);
}
}
//troop upgrades
TroopUpgradeAction troopUpgradeAction = new TroopUpgradeAction();
troopUpgradeAction.setPlayer(player);
List<TroopUpgradeAction> troopUpgradeActionsList = troopUpgradeActionDAO.queryByExample(troopUpgradeAction);
List<TroopUpgradeActionDTO> troopUpgradeActionDTOList = new ArrayList<TroopUpgradeActionDTO>();
for (TroopUpgradeAction action : troopUpgradeActionsList) {
if (action.getEndDate().after(now)) {
TroopUpgradeActionDTO dto = new TroopUpgradeActionDTO();
dto.setDestination_x(action.getTarget().getId().getX());
dto.setDestination_y(action.getTarget().getId().getY());
dto.setIsAbortable(action.getIsAbortable());
dto.setTroopName(action.getTroop().getType().getName());
dto.setEndDate(action.getEndDate());
dto.setLevel(action.getTroopLevel().getLevel());
dto.setId(action.getId());
troopUpgradeActionDTOList.add(dto);
}
}
//buildings
BuildAction buildAction = new BuildAction();
buildAction.setPlayer(player);
List<BuildAction> buildActionList = buildActionDAO.queryByExample(buildAction);
List<BuildActionDTO> buildActionDTOList = new ArrayList<BuildActionDTO>();
for (BuildAction action : buildActionList) {
if (action.getEndDate().after(now)) {
BuildActionDTO dto = new BuildActionDTO();
dto.setDestination_x(action.getTarget().getId().getX());
dto.setDestination_y(action.getTarget().getId().getY());
dto.setIsAbortable(action.getIsAbortable());
dto.setBuildingName(action.getConcerns().getType().getName());
dto.setLevel(action.getConcerns().getIsOfLevel().getLevel() + 1);
dto.setSquareId(action.getConcerns().getSquare().getId().getPosition());
dto.setEndDate(action.getEndDate());
dto.setId(action.getId());
buildActionDTOList.add(dto);
}
}
//troops in training
TroopBuildAction troopBuildAction = new TroopBuildAction();
troopBuildAction.setPlayer(player);
List<TroopBuildAction> troopBuildActionsList = troopBuildActionDAO.queryByExample(troopBuildAction);
List<TroopBuildActionDTO> buildBuildDTOList = new ArrayList<TroopBuildActionDTO>();
for (TroopBuildAction action : troopBuildActionsList) {
if (action.getEndDate().after(now)) {
TroopBuildActionDTO dto = new TroopBuildActionDTO();
dto.setDestination_x(action.getTarget().getId().getX());
dto.setDestination_y(action.getTarget().getId().getY());
dto.setIsAbortable(action.getIsAbortable());
dto.setTroopName(action.getTroopType().getName());
dto.setEndDate(action.getEndDate());
dto.setAmount(action.getAmount());
dto.setId(action.getId());
buildBuildDTOList.add(dto);
}
}
model.addAttribute("troopActions", troopActionDTOList);
model.addAttribute("troopUpgradeActions", troopUpgradeActionDTOList);
model.addAttribute("baseActions", buildActionDTOList);
model.addAttribute("troopBuildActions", buildBuildDTOList);
return "actions";
}
@RequestMapping(value = "/canceltroopbuildaction", method = RequestMethod.GET)
@Transactional("swag49.map")
public String cancelTroopBuildAction(@RequestParam(value = "id", defaultValue = "-1") long id, Model model) {
TroopBuildAction action2 = troopBuildActionDAO.get(id);
if (action2 == null) {
logger.error("Action with id " + id + " not found");
return ERROR;
}
if (action2.getIsAbortable()) {
//give 50% of resources back
ResourceValue fiftyPerCent = action2.getTroopLevel().getBuildCosts();
ResourceValueHelper.multiply(fiftyPerCent, 0.5);
ResourceValueHelper.add(action2.getPlayer().getResources(), fiftyPerCent);
playerDAO.update(action2.getPlayer());
troopBuildActionDAO.delete(action2);
}
Date now = new Date();
player = playerDAO.get(player.getId());
//troop actions
TroopAction troopAction = new TroopAction();
troopAction.setPlayer(player);
Set<TroopAction> troopActionsList = new HashSet<TroopAction>(troopActionDAO.queryByExample(troopAction));
List<TroopActionDTO> troopActionDTOList = new ArrayList<TroopActionDTO>();
for (TroopAction action : troopActionsList) {
if (action.getEndDate().after(now)) {
TroopActionDTO dto = new TroopActionDTO();
dto.setDestination(action.getSource().getId().getX(), action.getSource().getId().getX());
dto.setIsAbortable(action.getIsAbortable());
dto.setStartDate(action.getStartDate());
dto.setEndDate(action.getEndDate());
dto.setId(action.getId());
troopActionDTOList.add(dto);
}
}
//troop upgrades
TroopUpgradeAction troopUpgradeAction = new TroopUpgradeAction();
troopUpgradeAction.setPlayer(player);
List<TroopUpgradeAction> troopUpgradeActionsList = troopUpgradeActionDAO.queryByExample(troopUpgradeAction);
List<TroopUpgradeActionDTO> troopUpgradeActionDTOList = new ArrayList<TroopUpgradeActionDTO>();
for (TroopUpgradeAction action : troopUpgradeActionsList) {
if (action.getEndDate().after(now)) {
TroopUpgradeActionDTO dto = new TroopUpgradeActionDTO();
dto.setDestination_x(action.getTarget().getId().getX());
dto.setDestination_y(action.getTarget().getId().getY());
dto.setIsAbortable(action.getIsAbortable());
dto.setTroopName(action.getTroop().getType().getName());
dto.setEndDate(action.getEndDate());
dto.setLevel(action.getTroopLevel().getLevel());
dto.setId(action.getId());
troopUpgradeActionDTOList.add(dto);
}
}
//buildings
BuildAction buildAction = new BuildAction();
buildAction.setPlayer(player);
List<BuildAction> buildActionList = buildActionDAO.queryByExample(buildAction);
List<BuildActionDTO> buildActionDTOList = new ArrayList<BuildActionDTO>();
for (BuildAction action : buildActionList) {
if (action.getEndDate().after(now)) {
BuildActionDTO dto = new BuildActionDTO();
dto.setDestination_x(action.getTarget().getId().getX());
dto.setDestination_y(action.getTarget().getId().getY());
dto.setIsAbortable(action.getIsAbortable());
dto.setBuildingName(action.getConcerns().getType().getName());
dto.setLevel(action.getConcerns().getIsOfLevel().getLevel() + 1);
dto.setSquareId(action.getConcerns().getSquare().getId().getPosition());
dto.setEndDate(action.getEndDate());
dto.setId(action.getId());
buildActionDTOList.add(dto);
}
}
//troops in training
TroopBuildAction troopBuildAction = new TroopBuildAction();
troopBuildAction.setPlayer(player);
List<TroopBuildAction> troopBuildActionsList = troopBuildActionDAO.queryByExample(troopBuildAction);
List<TroopBuildActionDTO> buildBuildDTOList = new ArrayList<TroopBuildActionDTO>();
for (TroopBuildAction action : troopBuildActionsList) {
if (action.getEndDate().after(now)) {
TroopBuildActionDTO dto = new TroopBuildActionDTO();
dto.setDestination_x(action.getTarget().getId().getX());
dto.setDestination_y(action.getTarget().getId().getY());
dto.setIsAbortable(action.getIsAbortable());
dto.setTroopName(action.getTroopType().getName());
dto.setEndDate(action.getEndDate());
dto.setAmount(action.getAmount());
dto.setId(action.getId());
buildBuildDTOList.add(dto);
}
}
model.addAttribute("troopActions", troopActionDTOList);
model.addAttribute("troopUpgradeActions", troopUpgradeActionDTOList);
model.addAttribute("baseActions", buildActionDTOList);
model.addAttribute("troopBuildActions", buildBuildDTOList);
return "actions";
}
@RequestMapping(value = "/canceltroopaction", method = RequestMethod.GET)
@Transactional("swag49.map")
public String cancelTroopAction(@RequestParam(value = "id", defaultValue = "-1") long id, Model model) {
if (!loggedIn())
return "redirect:" + nodeContext.getUserNodeUrl() + "/swag/user/";
TroopAction action2 = troopActionDAO.get(Long.valueOf(id));
if (action2 == null) {
logger.error("Action with id " + id + " not found");
return ERROR;
}
if (action2.getIsAbortable()) {
//create new action for the way back
Date now = new Date();
TroopAction newAction = new TroopAction();
newAction.setPlayer(action2.getPlayer());
newAction.setConcerns(action2.getConcerns());
newAction.setStartDate(now);
newAction.setShouldFoundBase(Boolean.FALSE);
newAction.setIsAbortable(Boolean.FALSE);
newAction.setDuration(now.getTime() - action2.getStartDate().getTime());
newAction.setTarget(action2.getSource());
newAction.setSource(action2.getSource());
newAction = troopActionDAO.create(newAction);
troopActionDAO.delete(action2);
}
Date now = new Date();
player = playerDAO.get(player.getId());
//troop actions
TroopAction troopAction = new TroopAction();
troopAction.setPlayer(player);
Set<TroopAction> troopActionsList = new HashSet<TroopAction>(troopActionDAO.queryByExample(troopAction));
List<TroopActionDTO> troopActionDTOList = new ArrayList<TroopActionDTO>();
for (TroopAction action : troopActionsList) {
if (action.getEndDate().after(now)) {
TroopActionDTO dto = new TroopActionDTO();
dto.setDestination(action.getSource().getId().getX(), action.getSource().getId().getX());
dto.setIsAbortable(action.getIsAbortable());
dto.setStartDate(action.getStartDate());
dto.setEndDate(action.getEndDate());
dto.setId(action.getId());
troopActionDTOList.add(dto);
}
}
//troop upgrades
TroopUpgradeAction troopUpgradeAction = new TroopUpgradeAction();
troopUpgradeAction.setPlayer(player);
List<TroopUpgradeAction> troopUpgradeActionsList = troopUpgradeActionDAO.queryByExample(troopUpgradeAction);
List<TroopUpgradeActionDTO> troopUpgradeActionDTOList = new ArrayList<TroopUpgradeActionDTO>();
for (TroopUpgradeAction action : troopUpgradeActionsList) {
if (action.getEndDate().after(now)) {
TroopUpgradeActionDTO dto = new TroopUpgradeActionDTO();
dto.setDestination_x(action.getTarget().getId().getX());
dto.setDestination_y(action.getTarget().getId().getY());
dto.setIsAbortable(action.getIsAbortable());
dto.setTroopName(action.getTroop().getType().getName());
dto.setEndDate(action.getEndDate());
dto.setLevel(action.getTroopLevel().getLevel());
dto.setId(action.getId());
troopUpgradeActionDTOList.add(dto);
}
}
//buildings
BuildAction buildAction = new BuildAction();
buildAction.setPlayer(player);
List<BuildAction> buildActionList = buildActionDAO.queryByExample(buildAction);
List<BuildActionDTO> buildActionDTOList = new ArrayList<BuildActionDTO>();
for (BuildAction action : buildActionList) {
if (action.getEndDate().after(now)) {
BuildActionDTO dto = new BuildActionDTO();
dto.setDestination_x(action.getTarget().getId().getX());
dto.setDestination_y(action.getTarget().getId().getY());
dto.setIsAbortable(action.getIsAbortable());
dto.setBuildingName(action.getConcerns().getType().getName());
dto.setLevel(action.getConcerns().getIsOfLevel().getLevel() + 1);
dto.setSquareId(action.getConcerns().getSquare().getId().getPosition());
dto.setEndDate(action.getEndDate());
dto.setId(action.getId());
buildActionDTOList.add(dto);
}
}
//troops in training
TroopBuildAction troopBuildAction = new TroopBuildAction();
troopBuildAction.setPlayer(player);
List<TroopBuildAction> troopBuildActionsList = troopBuildActionDAO.queryByExample(troopBuildAction);
List<TroopBuildActionDTO> buildBuildDTOList = new ArrayList<TroopBuildActionDTO>();
for (TroopBuildAction action : troopBuildActionsList) {
if (action.getEndDate().after(now)) {
TroopBuildActionDTO dto = new TroopBuildActionDTO();
dto.setDestination_x(action.getTarget().getId().getX());
dto.setDestination_y(action.getTarget().getId().getY());
dto.setIsAbortable(action.getIsAbortable());
dto.setTroopName(action.getTroopType().getName());
dto.setEndDate(action.getEndDate());
dto.setAmount(action.getAmount());
dto.setId(action.getId());
buildBuildDTOList.add(dto);
}
}
model.addAttribute("troopActions", troopActionDTOList);
model.addAttribute("troopUpgradeActions", troopUpgradeActionDTOList);
model.addAttribute("baseActions", buildActionDTOList);
model.addAttribute("troopBuildActions", buildBuildDTOList);
return "actions";
}
@RequestMapping(value = "/canceltroopupgradeaction", method = RequestMethod.GET)
@Transactional("swag49.map")
public String cancelTroopUpgradeAction(@RequestParam(value = "id", defaultValue = "-1") long id, Model model) {
if (!loggedIn())
return "redirect:" + nodeContext.getUserNodeUrl() + "/swag/user/";
TroopUpgradeAction action2 = troopUpgradeActionDAO.get(id);
if (action2 == null) {
logger.error("Action with id " + id + " not found");
return ERROR;
}
if (action2.getIsAbortable()) {
Troop troop = action2.getTroop();
troop.setActive(Boolean.TRUE);
troopDAO.update(troop);
//give 50% of resources back
ResourceValue fiftyPerCent = action2.getTroopLevel().getBuildCosts();
ResourceValueHelper.multiply(fiftyPerCent, 0.5);
ResourceValueHelper.add(action2.getPlayer().getResources(), fiftyPerCent);
playerDAO.update(action2.getPlayer());
troopUpgradeActionDAO.delete(action2);
}
Date now = new Date();
player = playerDAO.get(player.getId());
//troop actions
TroopAction troopAction = new TroopAction();
troopAction.setPlayer(player);
Set<TroopAction> troopActionsList = new HashSet<TroopAction>(troopActionDAO.queryByExample(troopAction));
List<TroopActionDTO> troopActionDTOList = new ArrayList<TroopActionDTO>();
for (TroopAction action : troopActionsList) {
if (action.getEndDate().after(now)) {
TroopActionDTO dto = new TroopActionDTO();
dto.setDestination(action.getSource().getId().getX(), action.getSource().getId().getX());
dto.setIsAbortable(action.getIsAbortable());
dto.setStartDate(action.getStartDate());
dto.setEndDate(action.getEndDate());
dto.setId(action.getId());
troopActionDTOList.add(dto);
}
}
//troop upgrades
TroopUpgradeAction troopUpgradeAction = new TroopUpgradeAction();
troopUpgradeAction.setPlayer(player);
List<TroopUpgradeAction> troopUpgradeActionsList = troopUpgradeActionDAO.queryByExample(troopUpgradeAction);
List<TroopUpgradeActionDTO> troopUpgradeActionDTOList = new ArrayList<TroopUpgradeActionDTO>();
for (TroopUpgradeAction action : troopUpgradeActionsList) {
if (action.getEndDate().after(now)) {
TroopUpgradeActionDTO dto = new TroopUpgradeActionDTO();
dto.setDestination_x(action.getTarget().getId().getX());
dto.setDestination_y(action.getTarget().getId().getY());
dto.setIsAbortable(action.getIsAbortable());
dto.setTroopName(action.getTroop().getType().getName());
dto.setEndDate(action.getEndDate());
dto.setLevel(action.getTroopLevel().getLevel());
dto.setId(action.getId());
troopUpgradeActionDTOList.add(dto);
}
}
//buildings
BuildAction buildAction = new BuildAction();
buildAction.setPlayer(player);
List<BuildAction> buildActionList = buildActionDAO.queryByExample(buildAction);
List<BuildActionDTO> buildActionDTOList = new ArrayList<BuildActionDTO>();
for (BuildAction action : buildActionList) {
if (action.getEndDate().after(now)) {
BuildActionDTO dto = new BuildActionDTO();
dto.setDestination_x(action.getTarget().getId().getX());
dto.setDestination_y(action.getTarget().getId().getY());
dto.setIsAbortable(action.getIsAbortable());
dto.setBuildingName(action.getConcerns().getType().getName());
dto.setLevel(action.getConcerns().getIsOfLevel().getLevel() + 1);
dto.setSquareId(action.getConcerns().getSquare().getId().getPosition());
dto.setEndDate(action.getEndDate());
dto.setId(action.getId());
buildActionDTOList.add(dto);
}
}
//troops in training
TroopBuildAction troopBuildAction = new TroopBuildAction();
troopBuildAction.setPlayer(player);
List<TroopBuildAction> troopBuildActionsList = troopBuildActionDAO.queryByExample(troopBuildAction);
List<TroopBuildActionDTO> buildBuildDTOList = new ArrayList<TroopBuildActionDTO>();
for (TroopBuildAction action : troopBuildActionsList) {
if (action.getEndDate().after(now)) {
TroopBuildActionDTO dto = new TroopBuildActionDTO();
dto.setDestination_x(action.getTarget().getId().getX());
dto.setDestination_y(action.getTarget().getId().getY());
dto.setIsAbortable(action.getIsAbortable());
dto.setTroopName(action.getTroopType().getName());
dto.setEndDate(action.getEndDate());
dto.setAmount(action.getAmount());
dto.setId(action.getId());
buildBuildDTOList.add(dto);
}
}
model.addAttribute("troopActions", troopActionDTOList);
model.addAttribute("troopUpgradeActions", troopUpgradeActionDTOList);
model.addAttribute("baseActions", buildActionDTOList);
model.addAttribute("troopBuildActions", buildBuildDTOList);
return "actions";
}
@RequestMapping(value = "/cancelbuildaction", method = RequestMethod.GET)
@Transactional("swag49.map")
public String cancelBuildAction(@RequestParam(value = "id", defaultValue = "-1") long id, Model model) {
if (!loggedIn())
return "redirect:" + nodeContext.getUserNodeUrl() + "/swag/user/";
BuildAction action2 = buildActionDAO.get(Long.valueOf(id));
if (action2 == null) {
logger.error("Action with id " + id + " not found");
return ERROR;
}
if (action2.getIsAbortable()) {
Building building = action2.getConcerns();
//give 50% of resources back
BuildingLevel.Id blId = new BuildingLevel.Id(building.getIsOfLevel().getLevel() + 1, building.getType().getId());
BuildingLevel nextLevel = buildingLevelDAO.get(blId);
ResourceValue fiftyPerCent = nextLevel.getBuildCosts();
ResourceValueHelper.multiply(fiftyPerCent, 0.5);
ResourceValueHelper.add(action2.getPlayer().getResources(), fiftyPerCent);
playerDAO.update(action2.getPlayer());
if (building.getIsOfLevel().getLevel().equals(0)) {
//delete construction yard
buildActionDAO.delete(action2);
buildingDAO.delete(building);
} else {
building.setActive(Boolean.TRUE);
buildingDAO.update(building);
buildActionDAO.delete(action2);
}
}
Date now = new Date();
player = playerDAO.get(player.getId());
//troop actions
TroopAction troopAction = new TroopAction();
troopAction.setPlayer(player);
Set<TroopAction> troopActionsList = new HashSet<TroopAction>(troopActionDAO.queryByExample(troopAction));
List<TroopActionDTO> troopActionDTOList = new ArrayList<TroopActionDTO>();
for (TroopAction action : troopActionsList) {
if (action.getEndDate().after(now)) {
TroopActionDTO dto = new TroopActionDTO();
dto.setDestination(action.getSource().getId().getX(), action.getSource().getId().getX());
dto.setIsAbortable(action.getIsAbortable());
dto.setStartDate(action.getStartDate());
dto.setEndDate(action.getEndDate());
dto.setId(action.getId());
troopActionDTOList.add(dto);
}
}
//troop upgrades
TroopUpgradeAction troopUpgradeAction = new TroopUpgradeAction();
troopUpgradeAction.setPlayer(player);
List<TroopUpgradeAction> troopUpgradeActionsList = troopUpgradeActionDAO.queryByExample(troopUpgradeAction);
List<TroopUpgradeActionDTO> troopUpgradeActionDTOList = new ArrayList<TroopUpgradeActionDTO>();
for (TroopUpgradeAction action : troopUpgradeActionsList) {
if (action.getEndDate().after(now)) {
TroopUpgradeActionDTO dto = new TroopUpgradeActionDTO();
dto.setDestination_x(action.getTarget().getId().getX());
dto.setDestination_y(action.getTarget().getId().getY());
dto.setIsAbortable(action.getIsAbortable());
dto.setTroopName(action.getTroop().getType().getName());
dto.setEndDate(action.getEndDate());
dto.setLevel(action.getTroopLevel().getLevel());
dto.setId(action.getId());
troopUpgradeActionDTOList.add(dto);
}
}
//buildings
BuildAction buildAction = new BuildAction();
buildAction.setPlayer(player);
List<BuildAction> buildActionList = buildActionDAO.queryByExample(buildAction);
List<BuildActionDTO> buildActionDTOList = new ArrayList<BuildActionDTO>();
for (BuildAction action : buildActionList) {
if (action.getEndDate().after(now)) {
BuildActionDTO dto = new BuildActionDTO();
dto.setDestination_x(action.getTarget().getId().getX());
dto.setDestination_y(action.getTarget().getId().getY());
dto.setIsAbortable(action.getIsAbortable());
dto.setBuildingName(action.getConcerns().getType().getName());
dto.setLevel(action.getConcerns().getIsOfLevel().getLevel() + 1);
dto.setSquareId(action.getConcerns().getSquare().getId().getPosition());
dto.setEndDate(action.getEndDate());
dto.setId(action.getId());
buildActionDTOList.add(dto);
}
}
//troops in training
TroopBuildAction troopBuildAction = new TroopBuildAction();
troopBuildAction.setPlayer(player);
List<TroopBuildAction> troopBuildActionsList = troopBuildActionDAO.queryByExample(troopBuildAction);
List<TroopBuildActionDTO> buildBuildDTOList = new ArrayList<TroopBuildActionDTO>();
for (TroopBuildAction action : troopBuildActionsList) {
if (action.getEndDate().after(now)) {
TroopBuildActionDTO dto = new TroopBuildActionDTO();
dto.setDestination_x(action.getTarget().getId().getX());
dto.setDestination_y(action.getTarget().getId().getY());
dto.setIsAbortable(action.getIsAbortable());
dto.setTroopName(action.getTroopType().getName());
dto.setEndDate(action.getEndDate());
dto.setAmount(action.getAmount());
dto.setId(action.getId());
buildBuildDTOList.add(dto);
}
}
model.addAttribute("troopActions", troopActionDTOList);
model.addAttribute("troopUpgradeActions", troopUpgradeActionDTOList);
model.addAttribute("baseActions", buildActionDTOList);
model.addAttribute("troopBuildActions", buildBuildDTOList);
return "actions";
}
@RequestMapping(value = "/troopoverview", method = RequestMethod.GET)
@Transactional("swag49.map")
public String getTroopOverview(@RequestParam(value = "baseId", defaultValue = "-1") long baseId, Model model) {
lazyInit();
if (!loggedIn())
return "redirect:" + nodeContext.getUserNodeUrl() + "/swag/user/";
player = playerDAO.get(player.getId());
map = mapDAO.get(map.getId());
Base base = baseDAO.get(baseId);
if (base == null || !base.getOwner().getId().equals(player.getId())) {
return ERROR;
}
ArrayList<TroopDTO> troops = new ArrayList<TroopDTO>();
for (Troop troop : base.getLocatedOn().getTroops()) {
TroopDTO dto = new TroopDTO(troop.getType().getName(), troop.getIsOfLevel().getLevel(),
troop.getIsOfLevel().getStrength(), troop.getIsOfLevel().getDefense(),
troop.getIsOfLevel().getSpeed(), troop.getIsOfLevel().getCargo_capacity(), troop.getId(),
troop.getActive());
//set upgrade
//get current TroopTypeLevel
TroopLevel currentLevel = troop.getIsOfLevel();
//get next Level
TroopLevel.Id id = new TroopLevel.Id(currentLevel.getLevel() + 1, currentLevel.getId().getTroopTypeId());
TroopLevel nextLevel = troopLevelDAO.get(id);
if (nextLevel == null || troop.getActive() != Boolean.TRUE)
dto.setCanUpgrade(false);
else {
dto.setCanUpgrade(true);
dto.setUpgradeCost(new ResourceValueDTO(nextLevel.getBuildCosts().getAmount_gold(),
nextLevel.getBuildCosts().getAmount_wood(), nextLevel.getBuildCosts().getAmount_stone(),
nextLevel.getBuildCosts().getAmount_crops()));
}
troops.add(dto);
}
model.addAttribute("troops", troops);
model.addAttribute("baseId", baseId);
model.addAttribute("back_x", base.getLocatedOn().getId().getX());
model.addAttribute("back_y", base.getLocatedOn().getId().getY());
model.addAttribute("message", new String(""));
return "troopoverview";
}
@RequestMapping(value = "/build", method = RequestMethod.GET)
@Transactional("swag49.map")
public String getBuildView(@RequestParam(value = "baseId", defaultValue = "-1") long baseId,
@RequestParam(value = "position", defaultValue = "-1") int position,
@RequestParam(value = "buildingTypeId", defaultValue = "-1") long buildingTypeId,
Model model) {
lazyInit();
if (!loggedIn())
return "redirect:" + nodeContext.getUserNodeUrl() + "/swag/user/";
//TODO: besser machen
player = playerDAO.get(player.getId());
map = mapDAO.get(map.getId());
BuildingType buildingTypeExample = new BuildingType();
buildingTypeExample.setLevels(null);
List<BuildingType> buildings = buildingTypeDAO.queryByExample(buildingTypeExample);
if (buildingTypeId != -1 && position != -1 && baseId != -1) {
Base base = baseDAO.get(baseId);
Square square = squareDAO.get(new Square.Id(base.getId(), position));
BuildingType buildingType = buildingTypeDAO.get(buildingTypeId);
try {
mapLogic.build(square, buildingType);
} catch (Exception e) {
logger.error("Error during build", e);
return ERROR;
}
ArrayList<BuildingTypeDTO> availableBuildings = new ArrayList<BuildingTypeDTO>();
for (BuildingType building : buildings) {
BuildingTypeDTO buildingType2 = new BuildingTypeDTO(building.getId(), building.getName());
Set<BuildingLevel> levels = building.getLevels();
ResourceValue costs = new ResourceValue();
for (BuildingLevel level : levels) {
if (level.getLevel() == 1) {
costs = level.getBuildCosts();
}
}
buildingType2.setCosts(
new ResourceValueDTO(costs.getAmount_gold(), costs.getAmount_wood(), costs.getAmount_stone(),
costs.getAmount_crops()));
availableBuildings.add(buildingType2);
}
model.addAttribute("buildings", availableBuildings);
model.addAttribute("baseId", baseId);
model.addAttribute("position", position);
model.addAttribute("message", new String("Build progress started"));
return "build";
}
// ResourceValue resources = player.getResources();
ArrayList<BuildingTypeDTO> availableBuildings = new ArrayList<BuildingTypeDTO>();
for (BuildingType building : buildings) {
BuildingTypeDTO buildingType = new BuildingTypeDTO(building.getId(), building.getName());
Set<BuildingLevel> levels = building.getLevels();
ResourceValue costs = new ResourceValue();
for (BuildingLevel level : levels) {
if (level.getLevel() == 1) {
costs = level.getBuildCosts();
}
}
buildingType.setCosts(
new ResourceValueDTO(costs.getAmount_gold(), costs.getAmount_wood(), costs.getAmount_stone(),
costs.getAmount_crops()));
availableBuildings.add(buildingType);
}
model.addAttribute("buildings", availableBuildings);
model.addAttribute("baseId", baseId);
model.addAttribute("position", position);
model.addAttribute("message", new String(""));
return "build";
}
@RequestMapping(value = "/", method = RequestMethod.GET)
@Transactional("swag49.map")
public String getHomeview(@RequestParam(value = "xLow", defaultValue = "-1") int x_low,
@RequestParam(value = "yLow", defaultValue = "-1") int y_low,
@RequestParam(value = "xHigh", defaultValue = "-1") int x_high,
@RequestParam(value = "yHigh", defaultValue = "-1") int y_high, Model model,
Map<String, Object> tempMap) {
lazyInit();
if (!loggedIn())
return "redirect:" + nodeContext.getUserNodeUrl() + "/swag/user/";
tempMap.put("userID", this.userID);
if (userID == null) {
tempMap.put("userNode", nodeContext.getUserNodeUrl() + "/swag/user/");
return "home";
}
//TODO: besser machen
player = playerDAO.get(player.getId());
map = mapDAO.get(map.getId());
//default values
if ((x_low == x_high && y_low == y_high && y_low == x_low && x_low == -1)
) {
//focus on home base
Base homeBase = null;
if (player.getOwns() != null && !player.getOwns().isEmpty()) {
for (Base base : player.getOwns()) {
if (base.isHome()) {
homeBase = base;
break;
}
}
x_low = Math.max(0, homeBase.getLocatedOn().getId().getX() - VIEWSIZE);
x_high = x_low + 2 * VIEWSIZE;
if (x_high > mapLength) {
x_high = mapLength;
x_low = Math.max(0, x_high - 2 * VIEWSIZE);
}
y_low = Math.max(0, homeBase.getLocatedOn().getId().getY() - VIEWSIZE);
y_high = y_low + 2 * VIEWSIZE;
if (y_high > mapLength) {
y_high = mapLength;
y_low = Math.max(0, y_high - 2 * VIEWSIZE);
}
} else {
x_low = 0;
y_low = 0;
x_high = 2 * VIEWSIZE;
y_high = 2 * VIEWSIZE;
}
}
//mind 2* viewsize als ansichtsgroesze
if ((x_high - x_low) < (2 * VIEWSIZE)) {
x_high = x_low + 2 * VIEWSIZE;
if (x_high > mapLength) {
x_high = mapLength;
x_low = Math.max(0, x_high - 2 * VIEWSIZE);
}
}
if ((y_high - y_low) < (2 * VIEWSIZE)) {
y_high = y_low + 2 * VIEWSIZE;
if (y_high > mapLength) {
y_high = mapLength;
y_low = Math.max(0, y_high - 2 * VIEWSIZE);
}
}
model.addAttribute("xLow", x_low);
model.addAttribute("yLow", y_low);
model.addAttribute("xHigh", x_high);
model.addAttribute("yHigh", y_high);
ArrayList<ArrayList<TileOverviewDTO>> displayedTiles = new ArrayList<ArrayList<TileOverviewDTO>>();
// get all visible tiles
Tile.Id id = new Tile.Id(map.getId(), 0, 0);
for (int y = y_low; y <= y_high; y++) {
ArrayList<TileOverviewDTO> currentRow = new ArrayList<TileOverviewDTO>();
for (int x = x_low; x <= x_high; x++) {
id.setX(x);
id.setY(y);
Tile tile = tileDAO.get(id);
if (tile != null) {
TileOverviewDTO dto = new TileOverviewDTO(tile.getId().getX(), tile.getId().getY());
dto.setSpecialResource(swag49.transfer.model.ResourceType.values()[tile.getSpecial().ordinal()]);
// create info
String toolTip = createToolTip(tile);
dto.setInfo(toolTip);
if (tile.getBase() != null)
dto.setHasBase(true);
else
dto.setHasBase(false);
if (checkForEnemyTerritory(tile))
dto.setEnemyTerritory(true);
else
dto.setEnemyTerritory(false);
if (tile.getTroops().isEmpty())
dto.setHasTroops(false);
else
dto.setHasTroops(true);
currentRow.add(dto);
}
}
displayedTiles.add(currentRow);
}
// model.addAttribute("amount_gold", player.getResources().getAmount_gold());
// model.addAttribute("amount_wood", player.getResources().getAmount_wood());
// model.addAttribute("amount_stone", player.getResources().getAmount_stone());
// model.addAttribute("amount_crops", player.getResources().getAmount_crops());
ResourceValue amountValue = player.getResources();
ResourceValue incomeValue = player.getIncome();
ResourceValue upkeepValue = player.getUpkeep();
ResourceTableDTO resourceTable = new ResourceTableDTO();
resourceTable.setAmount(amountValue);
resourceTable.setIncome(incomeValue);
resourceTable.setUpkeep(upkeepValue);
model.addAttribute("tiles", displayedTiles);
model.addAttribute("resources", resourceTable);
return "home";
}
@RequestMapping(value = "/mapoverview", method = RequestMethod.GET)
@Transactional("swag49.map")
public String getMapOverview(@RequestParam(value = "xLow", defaultValue = "-1") int x_low,
@RequestParam(value = "yLow", defaultValue = "-1") int y_low,
@RequestParam(value = "xHigh", defaultValue = "-1") int x_high,
@RequestParam(value = "yHigh", defaultValue = "-1") int y_high, Model model) {
lazyInit();
if (!loggedIn())
return "redirect:" + nodeContext.getUserNodeUrl() + "/swag/user/";
//TODO: besser machen
player = playerDAO.get(player.getId());
map = mapDAO.get(map.getId());
//default values
if ((x_low == x_high && y_low == y_high && y_low == x_low && x_low == -1)
) {
//focus on home base
Base homeBase = null;
if (player.getOwns() != null && !player.getOwns().isEmpty()) {
for (Base base : player.getOwns()) {
if (base.isHome()) {
homeBase = base;
break;
}
}
x_low = Math.max(0, homeBase.getLocatedOn().getId().getX() - VIEWSIZE);
x_high = x_low + 2 * VIEWSIZE;
if (x_high > mapLength) {
x_high = mapLength;
x_low = Math.max(0, x_high - 2 * VIEWSIZE);
}
y_low = Math.max(0, homeBase.getLocatedOn().getId().getY() - VIEWSIZE);
y_high = y_low + 2 * VIEWSIZE;
if (y_high > mapLength) {
y_high = mapLength;
y_low = Math.max(0, y_high - 2 * VIEWSIZE);
}
} else {
x_low = 0;
y_low = 0;
x_high = 2 * VIEWSIZE;
y_high = 2 * VIEWSIZE;
}
}
//mind 2* viewsize als ansichtsgroesze
if ((x_high - x_low) < (2 * VIEWSIZE)) {
x_high = x_low + 2 * VIEWSIZE;
if (x_high > mapLength) {
x_high = mapLength;
x_low = Math.max(0, x_high - 2 * VIEWSIZE);
}
}
if ((y_high - y_low) < (2 * VIEWSIZE)) {
y_high = y_low + 2 * VIEWSIZE;
if (y_high > mapLength) {
y_high = mapLength;
y_low = Math.max(0, y_high - 2 * VIEWSIZE);
}
}
model.addAttribute("xLow", x_low);
model.addAttribute("yLow", y_low);
model.addAttribute("xHigh", x_high);
model.addAttribute("yHigh", y_high);
ArrayList<ArrayList<TileOverviewDTO>> displayedTiles = new ArrayList<ArrayList<TileOverviewDTO>>();
// get all visible tiles
Tile.Id id = new Tile.Id(map.getId(), 0, 0);
for (int y = y_low; y <= y_high; y++) {
ArrayList<TileOverviewDTO> currentRow = new ArrayList<TileOverviewDTO>();
for (int x = x_low; x <= x_high; x++) {
id.setX(x);
id.setY(y);
Tile tile = tileDAO.get(id);
if (tile != null) {
TileOverviewDTO dto = new TileOverviewDTO(tile.getId().getX(), tile.getId().getY());
dto.setSpecialResource(swag49.transfer.model.ResourceType.values()[tile.getSpecial().ordinal()]);
String toolTip = createToolTip(tile);
dto.setInfo(toolTip);
if (tile.getBase() != null)
dto.setHasBase(true);
else
dto.setHasBase(false);
if (checkForEnemyTerritory(tile))
dto.setEnemyTerritory(true);
else
dto.setEnemyTerritory(false);
if (tile.getTroops().isEmpty())
dto.setHasTroops(false);
else
dto.setHasTroops(true);
currentRow.add(dto);
}
}
displayedTiles.add(currentRow);
}
model.addAttribute("tiles", displayedTiles);
return "mapoverview";
}
private String createToolTip(Tile tile) {
StringBuilder sb = new StringBuilder();
// check if base
if (tile.getBase() != null) {
if (!tile.getBase().getOwner().getId().equals(player.getId())) {
sb.append("Enemy base owned by ");
sb.append(tile.getBase().getOwner().getUserId());
} else {
sb.append("Your base!");
}
} else if (!tile.getTroops().isEmpty()) { // check for troops
int strength = 0;
int defense = 0;
for (Troop troop : tile.getTroops()) {
strength += troop.getIsOfLevel().getStrength();
defense += troop.getIsOfLevel().getDefense();
}
if (tile.getTroops().iterator().next().getOwner().getId().equals(player.getId())) {
sb.append("Your troops! Strength: ");
sb.append(strength);
sb.append(" , Defense: ");
sb.append(defense);
} else {
sb.append("Enemy troops! Strength: ");
sb.append(strength);
sb.append(" , Defense: ");
sb.append(defense);
}
}
// check for special resources
if (tile.getSpecial() != ResourceType.NONE) {
sb.append("Special Resource: ");
sb.append(tile.getSpecial().toString());
}
if (sb.length() == 0) {
sb.append("Empty Tile...");
}
return sb.toString();
}
@RequestMapping(value = "/playerresources", method = RequestMethod.GET)
@Transactional("swag49.map")
public String getPlayerResources(Model model) {
lazyInit();
if (player == null) {
logger.info("no player yet set, not refreshing resources");
return null;
}
//TODO: besser machen
player = playerDAO.get(player.getId());
map = mapDAO.get(map.getId());
ResourceValue amountValue = player.getResources();
ResourceValue incomeValue = player.getIncome();
ResourceValue upkeepValue = player.getUpkeep();
ResourceTableDTO resourceTable = new ResourceTableDTO();
resourceTable.setAmount(amountValue);
resourceTable.setIncome(incomeValue);
resourceTable.setUpkeep(upkeepValue);
model.addAttribute("resources", resourceTable);
return "playerresources";
}
private boolean checkForEnemyTerritory(Tile tile) {
return tile.getBase() != null && tile.getBase().getOwner() != player ||
!tile.getTroops().isEmpty() && tile.getTroops().iterator().next().getOwner() != player;
}
@RequestMapping(value = "/logoutPlayer", method = RequestMethod.GET)
@Transactional("swag49.map")
public String logoutPlayer(SessionStatus status) {
// close session for player
status.setComplete();
Player player = playerDAO.get(this.player.getId());
player.setOnline(false);
playerDAO.update(player);
this.userID = null;
return "redirect:" + nodeContext.getUserNodeUrl() + "/swag/user/";
}
}