5864cf775872fbebb4f6a398632b53501ea99317
[pkg/netris.git] / netris.h
1 /*
2  * Netris -- A free networked version of T*tris
3  * Copyright (C) 1994,1995,1996  Mark H. Weaver <mhw@netris.org>
4  * 
5  * This program is free software; you can redistribute it and/or
6  * modify it under the terms of the GNU General Public License
7  * as published by the Free Software Foundation; either version 2
8  * of the License, or (at your option) any later version.
9  * 
10  * This program is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13  * GNU General Public License for more details.
14  * 
15  * You should have received a copy of the GNU General Public License
16  * along with this program; if not, write to the Free Software
17  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
18  *
19  * $Id: netris.h,v 1.27 1996/02/09 08:22:14 mhw Exp $
20  */
21
22 #ifndef NETRIS_H
23 #define NETRIS_H
24
25 #include "config.h"
26 #include <sys/time.h>
27 #include <assert.h>
28 #include <stdio.h>
29 #include <signal.h>
30
31 #define ExtFunc         /* Marks functions that need prototypes */
32
33 #ifdef NOEXT
34 # define EXT
35 # define IN(a) a
36 #else
37 # define EXT extern
38 # define IN(a)
39 #endif
40
41 #ifndef NULL
42 # define NULL ((void *)0)
43 #endif
44
45 #ifdef HAS_SIGPROCMASK
46 typedef sigset_t MySigSet;
47 #else
48 typedef int MySigSet;
49 #endif
50
51 /*
52  * The following definitions are to ensure network compatibility even if
53  * the sizes of ints and shorts are different.  I'm not sure exactly how
54  * to deal with this problem, so I've added an abstraction layer.
55  */
56
57 typedef short netint2;
58 typedef long netint4;
59
60 #define hton2(x) htons(x)
61 #define hton4(x) htonl(x)
62
63 #define ntoh2(x) ntohs(x)
64 #define ntoh4(x) ntohl(x)
65
66 #define DEFAULT_PORT 9284       /* Very arbitrary */
67
68 #define DEFAULT_KEYS "jkl mspf^l"
69
70 /* Protocol versions */
71 #define MAJOR_VERSION           1       
72 #define PROTOCOL_VERSION        3
73 #define ROBOT_VERSION           1
74
75 #define MAX_BOARD_WIDTH         32
76 #define MAX_BOARD_HEIGHT        64
77 #define MAX_SCREENS                     2
78
79 #define DEFAULT_INTERVAL        300000  /* Step-down interval in microseconds */
80
81 /* NP_startConn flags */
82 #define SCF_usingRobot          000001
83 #define SCF_fairRobot           000002
84 #define SCF_setSeed                     000004
85
86 /* Event masks */
87 #define EM_alarm                        000001
88 #define EM_key                          000002
89 #define EM_net                          000004
90 #define EM_robot                        000010
91 #define EM_any                          000777
92
93 typedef enum _GameType { GT_onePlayer, GT_classicTwo, GT_len } GameType;
94 typedef enum _BlockTypeA { BT_none, BT_piece1, BT_wall, BT_len } BlockTypeA;
95 typedef enum _Dir { D_down, D_right, D_up, D_left } Dir;
96 typedef enum _Cmd { C_end, C_forw, C_back, C_left, C_right, C_plot } Cmd;
97 typedef enum _FDType { FT_read, FT_write, FT_except, FT_len } FDType;
98 typedef enum _MyEventType { E_none, E_alarm, E_key, E_net,
99                                                         E_lostConn, E_robot, E_lostRobot } MyEventType;
100 typedef enum _NetPacketType { NP_endConn, NP_giveJunk, NP_newPiece,
101                                                         NP_down, NP_left, NP_right,
102                                                         NP_rotate, NP_drop, NP_clear,
103                                                         NP_insertJunk, NP_startConn,
104                                                         NP_userName, NP_pause, NP_version,
105                                                         NP_byeBye } NetPacketType;
106
107 typedef signed char BlockType;
108
109 typedef struct _MyEvent {
110         MyEventType type;
111         union {
112                 char key;
113                 struct {
114                         NetPacketType type;
115                         int size;
116                         void *data;
117                 } net;
118                 struct {
119                         int size;
120                         char *data;
121                 } robot;
122         } u;
123 } MyEvent;
124
125 struct _EventGenRec;
126 typedef MyEventType (*EventGenFunc)(struct _EventGenRec *gen, MyEvent *event);
127
128 typedef struct _EventGenRec {
129         struct _EventGenRec *next;
130         int ready;
131         FDType fdType;
132         int fd;
133         EventGenFunc func;
134         int mask;
135 } EventGenRec;
136
137 typedef struct _Shape {
138         struct _Shape *rotateTo;
139         int initY, initX, mirrored;
140         Dir initDir;
141         BlockType type;
142         Cmd *cmds;
143 } Shape;
144
145 typedef struct _ShapeOption {
146         float weight;
147         Shape *shape;
148 } ShapeOption;
149
150 typedef int (*ShapeDrawFunc)(int scr, int y, int x,
151                                         BlockType type, void *data);
152
153 EXT GameType game;
154 EXT int boardHeight[MAX_SCREENS];
155 EXT int boardVisible[MAX_SCREENS], boardWidth[MAX_SCREENS];
156 EXT Shape *curShape[MAX_SCREENS];
157 EXT int curY[MAX_SCREENS], curX[MAX_SCREENS];
158 EXT char opponentName[16], opponentHost[256];
159 EXT int standoutEnable;
160 EXT int robotEnable, robotVersion, fairRobot;
161 EXT int protocolVersion;
162
163 EXT long initSeed;
164 EXT long stepDownInterval, speed;
165
166 EXT int myFlags, opponentFlags;
167
168 EXT char scratch[1024];
169
170 extern ShapeOption stdOptions[];
171 extern char *version_string;
172
173 #include "proto.h"
174
175 #endif /* NETRIS_H */
176
177 /*
178  * vi: ts=4 ai
179  * vim: noai si
180  */