package fr.utc.leapband.sma.server; import jade.core.AID; import jade.core.behaviours.Behaviour; import jade.lang.acl.ACLMessage; import jade.lang.acl.MessageTemplate; import java.io.IOException; import java.util.ArrayList; import java.util.HashMap; import java.util.Map; import javax.swing.DefaultListModel; import fr.utc.leapband.utilities.Constance; import fr.utc.leapband.utilities.MyAID; @SuppressWarnings("serial") /** * behaviour to manage a game * @author hukewei * */ public class GameManageBehaviour extends Behaviour{ private MultiPlayAgent myAgent; private ACLMessage msg = null; private AID host_name = null; private AID host_sound_name = null; private ACLMessage host_msg = null; private ArrayList<AID> list_member = new ArrayList<AID>(); private Map<AID,AID> list_member_map = new HashMap<AID,AID>(); private DefaultListModel<String> dict_player = new DefaultListModel<>(); private boolean player_changed = false; private int room_id = 0; private boolean initialize = true; private String conversation_id = null; private boolean game_over = false; public GameManageBehaviour(MultiPlayAgent myAgent, ACLMessage host_msg) { super(); this.myAgent = myAgent; this.room_id = myAgent.generateRoomId(); this.host_msg = host_msg; } @Override public void action() { MessageTemplate mt = MessageTemplate.and(MessageTemplate.or(MessageTemplate.or( MessageTemplate.MatchPerformative(ACLMessage.REQUEST), MessageTemplate.MatchPerformative(ACLMessage.SUBSCRIBE)), MessageTemplate.MatchPerformative(ACLMessage.CANCEL) ), MessageTemplate.MatchConversationId("Room" + room_id)); ACLMessage message = myAgent.receive(mt); if (message != null) { if (message.getPerformative() == ACLMessage.SUBSCRIBE) { System.out.println("asking for entering a existed room"); if (message.getContent().equals(Constance.EnterGroupMode)){ setPlayerDict(message.getSender().getName()); list_member.add(message.getSender()); list_member_map.put(message.getSender(),MyAID.toAID(message.getReplyWith())); answer_guest_ack(message); player_changed = true; } } else if (message.getPerformative() == ACLMessage.CANCEL) { System.out.println("asking for quiting a existed room"); if (message.getContent().equals(Constance.ExitGroupMode)){ removePlayerDict(message.getSender().getName()); list_member.remove(message.getSender()); list_member_map.remove(message.getSender()); player_changed = true; if (list_member.size() == 0) { game_over = true; System.out.println("game over, game manager done"); myAgent.getDict().removeElement(conversation_id); info_multiplay_users(); } else if(message.getSender().equals(host_name)){ info_multiplay_users(); //change host to the next one host_name = list_member.get(0); host_sound_name = list_member_map.get(host_name); info_all_player_change_sound_name(message); ACLMessage inform_host = new ACLMessage(ACLMessage.INFORM); inform_host.addReceiver(host_name); inform_host.setConversationId("StartVisibility"); inform_host.setContent("true"); myAgent.send(inform_host); } answer_exit_req(message); } } else if(message.getPerformative()==ACLMessage.REQUEST){ if(message.getContent().equals(Constance.START_GAME) && message.getSender().equals(host_name)){ info_all_player_start_game(message); myAgent.getDict().removeElement(conversation_id); info_multiplay_users(); } } } if(initialize){ //creat a groupe of game // int countGroup=myAgent.getDict().size(); // countGroup+=1; //update room list conversation_id = "Room"+room_id; myAgent.setDict(conversation_id); info_multiplay_users(); setPlayerDict(host_msg.getSender().getName()); //info_all_player(); list_member.add(host_msg.getSender()); list_member_map.put(host_msg.getSender(),MyAID.toAID(host_msg.getReplyWith())); host_name = host_msg.getSender(); System.out.println(host_msg.getReplyWith()); host_sound_name = MyAID.toAID(host_msg.getReplyWith()); answer_host_ack(); player_changed = true; initialize = false; } if (player_changed) { info_all_player(); player_changed = false; } } public void setPlayerDict(String item){ dict_player.addElement(item); } public void removePlayerDict(String item){ dict_player.removeElement(item); } public void answer_host_ack() { ACLMessage reply=host_msg.createReply(); reply.setPerformative(ACLMessage.CONFIRM); reply.setContent(conversation_id); System.out.println("send host ack"); myAgent.send(reply); } public void answer_guest_ack(ACLMessage message) { ACLMessage reply=message.createReply(); reply.clearAllReceiver(); reply.addReceiver(message.getSender()); reply.setPerformative(ACLMessage.CONFIRM); reply.setContent(Constance.ROOM_ENTERED); myAgent.send(reply); } public void answer_exit_req(ACLMessage message) { ACLMessage reply=message.createReply(); reply.setPerformative(ACLMessage.CONFIRM); reply.setContent(Constance.ROOM_QUITTED); myAgent.send(reply); } private void info_all_player() { ACLMessage info_player_change = new ACLMessage(ACLMessage.INFORM); for (int i = 0; i < list_member.size(); i++) { info_player_change.addReceiver(list_member.get(i)); } info_player_change.setSender(myAgent.getAID()); try { info_player_change.setContentObject(dict_player); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } info_player_change.setConversationId(Constance.MEMBER_CHANGE); myAgent.send(info_player_change); } private void info_multiplay_users(){ ACLMessage info_multiplay_users = new ACLMessage(ACLMessage.INFORM); for(int i=0; i<myAgent.getMultiPlayUsers().size();i++){ info_multiplay_users.addReceiver(myAgent.getMultiPlayUsers().get(i)); } info_multiplay_users.setSender(myAgent.getAID()); try { info_multiplay_users.setContentObject(myAgent.getDict()); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } info_multiplay_users.setConversationId("updateDICT"); myAgent.send(info_multiplay_users); } private void info_all_player_start_game(ACLMessage m) { ACLMessage info_game_start = new ACLMessage(ACLMessage.CONFIRM); for (int i = 0; i < list_member.size(); i++) { info_game_start.addReceiver(list_member.get(i)); } info_game_start.setConversationId(m.getConversationId()); info_game_start.setSender(myAgent.getAID()); MyAID sound_agent = new MyAID(host_sound_name.getName(), host_sound_name.getAddressesArray()[0]); info_game_start.setReplyWith(sound_agent.toJSON()); info_game_start.setContent(Constance.CONFIRM_START); myAgent.send(info_game_start); } private void info_all_player_change_sound_name(ACLMessage m) { ACLMessage info_sound_change = new ACLMessage(ACLMessage.CONFIRM); for (int i = 0; i < list_member.size(); i++) { info_sound_change.addReceiver(list_member.get(i)); } info_sound_change.setConversationId(m.getConversationId()); info_sound_change.setSender(myAgent.getAID()); MyAID sound_agent = new MyAID(host_sound_name.getName(), host_sound_name.getAddressesArray()[0]); info_sound_change.setReplyWith(sound_agent.toJSON()); info_sound_change.setContent(Constance.Sound_Change); myAgent.send(info_sound_change); } public void answer(){ ACLMessage reply=msg.createReply(); reply.setPerformative(ACLMessage.INFORM); //String listString=""; /*for(String s:myAgent.getDict()){ listString+=s+","; }*/ try { reply.setContentObject(myAgent.getDict()); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } myAgent.send(reply); } @Override public boolean done() { return game_over; } }