⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 screen.c

📁 <B>Digital的Unix操作系统VAX 4.2源码</B>
💻 C
字号:
#ifndef lintstatic	char *sccsid = "@(#)screen.c	4.2	(ULTRIX)	9/1/88";#endif#include "externs.h"#include <sys/types.h>#include <sys/stat.h>extern int choke();readpos(){	register int n;	register postype *p = pos;	register ships *s = scene[game].ship;	for (n = scene[game].vessels; n > 0; n--, p++, s++){		p -> row = s -> shiprow;		p -> col = s -> shipcol;		p -> dir = s -> shipdir;		if (s -> file -> explode == 2 || s -> file -> sink == 2)			p -> dir = 0;	}}makesignal(fmt, shipnum, owner)int shipnum, owner;char *fmt;{	int junk;	char message[60];	sprintf(message, fmt, scene[game].ship[shipnum].shipname, colours(shipnum), sterncolor(shipnum, &junk, &junk));	Write(FILES + owner, 1, 164, message);}	#define PI 3.1415926535float contable[8] = {1.5708, 0.7854, 0.0, -0.7854, -1.5708, -2.3562, -PI, 2.3562};angle(dr, dc)register dr, dc;{	register i;	if (dc >= 0 && dr > 0)		i = 0;	else if (dr <= 0 && dc > 0)		i = 2;	else if (dc <= 0 && dr < 0)		i = 4;	else		i = 6;	dr = abs(dr);	dc = abs(dc);	if ((i == 0 || i == 4) && dc * 2.4 > dr) {		i++;		if (dc > dr * 2.4)			i++;	} else if ((i == 2 || i == 6) && dr * 2.4 > dc) {		i++;		if (dr > dc * 2.4)			i++;	}	return i % 8 + 1;}char gunsbear(fromship, toship)		/* checks for target bow or stern */{	int dr, dc, i;	register ang;	register postype *from = &pos[fromship];	register postype *to = &pos[toship];	dr = from->row - to->row;	dc = to->col - from->col;	for (i = 2; i; i--) {		if ((ang = angle(dr, dc) - from->dir + 1) < 1)			ang += 8;		if (ang >= 2 && ang <= 4)			return 'r';		if (ang >= 6 && ang <= 7)			return 'l';		drdc(&dr, &dc, to->dir);	}	return 0;}portside(fromship, onship, quick)register fromship, onship;int quick;			/* returns true if fromship is */{				/* shooting at onship's starboard side */	register ang;	int dr, dc;	dr = pos[fromship].row - pos[onship].row;	dc = pos[onship].col - pos[fromship].col;	if (quick == -1)		drdc(&dr, &dc, pos[onship].dir);	ang = angle(dr, dc);	if (quick != 0)		return ang;	ang = (ang + 4 - pos[onship].dir - 1) % 8 + 1;	return ang < 5;}int tantable[40] = {0,100,197,291,381,464,540,610,675,733,785,833,876,915,951,983,1012,1039,1064,1086,1107,1126,1144,1161,1176,1190,1204,1216,1227,1239,1249,1259,1268,1277,1285,1293,1300,1307,1313,1470}; double arctan(y,x)int y,x;{	int sx, sy;	register int index;	sy = y < 0 ? -1 : 1;	sx = x < 0 ? -1 : 1;	y *= sy;	x *= sx;	if (!x) return((double) PI/2 * sy);	index = (10*y)/x + 0.5;	if (index > 39) index = 39;	return((double) (sy * (sx < 0 ? PI : 0 + sx*(tantable[index]/1000))));}boarders(from, key)int from, key;{	register int n;	struct BP *ptr;	ptr = key ? scene[game].ship[from].file -> DBP : scene[game].ship[from].file -> OBP ;	for (n=0; n < 3; n++){		if (ptr[n].turnsent)			return(1);	}	return(0);}lengthof(string)char *string;{	register int n;	for (n=0; string[n]; n++);	return(n);}Write(address, string, offset, value)int string, address, offset, value;{	int fd;	char file[25];	int *ptr;	char *cptr;	struct BP *bptr;	struct snag *sptr;	if (string){		sprintf(Outbuf + buffercount, "%d %d %d %s\n", address, string, offset, value);	}	else {		sprintf(Outbuf + buffercount, "%d %d %d %d\n", address, string, offset, value);	}	buffercount += lengthof(Outbuf + buffercount);	if (address < 32){		ptr = &scene[game].ship[address].shipnum;		*(ptr + (offset - 2)/2) = value;	} else if (address < 64){		address -= SPECS;		ptr = &specs[scene[game].ship[address].shipnum].bs;		*(ptr + offset/2) = value;	} else if (address < 128){		address -= FILES;		ptr = &scene[game].ship[address].file -> points;		if (offset >= 30 && offset < 48){			bptr = scene[game].ship[address].file -> OBP;			switch(((offset - 30) % 6) / 2){				case 0:					bptr[(offset - 30)/6].turnsent = value;					break;				case 1:					bptr[(offset - 30)/6].toship = value;					break;				case 2:					bptr[(offset - 30)/6].mensent = value;					break;			}		}		if (offset >= 48 && offset < 66){			bptr = scene[game].ship[address].file -> DBP;			switch(((offset - 48) % 6) / 2){				case 0:					bptr[(offset - 48)/6].turnsent = value;					break;				case 1:					bptr[(offset - 48)/6].toship = value;					break;				case 2:					bptr[(offset - 48)/6].mensent = value;					break;			}		}		if (offset >= 84 && offset < 124){			sptr = scene[game].ship[address].file -> fouls;			switch(((offset - 84) % 4) / 2){				case 0:					sptr[(offset - 84) / 4].turnfoul = value;					break;				case 1:					sptr[(offset - 84) / 4].toship = value;					break;			}		}		if (offset >= 124 && offset < 164){			sptr = scene[game].ship[address].file -> grapples;			switch(((offset - 124) % 4) / 2){				case 0:					sptr[(offset - 124) / 4].turnfoul = value;					break;				case 1:					sptr[(offset - 124) / 4].toship = value;					break;			}		}		if (offset > 72) ptr = &scene[game].ship[address].file -> drift;		if (offset > 164) ptr = &scene[game].ship[address].file -> RH;		cptr = scene[game].ship[address].file -> captain;		if (offset == 72) cptr = scene[game].ship[address].file -> last;		if (offset == 164) cptr = scene[game].ship[address].file -> signal;		if (!string)			*(ptr + (offset - (offset > 72 ? (offset < 164 ? 82 : 224) : 20))/2 ) = value;		else			strcpy(cptr, (char *) value);	} else {		ptr = &scene[game].winddir;		*(ptr + offset/2) = value;	}}sync(){	char file[25];	char source[25];	int address, string;	int offset, value[40];	int fd, *ptr;	char *cptr;	struct BP *bptr;	struct snag *sptr;	register int n;	void (*sig1)(), (*sig2)();	sig1 = signal(SIGHUP, SIG_IGN);	sig2 = signal(SIGINT, SIG_IGN);	sprintf(file, "/tmp/sync.%d", game);	sprintf(source, "/tmp/.%d", game);	for(n = 0; link(source, file) == -1 && n < 30; n++)		sleep(2);	fseek(syncfile, lastsync, 0);	while(fscanf(syncfile, "%d%d%d", &address, &string, &offset) != EOF){		if (string){			fgets((char *) value, 60, syncfile);			rmend((char *) value);			while(*(char *)value == ' ')				strcpy((char *) value, (char *) value + 1);		}		else			fscanf(syncfile, "%d", value);		if (address < 32){			ptr = &scene[game].ship[address].shipnum;			*(ptr + (offset - 2)/2) = value[0];			continue;		}		if (address < 64){			address -= SPECS;			ptr = &specs[scene[game].ship[address].shipnum].bs;			*(ptr + offset/2) = value[0];			continue;		}		if (address < 128){			address -= FILES;			ptr = &scene[game].ship[address].file -> points;			if (offset >= 30 && offset < 48){				bptr = scene[game].ship[address].file -> OBP;				switch(((offset - 30) % 6) / 2){					case 0:						bptr[(offset - 30)/6].turnsent = value[0];						break;					case 1:						bptr[(offset - 30)/6].toship = value[0];						break;					case 2:						bptr[(offset - 30)/6].mensent = value[0];						break;				}			}			if (offset >= 48 && offset < 66){				bptr = scene[game].ship[address].file -> DBP;				switch(((offset - 48) % 6) / 2){					case 0:						bptr[(offset - 48)/6].turnsent = value[0];						break;					case 1:						bptr[(offset - 48)/6].toship = value[0];						break;					case 2:						bptr[(offset - 48)/6].mensent = value[0];						break;				}			}			if (offset >= 84 && offset < 124){				sptr = scene[game].ship[address].file -> fouls;				switch(((offset - 84) % 4) / 2){					case 0:						sptr[(offset - 84) / 4].turnfoul = value[0];						break;					case 1:						sptr[(offset - 84) / 4].toship = value[0];						break;				}			}			if (offset >= 124 && offset < 164){				sptr = scene[game].ship[address].file -> grapples;				switch(((offset - 124) % 4) / 2){					case 0:						sptr[(offset - 124) / 4].turnfoul = value[0];						break;					case 1:						sptr[(offset - 124) / 4].toship = value[0];						break;				}			}			if (offset > 72) ptr = &scene[game].ship[address].file -> drift;			if (offset > 164) ptr = &scene[game].ship[address].file -> RH;			cptr = scene[game].ship[address].file -> captain;			if (offset == 72) cptr = scene[game].ship[address].file -> last;			if (offset == 164) cptr = scene[game].ship[address].file -> signal;			if (!string)				*(ptr + (offset - (offset > 72 ? (offset < 164 ? 82 : 224) : 20))/2 ) = value[0];			else				strcpy(cptr, (char *) value);			continue;		}		ptr = &scene[game].winddir;		*(ptr + offset/2) = value[0];	}	if (buffercount){		fseek(syncfile, 0L, 2);		fprintf(syncfile, "%s", Outbuf);		fflush(syncfile);		buffercount = 0;	}	lastsync = ftell(syncfile);	unlink(file);	signal(SIGHUP, sig1);	signal(SIGINT, sig2);}rmend(str)char *str;{	register int n;	for (n=0; *(str + n); n++);	if (n)		*(str + n - 1) = '\0';}charcolours(ship)int ship;{	char flag;	int index;	struct File *ptr;	ptr = scene[game].ship[ship].file;	if (ptr -> struck)		flag = '!';	if (ptr -> explode)		flag = '#';	if (ptr -> sink)		flag = '~';	if (ptr -> struck)		return(flag);	if (ptr -> captured > -1)		index = scene[game].ship[ptr -> captured].nationality;	else		index = scene[game].ship[ship].nationality;	switch(index){				case 0:			flag = 'a';			break;		case 1:			flag = 'b';			break;		case 2:			flag = 's';			break;		case 3:			flag = 'f';			break;	}	return(ptr -> FS ? flag - 32 : flag);}charsterncolor(ship, sternr, sternc)int ship, *sternr, *sternc;{	int sr, sc;	int cap;	cap = scene[game].ship[ship].file -> captured;	sr = pos[ship].row;	sc = pos[ship].col;	drdc(&sr,&sc,pos[ship].dir);	*sternr = sr;	*sternc = sc;	ship -= nation[scene[game].ship[ship].nationality];	return(ship + '0' - 10*(cap > -1));}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -