Otherwise known as Player vs. Player.
This is going to assume the simplest senario. Two people on two different computers that want to play against each other. You can figure out how to make it weird on your own time.
The first thing to do is before the program starts: decide turn order. When this is decided, both players start up deduction tactics.
For both players, a ChooseAIs dialog will appear. Each player selects SwingInterface and WithNetworkServer as as hir PlayerAI. Each player selects NetworkClient with no addins as the other player's AI. WithAutorecord is compatible with WithNetworkServer. WithRandomTeam and WithArbitraryTeam are not compatible with WithNetworkServer.
After confirming the decision in the ChooseAIs dialog, the next dialogs will appear. The first player will have two dialogs appear: the SwingInterface's choose a team dialog and a second dialog listing an IP address and a Port, and with a button labeled "TestPing". The second player will have one dialog appear: one with two text fields and a button labeld "Ping".
The second player should fill in the IP address and Port information given in the first player's dialogs. To confirm that the correct information is filled in, both players can press the "Ping" and "TestPing" buttons; gets a message along the lines of "Recieved Pingback", the information is filled in correctly. The first player should choose his TokenClasses as usual. All three dialogs then have their OK buttons pushed. Each player will then recieve the set of dialogs they did not recieve the first time; the same information is filled in in the same places.
The Game frame will then appear after those are consfirmed and the game can begin. Move tokens, press EndOfTurn; at this point it's the same as battling a computer player.
If a server is sent a line equal to the string "Ping", it must send "PingBack" to the client. Ping >PingBack
The other option is a handshake consisting of a Clinet sending a Server the line "Ready", and the server responding with the line "Ready".
After the handshake, the Client can send the Server the line "TokenClasses". The Server will respond with a line containing the number of tokenclasses, and then the tokenclasses themselves, in JSON format, one per line.
Next, the Client will send the line "StartGame". The Server will resond with commands in CFN, one per line. The Server will keep prinint commands as they become availible until the game ends. Ready >Ready TokenClasses >5 >{"name":"Whee1","element":"Light", ... } >{"name":"Whee2","element":"Fire", ... } >{"name":"Whee3","element":"Sound", ... } >{"name":"Whee4","element":"Fire", ... } >{"name":"Whee5","element":"Sound", ... } StartGame >RequestMove(My(2), Field(3,4)) >RequestMove(My(4), Field(1,7)) >EndOfTurn >RequestMove(My(0), Field(2,4)) >RequestAttackForDamage(My(2), Other(0,2)) > ...