|
|
1.1 root 1: #include <stdlib.h>
2: #include <stdio.h>
3: #include <conio.h>
4: #include <stdarg.h>
5: #include <dos.h>
6: #include <io.h>
7: #include <sys/stat.h>
8: #include <errno.h>
9: #include <fcntl.h>
10:
11: #define LOOP_NOPEN 50
12: #define MAX_NODES 25
13: #define HIGH 8
14:
15: int players, player, roller, bet_amt, lose, win, hungup,ansi=0;
16: unsigned char node[MAX_NODES]={NULL},node_num,sys_nodes;
17: char curatr;
18:
19: /***********************/
20: /* Function prototypes */
21: /***********************/
22: int nopen(char *path,int access);
23: int roll(void);
24: void bprintf(char *fmt,...);
25: void color(char atr);
26:
27: main(int argc, char *argv[])
28: {
29: FILE *fp;
30: char cont='Y', ch;
31:
32: delay(0);
33:
34: /* read xtrn.dat */
35:
36: bprintf("\n\n\1y\1hWelcome to Dice Wars!\1n");
37: do {
38: bprintf("\n\nI]nstructions\nJ]oin the current game\nL]ist current players");
39: bprintf("\nQ]uit back to the board");
40: bprintf("\n\nCommand: ");
41: ch=toupper(getch());
42:
43: switch(ch) {
44: case 'Q':
45: break;
46: case 'I':
47: /* instructions(); */
48: break;
49: case 'L':
50: get_game_status();
51: bprintf("\n\n#players=%d roller=%d bet=%d",players,roller,bet_amt);
52: break;
53: case 'J':
54: join_game();
55: menu();
56: break;
57: }
58: } while ( ch!='Q' && ch!=3 && !hungup);
59:
60: bprintf("\n\nThanks for playing! Try again soon!\r\n");
61: get_game_status();
62: node[node_num-1]=0;
63: put_game_status();
64: return;
65: }
66:
67: /* This is the routine to roll the dice */
68:
69: int roll()
70: {
71: char ch;
72: int die1, die2, dice, shake;
73: die1=die2=dice=0;
74:
75: clrscr();
76: while (!lose&&!win) { ch='';
77: bprintf("\n\n[S]end message or [ENTER] to roll!"); ch=toupper(getche());
78: bprintf("\n\n");
79: for (shake=0; shake<50; shake++) {
80: die1=random(6)+1; die2=random(6)+1;
81: }
82: dice=die1+die2;
83: bprintf("You rolled a %d and a %d for a total of %d",die1,die2,dice);
84: return dice;
85: }
86: }
87:
88: /***********************************
89: Gets the current status of the game
90: ************************************/
91: get_game_status()
92: {
93: int file;
94:
95: if ((file=nopen("GAMESTAT.DAB",O_RDONLY))==-1)
96: return -1;
97:
98: read(file,&players,sizeof(players));
99: read(file,&roller,sizeof(roller));
100: read(file,&bet_amt,sizeof(bet_amt));
101: read(file,node,sys_nodes);
102: close(file); return 0;
103: }
104:
105: put_game_status()
106: {
107: int file;
108:
109: if ((file=nopen("GAMESTAT.DAB",O_RDWR|O_CREAT))==-1)
110: return -1;
111:
112: write(file,&players,sizeof(players));
113: write(file,&roller,sizeof(roller));
114: write(file,&bet_amt,sizeof(bet_amt));
115: lseek(file,node_num-1,SEEK_CUR);
116: write(file,&node[node_num-1],1);
117: close(file);
118: }
119:
120: increase_bet()
121: {
122: int add;
123:
124: while (1) {
125: bprintf("\n\nEnter amount to increase by (in Kbytes): ");
126: scanf("%d",add);
127: if (add<=100)
128: break;
129: else bprintf("\n\nMust be less than 100K!!");
130: }
131: return;
132: }
133:
134: /* Here we write the player information to the player file */
135:
136: put_player_status()
137: {
138: FILE *fp;
139: char fname[81];
140: int x;
141:
142: sprintf(fname,"PLAYER.%d",player);
143: if ((fp=fopen(fname,"a+"))==NULL) return;
144: fprintf(fname,"0\n1\nUser Name\n100000");
145: fclose(fp);
146:
147: }
148:
149: /* This is where the game takes place */
150:
151: menu()
152: {
153: char ch,
154: *rollercmd="\n\nCommand (I,P,R,S,Q,?): ",
155: *cmd="\n\nCommand (S,Q,?): ";
156: if(roller==player)
157: bprintf(rollercmd);
158: else
159: bprintf(cmd);
160: while(1) {
161: if(kbhit()) {
162: ch=toupper(getch());
163: bprintf("%c\r\n",ch);
164: if(ch=='Q')
165: break;
166: switch(ch) {
167: case 'S': /* send message */
168: break;
169: case 'I': /* increase bet */
170: if(roller!=player) {
171: bprintf("\r\nYou're not the roller!");
172: break; }
173: break;
174: case 'P':
175: if(roller!=player) {
176: bprintf("\r\nYou're not the roller!\n");
177: break; }
178: break;
179: case 'R': /* Roll dice */
180: if(roller!=player) {
181: bprintf("\r\nYou're not the roller!\n");
182: break; }
183: break;
184: } /* switch */
185: if(roller==player)
186: bprintf(rollercmd);
187: else
188: bprintf(cmd);
189: } /* kbhit */
190: } /* while(!done) */
191:
192:
193: }
194:
195: /* Here is where we wait for an appropriate moment to join the game */
196:
197: join_game()
198: {
199:
200: if (access("GAMESTAT.DAB",0)) {
201: players=roller=1; bet_amt=0;
202: put_game_status();
203: return;
204: }
205: get_game_status();
206: node[node_num-1]=players+1;
207: put_game_status();
208:
209: bprintf("\n\nHang on! Waiting to enter game!");
210: while (bet_amt) {
211: if (kbhit()==3) {
212: hungup=1; return;
213: }
214: get_game_status();
215: }
216:
217: player=++players;
218: put_player_status();
219: put_game_status();
220:
221: return;
222: }
223:
224: /****************************************************************************/
225: /* Network open function. Opens all files DENYALL and retries LOOP_NOPEN */
226: /* number of times if the attempted file is already open or denying access */
227: /* for some other reason. All files are opened in BINARY mode. */
228: /****************************************************************************/
229: int nopen(char *str, int access)
230: {
231: char count=0,logentry[256];
232: int file,share;
233:
234: if(access==O_RDONLY) share=O_DENYWRITE;
235: else share=O_DENYALL;
236: while(((file=open(str,O_BINARY|share|access,S_IWRITE))==-1)
237: && errno==EACCES && count++<LOOP_NOPEN)
238: if(count>10)
239: delay(50);
240: if(count)
241: bprintf("\r\n!$!$!$ NOPEN COLLISION - File: %s Count: %d\r\n"
242: ,str,count);
243: if(file==-1 && errno==EACCES)
244: puts("\7\r\nNOPEN: ACCESS DENIED\r\n\7");
245: return(file);
246: }
247:
248: /****************************************************************************/
249: /* Performs printf replacing ctrl-a codes with ansi seq if user has ansi */
250: /****************************************************************************/
251: void bprintf(char *fmt, ...)
252: {
253: char sbuf[1024];
254: int i,len;
255:
256: vsprintf(sbuf,fmt,_va_ptr);
257: len=strlen(sbuf);
258: for(i=0;i<len;i++) {
259: if(sbuf[i]==1) { /* ctrl-a */
260: if(ansi) {
261: switch(toupper(sbuf[i+1])) {
262: case 'R':
263: color(RED);
264: break;
265: case 'G':
266: color(GREEN);
267: break;
268: case 'B':
269: color(BLUE);
270: break;
271: case 'C':
272: color(CYAN);
273: break;
274: case 'M':
275: color(MAGENTA);
276: break;
277: case 'Y':
278: color(YELLOW);
279: break;
280: case 'H':
281: color(curatr|HIGH);
282: break;
283: case 'I':
284: color(curatr|BLINK);
285: break;
286: case 'N':
287: color(LIGHTGRAY);
288: break; } }
289: i++; } /* skip code */
290: else putchar(sbuf[i]); }
291: }
292:
293: /****************************************************************************/
294: /* Sends ansi codes to change remote ansi terminal's colors */
295: /* Only sends necessary codes - tracks remote terminal's current attributes */
296: /* through the 'curatr' variable */
297: /****************************************************************************/
298: void color(char atr)
299: {
300:
301: if((!(atr&HIGH) && curatr&HIGH) || (!(atr&BLINK) && curatr&BLINK)
302: || atr==LIGHTGRAY) {
303: bprintf("\x1b[0m");
304: curatr=LIGHTGRAY; }
305:
306: if(atr==LIGHTGRAY) { /* no attributes */
307: curatr=atr;
308: return; }
309:
310: if(atr&BLINK) { /* special attributes */
311: if(!(curatr&BLINK))
312: bprintf("\x1b[5m"); }
313: if(atr&HIGH) {
314: if(!(curatr&HIGH))
315: bprintf("\x1b[1m"); }
316:
317: if((atr&0x7)==BLACK) { /* foreground colors */
318: if((curatr&0x7)!=BLACK)
319: bprintf("\x1b[30m"); }
320: else if((atr&0x7)==RED) {
321: if((curatr&0x7)!=RED)
322: bprintf("\x1b[31m"); }
323: else if((atr&0x7)==GREEN) {
324: if((curatr&0x7)!=GREEN)
325: bprintf("\x1b[32m"); }
326: else if((atr&0x7)==BROWN) {
327: if((curatr&0x7)!=BROWN)
328: bprintf("\x1b[33m"); }
329: else if((atr&0x7)==BLUE) {
330: if((curatr&0x7)!=BLUE)
331: bprintf("\x1b[34m"); }
332: else if((atr&0x7)==MAGENTA) {
333: if((curatr&0x7)!=MAGENTA)
334: bprintf("\x1b[35m"); }
335: else if((atr&0x7)==CYAN) {
336: if((curatr&0x7)!=CYAN)
337: bprintf("\x1b[36m"); }
338: else if((atr&0x7)==LIGHTGRAY) {
339: if((curatr&0x7)!=LIGHTGRAY)
340: bprintf("\x1b[37m"); }
341:
342: if((atr&0x70)==(BLACK<<4)) { /* background colors */
343: if((curatr&0x70)!=(BLACK<<4))
344: bprintf("\x1b[40m"); }
345: else if((atr&0x70)==(RED<<4)) {
346: if((curatr&0x70)!=(RED<<4))
347: bprintf("\x1b[41m"); }
348: else if((atr&0x70)==(GREEN<<4)) {
349: if((curatr&0x70)!=(GREEN<<4))
350: bprintf("\x1b[42m"); }
351: else if((atr&0x70)==(BROWN<<4)) {
352: if((curatr&0x70)!=(BROWN<<4))
353: bprintf("\x1b[43m"); }
354: else if((atr&0x70)==(BLUE<<4)) {
355: if((curatr&0x70)!=(BLUE<<4))
356: bprintf("\x1b[44m"); }
357: else if((atr&0x70)==(MAGENTA<<4)) {
358: if((curatr&0x70)!=(MAGENTA<<4))
359: bprintf("\x1b[45m"); }
360: else if((atr&0x70)==(CYAN<<4)) {
361: if((curatr&0x70)!=(CYAN<<4))
362: bprintf("\x1b[46m"); }
363: else if((atr&0x70)==(LIGHTGRAY<<4)) {
364: if((curatr&0x70)!=(LIGHTGRAY<<4))
365: bprintf("\x1b[47m"); }
366:
367: curatr=atr;
368: }
369:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.