SIGS
----
There are two parts to establishing a SIGS connection. The first part involves
connecting to the update server to check for updates. The server is checked for
updates to both the SIGS system DLLs as well as updates to the game being played.
Once this step is completed, the connection is broken. A game server address is
negotiated during the update process which is later used to establish a connection
to login as a specific player.
Data Packets
------------
The following describes the TCP stream, how it is broken up into packets, and
how the packets are structured.
Each packet has a DWORD length prefix in Big Endian byte ordering. The value
(after endian conversion for an Intel processor) gives the length of the
following data (not including this length prefix). This data is collected into
a buffer, and then processed and broken into it's component parts. The data
after the length prefix will be collectively denoted as the "message" hereafter.
All messages have a header of 3 fields, all stored in Big Endian byte ordering
(and need to be adjusted on Intel processors). Following these 3 fields are
the message specific data, which varies from message type to message type.
Note that the first field of the message data is also a length prefix. This
value appears to be redundant as it is the same as the length prefix before the
message data. (This message length includes the size of itself along with the
size of the rest of the message).
Thus, the format of packets is as follows:
Offset Message Offset Size Description
------ -------------- ---- -----------
0x0 -X- 4 Length prefix of following data (Big Endian)
- - - - - - - - - - - - - - - - - - - - - -
0x4 0x0 4 MessageLength (Big Endian)
0x8 0x4 4 MessageType (Big Endian)
0xC 0x8 4 Flags? (MSB is either 1 or 9) (Big Endian)
- - - - - - - - - - - - - - - - - - - - - -
0x10 0xC Variable Message specific data. (*Some* data will be Big Endian)
...
Note: The "Flags?" value use is unknown, but values in the most significant byte
other than 1 or 9 cause the message to be discarded. The lower order bytes are
not checked in the comparison. Also, all values passed by the client seem to use
the value 1.
Part 1: Check For Updates
-------------------------
Note: Part 1 of the connection is handled by SNWValid.dll.
The client attempts to contact the SIGS server using TCP on port 7800.
A typical exchange where no updates are available is as follows:
Message # Data Direction Description
--------- -------------- -----------
0 Client to Server (0x268) 616. SIGS DLL version check
1 Server to Client (0x385) 901. Connection successful
2 Client to Server (0x272) 626. Game version check
3 Server to Client (0x38B? 907?. - doesn't matter? First data element >= 0, or not 0x38B?)
Connection terminated
Message Values
--------------
The following list are the message types found to be in use by the client (or
explicitly checked for by the client). All messages from the client to the
server are in the 600 range, and all messages from the server to the client
are in the 900 range.
Client -> SIGS Server
---------------------
0x268 616 Request SIGS version check
0x269 617 Request SIGS update
0x272 626 Request game version check
SIGS Server -> Client
---------------------
0x385 901 Connection successful? (OK? Probably just a simple OK/Success message)
0x386 902 Game requested was not found on the server
0x387 903 SIGS DLL requires updated
0x388 904 (Sending SIGS update?)
0x38A 906 (SIGS update file packet?)
0x38B 907 Game requires update
Part 2
------
A TCP connection is established to the address and port designated in the (0x385) 901 Connection
successful packet. The packet format is the same as that used in Part 1.
Particularly interesting messages seem to be:
(0x259) 601 Login
(0x25B) 603 RequestRoomCreate
Useful Messages
---------------
Only certain mesages from the server are processed by the client. (After a connection is established)
0x001 001 MessagePack
0x065 101 RoomServerConnectStatus
0x06A 106 PlayerDisconnect?
0x06D 109 ChangeGamingProfile
0x0CF 207 RoomServerPing
0x12E 302 (Reads packet field and discards result. Technically this is an ignore.)
0x12F 303 RoomJoinStatus
0x130 304 (RoomCreation status response)
0x131 305 (Reads packet field and discards result. Technically this is an ignore.)
0x132 306 AddRoom
0x133 307
0x134 308 PlayerFoundInRoom
0x135 309 RemoveRoom?/Player?
0x136 310 UpdateRoomPop
0x138 312
0x139 313 ChangeGamingProfileStatus
0x13A 314
0x13B 315 ChangeMembershipProfileStatus
0x13C 316
0x192 402
0x193 403
0x19B 411
0x321 801 SysOp message (Probably for system broadcast usage)
0x322 802 Private from SysOP
0x323 803 News and Info
Ignored Messages
----------------
These messages are explicitly checked for, but are still ignored.
(Only those listed in the range 0x3XX. All messages check for in the 0x2XX range are ignored.)
0x324 804
0x385 901
0x386 902
0x387 903
0x388 904
0x389 905
0x38A 906
0x38B 907
Message Data Fields
--------------------
Note: The variable message data consists of 9 basic data types. These 9 cases
are summarized below.
Case Data Size Type/Description
---- --------- ----------------
0 2 WORD (short)
1 4 DWORD (int, Big Endian)
2 4 float?
3 8 double?
4 2 WORD (short, Big Endian)
5 4 DWORD (int)
6 1 BYTE (char)
7 X (variable) String - NULL terminated string
8 X (variable) Buffer - length prefixed buffer (4 byte length prefix,
followed by corresponding amount of data)
Message Data Formats
--------------------
The following describes the variable portion of each message, listed in order
of MessageType. The message header will not be listed for brevity. This is the
data starting at MessageOffset 0xC. All fields are packed one after the other
with no alignment bytes.
Note: A marking of: (Unimplemented)
means the client has only a dummy stub
function that returns right away as the
message handler
Note: A marking of: (Unfinished)
means the client has slightly more
than a dummy stub function that just
returns right away. In this case the
fields from the network message are
first unpacked into local variables
... and then the function just returns
without doing anything.
For all intents and purposes, this is
just as good as (Unimplemented) above,
but a little less immediately recognizable
when examining the assembly code.
-----------------------------------
***********************************
-----------------------------------
MessageType : 1 (0x1)
MessageName : MessagePack
Description : Allows multiple messages to be processed
in one network transaction.
NumDataFields : 1
---------------
Index DataType Description
----- -------- -----------
0 8 (Buffer) messageData - Packed buffer of messages
MessageType : 2 (0x2)
MessageName :
Description : (Unimplemented)
NumDataFields : 2
---------------
Index DataType Description
----- -------- -----------
0 7 (String)
1 8 (Buffer)
-----------------------------------
***********************************
-----------------------------------
MessageType : 101 (0x65)
MessageName : RoomServerConnectStatus
Description : Notifies the client if a connection to a room
server was successful or not.
(Displays a message on error, and ignored
otherwise).
NumDataFields : 2
---------------
Index DataType Description
----- -------- -----------
0 7 (String) roomServerName
1 1 (Int) connectStatus (-1 == failure, otherwise success)
MessageType : 102 (0x66)
MessageName :
Description :
NumDataFields : 3
---------------
Index DataType Description
----- -------- -----------
0 7 (String) (Unused)
1 7 (String) (Unused)
2 1 (Int) (Unused)
MessageType : 103 (0x67)
MessageName :
Description : (Unimplemented)
NumDataFields : 4
---------------
Index DataType Description
----- -------- -----------
0 7 (String)
1 7 (String)
2 1 (Int)
3 1 (Int)
MessageType : 104 (0x68)
MessageName : Logout
Description : (Unimplemented)
NumDataFields : 1
---------------
Index DataType Description
----- -------- -----------
0 7 (String) playerName
MessageType : 105 (0x69)
MessageName :
Description : (Unimplemented)
NumDataFields : 1
---------------
Index DataType Description
----- -------- -----------
0 7 (String)
MessageType : 106 (0x6a)
MessageName : PlayerDisconnectFromRoomServer
Description : Notifies the client that a game was launched
(Unsuccessfully?)
(Sleeps for 2000ms before processing)
NumDataFields : 1
---------------
Index DataType Description
----- -------- -----------
0 7 (String) (ignored) (playerName?)
MessageType : 107 (0x6b)
MessageName : RoomServerPingResponse
Description : (Unimplemented)
(Client reponse to server message 207 (RoomServerPing))
NumDataFields : 0
---------------
Index DataType Description
----- -------- -----------
(Intentionally left blank)
MessageType : 108 (0x6c)
MessageName :
Description : (Unimplemented)
NumDataFields : 3
---------------
Index DataType Description
----- -------- -----------
0 7 (String)
1 1 (Int)
2 1 (Int)
MessageType : 109 (0x6d)
MessageName : ChangeGamingProfile
Description : (Preferences->User Data->Change Gaming Profile...)
NumDataFields : 5
---------------
Index DataType Description
----- -------- -----------
0 7 (String) playerName
1 7 (String) playerName (Must match player name to update)
2 6 (Char) skillLevel
1=Novice
2=Intermediate
3=Advanced
4=Guru
3 7 (String) tagLine "What would you like others to know?"
4 7 (String) location
MessageType : 110 (0x6e)
MessageName :
Description : (Unimplemented in LobbyServerConnection)
(Starts a new receive thread in RoomServerConnection)
(Something to do with UDP?)
NumDataFields : 2
---------------
Index DataType Description
----- -------- -----------
0 7 (String)
1 1 (Int)
MessageType : 111 (0x6f)
MessageName : ConnectToRoomServer
Description : (Unimplemented)
(Message from client to server)
NumDataFields : 7
---------------
Index DataType Description
----- -------- -----------
0 7 (String) playerName
1 7 (String) playerName
2 6 (Char)
3 7 (String) tagLine
4 7 (String) location
5 7 (String) ipAddress (of who? client?)
6 1 (Int) gamePort (of client)
-----------------------------------
***********************************
-----------------------------------
MessageType : 201 (0xc9)
MessageName : AddPlayerToRoom (AddToPlayerChatList)
Description : Adds a player to the "Player Chat List"
(left of main SIGS screen)
The client uses this list to select who gets
private messages.
NumDataFields : 1
---------------
Index DataType Description
----- -------- -----------
0 7 (String) playerName
MessageType : 202 (0xca)
MessageName : RemovePlayerFromRoom (RemoveFromPlayerChatList)
Description : Removes a user from the "Player Chat List"
(Left of main SIGS screen)
The client uses this list to select who gets
private messages.
NumDataFields : 1
---------------
Index DataType Description
----- -------- -----------
0 7 (String) playerName
MessageType : 203 (0xcb)
MessageName :
Description :
NumDataFields : 1
---------------
Index DataType Description
----- -------- -----------
0 1 (Int)
MessageType : 204 (0xcc)
MessageName :
Description :
NumDataFields : 1
---------------
Index DataType Description
----- -------- -----------
0 1 (Int)
MessageType : 205 (0xcd)
MessageName :
Description :
NumDataFields : 3
---------------
Index DataType Description
----- -------- -----------
0 7 (String)
1 7 (String)
2 1 (Int)
MessageType : 206 (0xce)
MessageName :
Description :
NumDataFields : 1
---------------
Index DataType Description
----- -------- -----------
0 7 (String)
MessageType : 207 (0xcf)
MessageName : PingRoomServer
Description :
NumDataFields : 0
---------------
Index DataType Description
----- -------- -----------
(Intentionally left blank)
MessageType : 208 (0xd0)
MessageName :
Description :
NumDataFields : 3
---------------
Index DataType Description
----- -------- -----------
0 7 (String)
1 7 (String)
2 1 (Int)
MessageType : 209 (0xd1)
MessageName :
Description :
NumDataFields : 21
---------------
Index DataType Description
----- -------- -----------
0 1 (Int)
1 1 (Int)
2 7 (String)
3 7 (String)
4 7 (String)
5 7 (String)
6 1 (Int)
7 1 (Int)
8 1 (Int)
9 1 (Int)
10 1 (Int)
11 1 (Int)
12 1 (Int)
13 1 (Int)
14 1 (Int)
15 1 (Int)
16 1 (Int)
17 1 (Int)
18 1 (Int)
19 1 (Int)
20 1 (Int)
-----------------------------------
***********************************
-----------------------------------
MessageType : 301 (0x12d)
MessageName : BadDllRevisionDetected
Description : Can be sent to the user after they submit a new
member profile.
NumDataFields : 1
---------------
Index DataType Description
----- -------- -----------
0 2 (Float) requiredRevision
MessageType : 302 (0x12e)
MessageName :
Description : (Unfinished)
NumDataFields : 3
---------------
Index DataType Description
----- -------- -----------
0 1 (Int)
1 7 (String)
2 7 (String)
MessageType : 303 (0x12f)
MessageName : RoomJoinStatus
Description : [*** Very Important Message! ***]
If roomJoinStatus != 0 then code executes
that prevents the client from crashing when
SIGS exits.
If roomJoinStatus == 0, and a function succeeds,
then a new thread is created to listen for
incomming packets [RoomServerReceiveThread]
NumDataFields : 1
---------------
Index DataType Description
----- -------- -----------
0 1 (Int) roomJoinStatus (0 == ???, -2 == RoomFull, nonzero == ???)
MessageType : 304 (0x130)
MessageName : RoomCreationStatusResponse
Description :
NumDataFields : 1
---------------
Index DataType Description
----- -------- -----------
0 1 (Int) roomCreationStatus (0 == success?, 0x78 == obscenity, other == communication error)
MessageType : 305 (0x131)
MessageName :
Description : (Unfinished)
NumDataFields : 1
---------------
Index DataType Description
----- -------- -----------
0 1 (Int)
MessageType : 306 (0x132)
MessageName : AddRoom
Description : Informs the client of a room available to the
user to join.
NumDataFields : 11
---------------
Index DataType Description
----- -------- -----------
0 7 (String) roomName
1 7 (String) gameType (Ex: "Last One Standing")
2 1 (Int) roomID (0 == Reserved)
3 1 (Int) numPlayers (NumPlayer currently in this room)
4 1 (Int) (Unused, but passed to AddRoom)
5 1 (Int) (Unused)
6 6 (Char) (Unused, but passed to AddRoom)
7 7 (String) roomPassword (Verified by joining client)
8 7 (String) roomDescription
9 7 (String) roomNetworkAddress
10 1 (Int) roomPortNumber
MessageType : 307 (0x133)
MessageName :
Description :
NumDataFields : 3
---------------
Index DataType Description
----- -------- -----------
0 7 (String)
1 7 (String)
2 1 (Int)
MessageType : 308 (0x134)
MessageName : PlayerFoundInRoom
Description :
NumDataFields : 1
---------------
Index DataType Description
----- -------- -----------
0 1 (Int) roomID (-1 == Not Found)
MessageType : 309 (0x135)
MessageName : RemoveRoom/Player?
Description :
NumDataFields : 1
---------------
Index DataType Description
----- -------- -----------
0 7 (String) roomName?
MessageType : 310 (0x136)
MessageName : UpdateRoomPop
Description :
NumDataFields : 2
---------------
Index DataType Description
----- -------- -----------
0 1 (Int) roomID
1 1 (Int) newNumPlayers
MessageType : 311 (0x137)
MessageName :
Description :
NumDataFields : 2
---------------
Index DataType Description
----- -------- -----------
0 1 (Int)
1 7 (String)
MessageType : 312 (0x138)
MessageName :
Description : (if boolSetRoomName != 0 then [global] roomName
is initialized with another string [empty?])
NumDataFields : 2
---------------
Index DataType Description
----- -------- -----------
0 1 (Int) boolSetRoomName
1 1 (Int) (Unused)
MessageType : 313 (0x139)
MessageName : ChangeGamingProfileStatus
Description :
NumDataFields : 1
---------------
Index DataType Description
----- -------- -----------
0 1 (Int) changeGamingProfileStatus
0 == Fail silently?
1 == Success?
2 == Nickname already in use
0x78 == Obscenity
MessageType : 314 (0x13a)
MessageName : MemberProfile
Description : Message from SIGS server to the client containing
the membership profile to the user.
This can be used to set the profile to meaningful
values upon login. (Profile stored on the server).
NumDataFields : 20
---------------
Index DataType Description
----- -------- -----------
0 7 (String) memberName
1 7 (String) realName
2 7 (String) password
3 7 (String) address1
4 7 (String) address2
5 7 (String) city
6 7 (String) state
7 7 (String) country
8 7 (String) postalCode
9 7 (String) emailAddress
10 7 (String) internetService ("Other")
11 4 (Short) boolCD_ROM (0 == No CD, 1 == CD)
12 4 (Short) boolMicrophone (0 == No Mic, 1 == Mic)
13 1 (Int)
14 6 (Char) age
1 == "< 7"
2 == "7 - 12"
3 == "13 - 18"
4 == "19 - 25"
5 == "26 - 40"
6 == "41 - 54"
7 == "55+"
99 == "My Secret"
15 6 (Char) gender
1 == "Male"
2 == "Female"
9 == "My Secret"
16 6 (Char) connectionSpeed
1 == "2400"
2 == "9600"
3 == "14,400"
4 == "28,800"
5 == "High Speed (ISDN, etc...)"
9 == "Other"
17 6 (Char) monitor
1 == "14 in."
2 == "15 in."
3 == "17 in. or greater"
4 == "Laptop"
18 6 (Char) ram
1 == "< 8"
2 == "8 - 12"
3 == "> 12"
19 6 (Char) cpu
1 == "386"
2 == "486"
3 == "pentium"
4 == "pentium pro"
9 == "other"
MessageType : 315 (0x13b)
MessageName : ChangeMembershipProfileStatus
Description :
NumDataFields : 2
---------------
Index DataType Description
----- -------- -----------
0 1 (Int) changeMembershipProfileStatus
0 == Fail silently?
1 == Success?
2 == Nickname already in use
0x78 == Obscenity
0x7A == ??? (Failed)
1 7 (String)
MessageType : 316 (0x13c)
MessageName : SpecialChat?
Description :
NumDataFields : 12
---------------
Index DataType Description
----- -------- -----------
0 7 (String)
1 7 (String)
2 7 (String)
3 7 (String)
4 4 (Short)
5 4 (Short)
6 6 (Char)
7 6 (Char)
8 6 (Char)
9 6 (Char)
10 6 (Char)
11 6 (Char)
MessageType : 317 (0x13d)
MessageName :
Description :
NumDataFields : 0
---------------
Index DataType Description
----- -------- -----------
(Intentionally left blank)
-----------------------------------
***********************************
-----------------------------------
MessageType : 401 (0x191)
MessageName : AcceptRoomJoin? (or game join?)
Description :
NumDataFields : 14
---------------
Index DataType Description
----- -------- -----------
0 1 (Int)
1 1 (Int)
2 1 (Int) maxPlayers?
3 1 (Int)
4 1 (Int)
5 1 (Int)
6 1 (Int)
7 1 (Int)
8 1 (Int)
9 1 (Int)
10 1 (Int)
11 1 (Int)
12 1 (Int)
13 1 (Int)
MessageType : 402 (0x192)
MessageName :
Description : (Unblocks the clients) [ *** ]
NumDataFields : 2
---------------
Index DataType Description
----- -------- -----------
0 1 (Int) numGamesInRoom
1 1 (Int) numPlayersInRoom
MessageType : 403 (0x193)
MessageName :
Description :
NumDataFields : 7
---------------
Index DataType Description
----- -------- -----------
0 7 (String) roomName?
1 1 (Int) (Unused)
2 1 (Int) (Unused)
3 1 (Int) (Unused)
4 1 (Int) (Unused)
5 7 (String) (Unused)
6 1 (Int) (Unused)
[**Warning**: Games reads 6 int fields into local variables]
[Note: The "extra" field is also unused]
MessageType : 404 (0x194)
MessageName :
Description :
NumDataFields : 3
---------------
Index DataType Description
----- -------- -----------
0 1 (Int)
1 7 (String)
2 1 (Int)
MessageType : 405 (0x195)
MessageName :
Description :
NumDataFields : 1
---------------
Index DataType Description
----- -------- -----------
0 7 (String)
MessageType : 406 (0x196)
MessageName :
Description : (Removes a node)
NumDataFields : 1
---------------
Index DataType Description
----- -------- -----------
0 7 (String)
MessageType : 407 (0x197)
MessageName : Invitation
Description :
NumDataFields : 4
---------------
Index DataType Description
----- -------- -----------
0 7 (String) gameName
1 1 (Int)
2 1 (Int)
3 7 (String) playerName
MessageType : 408 (0x198)
MessageName : InvitationResponse
Description : Returns a response as to whether or not an
invitation was accepted or rejected.
NumDataFields : 2
---------------
Index DataType Description
----- -------- -----------
0 1 (Int) bAccepted (1 == accepted, otherwise == declined)
1 7 (String) playerName
MessageType : 409 (0x199)
MessageName : GameJoinRequest
Description :
NumDataFields : 4
---------------
Index DataType Description
----- -------- -----------
0 7 (String)
1 1 (Int)
2 1 (Int)
3 7 (String)
MessageType : 410 (0x19a)
MessageName : GameJoinRequestResponse
Description :
NumDataFields : 1
---------------
Index DataType Description
----- -------- -----------
0 1 (Int)
MessageType : 411 (0x19b)
MessageName : AddPlayerToPlayerList/JoinGame?
Description : (Move/add/remove player)
NumDataFields : 4
---------------
Index DataType Description
----- -------- -----------
0 7 (String)
1 1 (Int)
2 1 (Int)
3 7 (String)
MessageType : 412 (0x19c)
MessageName :
Description :
NumDataFields : 4
---------------
Index DataType Description
----- -------- -----------
0 7 (String)
1 1 (Int)
2 1 (Int)
3 7 (String) playerName (of who?)
MessageType : 413 (0x19d)
MessageName :
Description :
NumDataFields : 1
---------------
Index DataType Description
----- -------- -----------
0 1 (Int)
MessageType : 414 (0x19e)
MessageName :
Description :
NumDataFields : 3
---------------
Index DataType Description
----- -------- -----------
0 1 (Int)
1 7 (String)
2 8 (Buffer)
MessageType : 415 (0x19f)
MessageName :
Description :
NumDataFields : 3
---------------
Index DataType Description
----- -------- -----------
0 7 (String)
1 1 (Int)
2 1 (Int)
MessageType : 416 (0x1a0)
MessageName :
Description :
NumDataFields : 2
---------------
Index DataType Description
----- -------- -----------
0 7 (String)
1 7 (String)
MessageType : 417 (0x1a1)
MessageName :
Description :
NumDataFields : 1
---------------
Index DataType Description
----- -------- -----------
0 1 (Int)
MessageType : 418 (0x1a2)
MessageName :
Description :
NumDataFields : 3
---------------
Index DataType Description
----- -------- -----------
0 7 (String)
1 1 (Int)
2 7 (String)
MessageType : 419 (0x1a3)
MessageName :
Description :
NumDataFields : 4
---------------
Index DataType Description
----- -------- -----------
0 7 (String)
1 1 (Int)
2 1 (Int)
3 7 (String)
MessageType : 420 (0x1a4)
MessageName :
Description :
NumDataFields : 4
---------------
Index DataType Description
----- -------- -----------
0 7 (String)
1 1 (Int)
2 1 (Int)
3 7 (String)
MessageType : 421 (0x1a5)
MessageName :
Description :
NumDataFields : 4
---------------
Index DataType Description
----- -------- -----------
0 7 (String)
1 7 (String)
2 7 (String)
3 1 (Int)
[ **WARNING**: Code processes 2 strings and 2 ints ]
MessageType : 422 (0x1a6)
MessageName :
Description :
NumDataFields : 4
---------------
Index DataType Description
----- -------- -----------
0 7 (String)
1 7 (String)
2 7 (String)
3 1 (Int)
MessageType : 423 (0x1a7)
MessageName :
Description :
NumDataFields : 2
---------------
Index DataType Description
----- -------- -----------
0 7 (String)
1 1 (Int)
MessageType : 424 (0x1a8)
MessageName :
Description :
NumDataFields : 2
---------------
Index DataType Description
----- -------- -----------
0 1 (Int)
1 1 (Int)
-----------------------------------
***********************************
-----------------------------------
MessageType : 501 (0x1f5)
MessageName : ConnectedToGameServer?
Description :
NumDataFields : 0
---------------
Index DataType Description
----- -------- -----------
(Intentionally left blank)
MessageType : 502 (0x1f6)
MessageName :
Description :
NumDataFields : 1
---------------
Index DataType Description
----- -------- -----------
0 1 (Int)
MessageType : 503 (0x1f7)
MessageName :
Description :
NumDataFields : 0
---------------
Index DataType Description
----- -------- -----------
(Intentionally left blank)
MessageType : 504 (0x1f8)
MessageName :
Description :
NumDataFields : 0
---------------
Index DataType Description
----- -------- -----------
(Intentionally left blank)
MessageType : 505 (0x1f9)
MessageName :
Description :
NumDataFields : 1
---------------
Index DataType Description
----- -------- -----------
0 8 (Buffer)
MessageType : 506 (0x1fa)
MessageName :
Description :
NumDataFields : 0
---------------
Index DataType Description
----- -------- -----------
(Intentionally left blank)
-----------------------------------
***********************************
-----------------------------------
MessageType : 601 (0x259)
MessageName : Login
Description : User Logs into the SIGS system.
The SIGS server should reply with info
needed after the initial join.
(Such as a list of rooms).
NumDataFields : 2
---------------
Index DataType Description
----- -------- -----------
0 7 (String) userName
1 7 (String) password
MessageType : 602 (0x25a)
MessageName : JoinRoom
Description : Message from client to server to join a room.
Server should reply with error code (message 303)
NumDataFields : 1
---------------
Index DataType Description
----- -------- -----------
0 1 (Int) roomID
MessageType : 603 (0x25b)
MessageName : CreateRoom
Description : Message from client to server to create a room.
The server should create a new room (message 306)
or return an error (message 304)
NumDataFields : 6
---------------
Index DataType Description
----- -------- -----------
0 7 (String) roomName
1 7 (String) description
2 7 (String) gameType (Ex: "Last One Standing")
3 1 (Int) maxPlayers
4 6 (Char) boolUsePassword
5 7 (String) password
MessageType : 604 (0x25c)
MessageName :
Description :
NumDataFields : 0
---------------
Index DataType Description
----- -------- -----------
(Intentionally left blank)
MessageType : 605 (0x25d)
MessageName : CreateGame
Description : Message from client to server to create a game.
NumDataFields : 7
---------------
Index DataType Description
----- -------- -----------
0 7 (String) gameName
1 1 (Int) maxPlayers?
2 1 (Int) maxPlayers?
3 1 (Int) (4th int of message 401)
4 1 (Int) (5th int of message 401)
5 1 (Int)
6 1 (Int)
MessageType : 606 (0x25e)
MessageName : Invitation?
Description :
NumDataFields : 4
---------------
Index DataType Description
----- -------- -----------
0 7 (String)
1 1 (Int)
2 1 (Int)
3 7 (String)
MessageType : 607 (0x25f)
MessageName :
Description :
NumDataFields : 2
---------------
Index DataType Description
----- -------- -----------
0 7 (String)
1 1 (Int)
MessageType : 608 (0x260)
MessageName :
Description :
NumDataFields : 4
---------------
Index DataType Description
----- -------- -----------
0 7 (String)
1 7 (String)
2 1 (Int)
3 1 (Int)
MessageType : 609 (0x261)
MessageName :
Description :
NumDataFields : 2
---------------
Index DataType Description
----- -------- -----------
0 7 (String)
1 1 (Int)
MessageType : 610 (0x262)
MessageName :
Description :
NumDataFields : 3
---------------
Index DataType Description
----- -------- -----------
0 7 (String)
1 1 (Int)
2 7 (String)
MessageType : 611 (0x263)
MessageName :
Description :
NumDataFields : 2
---------------
Index DataType Description
----- -------- -----------
0 7 (String)
1 1 (Int)
MessageType : 612 (0x264)
MessageName : SearchForPlayer
Description : (SIGS->Find opponent...)
NumDataFields : 1
---------------
Index DataType Description
----- -------- -----------
0 7 (String) playerName (to search for)
MessageType : 613 (0x265)
MessageName :
Description :
NumDataFields : 1
---------------
Index DataType Description
----- -------- -----------
0 4 (Short)
MessageType : 614 (0x266)
MessageName :
Description :
NumDataFields : 0
---------------
Index DataType Description
----- -------- -----------
(Intentionally left blank)
MessageType : 615 (0x267)
MessageName :
Description :
NumDataFields : 0
---------------
Index DataType Description
----- -------- -----------
(Intentionally left blank)
MessageType : 616 (0x268)
MessageName : RequestSIGSVersionCheck
Description :
NumDataFields : 2
---------------
Index DataType Description
----- -------- -----------
0 7 (String) Game/RegionString
1 7 (String) GameVersionString
MessageType : 617 (0x269)
MessageName : RequestSIGSUpdate
Description :
NumDataFields : 0
---------------
Index DataType Description
----- -------- -----------
(Intentionally left blank)
MessageType : 618 (0x26a)
MessageName : ViewPlayers
Description : Message from client to Lobby Server to view
the players in a room.
NumDataFields : 1
---------------
Index DataType Description
----- -------- -----------
0 1 (Int) roomID
MessageType : 619 (0x26b)
MessageName :
Description :
NumDataFields : 0
---------------
Index DataType Description
----- -------- -----------
(Intentionally left blank)
MessageType : 620 (0x26c)
MessageName : NewMember
Description : New member info submitted by user to SIGS when
choosing "New Member" at the Login screen.
NumDataFields : 21
---------------
Index DataType Description
----- -------- -----------
0 7 (String) memberName
1 7 (String) realName
2 7 (String) password (Set to "PASSWORD", given by email)
3 7 (String) address1
4 7 (String) address2
5 7 (String) city
6 7 (String) state
7 7 (String) country
8 7 (String) postalCode
9 7 (String) emailAddress
10 7 (String) internetService ("Other")
11 7 (String) ipAddress? (of what?)
12 4 (Short) boolCD_ROM (0 == No CD, 1 == CD)
13 4 (Short) boolMicrophone (0 == No Mic, 1 == Mic)
14 1 (Int)
15 6 (Char) age
1 == "< 7"
2 == "7 - 12"
3 == "13 - 18"
4 == "19 - 25"
5 == "26 - 40"
6 == "41 - 54"
7 == "55+"
99 == "My Secret"
16 6 (Char) gender
1 == "Male"
2 == "Female"
9 == "My Secret"
17 6 (Char) connectionSpeed
1 == "2400"
2 == "9600"
3 == "14,400"
4 == "28,800"
5 == "High Speed (ISDN, etc...)"
9 == "Other"
18 6 (Char) monitor
1 == "14 in."
2 == "15 in."
3 == "17 in. or greater"
4 == "Laptop"
19 6 (Char) ram
1 == "< 8"
2 == "8 - 12"
3 == "> 12"
20 6 (Char) cpu
1 == "386"
2 == "486"
3 == "pentium"
4 == "pentium pro"
9 == "other"
MessageType : 621 (0x26d)
MessageName :
Description :
NumDataFields : 2
---------------
Index DataType Description
----- -------- -----------
0 7 (String)
1 7 (String)
MessageType : 622 (0x26e)
MessageName : UpdateMembershipProfile
Description : Member info submitted by user to SIGS when updating
their membership profile.
NumDataFields : 23
---------------
Index DataType Description
----- -------- -----------
0 7 (String) memberName
1 7 (String) realName
2 7 (String) password
3 7 (String) address1
4 7 (String) address2
5 7 (String) city
6 7 (String) state
7 7 (String) country
8 7 (String) postalCode
9 7 (String) emailAddress
10 7 (String) internetService ("Other")
11 7 (String) ipAddress? (of who?)
12 7 (String) playerName
13 7 (String) password2
14 4 (Short) boolCD_ROM (0 == No CD, 1 == CD)
15 4 (Short) boolMicrophone (0 == No Mic, 1 == Mic)
16 1 (Int)
17 6 (Char) age
1 == "< 7"
2 == "7 - 12"
3 == "13 - 18"
4 == "19 - 25"
5 == "26 - 40"
6 == "41 - 54"
7 == "55+"
99 == "My Secret"
18 6 (Char) gender
1 == "Male"
2 == "Female"
9 == "My Secret"
19 6 (Char) connectionSpeed
1 == "2400"
2 == "9600"
3 == "14,400"
4 == "28,800"
5 == "High Speed (ISDN, etc...)"
9 == "Other"
20 6 (Char) monitor
1 == "14 in."
2 == "15 in."
3 == "17 in. or greater"
4 == "Laptop"
21 6 (Char) ram
1 == "< 8"
2 == "8 - 12"
3 == "> 12"
22 6 (Char) cpu
1 == "386"
2 == "486"
3 == "pentium"
4 == "pentium pro"
9 == "other"
MessageType : 623 (0x26f)
MessageName :
Description :
NumDataFields : 1
---------------
Index DataType Description
----- -------- -----------
0 7 (String)
MessageType : 624 (0x270)
MessageName :
Description :
NumDataFields : 2
---------------
Index DataType Description
----- -------- -----------
0 7 (String)
1 7 (String)
MessageType : 625 (0x271)
MessageName : SendCustomServerMessage
Description :
NumDataFields : 1
---------------
Index DataType Description
----- -------- -----------
0 8 (Buffer)
MessageType : 626 (0x272)
MessageName : RequestGameVersionCheck
Description :
NumDataFields : 2
---------------
Index DataType Description
----- -------- -----------
0 7 (String) GameVersionString
1 7 (String)
MessageType : 627 (0x273)
MessageName : SetGameState / LeaveChatRoom? / LeaveGame? No
Description : Note: The meaning of Value depends on Parameter
For PARAM_JOIN_PERMISSION:
1 - Nobody can join
2 - No approval required
3 - Any one player may allow
4 - Only captain may allow
5 - Only game owner may allow
6 - Majority vote required (not yet implemented)
7 - Everyone must approve (not yet implemented)
For PARAM_INVITE_PERMISSION:
1 - Only owner may invite (not yet implemented)
2 - Only captain may invite (not yet implemented)
3 - Any player may invite
4 - Anyone in room may invite (not yet implemented)
NumDataFields : 3
---------------
Index DataType Description
----- -------- -----------
0 7 (String) gameName
1 1 (Int) parameter (PARAM_JOIN_PERMISSION, PARAM_INVITE_PERMISSION, PERAM_WATCH_PERMISSION)
2 1 (Int) value
MessageType : 628 (0x274)
MessageName :
Description :
NumDataFields : 2
---------------
Index DataType Description
----- -------- -----------
0 7 (String)
1 1 (Int)
MessageType : 629 (0x275)
MessageName :
Description :
NumDataFields : 3
---------------
Index DataType Description
----- -------- -----------
0 7 (String)
1 1 (Int)
2 1 (Int)
MessageType : 630 (0x276)
MessageName :
Description :
NumDataFields : 4
---------------
Index DataType Description
----- -------- -----------
0 7 (String)
1 1 (Int)
2 1 (Int)
3 7 (String)
MessageType : 631 (0x277)
MessageName : Complaint
Description : User submitted complaint to SIGS about another user
or the SIGS system itself.
Note: The field offender will be "SIGS" if the user
chooses to submit a complaint about SIGS rather than
another user.
Note: the client will append the last 20 lines of
Room chat to the complaint before sending.
This applies even for complaints about SIGS.
NumDataFields : 2
---------------
Index DataType Description
----- -------- -----------
0 7 (String) offender (playerName of offender)
1 7 (String) complaint
MessageType : 632 (0x278)
MessageName :
Description :
NumDataFields : 1
---------------
Index DataType Description
----- -------- -----------
0 7 (String)
MessageType : 633 (0x279)
MessageName :
Description :
NumDataFields : 1
---------------
Index DataType Description
----- -------- -----------
0 7 (String)
MessageType : 634 (0x27a)
MessageName :
Description :
NumDataFields : 1
---------------
Index DataType Description
----- -------- -----------
0 7 (String)
-----------------------------------
***********************************
-----------------------------------
MessageType : 701 (0x2bd)
MessageName : ChatMessage
Description : Send a chat message to a chat room.
The chat message is NOT automatically echoed
to the chat room's chat display.
NumDataFields : 2
---------------
Index DataType Description
----- -------- -----------
0 7 (String) sourcePlayerName
1 7 (String) chatMessage
MessageType : 702 (0x2be)
MessageName : PrivateChatMessage
Description : Sends a private chat message to the destination
player.
The chat message is automatically echoed to the
chat room display as a sent private message.
NumDataFields : 3
---------------
Index DataType Description
----- -------- -----------
0 7 (String) destPlayerName (Unused by client)
1 7 (String) sourcePlayerName
2 7 (String) chatMessage
MessageType : 703 (0x2bf)
MessageName : [Send]Message
Description : Transmits a generic message to all other players
NumDataFields : 1
---------------
Index DataType Description
----- -------- -----------
0 8 (Buffer)
MessageType : 704 (0x2c0)
MessageName : [Send]PointMessage
Description : Transmits a generic message to a specific player
NumDataFields : 3
---------------
Index DataType Description
----- -------- -----------
0 1 (Int)
1 1 (Int)
2 8 (Buffer)
-----------------------------------
***********************************
-----------------------------------
MessageType : 801 (0x321)
MessageName : SysOpMessage
Description : Message from a SysOp (to the entire system)
NumDataFields : 1
---------------
Index DataType Description
----- -------- -----------
0 7 (String) message
MessageType : 802 (0x322)
MessageName : PrivateSysOpMessage
Description : Priavte message from a SysOp to a specific user
NumDataFields : 2
---------------
Index DataType Description
----- -------- -----------
0 7 (String) message
1 7 (String) (Unused)
MessageType : 803 (0x323)
MessageName : NewsAndInfo
Description : Creates a popup window displaying the news/info
NumDataFields : 3
---------------
Index DataType Description
----- -------- -----------
0 1 (Int) messageTimeStamp
1 7 (String)
2 7 (String) newsAndInfo
MessageType : 804 (0x324)
MessageName :
Description :
NumDataFields : 1
---------------
Index DataType Description
----- -------- -----------
0 7 (String)
-----------------------------------
***********************************
-----------------------------------
MessageType : 901 (0x385)
MessageName : ConnectionSuccessful
Description :
NumDataFields : 2
---------------
Index DataType Description
----- -------- -----------
0 7 (String) gameServerName
1 1 (Int) portNum
MessageType : 902 (0x386)
MessageName : GameRequestedNotFound
Description :
NumDataFields : 0
---------------
Index DataType Description
----- -------- -----------
(Intentionally left blank)
MessageType : 903 (0x387)
MessageName : SigsDllRequiresUpdate
Description :
NumDataFields : 2
---------------
Index DataType Description
----- -------- -----------
0 7 (String) newSigsDllVersion
1 1 (Int) newSigsDllSize
MessageType : 904 (0x388)
MessageName :
Description :
NumDataFields : 1
---------------
Index DataType Description
----- -------- -----------
0 1 (Int)
MessageType : 905 (0x389)
MessageName :
Description :
NumDataFields : 1
---------------
Index DataType Description
----- -------- -----------
0 8 (Buffer)
MessageType : 906 (0x38a)
MessageName :
Description :
NumDataFields : 0
---------------
Index DataType Description
----- -------- -----------
(Intentionally left blank)
MessageType : 907 (0x38b)
MessageName : GameRequiresUpdate
Description :
NumDataFields : 3
---------------
Index DataType Description
----- -------- -----------
0 1 (Int) ( < 0 or message is ignored)
1 1 (Int) downloadSize
2 4 (Short) boolRequiredUpdate (0 == Optional, non-zero == Required)
Now, I don't understand from exceptionally little to nothing in coding.Hacker has a Hamachi/WON (yes, it'll replace both) replacement WIP, but I'm not sure if he's been able to work on it much lately.
However, I do remember some project a while back to try and reproduce the original SIGS program.
Is anyone working on that now ?
[SIGS]
ValidateIP=<insertIPAddressHere>
There's still the simple Sierra.ini edit to point the client to the server. Not quite automatic for the user, but a simple and easy fix to get things working.But people would have to visit this site to find out about that, and then they might as well download our version of OP2. Again, it'd be pointless to attempt to make this compatible with the Dynamix OP2 out of the box.
Also, I don't see why it's pointless to be compatible with an out of the box version. People like me are weary of things like the OP2 download. I chose not to run it until I had verified why each and every byte was changed, and even then, only because the version differences introduced forced me to use it to be able to play with other people. (Btw, the old No-CD patch was really sick, and changed a lot of things it didn't need to. They just sort of butchered the exe until eventually it worked.)... Not even checksum errors occur to you as a problem? Even if you were somehow able to bypass the checksum errors, just because of the differences between them (even minor, even techs being arranged differently though essentially being the same would cause this), they will desync and crash. And very few people here are wary of our OP2.
I've read through all replies here, but truth is, much of it is above my head. Though 1 question still keeps popping into my head: Is there any way to make sure anyone, whether they are behind a router etc, play op2 ? (I assume there isn't, and if it is it will be hard to do since this solution hasn't been presented before)
However, both of are welcome to pick my mind if you have any questions about how the old WON system worked! I hope I still remember something
Offset Message Offset Size Description
------ -------------- ---- -----------
0x0 -X- 4 Length prefix of following data (Big Endian)
- - - - - - - - - - - - - - - - - - - - - -
0x4 0x0 4 MessageLength (Big Endian)
0x8 0x4 4 MessageType (Big Endian)
0xC 0x8 4 Flags? (MSB is either 1 or 9) (Big Endian)
- - - - - - - - - - - - - - - - - - - - - -
0x10 0xC Variable Message specific data. (*Some* data will be Big Endian)
...
Note: The "Flags?" value use is unknown, but values in the most significant byte
other than 1 or 9 cause the message to be discarded. The lower order bytes are
not checked in the comparison. Also, all values passed by the client seem to use
the value 1.
01 00 00 00
00 00 00 20 00 00 00 20 00 00 02 68 [01 00 00 00] 4F 75 74 70 6F 73 74 32 5F 55 53 00 33 2E 30 2E 33 2E 30 00