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

📄 execute.c

📁 早期freebsd实现
💻 C
字号:
/* *  Hunt *  Copyright (c) 1985 Conrad C. Huang, Gregory S. Couch, Kenneth C.R.C. Arnold *  San Francisco, California */# include	"hunt.h"# ifdef MONITOR/* * mon_execute: *	Execute a single monitor command */mon_execute(pp)register PLAYER	*pp;{	register char	ch;	ch = pp->p_cbuf[pp->p_ncount++];	switch (ch) {	  case CTRL('L'):		sendcom(pp, REDRAW);		break;	  case 'q':		(void) strcpy(pp->p_death, "| Quit |");		break;	}}# endif/* * execute: *	Execute a single command */execute(pp)register PLAYER	*pp;{	register char	ch;	ch = pp->p_cbuf[pp->p_ncount++];# ifdef	FLY	if (pp->p_flying >= 0) {		switch (ch) {		  case CTRL('L'):			sendcom(pp, REDRAW);			break;		  case 'q':			(void) strcpy(pp->p_death, "| Quit |");			break;		}		return;	}# endif	switch (ch) {	  case CTRL('L'):		sendcom(pp, REDRAW);		break;	  case 'h':		move_player(pp, LEFTS);		break;	  case 'H':		face(pp, LEFTS);		break;	  case 'j':		move_player(pp, BELOW);		break;	  case 'J':		face(pp, BELOW);		break;	  case 'k':		move_player(pp, ABOVE);		break;	  case 'K':		face(pp, ABOVE);		break;	  case 'l':		move_player(pp, RIGHT);		break;	  case 'L':		face(pp, RIGHT);		break;	  case 'f':	  case '1':		fire(pp, 0);		/* SHOT */		break;	  case 'g':	  case '2':		fire(pp, 1);		/* GRENADE */		break;	  case 'F':	  case '3':		fire(pp, 2);		/* SATCHEL */		break;	  case 'G':	  case '4':		fire(pp, 3);		/* 7x7 BOMB */		break;	  case '5':		fire(pp, 4);		/* 9x9 BOMB */		break;	  case '6':		fire(pp, 5);		/* 11x11 BOMB */		break;	  case '7':		fire(pp, 6);		/* 13x13 BOMB */		break;	  case '8':		fire(pp, 7);		/* 15x15 BOMB */		break;	  case '9':		fire(pp, 8);		/* 17x17 BOMB */		break;	  case '0':		fire(pp, 9);		/* 19x19 BOMB */		break;	  case '@':		fire(pp, 10);		/* 21x21 BOMB */		break;# ifdef	OOZE	  case 'o':		fire_slime(pp, 0);	/* SLIME */		break;	  case 'O':		fire_slime(pp, 1);	/* SSLIME */		break;	  case 'p':		fire_slime(pp, 2);		break;	  case 'P':		fire_slime(pp, 3);		break;# endif	  case 's':		scan(pp);		break;	  case 'c':		cloak(pp);		break;	  case 'q':		(void) strcpy(pp->p_death, "| Quit |");		break;	}}/* * move_player: *	Execute a move in the given direction */move_player(pp, dir)register PLAYER	*pp;int		dir;{	register PLAYER	*newp;	register int	x, y;	register FLAG	moved;	register BULLET	*bp;	y = pp->p_y;	x = pp->p_x;	switch (dir) {	  case LEFTS:		x--;		break;	  case RIGHT:		x++;		break;	  case ABOVE:		y--;		break;	  case BELOW:		y++;		break;	}	moved = FALSE;	switch (Maze[y][x]) {	  case SPACE:# ifdef RANDOM	  case DOOR:# endif		moved = TRUE;		break;	  case WALL1:	  case WALL2:	  case WALL3:# ifdef REFLECT	  case WALL4:	  case WALL5:# endif		break;	  case MINE:	  case GMINE:		if (dir == pp->p_face)			pickup(pp, y, x, 2, Maze[y][x]);		else if (opposite(dir, pp->p_face))			pickup(pp, y, x, 95, Maze[y][x]);		else			pickup(pp, y, x, 50, Maze[y][x]);		Maze[y][x] = SPACE;		moved = TRUE;		break;	  case SHOT:	  case GRENADE:	  case SATCHEL:	  case BOMB:# ifdef OOZE	  case SLIME:# endif# ifdef DRONE	  case DSHOT:# endif		bp = is_bullet(y, x);		if (bp != NULL)			bp->b_expl = TRUE;		Maze[y][x] = SPACE;		moved = TRUE;		break;	  case LEFTS:	  case RIGHT:	  case ABOVE:	  case BELOW:		if (dir != pp->p_face)			sendcom(pp, BELL);		else {			newp = play_at(y, x);			checkdam(newp, pp, pp->p_ident, STABDAM, KNIFE);		}		break;# ifdef FLY	  case FLYER:		newp = play_at(y, x);		message(newp, "Oooh, there's a short guy waving at you!");		message(pp, "You couldn't quite reach him!");		break;# endif# ifdef BOOTS	  case BOOT:	  case BOOT_PAIR:		if (Maze[y][x] == BOOT)			pp->p_nboots++;		else			pp->p_nboots += 2;		for (newp = Boot; newp < &Boot[NBOOTS]; newp++) {			if (newp->p_flying < 0)				continue;			if (newp->p_y == y && newp->p_x == x) {				newp->p_flying = -1;				if (newp->p_undershot)					fixshots(y, x, newp->p_over);			}		}		if (pp->p_nboots == 2)			message(pp, "Wow!  A pair of boots!");		else			message(pp, "You can hobble around on one boot.");		Maze[y][x] = SPACE;		moved = TRUE;		break;# endif	}	if (moved) {		if (pp->p_ncshot > 0)			if (--pp->p_ncshot == MAXNCSHOT) {				cgoto(pp, STAT_GUN_ROW, STAT_VALUE_COL);				outstr(pp, " ok", 3);			}		if (pp->p_undershot) {			fixshots(pp->p_y, pp->p_x, pp->p_over);			pp->p_undershot = FALSE;		}		drawplayer(pp, FALSE);		pp->p_over = Maze[y][x];		pp->p_y = y;		pp->p_x = x;		drawplayer(pp, TRUE);	}}/* * face: *	Change the direction the player is facing */face(pp, dir)register PLAYER	*pp;register int	dir;{	if (pp->p_face != dir) {		pp->p_face = dir;		drawplayer(pp, TRUE);	}}/* * fire: *	Fire a shot of the given type in the given direction */fire(pp, req_index)register PLAYER	*pp;register int	req_index;{	if (pp == NULL)		return;# ifdef DEBUG	if (req_index < 0 || req_index >= MAXBOMB)		message(pp, "What you do?");# endif	while (req_index >= 0 && pp->p_ammo < shot_req[req_index])		req_index--;	if (req_index < 0) {		message(pp, "Not enough charges.");		return;	}	if (pp->p_ncshot > MAXNCSHOT)		return;	if (pp->p_ncshot++ == MAXNCSHOT) {		cgoto(pp, STAT_GUN_ROW, STAT_VALUE_COL);		outstr(pp, "   ", 3);	}	pp->p_ammo -= shot_req[req_index];	(void) sprintf(Buf, "%3d", pp->p_ammo);	cgoto(pp, STAT_AMMO_ROW, STAT_VALUE_COL);	outstr(pp, Buf, 3);	add_shot(shot_type[req_index], pp->p_y, pp->p_x, pp->p_face,		shot_req[req_index], pp, FALSE, pp->p_face);	pp->p_undershot = TRUE;	/*	 * Show the object to everyone	 */	showexpl(pp->p_y, pp->p_x, shot_type[req_index]);	for (pp = Player; pp < End_player; pp++)		sendcom(pp, REFRESH);# ifdef MONITOR	for (pp = Monitor; pp < End_monitor; pp++)		sendcom(pp, REFRESH);# endif}# ifdef	OOZE/* * fire_slime: *	Fire a slime shot in the given direction */fire_slime(pp, req_index)register PLAYER	*pp;register int	req_index;{	if (pp == NULL)		return;# ifdef DEBUG	if (req_index < 0 || req_index >= MAXSLIME)		message(pp, "What you do?");# endif	while (req_index >= 0 && pp->p_ammo < slime_req[req_index])		req_index--;	if (req_index < 0) {		message(pp, "Not enough charges.");		return;	}	if (pp->p_ncshot > MAXNCSHOT)		return;	if (pp->p_ncshot++ == MAXNCSHOT) {		cgoto(pp, STAT_GUN_ROW, STAT_VALUE_COL);		outstr(pp, "   ", 3);	}	pp->p_ammo -= slime_req[req_index];	(void) sprintf(Buf, "%3d", pp->p_ammo);	cgoto(pp, STAT_AMMO_ROW, STAT_VALUE_COL);	outstr(pp, Buf, 3);	add_shot(SLIME, pp->p_y, pp->p_x, pp->p_face,		slime_req[req_index] * SLIME_FACTOR, pp, FALSE, pp->p_face);	pp->p_undershot = TRUE;	/*	 * Show the object to everyone	 */	showexpl(pp->p_y, pp->p_x, SLIME);	for (pp = Player; pp < End_player; pp++)		sendcom(pp, REFRESH);# ifdef MONITOR	for (pp = Monitor; pp < End_monitor; pp++)		sendcom(pp, REFRESH);# endif}# endif/* * add_shot: *	Create a shot with the given properties */add_shot(type, y, x, face, charge, owner, expl, over)int	type;int	y, x;char	face;int	charge;PLAYER	*owner;int	expl;char	over;{	register BULLET	*bp;	register int	size;	switch (type) {	  case SHOT:	  case MINE:		size = 1;		break;	  case GRENADE:	  case GMINE:		size = 2;		break;	  case SATCHEL:		size = 3;		break;	  case BOMB:		for (size = 3; size < MAXBOMB; size++)			if (shot_req[size] >= charge)				break;		size++;		break;	  default:		size = 0;		break;	}	bp = create_shot(type, y, x, face, charge, size, owner,		(owner == NULL) ? NULL : owner->p_ident, expl, over);	bp->b_next = Bullets;	Bullets = bp;}BULLET *create_shot(type, y, x, face, charge, size, owner, score, expl, over)int	type;int	y, x;char	face;int	charge;int	size;PLAYER	*owner;IDENT	*score;int	expl;char	over;{	register BULLET	*bp;	bp = (BULLET *) malloc(sizeof (BULLET));	/* NOSTRICT */	if (bp == NULL) {		if (owner != NULL)			message(owner, "Out of memory");		return NULL;	}	bp->b_face = face;	bp->b_x = x;	bp->b_y = y;	bp->b_charge = charge;	bp->b_owner = owner;	bp->b_score = score;	bp->b_type = type;	bp->b_size = size;	bp->b_expl = expl;	bp->b_over = over;	bp->b_next = NULL;	return bp;}/* * cloak: *	Turn on or increase length of a cloak */cloak(pp)register PLAYER	*pp;{	if (pp->p_ammo <= 0) {		message(pp, "No more charges");		return;	}# ifdef BOOTS	if (pp->p_nboots > 0) {		message(pp, "Boots are too noisy to cloak!");		return;	}# endif	(void) sprintf(Buf, "%3d", --pp->p_ammo);	cgoto(pp, STAT_AMMO_ROW, STAT_VALUE_COL);	outstr(pp, Buf, 3);	pp->p_cloak += CLOAKLEN;	if (pp->p_scan >= 0)		pp->p_scan = -1;	showstat(pp);}/* * scan: *	Turn on or increase length of a scan */scan(pp)register PLAYER	*pp;{	if (pp->p_ammo <= 0) {		message(pp, "No more charges");		return;	}	(void) sprintf(Buf, "%3d", --pp->p_ammo);	cgoto(pp, STAT_AMMO_ROW, STAT_VALUE_COL);	outstr(pp, Buf, 3);	pp->p_scan += SCANLEN;	if (pp->p_cloak >= 0)		pp->p_cloak = -1;	showstat(pp);}/* * pickup: *	check whether the object blew up or whether he picked it up */pickup(pp, y, x, prob, obj)register PLAYER	*pp;register int	y, x;int		prob;int		obj;{	register int	req;	switch (obj) {	  case MINE:		req = BULREQ;		break;	  case GMINE:		req = GRENREQ;		break;	  default:		abort();	}	if (rand_num(100) < prob)		add_shot(obj, y, x, LEFTS, req, (PLAYER *) NULL,			TRUE, pp->p_face);	else {		pp->p_ammo += req;		(void) sprintf(Buf, "%3d", pp->p_ammo);		cgoto(pp, STAT_AMMO_ROW, STAT_VALUE_COL);		outstr(pp, Buf, 3);	}}

⌨️ 快捷键说明

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