# HG changeset patch
# User unc0rr
# Date 1251827785 0
# Node ID 408edb2f254c2a60ea8b91775b88d835a5707c8b
# Parent  3b35fd5f67c77bf75378932c97a072f4b1990e5d
Implement room delegation (not tested, only one predefined name to rename room)

diff -r 3b35fd5f67c7 -r 408edb2f254c gameServer/Actions.hs
--- a/gameServer/Actions.hs	Tue Sep 01 17:46:13 2009 +0000
+++ b/gameServer/Actions.hs	Tue Sep 01 17:56:25 2009 +0000
@@ -193,8 +193,8 @@
 	(_, _, newClients, newRooms) <-
 		if roomID client /= 0 then
 			if isMaster client then
-				if gameinprogress room then
-					processAction (clID, serverInfo, clients, rooms) RemoveRoom
+				if (gameinprogress room) && (playersIn room > 1) then
+					changeMaster
 				else -- not in game
 					processAction (clID, serverInfo, clients, rooms) RemoveRoom
 			else -- not master
@@ -218,11 +218,22 @@
 		room = rooms ! rID
 		resetClientFlags cl = cl{roomID = 0, isMaster = False, isReady = False, teamsInGame = undefined}
 		removeClientFromRoom r = r{
-				playersIDs = IntSet.delete clID (playersIDs r),
+				playersIDs = otherPlayersSet,
 				playersIn = (playersIn r) - 1,
 				readyPlayers = if isReady client then (readyPlayers r) - 1 else readyPlayers r
 				}
 		insertClientToRoom r = r{playersIDs = IntSet.insert clID (playersIDs r)}
+		changeMaster = do
+			processAction (newMasterId, serverInfo, clients, rooms) $ AnswerThisClient ["ROOM_CONTROL_ACCESS", "1"]
+			return (
+				clID,
+				serverInfo,
+				adjust (\cl -> cl{isMaster = True}) newMasterId clients,
+				adjust (\r -> r{name = newRoomName}) rID rooms
+				)
+		newRoomName = "abandoned"
+		otherPlayersSet = IntSet.delete clID (playersIDs room)
+		newMasterId = IntSet.findMin otherPlayersSet
 
 
 processAction (clID, serverInfo, clients, rooms) (AddRoom roomName roomPassword) = do