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

📄 driver.c

📁 早期freebsd实现
💻 C
📖 第 1 页 / 共 2 页
字号:
		ouch->p_ammo = 0;		/* No exploding */		break;	  case SHOT:		cp = "Shot to death";		break;	  case GRENADE:	  case SATCHEL:	  case BOMB:		cp = "Bombed";		break;	  case MINE:	  case GMINE:		cp = "Blown apart";		break;# ifdef	OOZE	  case SLIME:		cp = "Slimed";		if (credit != NULL)			credit->i_slime++;		break;# endif# ifdef	VOLCANO	  case LAVA:		cp = "Baked";		break;# endif# ifdef DRONE	  case DSHOT:		cp = "Eliminated";		break;# endif	}	if (credit == NULL) {		(void) sprintf(ouch->p_death, "| %s by %s |", cp,			(shot_type == MINE || shot_type == GMINE) ?			"a mine" : "act of God");		return;	}	(void) sprintf(ouch->p_death, "| %s by %s |", cp, credit->i_name);	if (ouch == gotcha) {		/* No use killing yourself */		credit->i_kills--;		credit->i_bkills++;	}	else if (ouch->p_ident->i_team == ' '	|| ouch->p_ident->i_team != credit->i_team) {		credit->i_kills++;		credit->i_gkills++;	}	else {		credit->i_kills--;		credit->i_bkills++;	}	credit->i_score = credit->i_kills / (double) credit->i_entries;	ouch->p_ident->i_deaths++;	if (ouch->p_nchar == 0)		ouch->p_ident->i_stillb++;	if (gotcha == NULL)		return;	gotcha->p_damcap += STABDAM;	gotcha->p_damage -= STABDAM;	if (gotcha->p_damage < 0)		gotcha->p_damage = 0;	(void) sprintf(Buf, "%2d/%2d", gotcha->p_damage, gotcha->p_damcap);	cgoto(gotcha, STAT_DAM_ROW, STAT_VALUE_COL);	outstr(gotcha, Buf, 5);	(void) sprintf(Buf, "%3d", (gotcha->p_damcap - MAXDAM) / 2);	cgoto(gotcha, STAT_KILL_ROW, STAT_VALUE_COL);	outstr(gotcha, Buf, 3);	(void) sprintf(Buf, "%5.2f", gotcha->p_ident->i_score);	for (ouch = Player; ouch < End_player; ouch++) {		cgoto(ouch, STAT_PLAY_ROW + 1 + (gotcha - Player),			STAT_NAME_COL);		outstr(ouch, Buf, 5);	}# ifdef MONITOR	for (ouch = Monitor; ouch < End_monitor; ouch++) {		cgoto(ouch, STAT_PLAY_ROW + 1 + (gotcha - Player),			STAT_NAME_COL);		outstr(ouch, Buf, 5);	}# endif}/* * zap: *	Kill off a player and take him out of the game. */zap(pp, was_player)register PLAYER	*pp;FLAG		was_player;{	register int	i, len;	register BULLET	*bp;	register PLAYER	*np;	register int	x, y;	int		savefd, savemask;	if (was_player) {		if (pp->p_undershot)			fixshots(pp->p_y, pp->p_x, pp->p_over);		drawplayer(pp, FALSE);		Nplayer--;	}	len = strlen(pp->p_death);	/* Display the cause of death */	x = (WIDTH - len) / 2;	cgoto(pp, HEIGHT / 2, x);	outstr(pp, pp->p_death, len);	for (i = 1; i < len; i++)		pp->p_death[i] = '-';	pp->p_death[0] = '+';	pp->p_death[len - 1] = '+';	cgoto(pp, HEIGHT / 2 - 1, x);	outstr(pp, pp->p_death, len);	cgoto(pp, HEIGHT / 2 + 1, x);	outstr(pp, pp->p_death, len);	cgoto(pp, HEIGHT, 0);	savefd = pp->p_fd;	savemask = pp->p_mask;# ifdef MONITOR	if (was_player) {# endif		for (bp = Bullets; bp != NULL; bp = bp->b_next) {			if (bp->b_owner == pp)				bp->b_owner = NULL;			if (bp->b_x == pp->p_x && bp->b_y == pp->p_y)				bp->b_over = SPACE;		}		i = rand_num(pp->p_ammo);		x = rand_num(pp->p_ammo);		if (x > i)			i = x;		if (pp->p_ammo == 0)			x = 0;		else if (i == pp->p_ammo - 1) {			x = pp->p_ammo;			len = SLIME;		}		else {			for (x = MAXBOMB - 1; x > 0; x--)				if (i >= shot_req[x])					break;			for (y = MAXSLIME - 1; y > 0; y--)				if (i >= slime_req[y])					break;			if (y >= 0 && slime_req[y] > shot_req[x]) {				x = slime_req[y];				len = SLIME;			}			else if (x != 0) {				len = shot_type[x];				x = shot_req[x];			}		}		if (x > 0) {			(void) add_shot(len, pp->p_y, pp->p_x, pp->p_face, x,				(PLAYER *) NULL, TRUE, SPACE);			(void) sprintf(Buf, "%s detonated.",				pp->p_ident->i_name);			for (np = Player; np < End_player; np++)				message(np, Buf);# ifdef MONITOR			for (np = Monitor; np < End_monitor; np++)				message(np, Buf);# endif# ifdef BOOTS			while (pp->p_nboots-- > 0) {				for (np = Boot; np < &Boot[NBOOTS]; np++)					if (np->p_flying < 0)						break;				if (np >= &Boot[NBOOTS])					abort(1, "Too many boots");				np->p_undershot = FALSE;				np->p_x = pp->p_x;				np->p_y = pp->p_y;				np->p_flying = rand_num(20);				np->p_flyx = 2 * rand_num(6) - 5;				np->p_flyy = 2 * rand_num(6) - 5;				np->p_over = SPACE;				np->p_face = BOOT;				showexpl(np->p_y, np->p_x, BOOT);			}# endif		}# ifdef BOOTS		else if (pp->p_nboots > 0) {			if (pp->p_nboots == 2)				Maze[pp->p_y][pp->p_x] = BOOT_PAIR;			else				Maze[pp->p_y][pp->p_x] = BOOT;			if (pp->p_undershot)				fixshots(pp->p_y, pp->p_x,					Maze[pp->p_y][pp->p_x]);		}# endif# ifdef VOLCANO		volcano += pp->p_ammo - x;		if (rand_num(100) < volcano / 50) {			do {				x = rand_num(WIDTH / 2) + WIDTH / 4;				y = rand_num(HEIGHT / 2) + HEIGHT / 4;			} while (Maze[y][x] != SPACE);			(void) add_shot(LAVA, y, x, LEFTS, volcano,				(PLAYER *) NULL, TRUE, SPACE);			for (np = Player; np < End_player; np++)				message(np, "Volcano eruption.");			volcano = 0;		}# endif# ifdef	DRONE		if (rand_num(100) < 2) {			do {				x = rand_num(WIDTH / 2) + WIDTH / 4;				y = rand_num(HEIGHT / 2) + HEIGHT / 4;			} while (Maze[y][x] != SPACE);			add_shot(DSHOT, y, x, rand_dir(),				shot_req[MINDSHOT +				rand_num(MAXBOMB - MINDSHOT)],				(PLAYER *) NULL, FALSE, SPACE);		}# endif		sendcom(pp, ENDWIN);		(void) putc(' ', pp->p_output);		(void) fclose(pp->p_output);		End_player--;		if (pp != End_player) {			memcpy(pp, End_player, sizeof (PLAYER));			(void) sprintf(Buf, "%5.2f%c%-10.10s %c",				pp->p_ident->i_score, stat_char(pp),				pp->p_ident->i_name, pp->p_ident->i_team);			i = STAT_PLAY_ROW + 1 + (pp - Player);			for (np = Player; np < End_player; np++) {				cgoto(np, i, STAT_NAME_COL);				outstr(np, Buf, STAT_NAME_LEN);			}# ifdef MONITOR			for (np = Monitor; np < End_monitor; np++) {				cgoto(np, i, STAT_NAME_COL);				outstr(np, Buf, STAT_NAME_LEN);			}# endif		}		/* Erase the last player */		i = STAT_PLAY_ROW + 1 + Nplayer;		for (np = Player; np < End_player; np++) {			cgoto(np, i, STAT_NAME_COL);			ce(np);		}# ifdef MONITOR		for (np = Monitor; np < End_monitor; np++) {			cgoto(np, i, STAT_NAME_COL);			ce(np);		}	}	else {		sendcom(pp, ENDWIN);		(void) putc(LAST_PLAYER, pp->p_output);		(void) fclose(pp->p_output);		End_monitor--;		if (pp != End_monitor) {			memcpy(pp, End_monitor, sizeof (PLAYER));			(void) sprintf(Buf, "%5.5s %-10.10s %c", " ",				pp->p_ident->i_name, pp->p_ident->i_team);			i = STAT_MON_ROW + 1 + (pp - Player);			for (np = Player; np < End_player; np++) {				cgoto(np, i, STAT_NAME_COL);				outstr(np, Buf, STAT_NAME_LEN);			}			for (np = Monitor; np < End_monitor; np++) {				cgoto(np, i, STAT_NAME_COL);				outstr(np, Buf, STAT_NAME_LEN);			}		}		/* Erase the last monitor */		i = STAT_MON_ROW + 1 + (End_monitor - Monitor);		for (np = Player; np < End_player; np++) {			cgoto(np, i, STAT_NAME_COL);			ce(np);		}		for (np = Monitor; np < End_monitor; np++) {			cgoto(np, i, STAT_NAME_COL);			ce(np);		}	}# endif	Fds_mask &= ~savemask;	if (Num_fds == savefd + 1) {		Num_fds = Socket;# ifdef INTERNET		if (Test_socket > Socket)			Num_fds = Test_socket;# endif		for (np = Player; np < End_player; np++)			if (np->p_fd > Num_fds)				Num_fds = np->p_fd;# ifdef MONITOR		for (np = Monitor; np < End_monitor; np++)			if (np->p_fd > Num_fds)				Num_fds = np->p_fd;# endif		Num_fds++;	}}/* * rand_num: *	Return a random number in a given range. */rand_num(range)int	range;{	return (range == 0 ? 0 : RN % range);}/* * havechar: *	Check to see if we have any characters in the input queue; if *	we do, read them, stash them away, and return TRUE; else return *	FALSE. */havechar(pp)register PLAYER	*pp;{	extern int	errno;	if (pp->p_ncount < pp->p_nchar)		return TRUE;	if (!(Have_inp & pp->p_mask))		return FALSE;	Have_inp &= ~pp->p_mask;check_again:	errno = 0;	if ((pp->p_nchar = read(pp->p_fd, pp->p_cbuf, sizeof pp->p_cbuf)) <= 0)	{		if (errno == EINTR)			goto check_again;		pp->p_cbuf[0] = 'q';	}	pp->p_ncount = 0;	return TRUE;}/* * cleanup: *	Exit with the given value, cleaning up any droppings lying around */SIGNAL_TYPEcleanup(eval)int	eval;{	register PLAYER	*pp;	for (pp = Player; pp < End_player; pp++) {		cgoto(pp, HEIGHT, 0);		sendcom(pp, ENDWIN);		(void) putc(LAST_PLAYER, pp->p_output);		(void) fclose(pp->p_output);	}# ifdef MONITOR	for (pp = Monitor; pp < End_monitor; pp++) {		cgoto(pp, HEIGHT, 0);		sendcom(pp, ENDWIN);		(void) putc(LAST_PLAYER, pp->p_output);		(void) fclose(pp->p_output);	}# endif	(void) close(Socket);# ifdef AF_UNIX_HACK	(void) unlink(Sock_name);# endif	exit(eval);}/* * send_stats: *	Print stats to requestor */send_stats(){	register IDENT	*ip;	register FILE	*fp;	int		s;	SOCKET		sockstruct;	int		socklen;	/*	 * Get the output stream ready	 */# ifdef INTERNET	socklen = sizeof sockstruct;# else	socklen = sizeof sockstruct - 1;# endif	s = accept(Status, (struct sockaddr *) &sockstruct, &socklen);	if (s < 0) {		if (errno == EINTR)			return;# ifdef LOG		syslog(LOG_ERR, "accept: %m");# else		perror("accept");# endif		return;	}	fp = fdopen(s, "w");	if (fp == NULL) {# ifdef LOG		syslog(LOG_ERR, "fdopen: %m");# else		perror("fdopen");# endif		(void) close(s);		return;	}	/*	 * Send output to requestor	 */	fputs("Name\t\tScore\tDucked\tAbsorb\tFaced\tShot\tRobbed\tMissed\tSlimeK\n", fp);	for (ip = Scores; ip != NULL; ip = ip->i_next) {		fprintf(fp, "%s\t", ip->i_name);		if (strlen(ip->i_name) < 8)			putc('\t', fp);		fprintf(fp, "%.2f\t%d\t%d\t%d\t%d\t%d\t%d\t%d\n",			ip->i_score, ip->i_ducked, ip->i_absorbed,			ip->i_faced, ip->i_shot, ip->i_robbed,			ip->i_missed, ip->i_slime);	}	fputs("\n\nName\t\tEnemy\tFriend\tDeaths\tStill\tSaved\n", fp);	for (ip = Scores; ip != NULL; ip = ip->i_next) {		if (ip->i_team == ' ') {			fprintf(fp, "%s\t", ip->i_name);			if (strlen(ip->i_name) < 8)				putc('\t', fp);		}		else {			fprintf(fp, "%s[%c]\t", ip->i_name, ip->i_team);			if (strlen(ip->i_name) + 3 < 8)				putc('\t', fp);		}		fprintf(fp, "%d\t%d\t%d\t%d\t%d\n",			ip->i_gkills, ip->i_bkills, ip->i_deaths,			ip->i_stillb, ip->i_saved);	}	(void) fclose(fp);}/* * clear_scores: *	Clear out the scores so the next session start clean */clear_scores(){	register IDENT	*ip, *nextip;	for (ip = Scores; ip != NULL; ip = nextip) {		nextip = ip->i_next;		(void) free((char *) ip);	}	Scores = NULL;}

⌨️ 快捷键说明

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