package com.hearthattack;
import com.protos.HAOutboundProto;
import com.protos.CardProto;
import com.protos.DeckProto;
import com.protos.HeroProto;
import com.protos.MinionProto;
import com.protos.PlayerModelProto;
import com.protos.WeaponProto;
import com.hearthsim.util.HearthAction;
import com.hearthsim.util.HearthActionBoardPair;
import com.hearthsim.model.BoardModel;
import com.hearthsim.model.PlayerModel;
import com.hearthsim.model.PlayerSide;
import com.hearthsim.card.Deck;
import com.hearthsim.card.minion.Minion;
import com.hearthsim.card.Card;
import com.hearthsim.card.CharacterIndex;
import com.hearthsim.card.minion.Hero;
import com.hearthsim.card.weapon.WeaponCard;
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.InputStreamReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
public class Messenger {
HAOutboundProto.MoveList.Builder msg = HAOutboundProto.MoveList.newBuilder();
FileOutputStream output;
public Messenger() throws FileNotFoundException {
output = new FileOutputStream("default.log");
}
public Messenger(String arg) throws FileNotFoundException {
output = new FileOutputStream(arg);
}
public void send(List<ArrayList<HearthActionBoardPair>> moveSet) throws IOException {
msg.clear();
HAOutboundProto.HABP val;
HAOutboundProto.MoveList.HABPList.Builder move = HAOutboundProto.MoveList.HABPList.newBuilder();
for(int i = 0; i < moveSet.size(); i++) {
move.clear();
for(int j = 0; j < moveSet.get(i).size(); j++) {
val = this.convertABP(moveSet.get(i).get(j));
move.addActionBoardPair(val);
}
msg.addMove(move.build());
}
System.out.println(msg.build().toString());
}
public HAOutboundProto.HABP convertABP(HearthActionBoardPair abp) {
HAOutboundProto.HABP.Builder ret = HAOutboundProto.HABP.newBuilder();
ret.setBoard(this.convertBoard(abp.board));
if(abp.action == null)
System.out.println("NULL");
ret.setAction(this.convertAction(abp.action));
return ret.build();
}
public HAOutboundProto.Board convertBoard(BoardModel board) {
HAOutboundProto.Board.Builder ret = HAOutboundProto.Board.newBuilder();
ret.setCurrentPlayer(this.convertPlayer(board.getCurrentPlayer()));
ret.setWaitingPlayer(this.convertPlayer(board.getWaitingPlayer()));
return ret.build();
}
public HAOutboundProto.Action convertAction(HearthAction action) {
HAOutboundProto.Action.Builder ret = HAOutboundProto.Action.newBuilder();
try{
ret.setVerb(this.convertVerb(action.verb_));
ret.setActionPerformerPlayerSide(this.convertPlayerSide(action.getAPPS()));
ret.setCardOrCharacterIndex(action.getIndex());
ret.setTargetPlayerSide(this.convertPlayerSide(action.getTPS()));
ret.setTargetCharacterIndex(this.convertCharIndex(action.targetCharacterIndex));
}
catch (NullPointerException e) {
ret.setVerb(this.convertVerb(HearthAction.Verb.DO_NOT_USE_CARD));
ret.setActionPerformerPlayerSide(this.convertPlayerSide(PlayerSide.CURRENT_PLAYER));
ret.setCardOrCharacterIndex(0);
ret.setTargetPlayerSide(this.convertPlayerSide(PlayerSide.WAITING_PLAYER));
ret.setTargetCharacterIndex(this.convertCharIndex(CharacterIndex.fromInteger(0)));
}
return ret.build();
}
public PlayerModelProto.PlayerModel convertPlayer(PlayerModel player) {
PlayerModelProto.PlayerModel.Builder ret = PlayerModelProto.PlayerModel.newBuilder();
ret.setName(player.getName());
ret.setPlayerId(player.getPlayerId());
ret.setHero(this.convertHero(player.getHero()));
ret.setDeck(this.convertDeck(player.getDeck()));
ret.setMana(player.getMana());
ret.setMaxMana(player.getMaxMana());
ret.setDeckPos(player.getDeckPos());
ret.setFatigueDamage(player.getFatigueDamage());
for(Minion minion : player.getMinions()) {
ret.addMinions(this.convertMinion(minion));
}
for(Card card : player.getHand()) {
ret.addHand(this.convertCard(card));
}
ret.setOverload(player.getOverload());
ret.setNumCardsUsed(player.getNumCardsUsed());
return ret.build();
}
public HeroProto.Hero convertHero(Hero hero) {
HeroProto.Hero.Builder ret = HeroProto.Hero.newBuilder();
ret.setWeapon(this.convertWeapon(hero.getWeapon()));
ret.setArmor(hero.getArmor());
ret.setMinion(this.convertMinion(hero));
return ret.build();
}
public WeaponProto.Weapon convertWeapon(WeaponCard weapon) {
WeaponProto.Weapon.Builder ret = WeaponProto.Weapon.newBuilder();
ret.setName(weapon.getName());
ret.setDurability(weapon.getWeaponCharge());
ret.setAttack(weapon.getWeaponDamage());
return ret.build();
}
public DeckProto.Deck convertDeck(Deck deck) {
DeckProto.Deck.Builder ret = DeckProto.Deck.newBuilder();
for(Card card : deck.getDeck()) {
ret.addCards(this.convertCard(card));
}
return ret.build();
}
public MinionProto.Minion convertMinion(Minion minion) {
MinionProto.Minion.Builder ret = MinionProto.Minion.newBuilder();
ret.setTaunt(minion.getTaunt());
ret.setDivineShield(minion.getDivineShield());
ret.setWindfury(minion.getWindfury());
ret.setCharge(minion.getCharge());
ret.setImmune(minion.getImmune());
ret.setHasAttacked(minion.hasAttacked());
ret.setHasWindfuryAttacked(minion.hasWindFuryAttacked());
ret.setFrozen(minion.getFrozen());
ret.setSilenced(minion.isSilenced());
ret.setStealthedUntilRevealed(minion.getStealthedUntilRevealed());
ret.setStealthedUntilNextTurn(minion.getStealthedUntilNextTurn());
ret.setHeroTargetable(minion.isHeroTargetable());
ret.setHealth(minion.getHealth());
ret.setMaxHealth(minion.getMaxHealth());
ret.setAuraHealth(minion.getAuraHealth());
ret.setAttack(minion.getBaseAttack());
ret.setExtraAttackUntilTurnEnd(minion.getExtraAttackUntilTurnEnd());
ret.setAuraAttack(minion.getAuraAttack());
ret.setDestroyOnTurnStart(minion.getDestroyOnTurnStart());
ret.setDestroyOnTurnEnd(minion.getDestroyOnTurnEnd());
ret.setSpellDamage(minion.getSpellDamage());
ret.setCantAttack(!minion.canAttack());//ADD SHIT
ret.setTribe(this.convertTribe(minion.getTribe()));
ret.setCard(this.convertCard(minion));
ret.setTurnPlayed(0);
return ret.build();
}
public CardProto.Card convertCard(Card card) {
CardProto.Card.Builder ret = CardProto.Card.newBuilder();
ret.setHasBeenUsed(card.hasBeenUsed());
ret.setInHand(card.setInHand());
ret.setName(card.getName());
return ret.build();
}
public HAOutboundProto.Action.Verb convertVerb(HearthAction.Verb verb) {
switch (verb) {
case USE_CARD :
return HAOutboundProto.Action.Verb.USE_CARD;
case HERO_ABILITY :
return HAOutboundProto.Action.Verb.HERO_ABILITY;
case ATTACK :
return HAOutboundProto.Action.Verb.ATTACK;
case UNTARGETABLE_BATTLECRY :
return HAOutboundProto.Action.Verb.UNTARGETABLE_BATTLECRY;
case TARGETABLE_BATTLECRY :
return HAOutboundProto.Action.Verb.TARGETABLE_BATTLECRY;
case START_TURN :
return HAOutboundProto.Action.Verb.START_TURN;
case END_TURN :
return HAOutboundProto.Action.Verb.END_TURN;
case DO_NOT_USE_CARD :
return HAOutboundProto.Action.Verb.DO_NOT_USE_CARD;
case DO_NOT_ATTACK :
return HAOutboundProto.Action.Verb.DO_NOT_ATTACK;
case DO_NOT_USE_HEROPOWER :
return HAOutboundProto.Action.Verb.DO_NOT_USE_HEROPOWER;
case RNG :
return HAOutboundProto.Action.Verb.RNG;
case DRAW_CARDS :
return HAOutboundProto.Action.Verb.DRAW_CARDS;
default :
return HAOutboundProto.Action.Verb.RNG;
}
}
public HAOutboundProto.Action.PlayerSide convertPlayerSide(PlayerSide side) {
switch (side) {
case CURRENT_PLAYER :
return HAOutboundProto.Action.PlayerSide.CURRENT_PLAYER;
case WAITING_PLAYER :
return HAOutboundProto.Action.PlayerSide.WAITING_PLAYER;
}
return HAOutboundProto.Action.PlayerSide.WAITING_PLAYER;
}
public HAOutboundProto.Action.CharacterIndex convertCharIndex(CharacterIndex index) {
switch (index) {
case HERO :
return HAOutboundProto.Action.CharacterIndex.HERO;
case MINION_1 :
return HAOutboundProto.Action.CharacterIndex.MINION_1;
case MINION_2 :
return HAOutboundProto.Action.CharacterIndex.MINION_2;
case MINION_3 :
return HAOutboundProto.Action.CharacterIndex.MINION_3;
case MINION_4 :
return HAOutboundProto.Action.CharacterIndex.MINION_4;
case MINION_5 :
return HAOutboundProto.Action.CharacterIndex.MINION_5;
case MINION_6 :
return HAOutboundProto.Action.CharacterIndex.MINION_6;
case MINION_7 :
return HAOutboundProto.Action.CharacterIndex.MINION_7;
case MINION_8 :
return HAOutboundProto.Action.CharacterIndex.MINION_8;
case MINION_9 :
return HAOutboundProto.Action.CharacterIndex.MINION_9;
case UNKNOWN :
return HAOutboundProto.Action.CharacterIndex.UNKNOWN;
}
return HAOutboundProto.Action.CharacterIndex.UNKNOWN;
}
public MinionProto.Minion.Tribe convertTribe(Minion.MinionTribe tribe) {
switch (tribe) {
case NONE :
return MinionProto.Minion.Tribe.NONE;
case BEAST :
return MinionProto.Minion.Tribe.BEAST;
case MECH :
return MinionProto.Minion.Tribe.MECH;
case MURLOC :
return MinionProto.Minion.Tribe.MURLOC;
case PIRATE :
return MinionProto.Minion.Tribe.PIRATE;
case DEMON :
return MinionProto.Minion.Tribe.DEMON;
case DRAGON :
return MinionProto.Minion.Tribe.DRAGON;
case TOTEM :
return MinionProto.Minion.Tribe.TOTEM;
}
return MinionProto.Minion.Tribe.NONE;
}
}