/*
* Copyright 2014 The Skfiy Open Association.
*
* 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 org.skfiy.typhon.action;
import java.util.List;
import javax.inject.Inject;
import org.skfiy.typhon.annotation.Action;
import org.skfiy.typhon.domain.Bag;
import org.skfiy.typhon.domain.Bag.Node;
import org.skfiy.typhon.domain.ITroop;
import org.skfiy.typhon.domain.Player;
import org.skfiy.typhon.domain.Troop;
import org.skfiy.typhon.domain.item.TroopItem;
import org.skfiy.typhon.packet.MultipleValue;
import org.skfiy.typhon.packet.Namespaces;
import org.skfiy.typhon.packet.Packet;
import org.skfiy.typhon.packet.PacketError;
import org.skfiy.typhon.packet.SingleValue;
import org.skfiy.typhon.packet.TroopPacket;
import org.skfiy.typhon.packet.TroopStrengPacket;
import org.skfiy.typhon.session.SessionUtils;
import org.skfiy.typhon.spi.troop.TroopProvider;
/**
*
* @author Kevin Zou <kevinz@skfiy.org>
*/
public class TroopAction {
@Inject
private TroopProvider troopProvider;
@Action(Namespaces.TROOP_STRENG)
public void troopStreng(TroopStrengPacket packet) {
Player player = SessionUtils.getPlayer();
List<Integer> intensities = packet.getIntensities();
for (int pos : intensities) {
Node node = player.getBag().findNode(pos);
if (node == null) {
PacketError error = PacketError.createResult(packet, PacketError.Condition.conflict);
error.setText("Not found item[" + pos + "]/count is not enough");
player.getSession().write(error);
return;
}
}
troopProvider.rise(packet);
}
@Action(Namespaces.TROOP_HARDEN)
public void harden(SingleValue packet) {
troopProvider.harden(packet);
}
@Action(Namespaces.TROOP_RESOLVE)
public void resolve(MultipleValue packet) {
troopProvider.resolve(packet);
}
@Action(Namespaces.TROOP_EQUIP)
public void equip(TroopPacket packet) {
Player player = SessionUtils.getPlayer();
Node node = player.getBag().findNode(packet.getPos());
if (node == null) {
PacketError error = PacketError.createResult(packet, PacketError.Condition.item_not_found);
player.getSession().write(error);
return;
}
TroopItem troopItem = node.getItem();
if (troopItem.getActiveType() != null) {
PacketError error = PacketError.createResult(packet, PacketError.Condition.conflict);
error.setText("Actived");
player.getSession().write(error);
return;
}
ITroop.Type troopType = ITroop.Type.valueOf(packet.getCasernType());
Troop troop = player.getNormal().getTroop(troopType);
if (troop.isFull()) {
PacketError error = PacketError.createResult(packet, PacketError.Condition.conflict);
error.setText("IsFull");
player.getSession().write(error);
return;
}
boolean sameType = isSameType(troopItem, player.getBag(), troop.getFirst())
|| isSameType(troopItem, player.getBag(), troop.getSecond())
|| isSameType(troopItem, player.getBag(), troop.getThird())
|| isSameType(troopItem, player.getBag(), troop.getFour())
|| isSameType(troopItem, player.getBag(), troop.getFive());
if (sameType) {
PacketError error = PacketError.createResult(packet, PacketError.Condition.conflict);
error.setText("Same Type");
player.getSession().write(error);
return;
}
//==========================================================================================
boolean success = false;
switch (packet.getTarget()) {
case 1:
if (troop.getFirst() <= 0) {
troop.setFirst(packet.getPos());
success = true;
}
break;
case 2:
if (troop.getSecond() <= 0) {
troop.setSecond(packet.getPos());
success = true;
}
break;
case 3:
if (troop.getThird() <= 0) {
troop.setThird(packet.getPos());
success = true;
}
break;
case 4:
if (troop.getFour() <= 0) {
troop.setFour(packet.getPos());
success = true;
}
break;
case 5:
if (troop.getFive() <= 0) {
troop.setFive(packet.getPos());
success = true;
}
break;
}
if (!success) {
PacketError error = PacketError.createResult(packet, PacketError.Condition.conflict);
error.setText("Not success");
player.getSession().write(error);
return;
}
troopItem.setActiveType(troopType);
player.getSession().write(Packet.createResult(packet));
troopProvider.calculateTroopProps(player);
}
/**
*
* @param packet
*/
@Action(Namespaces.TROOP_UNEQUIP)
public void unequip(TroopPacket packet) {
Player player = SessionUtils.getPlayer();
Troop troop = player.getNormal().getTroop(ITroop.Type.valueOf(packet.getCasernType()));
int pos = 0;
boolean success = false;
switch (packet.getTarget()) {
case 1:
if (troop.getFirst() > 0) {
pos = troop.getFirst();
troop.setFirst(0);
success = true;
}
break;
case 2:
if (troop.getSecond() > 0) {
pos = troop.getSecond();
troop.setSecond(0);
success = true;
}
break;
case 3:
if (troop.getThird() > 0) {
pos = troop.getThird();
troop.setThird(0);
success = true;
}
break;
case 4:
if (troop.getFour() > 0) {
pos = troop.getFour();
troop.setFour(0);
success = true;
}
break;
case 5:
if (troop.getFive() > 0) {
pos = troop.getFive();
troop.setFive(0);
success = true;
}
break;
}
if (!success) {
PacketError error = PacketError.createResult(packet, PacketError.Condition.conflict);
error.setText("Not success");
player.getSession().write(error);
return;
}
Node node = player.getBag().findNode(pos);
TroopItem troopItem = node.getItem();
troopItem.setActiveType(null);
player.getSession().write(Packet.createResult(packet));
troopProvider.calculateTroopProps(player);
}
private boolean isSameType(TroopItem troopItem, Bag bag, int pos) {
Node n = bag.findNode(pos);
return (n != null && troopItem.getItemDobj().getPrimary()
== ((TroopItem) n.getItem()).getItemDobj().getPrimary());
}
}