Finish implementation of ability to take control over your team after being disconnected. Completely untested.
authorunc0rr
Sat, 28 Jun 2014 14:51:45 +0400
changeset 10343 fe9853dea6c4
parent 10342 16122539d2ea
child 10344 cceabf9628bb
Finish implementation of ability to take control over your team after being disconnected. Completely untested.
gameServer/EngineInteraction.hs
hedgewars/uIO.pas
hedgewars/uTeams.pas
hedgewars/uTypes.pas
--- a/gameServer/EngineInteraction.hs	Thu Jun 26 21:43:36 2014 +0400
+++ b/gameServer/EngineInteraction.hs	Sat Jun 28 14:51:45 2014 +0400
@@ -67,9 +67,9 @@
                       if not $ tst timedMessages m' then n
                         else if '+' /= m' then Just Nothing else Just . Just . B.pack . Base64.encode . BW.unpack $ m
         isNonEmpty = (/=) '+' . B.head . B.tail
-        legalMessages = Set.fromList $ "M#+LlRrUuDdZzAaSjJ,sNpPwtghbc12345" ++ slotMessages
+        legalMessages = Set.fromList $ "M#+LlRrUuDdZzAaSjJ,sNpPwtgfhbc12345" ++ slotMessages
         slotMessages = "\128\129\130\131\132\133\134\135\136\137\138"
-        timedMessages = Set.fromList $ "+LlRrUuDdZzAaSjJ,NpPwtgc12345" ++ slotMessages
+        timedMessages = Set.fromList $ "+LlRrUuDdZzAaSjJ,NpPwtgfc12345" ++ slotMessages
 
 replayToDemo :: [TeamInfo]
         -> Map.Map B.ByteString B.ByteString
--- a/hedgewars/uIO.pas	Thu Jun 26 21:43:36 2014 +0400
+++ b/hedgewars/uIO.pas	Sat Jun 28 14:51:45 2014 +0400
@@ -221,7 +221,11 @@
 function isSyncedCommand(c: char): boolean;
 begin
     case c of
-        '+', '#', 'L', 'l', 'R', 'r', 'U', 'u', 'D', 'd', 'Z', 'z', 'A', 'a', 'S', 'j', 'J', ',', 'c', 'N', 'p', 'P', 'w', 't', '1', '2', '3', '4', '5': isSyncedCommand:= true;
+    '+', '#', 'L', 'l', 'R', 'r', 'U'
+    , 'u', 'D', 'd', 'Z', 'z', 'A', 'a'
+    , 'S', 'j', 'J', ',', 'c', 'N', 'p'
+    , 'P', 'w', 't', '1', '2', '3', '4'
+    , '5', 'f', 'g': isSyncedCommand:= true;
     else
         isSyncedCommand:= ((byte(c) >= 128) and (byte(c) <= 128 + cMaxSlotIndex))
     end
@@ -324,7 +328,8 @@
         or (headcmd^.cmd = 'h') // seems the hedgewars protocol does not allow remote synced commands
         or (headcmd^.cmd = '#') // must be synced for saves to work
         or (headcmd^.cmd = 'b')
-        or (headcmd^.cmd = 'F')) do
+        or (headcmd^.cmd = 'F')
+        or (headcmd^.cmd = 'G')) do
     begin
     case headcmd^.cmd of
         '+': ; // do nothing - it is just an empty packet
@@ -362,8 +367,10 @@
             ParseCommand('chatmsg ' + #4 + s, true);
             WriteLnToConsole(s)
              end;
-// TODO: deprecate 'F'
-        'F': ParseCommand('teamgone ' + copy(headcmd^.str, 2, Pred(headcmd^.len)), true);
+        'F': ParseCommand('teamgone u' + copy(headcmd^.str, 2, Pred(headcmd^.len)), true);
+        'G': ParseCommand('teamback u' + copy(headcmd^.str, 2, Pred(headcmd^.len)), true);
+        'f': ParseCommand('teamgone s' + copy(headcmd^.str, 2, headcmd^.len - 3), true);
+        'g': ParseCommand('teamback s' + copy(headcmd^.str, 2, headcmd^.len - 3), true);
         'N': begin
             tmpflag:= false;
             lastTurnChecksum:= SDLNet_Read32(@headcmd^.str[2]);
--- a/hedgewars/uTeams.pas	Thu Jun 26 21:43:36 2014 +0400
+++ b/hedgewars/uTeams.pas	Sat Jun 28 14:51:45 2014 +0400
@@ -630,21 +630,75 @@
 
 procedure chTeamGone(var s:shortstring);
 var t: LongInt;
+    isSynced: boolean;
 begin
-t:= 0;
-while (t < cMaxTeams) and (TeamsArray[t] <> nil) and (TeamsArray[t]^.TeamName <> s) do
-    inc(t);
-if (t = cMaxTeams) or (TeamsArray[t] = nil) then
-    exit;
+    isSynced:= s[1] = 's';
+
+    Delete(s, 1, 1);
+
+    t:= 0;
+    while (t < cMaxTeams) and (TeamsArray[t] <> nil) and (TeamsArray[t]^.TeamName <> s) do
+        inc(t);
+    if (t = cMaxTeams) or (TeamsArray[t] = nil) then
+        exit;
+
+    if isSynced then
+        begin
+        with TeamsArray[t]^ do
+            if not hasGone then
+                begin
+                AddChatString('** '+ TeamName + ' is gone');
+                hasGone:= true;
+
+                RecountTeamHealth(TeamsArray[t])
+                end;
+        end
+    else
+    begin
+        if not CurrentTeam^.ExtDriven then
+        begin
+            SendIPC(_S'f' + s);
+            ParseCommand('/teamgone s' + s, true);
+        end;
+    end;
+end;
 
-with TeamsArray[t]^ do
-    if not hasGone then
+procedure chTeamBack(var s:shortstring);
+var t: LongInt;
+    isSynced: boolean;
+begin
+    isSynced:= s[1] = 's';
+
+    Delete(s, 1, 1);
+
+    t:= 0;
+    while (t < cMaxTeams) and (TeamsArray[t] <> nil) and (TeamsArray[t]^.TeamName <> s) do
+        inc(t);
+    if (t = cMaxTeams) or (TeamsArray[t] = nil) then
+        exit;
+
+    if isSynced then
         begin
-        AddChatString('** '+ TeamName + ' is gone');
-        hasGone:= true;
+        with TeamsArray[t]^ do
+            if hasGone then
+                begin
+                AddChatString('** '+ TeamName + ' is back');
+                hasGone:= false;
+
+                RecountTeamHealth(TeamsArray[t]);
 
-        RecountTeamHealth(TeamsArray[t])
+                if Owner = UserNick then
+                    ExtDriven:= false
+                end;
+        end
+    else
+    begin
+        if not CurrentTeam^.ExtDriven then
+        begin
+            SendIPC(_S'g' + s);
+            ParseCommand('/teamback s' + s, true);
         end;
+    end;
 end;
 
 
@@ -747,6 +801,7 @@
 RegisterVariable('hhcoords', @chSetHHCoords, false);
 RegisterVariable('bind', @chBind, true );
 RegisterVariable('teamgone', @chTeamGone, true );
+RegisterVariable('teamback', @chTeamBack, true );
 RegisterVariable('finish', @chFinish, true ); // all teams gone
 RegisterVariable('fort'    , @chFort         , false);
 RegisterVariable('grave'   , @chGrave        , false);
--- a/hedgewars/uTypes.pas	Thu Jun 26 21:43:36 2014 +0400
+++ b/hedgewars/uTypes.pas	Sat Jun 28 14:51:45 2014 +0400
@@ -399,10 +399,10 @@
             DrawHealthY: LongInt;
             AttackBar: LongWord;
             HedgehogsNumber: Longword;
-            hasGone: boolean;
             voicepack: PVoicepack;
             PlayerHash: shortstring;   // md5 hash of player name. For temporary enabling of hats as thank you. Hashed for privacy of players
             stats: TTeamStats;
+            hasGone: boolean;
             end;
 
     TClan = record