/*******************************************************************************
* Copyright 2015 Maximilian Stark | Dakror <mail@dakror.de>
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
******************************************************************************/
package de.dakror.arise.server;
import de.dakror.arise.battlesim.Army;
import de.dakror.arise.battlesim.BattleResult;
import de.dakror.arise.battlesim.BattleSimulator;
import de.dakror.arise.net.Server;
import de.dakror.arise.net.User;
import de.dakror.arise.net.packet.Packet05Resources;
import de.dakror.arise.net.packet.Packet18BattleResult;
import de.dakror.arise.net.packet.Packet19Transfer;
import de.dakror.arise.net.packet.Packet20Takeover;
import de.dakror.arise.server.data.TransferData;
import de.dakror.arise.settings.CFG;
import de.dakror.arise.settings.Resources;
import de.dakror.arise.settings.TroopType;
/**
* @author Dakror
*/
public class TransferExecutor {
public static void execute(TransferData data) throws Exception {
switch (data.type) {
case TROOPS_ATTACK: {
executeTroopAttack(data);
break;
}
case TROOPS_FRIEND: {
for (TroopType type : TroopType.values())
DBManager.addCityTroops(data.cityToId, type, data.value.get(type.getType()), false);
User recOwner = Server.currentServer.getUserForId(DBManager.getUserIdForCityId(data.cityToId));
if (recOwner != null) Server.currentServer.sendPacket(new Packet05Resources(data.cityToId, DBManager.getCityResources(data.cityToId)), recOwner);
break;
}
default:
CFG.p("Couldn't execute action for TransferType " + data.type.name());
break;
}
}
public static void executeTroopAttack(final TransferData transferData) {
new Thread() {
@Override
public void run() {
Army att = new Army(true, transferData.value);
Army def = new Army(false, DBManager.getCityResources(transferData.cityToId));
BattleResult br = BattleSimulator.simulateBattle(att, def);
Server.out(br.toString(transferData.cityFromId, transferData.cityToId));
Packet19Transfer transferBack = null;
if (br.isAttackers()) {
DBManager.resetCityArmy(transferData.cityToId); // losers lose everything
Resources alive = new Resources(transferData.value.getBinaryData());
alive.add(Resources.mul(br.getDead(), -1));
transferBack = DBManager.transferAttackTroopsBackHome(transferData.cityToId, transferData.cityFromId, alive); // winning attackers get sent back home
} else {
for (TroopType t : TroopType.values())
DBManager.addCityTroops(transferData.cityToId, t, -br.getDead().get(t.getType()), false); // winner is defending city, their deads get subtracted here
}
try {
String ac = DBManager.getCityNameForId(transferData.cityFromId);
String dc = DBManager.getCityNameForId(transferData.cityToId);
int attUserId = DBManager.getUserIdForCityId(transferData.cityFromId);
User attOwner = Server.currentServer.getUserForId(attUserId);
User defOwner = Server.currentServer.getUserForId(DBManager.getUserIdForCityId(transferData.cityToId));
if (br.isAttackers()) {
Packet20Takeover p20 = DBManager.handleTakeover(transferData.cityToId, transferData.cityFromId, attUserId, new Army(true, transferData.value));
if (attOwner != null) {
if (!p20.isCityTakenOver()) Server.currentServer.sendPacket(p20, attOwner);
if (transferBack != null) Server.currentServer.sendPacket(transferBack, attOwner);
}
if (defOwner != null) {
if (!p20.isCityTakenOver()) Server.currentServer.sendPacket(p20, defOwner);
if (transferBack != null) Server.currentServer.sendPacket(transferBack, defOwner);
}
if (p20.isCityTakenOver()) Server.currentServer.sendPacketToAllClientsOnWorld(p20, DBManager.getWorldIdForCityId(transferData.cityFromId));
}
if (attOwner != null)
Server.currentServer.sendPacket(new Packet18BattleResult(br.isAttackers(), false, br.isAttackers() ? (int) br.getDead().getLength() : 0, ac, dc,
attOwner.getUsername(), attOwner.getUsername()), attOwner); // to
// attacker
if (defOwner != null)
Server.currentServer.sendPacket(new Packet18BattleResult(!br.isAttackers(), true, !br.isAttackers() ? (int) br.getDead().getLength() : 0, ac, dc,
attOwner.getUsername(), defOwner.getUsername()), defOwner); // to
// defender
} catch (Exception e) {
e.printStackTrace();
}
}
}.start();
}
}