Room control menu works
authorunc0rr
Fri, 24 Oct 2008 17:53:14 +0000
changeset 1411 df78c9571bc7
parent 1410 eece43296890
child 1412 20746999bc4a
Room control menu works
QTfrontend/hwform.cpp
netserver/HWProto.hs
netserver/Miscutils.hs
--- a/QTfrontend/hwform.cpp	Fri Oct 24 17:34:20 2008 +0000
+++ b/QTfrontend/hwform.cpp	Fri Oct 24 17:53:14 2008 +0000
@@ -541,7 +541,7 @@
 
     pnetserver->StopServer();
     delete pnetserver;
-    pnetserver=0;
+    pnetserver = 0;
   }
 }
 
--- a/netserver/HWProto.hs	Fri Oct 24 17:34:20 2008 +0000
+++ b/netserver/HWProto.hs	Fri Oct 24 17:53:14 2008 +0000
@@ -56,7 +56,8 @@
 answerCannotCreateRoom = [(clientOnly, ["WARNING", "Cannot create more rooms"])]
 answerIsReady nick = [(sameRoom, ["READY", nick])]
 answerNotReady nick = [(sameRoom, ["NOT_READY", nick])]
-
+answerTooFewClans = [(clientOnly, ["ERROR", "Too few clans in game"])]
+answerRestricted = [(clientOnly, ["WARNING", "Room joining restricted"])]
 
 -- Main state-independent cmd handler
 handleCmd :: CmdHandler
@@ -140,6 +141,8 @@
 		(noChangeClients, noChangeRooms, answerNoRoom)
 	else if roomPassword /= password clRoom then
 		(noChangeClients, noChangeRooms, answerWrongPassword)
+	else if isRestrictedJoins clRoom then
+		(noChangeClients, noChangeRooms, answerRestricted)
 	else
 		(modifyClient client{room = roomName}, modifyRoom clRoom{playersIn = 1 + playersIn clRoom}, answerNicks ++ answerReady ++ (answerJoined $ nick client) ++ (answerNotReady $ nick client) ++ answerFullConfig clRoom ++ answerAllTeams clRoom)
 	where
@@ -178,7 +181,11 @@
 
 handleCmd_inRoom client _ rooms ("ADD_TEAM" : name : color : grave : fort : difStr : hhsInfo)
 	| length hhsInfo == 16 =
-	if length (teams clRoom) == 6 || canAddNumber <= 0 || isJust findTeam || gameinprogress clRoom then
+	if length (teams clRoom) == 6
+		|| canAddNumber <= 0
+		|| isJust findTeam
+		|| gameinprogress clRoom
+		|| isRestrictedTeams clRoom then
 		(noChangeClients, noChangeRooms, answerCantAdd)
 	else
 		(noChangeClients, modifyRoom clRoom{teams = teams clRoom ++ [newTeam]}, answerTeamAccepted newTeam ++ answerAddTeam newTeam ++ answerTeamColor name color)
@@ -235,16 +242,43 @@
 
 handleCmd_inRoom client _ rooms ["TOGGLE_READY"] =
 	if isReady client then
-		(modifyClient client{isReady = False}, modifyRoom clRoom{readyPlayers = newReadyPlayers}, (answerNotReady $ nick client))
+		(modifyClient client{isReady = False}, modifyRoom clRoom{readyPlayers = newReadyPlayers}, answerNotReady $ nick client)
 	else
-		if (playersIn clRoom) == newReadyPlayers then
-			(modifyClient client{isReady = True}, modifyRoom clRoom{gameinprogress = True, readyPlayers = newReadyPlayers}, (answerIsReady $ nick client) ++ answerRunGame)
-		else
-			(modifyClient client{isReady = True}, modifyRoom clRoom{readyPlayers = newReadyPlayers}, answerIsReady $ nick client)
+		(modifyClient client{isReady = True}, modifyRoom clRoom{readyPlayers = newReadyPlayers}, answerIsReady $ nick client)
 	where
 		clRoom = roomByName (room client) rooms
 		newReadyPlayers = (readyPlayers clRoom) + if isReady client then -1 else 1
 
+handleCmd_inRoom client _ rooms ["START_GAME"] =
+	if isMaster client && (playersIn clRoom == readyPlayers clRoom) && (not $ gameinprogress clRoom) then
+		if enoughClans then
+			(noChangeClients, modifyRoom clRoom{gameinprogress = True}, answerRunGame)
+		else
+			(noChangeClients, noChangeRooms, answerTooFewClans)
+	else
+		(noChangeClients, noChangeRooms, [])
+	where
+		clRoom = roomByName (room client) rooms
+		enoughClans = not $ null $ drop 1 $ group $ map teamcolor $ teams clRoom
+
+handleCmd_inRoom client _ rooms ["TOGGLE_RESTRICT_JOINS"] =
+	if isMaster client then
+		(noChangeClients, modifyRoom clRoom{isRestrictedJoins = newStatus}, [])
+	else
+		(noChangeClients, noChangeRooms, answerNotMaster)
+	where
+		clRoom = roomByName (room client) rooms
+		newStatus = not $ isRestrictedJoins clRoom
+
+handleCmd_inRoom client _ rooms ["TOGGLE_RESTRICT_TEAMS"] =
+	if isMaster client then
+		(noChangeClients, modifyRoom clRoom{isRestrictedTeams = newStatus}, [])
+	else
+		(noChangeClients, noChangeRooms, answerNotMaster)
+	where
+		clRoom = roomByName (room client) rooms
+		newStatus = not $ isRestrictedTeams clRoom
+
 handleCmd_inRoom client clients rooms ["ROUNDFINISHED"] =
 	if isMaster client then
 		(modifyRoomClients clRoom (\cl -> cl{isReady = False}), modifyRoom clRoom{gameinprogress = False, readyPlayers = 0}, answerAllNotReady)
--- a/netserver/Miscutils.hs	Fri Oct 24 17:34:20 2008 +0000
+++ b/netserver/Miscutils.hs	Fri Oct 24 17:53:14 2008 +0000
@@ -51,9 +51,11 @@
 		gameinprogress :: Bool,
 		playersIn :: Int,
 		readyPlayers :: Int,
+		isRestrictedJoins :: Bool,
+		isRestrictedTeams :: Bool,
 		params :: Map.Map String [String]
 	}
-createRoom = (RoomInfo "" "" 0 [] "+rnd+" False 1 0 Map.empty)
+createRoom = (RoomInfo "" "" 0 [] "+rnd+" False 1 0 False False Map.empty)
 
 type ClientsTransform = [ClientInfo] -> [ClientInfo]
 type RoomsTransform = [RoomInfo] -> [RoomInfo]