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

📄 object.c

📁 早期freebsd实现
💻 C
📖 第 1 页 / 共 2 页
字号:
/*	object.c		Larn is copyrighted 1986 by Noah Morgan. */#include "header.h"/*	***************	LOOK_FOR_OBJECT	***************	subroutine to look for an object and give the player his options	if an object was found. */lookforobject(){register int i,j;if (c[TIMESTOP])  return;	/* can't find objects is time is stopped	*/i=item[playerx][playery];	if (i==0) return;showcell(playerx,playery);  cursors();  yrepcount=0;switch(i)	{	case OGOLDPILE:	case OMAXGOLD:	case OKGOLD:	case ODGOLD:	lprcat("\n\nYou have found some gold!");	ogold(i);	break;	case OPOTION:	lprcat("\n\nYou have found a magic potion");				i = iarg[playerx][playery];				if (potionname[i][0]) lprintf(" of %s",&potionname[i][1]);  opotion(i);  break;	case OSCROLL:	lprcat("\n\nYou have found a magic scroll");				i = iarg[playerx][playery];				if (scrollname[i][0])	lprintf(" of %s",&scrollname[i][1]);				oscroll(i);  break;	case OALTAR:	if (nearbymonst()) return;					lprcat("\n\nThere is a Holy Altar here!"); oaltar(); break;	case OBOOK:	lprcat("\n\nYou have found a book."); obook(); break;	case OCOOKIE:	lprcat("\n\nYou have found a fortune cookie."); ocookie(); break;	case OTHRONE:	if (nearbymonst()) return;					lprintf("\n\nThere is %s here!",objectname[i]); othrone(0); break;	case OTHRONE2:	if (nearbymonst()) return;					lprintf("\n\nThere is %s here!",objectname[i]); othrone(1); break;	case ODEADTHRONE: lprintf("\n\nThere is %s here!",objectname[i]); odeadthrone(); break;	case OORB:		lprcat("\n\nYou have found the Orb!!!!!"); oorb(); break;	case OPIT:		lprcat("\n\nYou're standing at the top of a pit."); opit(); break;	case OSTAIRSUP:		lprcat("\n\nThere is a circular staircase here"); ostairs(1);  /* up */ break;	case OELEVATORUP:	lprcat("\n\nYou feel heavy for a moment, but the feeling disappears");				oelevator(1);  /*  up  */  break;	case OFOUNTAIN:	if (nearbymonst()) return;					lprcat("\n\nThere is a fountain here"); ofountain(); break;	case OSTATUE:	if (nearbymonst()) return;					lprcat("\n\nYou are standing in front of a statue"); ostatue(); break;	case OCHEST:	lprcat("\n\nThere is a chest here");  ochest();  break;	case OIVTELETRAP:	if (rnd(11)<6) return;						item[playerx][playery] = OTELEPORTER;						know[playerx][playery] = 1;	case OTELEPORTER:	lprcat("\nZaaaappp!  You've been teleported!\n");						beep(); nap(3000); oteleport(0);						break; 	case OSCHOOL:	if (nearbymonst()) return;				lprcat("\n\nYou have found the College of Larn.");				lprcat("\nDo you (g) go inside, or (i) stay here? ");				i=0; while ((i!='g') && (i!='i') && (i!='\33')) i=getchar();				if (i == 'g') { oschool();  /*	the college of larn	*/ }				else	lprcat(" stay here");				break;	case OMIRROR:	if (nearbymonst()) return;					lprcat("\n\nThere is a mirror here");	omirror();	break;	case OBANK2:	case OBANK:	if (nearbymonst()) return;				if (i==OBANK) lprcat("\n\nYou have found the bank of Larn.");				else lprcat("\n\nYou have found a branch office of the bank of Larn.");				lprcat("\nDo you (g) go inside, or (i) stay here? ");				j=0; while ((j!='g') && (j!='i') && (j!='\33')) j=getchar();				if (j == 'g') {  if (i==OBANK) obank(); else obank2(); /*  the bank of larn  */  }				else   lprcat(" stay here");				break;	case ODEADFOUNTAIN:	if (nearbymonst()) return;						lprcat("\n\nThere is a dead fountain here"); break;	case ODNDSTORE:	if (nearbymonst()) return;					lprcat("\n\nThere is a DND store here.");					lprcat("\nDo you (g) go inside, or (i) stay here? ");					i=0; while ((i!='g') && (i!='i') && (i!='\33')) i=getchar();					if (i == 'g')						dndstore();  /*  the dnd adventurers store  */					else  lprcat(" stay here");					break;	case OSTAIRSDOWN:	lprcat("\n\nThere is a circular staircase here"); ostairs(-1); /* down */ break;	case OELEVATORDOWN:	lprcat("\n\nYou feel light for a moment, but the feeling disappears");				oelevator(-1);	/*	down	*/				break;	case OOPENDOOR:		lprintf("\n\nYou have found %s",objectname[i]);						lprcat("\nDo you (c) close it"); iopts();						i=0; while ((i!='c') && (i!='i') && (i!='\33')) i=getchar();						if ((i=='\33') || (i=='i')) { ignore();  break; }						lprcat("close");  forget();						item[playerx][playery]=OCLOSEDDOOR;						iarg[playerx][playery]=0;						playerx = lastpx;  playery = lastpy;						break;	case OCLOSEDDOOR:	lprintf("\n\nYou have found %s",objectname[i]);						lprcat("\nDo you (o) try to open it"); iopts();						i=0; while ((i!='o') && (i!='i') && (i!='\33')) i=getchar();						if ((i=='\33') || (i=='i'))							{ ignore();  playerx = lastpx;							playery = lastpy; break; }						else						{						lprcat("open");						if (rnd(11)<7)						  {						  switch(iarg[playerx][playery])							{							case 6: c[AGGRAVATE] += rnd(400);	break;							case 7:	lprcat("\nYou are jolted by an electric shock "); 									lastnum=274; losehp(rnd(20));  bottomline();  break;							case 8:	loselevel();  break;							case 9:	lprcat("\nYou suddenly feel weaker ");									if (c[STRENGTH]>3) c[STRENGTH]--;									bottomline();  break;							default:	break;							}						  playerx = lastpx;  playery = lastpy;						  }						else						  {						  forget();  item[playerx][playery]=OOPENDOOR;						  }						}						break;	case OENTRANCE:	lprcat("\nYou have found "); lprcat(objectname[OENTRANCE]);					lprcat("\nDo you (g) go inside"); iopts();					i=0; while ((i!='g') && (i!='i') && (i!='\33')) i=getchar();					if (i == 'g')						{						newcavelevel(1); playerx=33; playery=MAXY-2;						item[33][MAXY-1]=know[33][MAXY-1]=mitem[33][MAXY-1]=0;						draws(0,MAXX,0,MAXY); bot_linex(); return;						}					else   ignore();					break;	case OVOLDOWN:	lprcat("\nYou have found "); lprcat(objectname[OVOLDOWN]);						lprcat("\nDo you (c) climb down"); iopts();						i=0; while ((i!='c') && (i!='i') && (i!='\33')) i=getchar();						if ((i=='\33') || (i=='i')) { ignore();  break; }					if (level!=0) { lprcat("\nThe shaft only extends 5 feet downward!"); return; }					if (packweight() > 45+3*(c[STRENGTH]+c[STREXTRA])) { lprcat("\nYou slip and fall down the shaft"); beep();											  lastnum=275;  losehp(30+rnd(20)); bottomhp(); }										else lprcat("climb down");  nap(3000);  newcavelevel(MAXLEVEL);					for (i=0; i<MAXY; i++)  for (j=0; j<MAXX; j++) /* put player near volcano shaft */						if (item[j][i]==OVOLUP) { playerx=j; playery=i; j=MAXX; i=MAXY; positionplayer(); }					draws(0,MAXX,0,MAXY); bot_linex(); return;	case OVOLUP:	lprcat("\nYou have found "); lprcat(objectname[OVOLUP]);						lprcat("\nDo you (c) climb up"); iopts();						i=0; while ((i!='c') && (i!='i') && (i!='\33')) i=getchar();						if ((i=='\33') || (i=='i')) { ignore();  break; }					if (level!=11) { lprcat("\nThe shaft only extends 8 feet upwards before you find a blockage!"); return; }					if (packweight() > 45+5*(c[STRENGTH]+c[STREXTRA])) { lprcat("\nYou slip and fall down the shaft"); beep();											  lastnum=275; losehp(15+rnd(20)); bottomhp(); return; }					lprcat("climb up"); lflush(); nap(3000); newcavelevel(0);					for (i=0; i<MAXY; i++)  for (j=0; j<MAXX; j++) /* put player near volcano shaft */						if (item[j][i]==OVOLDOWN) { playerx=j; playery=i; j=MAXX; i=MAXY; positionplayer(); }					draws(0,MAXX,0,MAXY); bot_linex(); return;	case OTRAPARROWIV:	if (rnd(17)<13) return;	/* for an arrow trap */						item[playerx][playery] = OTRAPARROW;						know[playerx][playery] = 0;	case OTRAPARROW:	lprcat("\nYou are hit by an arrow"); beep();	/* for an arrow trap */						lastnum=259;	losehp(rnd(10)+level);						bottomhp();	return;	case OIVDARTRAP:	if (rnd(17)<13) return;		/* for a dart trap */						item[playerx][playery] = ODARTRAP;						know[playerx][playery] = 0;	case ODARTRAP:		lprcat("\nYou are hit by a dart"); beep();	/* for a dart trap */						lastnum=260;	losehp(rnd(5));						if ((--c[STRENGTH]) < 3) c[STRENGTH] = 3;						bottomline();	return;	case OIVTRAPDOOR:	if (rnd(17)<13) return;		/* for a trap door */						item[playerx][playery] = OTRAPDOOR;						know[playerx][playery] = 1;	case OTRAPDOOR:		lastnum = 272; /* a trap door */						if ((level==MAXLEVEL-1) || (level==MAXLEVEL+MAXVLEVEL-1))							{ lprcat("\nYou fell through a bottomless trap door!"); beep();  nap(3000);  died(271); }						lprcat("\nYou fall through a trap door!"); beep();	/* for a trap door */						losehp(rnd(5+level));						nap(2000);  newcavelevel(level+1);  draws(0,MAXX,0,MAXY); bot_linex();						return;	case OTRADEPOST:	if (nearbymonst()) return;				lprcat("\nYou have found the Larn trading Post.");				lprcat("\nDo you (g) go inside, or (i) stay here? ");				i=0; while ((i!='g') && (i!='i') && (i!='\33')) i=getchar();				if (i == 'g')  otradepost();  else  lprcat("stay here");				return;	case OHOME:	if (nearbymonst()) return;				lprcat("\nYou have found your way home.");				lprcat("\nDo you (g) go inside, or (i) stay here? ");				i=0; while ((i!='g') && (i!='i') && (i!='\33')) i=getchar();				if (i == 'g')  ohome();  else  lprcat("stay here");				return;	case OWALL:	break;	case OANNIHILATION:	died(283); return; 	/* annihilated by sphere of annihilation */	case OLRS:	if (nearbymonst()) return;				lprcat("\n\nThere is an LRS office here.");				lprcat("\nDo you (g) go inside, or (i) stay here? ");				i=0; while ((i!='g') && (i!='i') && (i!='\33')) i=getchar();				if (i == 'g')					olrs();  /*  the larn revenue service */				else  lprcat(" stay here");				break;	default:	finditem(i); break;	};}/*	function to say what object we found and ask if player wants to take it */finditem(itm)	int itm;	{	int tmp,i;	lprintf("\n\nYou have found %s ",objectname[itm]);	tmp=iarg[playerx][playery];	switch(itm)		{		case ODIAMOND:		case ORUBY:			case OEMERALD:		case OSAPPHIRE:		case OSPIRITSCARAB:	case OORBOFDRAGON:		case OCUBEofUNDEAD:	case ONOTHEFT:	break;		default:		if (tmp>0) lprintf("+ %d",(long)tmp); else if (tmp<0) lprintf(" %d",(long)tmp);		}	lprcat("\nDo you want to (t) take it"); iopts();	i=0; while (i!='t' && i!='i' && i!='\33') i=getchar();	if (i == 't')		{	lprcat("take");  if (take(itm,tmp)==0)  forget();	return;	}	ignore();	}/*	*******	OSTAIRS	*******	subroutine to process the stair cases	if dir > 0 the up else down */ostairs(dir)	int dir;	{	register int k;	lprcat("\nDo you (s) stay here  ");	if (dir > 0)	lprcat("(u) go up  ");	else	lprcat("(d) go down  ");	lprcat("or (f) kick stairs? ");	while (1) switch(getchar())		{		case '\33':		case 's':	case 'i':	lprcat("stay here");	return;		case 'f':	lprcat("kick stairs");					if (rnd(2) == 1)						lprcat("\nI hope you feel better.  Showing anger rids you of frustration.");					else						{						k=rnd((level+1)<<1);						lprintf("\nYou hurt your foot dumb dumb!  You suffer %d hit points",(long)k);						lastnum=276;  losehp(k);  bottomline();						}					return;		case 'u':	lprcat("go up");					if (dir < 0)	lprcat("\nThe stairs don't go up!");					else					  if (level>=2 && level!=11)						{						k = level;  newcavelevel(level-1);						draws(0,MAXX,0,MAXY); bot_linex();						}					  else lprcat("\nThe stairs lead to a dead end!");					return;		case 'd':	lprcat("go down");					if (dir > 0)	lprcat("\nThe stairs don't go down!");					else					  if (level!=0 && level!=10 && level!=13)						{						k = level;  newcavelevel(level+1);						draws(0,MAXX,0,MAXY); bot_linex();						}					  else lprcat("\nThe stairs lead to a dead end!");					return;		};	}/*	*********	OTELEPORTER	*********	subroutine to handle a teleport trap +/- 1 level maximum */oteleport(err)	int err;	{	register int tmp;	if (err) if (rnd(151)<3)  died(264);  /*	stuck in a rock */	c[TELEFLAG]=1;	/*	show ?? on bottomline if been teleported	*/	if (level==0) tmp=0;	else if (level < MAXLEVEL)		{ tmp=rnd(5)+level-3; if (tmp>=MAXLEVEL) tmp=MAXLEVEL-1;			if (tmp<1) tmp=1; }	else		{ tmp=rnd(3)+level-2; if (tmp>=MAXLEVEL+MAXVLEVEL) tmp=MAXLEVEL+MAXVLEVEL-1;			if (tmp<MAXLEVEL) tmp=MAXLEVEL; }	playerx = rnd(MAXX-2);	playery = rnd(MAXY-2);	if (level != tmp)	newcavelevel(tmp);  positionplayer();	draws(0,MAXX,0,MAXY); bot_linex();	}/*	*******	OPOTION	*******	function to process a potion */opotion(pot)	int pot;	{	lprcat("\nDo you (d) drink it, (t) take it"); iopts();	while (1) switch(getchar())		{		case '\33':		case 'i':	ignore();  return;		case 'd':	lprcat("drink\n");	forget();	/*	destroy potion	*/					quaffpotion(pot);		return;		case 't':	lprcat("take\n");	if (take(OPOTION,pot)==0)  forget();					return;		};	}		/*	function to drink a potion */quaffpotion(pot)	int pot;	{	register int i,j,k;	if (pot<0 || pot>=MAXPOTION) return; /* check for within bounds */	potionname[pot][0] = ' ';	switch(pot)		{		case 9: lprcat("\nYou feel greedy . . .");   nap(2000);				for (i=0; i<MAXY; i++)  for (j=0; j<MAXX; j++)				  if ((item[j][i]==OGOLDPILE) || (item[j][i]==OMAXGOLD))					{					know[j][i]=1; show1cell(j,i);					}				showplayer();  return;

⌨️ 快捷键说明

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