project_files/Android-build/SDL-android-project/src/org/hedgewars/hedgeroid/netplay/Netplay.java
changeset 7485 0481bd74267c
parent 7476 2fb781bbdd51
child 7508 763d3961400b
--- a/project_files/Android-build/SDL-android-project/src/org/hedgewars/hedgeroid/netplay/Netplay.java	Sun Aug 12 22:37:57 2012 +0200
+++ b/project_files/Android-build/SDL-android-project/src/org/hedgewars/hedgeroid/netplay/Netplay.java	Sun Aug 12 22:46:23 2012 +0200
@@ -2,10 +2,13 @@
 
 import java.io.File;
 import java.io.FileNotFoundException;
+import java.util.Map;
+import java.util.TreeMap;
 
 import org.hedgewars.hedgeroid.R;
 import org.hedgewars.hedgeroid.Utils;
 import org.hedgewars.hedgeroid.Datastructures.RoomlistRoom;
+import org.hedgewars.hedgeroid.Datastructures.Team;
 import org.hedgewars.hedgeroid.Datastructures.TeamInGame;
 import org.hedgewars.hedgeroid.Datastructures.TeamIngameAttributes;
 import org.hedgewars.hedgeroid.frontlib.Flib;
@@ -82,6 +85,7 @@
 	public final MessageLog lobbyChatlog;
 	public final MessageLog roomChatlog;
 	public final Teamlist roomTeamlist = new Teamlist();
+	private final Map<String, Team> roomRequestedTeams = new TreeMap<String, Team>();
 	
 	public Netplay(Context appContext) {
 		this.appContext = appContext;
@@ -133,6 +137,13 @@
 	public void sendCreateRoom(String name) { sendToNet(ThreadedNetConnection.ToNetHandler.MSG_SEND_CREATE_ROOM, name); }
 	public void sendLeaveRoom(String message) { sendToNet(ThreadedNetConnection.ToNetHandler.MSG_SEND_LEAVE_ROOM, message); }
 	public void sendKick(String player) { sendToNet(ThreadedNetConnection.ToNetHandler.MSG_SEND_KICK, player); }
+	public void sendAddTeam(Team newTeam) {
+		roomRequestedTeams.put(newTeam.name, newTeam);
+		sendToNet(ThreadedNetConnection.ToNetHandler.MSG_SEND_ADD_TEAM, newTeam);
+	}
+	public void sendRemoveTeam(String teamName) { sendToNet(ThreadedNetConnection.ToNetHandler.MSG_SEND_REMOVE_TEAM, teamName); }
+	public void sendTeamColorIndex(String teamName, int colorIndex) { sendToNet(ThreadedNetConnection.ToNetHandler.MSG_SEND_TEAM_COLOR_INDEX, colorIndex, teamName); }
+	public void sendTeamHogCount(String teamName, int hogCount) { sendToNet(ThreadedNetConnection.ToNetHandler.MSG_SEND_TEAM_HOG_COUNT, hogCount, teamName); }
 	
 	public void disconnect() { sendToNet(ThreadedNetConnection.ToNetHandler.MSG_DISCONNECT, "User Quit"); }
 	
@@ -202,18 +213,17 @@
 	}
 	
 	private boolean sendToNet(int what) {
-		if(connection != null) {
-			Handler handler = connection.toNetHandler;
-			return handler.sendMessage(handler.obtainMessage(what));
-		} else {
-			return false;
-		}
+		return sendToNet(what, 0, null);
 	}
 	
 	private boolean sendToNet(int what, Object obj) {
+		return sendToNet(what, 0, obj);
+	}
+	
+	private boolean sendToNet(int what, int arg1, Object obj) {
 		if(connection != null) {
 			Handler handler = connection.toNetHandler;
-			return handler.sendMessage(handler.obtainMessage(what, obj));
+			return handler.sendMessage(handler.obtainMessage(what, arg1, 0, obj));
 		} else {
 			return false;
 		}
@@ -338,6 +348,7 @@
 				roomChatlog.clear();
 				roomPlayerlist.clear();
 				roomTeamlist.clear();
+				roomRequestedTeams.clear();
 				changeState(State.ROOM);
 				chief = (Boolean)msg.obj;
 				Intent intent = new Intent(ACTION_ENTERED_ROOM_FROM_LOBBY);
@@ -358,7 +369,14 @@
 				break;
 			}
 			case MSG_TEAM_ADDED: {
-				roomTeamlist.addTeamWithNewId((TeamInGame)msg.obj);
+				Team newTeam = (Team)msg.obj;
+				TeamIngameAttributes attrs = new TeamIngameAttributes(playerName, roomTeamlist.getUnusedOrRandomColorIndex(), TeamIngameAttributes.DEFAULT_HOG_COUNT, false);
+				TeamInGame tig = new TeamInGame(newTeam, attrs);
+				roomTeamlist.addTeamWithNewId(tig);
+				if(chief) {
+					sendTeamColorIndex(newTeam.name, attrs.colorIndex);
+					sendTeamHogCount(newTeam.name, attrs.hogCount);
+				}
 				break;
 			}
 			case MSG_TEAM_DELETED: {
@@ -366,7 +384,18 @@
 				break;
 			}
 			case MSG_TEAM_ACCEPTED: {
-				// TODO depends: adding teams
+				Team requestedTeam = roomRequestedTeams.remove(msg.obj);
+				if(requestedTeam!=null) {
+					TeamIngameAttributes attrs = new TeamIngameAttributes(playerName, roomTeamlist.getUnusedOrRandomColorIndex(), TeamIngameAttributes.DEFAULT_HOG_COUNT, false);
+					TeamInGame tig = new TeamInGame(requestedTeam, attrs);
+					roomTeamlist.addTeamWithNewId(tig);
+					if(chief) {
+						sendTeamColorIndex(requestedTeam.name, attrs.colorIndex);
+						sendTeamHogCount(requestedTeam.name, attrs.hogCount);
+					}
+				} else {
+					Log.e("Netplay", "Got accepted message for team that was never requested.");
+				}
 				break;
 			}
 			case MSG_TEAM_COLOR_CHANGED: {
@@ -412,7 +441,7 @@
 		private final Context appContext;
 		private final FromNetHandler fromNetHandler;
 		private final TickHandler tickHandler;
-		
+
 		/**
 		 * conn can only be null while connecting (the first thing in the thread), and directly after disconnecting,
 		 * in the same message (the looper is shut down on disconnect, so there will be no messages after that).
@@ -589,7 +618,7 @@
 		
 		private final TeamCallback teamAddedCb = new TeamCallback() {
 			public void callback(Pointer context, TeamPtr team) {
-				sendFromNet(FromNetHandler.MSG_TEAM_ADDED, team.deref());
+				sendFromNet(FromNetHandler.MSG_TEAM_ADDED, team.deref().team);
 			}
 		};
 		
@@ -674,8 +703,11 @@
 			public static final int MSG_SEND_CREATE_ROOM = 8;
 			public static final int MSG_SEND_LEAVE_ROOM = 9;
 			public static final int MSG_SEND_KICK = 10;
-			
-			public static final int MSG_DISCONNECT = 11;
+			public static final int MSG_SEND_ADD_TEAM = 11;
+			public static final int MSG_SEND_REMOVE_TEAM = 12;
+			public static final int MSG_DISCONNECT = 13;
+			public static final int MSG_SEND_TEAM_COLOR_INDEX = 14;
+			public static final int MSG_SEND_TEAM_HOG_COUNT = 15;
 			
 			public ToNetHandler(Looper looper) {
 				super(looper);
@@ -697,7 +729,7 @@
 					break;
 				}
 				case MSG_SEND_ROOMLIST_REQUEST: {
-					FLIB.flib_netconn_send_request_roomlist(conn); // TODO restrict to lobby state?
+					FLIB.flib_netconn_send_request_roomlist(conn);
 					break;
 				}
 				case MSG_SEND_PLAYER_INFO_REQUEST: {
@@ -732,11 +764,33 @@
 					FLIB.flib_netconn_send_kick(conn, (String)msg.obj);
 					break;
 				}
+				case MSG_SEND_ADD_TEAM: {
+					FLIB.flib_netconn_send_addTeam(conn, TeamPtr.createJavaOwned((Team)msg.obj));
+					break;
+				}
+				case MSG_SEND_REMOVE_TEAM: {
+					if(FLIB.flib_netconn_send_removeTeam(conn, (String)msg.obj)==0) {
+						sendFromNet(FromNetHandler.MSG_TEAM_DELETED, msg.obj);
+					}
+					break;
+				}
 				case MSG_DISCONNECT: {
 					FLIB.flib_netconn_send_quit(conn, (String)msg.obj);
 					shutdown(false, "User quit");
 					break;
 				}
+				case MSG_SEND_TEAM_COLOR_INDEX: {
+					if(FLIB.flib_netconn_send_teamColor(conn, (String)msg.obj, msg.arg1)==0) {
+						sendFromNet(FromNetHandler.MSG_TEAM_COLOR_CHANGED, msg.arg1, msg.obj);
+					}
+					break;
+				}
+				case MSG_SEND_TEAM_HOG_COUNT: {
+					if(FLIB.flib_netconn_send_teamHogCount(conn, (String)msg.obj, msg.arg1)==0) {
+						sendFromNet(FromNetHandler.MSG_HOG_COUNT_CHANGED, msg.arg1, msg.obj);
+					}
+					break;
+				}
 				default: {
 					Log.e("ToNetHandler", "Unknown message type: "+msg.what);
 					break;