1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
|
enum {
Twater,
Tship,
Thit,
Tmiss,
NTILES,
Scarrier = 0,
Sbattleship,
Scruiser,
Ssubmarine,
Sdestroyer,
NSHIPS,
OH, /* horizontal */
OV, /* vertical */
Waiting0 = 0,
Watching,
Ready,
Outlaying,
Waiting,
Playing,
Boardmargin = 50,
TW = 16,
TH = TW,
MAPW = 17,
MAPH = MAPW,
SCRW = Boardmargin+MAPW*TW+Boardmargin,
SCRH = Boardmargin+MAPH*TH+TH+MAPH*TH+Boardmargin,
KB = 1024,
};
typedef struct Ship Ship;
typedef struct Map Map;
typedef struct Board Board;
typedef struct Chanpipe Chanpipe;
typedef struct Player Player;
typedef struct Match Match;
typedef struct Msg Msg;
typedef struct Stands Stands;
struct Ship
{
Point2 p; /* board cell */
Rectangle bbox;
int orient;
int ncells;
int *hit; /* |hit| = ncells and hitᵢ ∈ {0,1} */
int sunk;
};
struct Map
{
char map[MAPW][MAPH];
};
struct Board
{
RFrame;
Map;
Rectangle bbox;
};
struct Chanpipe
{
Channel *in;
Channel *out;
Channel *ctl;
int fd;
};
struct Player
{
Map;
char name[8+1];
int state;
Match *battle;
NetConnInfo *nci;
Chanpipe io;
Channel *ctl;
};
struct Match
{
RWLock;
int id;
Player *pl[2];
Channel *data;
Channel *ctl;
Match *prev;
Match *next;
};
struct Msg
{
Player *from;
char *body;
};
struct Stands
{
Player **seats;
ulong nused;
ulong cap;
};
|