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

📄 main.c

📁 早期freebsd实现
💻 C
📖 第 1 页 / 共 3 页
字号:
// FUNCTION: find a character on file// AUTHOR: E. A. Estes, 12/4/85// ARGUMENTS: none// RETURN VALUE: none// MODULES CALLED: writerecord(), truncstring(), more(), death(), wmove(), /	wclear(), strcmp(), printw(), cleanup(), waddstr(), findname(), mvprintw(), /	getanswer(), getstring()// GLOBAL INPUTS: Player, *stdscr, Databuf[]// GLOBAL OUTPUTS: Echo, Player// DESCRIPTION:/	Search for a character of a certain name, and check password.//************************************************************************/longrecallplayer(){long	loc = 0L;		/* location in player file */register int	loop;		/* loop counter */int	ch;			/* input */    clear();    mvprintw(10, 0, "What was your character's name ? ");    getstring(Databuf, SZ_NAME);    truncstring(Databuf);    if ((loc = findname(Databuf, &Player)) >= 0L)	/* found character */	{	Echo = FALSE;	for (loop = 0; loop < 2; ++loop)	    {	    /* prompt for password */	    mvaddstr(11, 0, "Password ? ");	    getstring(Databuf, SZ_PASSWORD);	    if (strcmp(Databuf, Player.p_password) == 0)		/* password good */		{		Echo = TRUE;		if (Player.p_status != S_OFF)		    /* player did not exit normally last time */		    {		    clear();		    addstr("Your character did not exit normally last time.\n");		    addstr("If you think you have good cause to have your character saved,\n");		    printw("you may quit and mail your reason to 'root'.\n");		    addstr("Otherwise, continuing spells certain death.\n");		    addstr("Do you want to quit ? ");		    ch = getanswer("YN", FALSE);		    if (ch == 'Y')			{			Player.p_status = S_HUNGUP;			writerecord(&Player, loc);			cleanup(TRUE);			/*NOTREACHED*/			}		    death("Stupidity");		    /*NOTREACHED*/		    }		return(loc);		}	    else		mvaddstr(12, 0, "No good.\n");	    }	Echo = TRUE;	}    else	mvaddstr(11, 0, "Not found.\n");    more(13);    return(-1L);}/**//************************************************************************// FUNCTION NAME: neatstuff()// FUNCTION: do random stuff// AUTHOR: E. A. Estes, 3/3/86// ARGUMENTS: none// RETURN VALUE: none// MODULES CALLED: collecttaxes(), floor(), wmove(), drandom(), infloat(), /	waddstr(), mvprintw(), getanswer()// GLOBAL INPUTS: Player, *stdscr, *Statptr// GLOBAL OUTPUTS: Player// DESCRIPTION:/	Handle gurus, medics, etc.//************************************************************************/neatstuff(){double	temp;	/* for temporary calculations */int	ch;	/* input */    switch ((int) ROLL(0.0, 100.0))	{	case 1:	case 2:	    if (Player.p_poison > 0.0)		{		mvaddstr(4, 0, "You've found a medic!  How much will you offer to be cured ? ");		temp = floor(infloat());		if (temp < 0.0 || temp > Player.p_gold)		    /* negative gold, or more than available */		    {		    mvaddstr(6, 0, "He was not amused, and made you worse.\n");		    Player.p_poison += 1.0;		    }		else if (drandom() / 2.0 > (temp + 1.0) / MAX(Player.p_gold, 1))		    /* medic wants 1/2 of available gold */		    mvaddstr(5, 0, "Sorry, he wasn't interested.\n");		else		    {		    mvaddstr(5, 0, "He accepted.");		    Player.p_poison = MAX(0.0, Player.p_poison - 1.0);		    Player.p_gold -= temp;		    }		}	    break;	case 3:	    mvaddstr(4, 0, "You've been caught raping and pillaging!\n");	    Player.p_experience += 4000.0;	    Player.p_sin += 0.5;	    break;	case 4:	    temp = ROLL(10.0, 75.0);	    mvprintw(4, 0, "You've found %.0f gold pieces, want them ? ", temp);	    ch = getanswer("NY", FALSE);	    if (ch == 'Y')		collecttaxes(temp, 0.0);	    break;	case 5:	    if (Player.p_sin > 1.0)		{		mvaddstr(4, 0, "You've found a Holy Orb!\n");		Player.p_sin -= 0.25;		}	    break;	case 6:	    if (Player.p_poison < 1.0)		{		mvaddstr(4, 0, "You've been hit with a plague!\n");		Player.p_poison += 1.0;		}	    break;	case 7:	    mvaddstr(4, 0, "You've found some holy water.\n");	    ++Player.p_holywater;	    break;	case 8:	    mvaddstr(4, 0, "You've met a Guru. . .");	    if (drandom() * Player.p_sin > 1.0)		addstr("You disgusted him with your sins!\n");	    else if (Player.p_poison > 0.0)		{		addstr("He looked kindly upon you, and cured you.\n");		Player.p_poison = 0.0;		}	    else		{		addstr("He rewarded you for your virtue.\n");		Player.p_mana += 50.0;		Player.p_shield += 2.0;		}	    break;	case 9:	    mvaddstr(4, 0, "You've found an amulet.\n");	    ++Player.p_amulets;	    break;	case 10:	    if (Player.p_blindness)		{		mvaddstr(4, 0, "You've regained your sight!\n");		Player.p_blindness = FALSE;		}	    break;	default:	/* deal with poison */	    if (Player.p_poison > 0.0)		{		temp = Player.p_poison * Statptr->c_weakness		    * Player.p_maxenergy / 600.0;		if (Player.p_energy > Player.p_maxenergy / 10.0		    && temp + 5.0 < Player.p_energy)		    Player.p_energy -= temp;		}	    break;	}}/**//************************************************************************// FUNCTION NAME: genchar()// FUNCTION: generate a random character// AUTHOR: E. A. Estes, 12/4/85// ARGUMENTS:/	int type - ASCII value of character type to generate// RETURN VALUE: none// MODULES CALLED: floor(), drandom()// GLOBAL INPUTS: Wizard, Player, Stattable[]// GLOBAL OUTPUTS: Player// DESCRIPTION:/	Use the lookup table for rolling stats.//************************************************************************/genchar(type)int	type;{register int	subscript;		/* used for subscripting into Stattable */register struct charstats	*statptr;/* for pointing into Stattable */    subscript = type - '1';    if (subscript < C_MAGIC || subscript > C_EXPER)	if (subscript != C_SUPER || !Wizard)	    /* fighter is default */	    subscript = C_FIGHTER;        statptr = &Stattable[subscript];    Player.p_quickness =	ROLL(statptr->c_quickness.base, statptr->c_quickness.interval);    Player.p_strength =	ROLL(statptr->c_strength.base, statptr->c_strength.interval);    Player.p_mana =	ROLL(statptr->c_mana.base, statptr->c_mana.interval);    Player.p_maxenergy =    Player.p_energy =	ROLL(statptr->c_energy.base, statptr->c_energy.interval);    Player.p_brains =	ROLL(statptr->c_brains.base, statptr->c_brains.interval);    Player.p_magiclvl =	ROLL(statptr->c_magiclvl.base, statptr->c_magiclvl.interval);    Player.p_type = subscript;    if (Player.p_type == C_HALFLING)	/* give halfling some experience */	Player.p_experience = ROLL(600.0, 200.0);}/**//************************************************************************// FUNCTION NAME: playinit()// FUNCTION: initialize for playing game// AUTHOR: E. A. Estes, 12/4/85// ARGUMENTS: none// RETURN VALUE: none// MODULES CALLED: signal(), wclear(), noecho(), crmode(), initscr(), /	wrefresh()// GLOBAL INPUTS: *stdscr, ill_sig()// GLOBAL OUTPUTS: Windows// DESCRIPTION:/	Catch a bunch of signals, and turn on curses stuff.//************************************************************************/playinit(){    /* catch/ingnore signals */#ifdef	BSD41    sigignore(SIGQUIT);    sigignore(SIGALRM);    sigignore(SIGTERM);    sigignore(SIGTSTP);    sigignore(SIGTTIN);    sigignore(SIGTTOU);    sighold(SIGINT);    sigset(SIGHUP, ill_sig);    sigset(SIGTRAP, ill_sig);    sigset(SIGIOT, ill_sig);    sigset(SIGEMT, ill_sig);    sigset(SIGFPE, ill_sig);    sigset(SIGBUS, ill_sig);    sigset(SIGSEGV, ill_sig);    sigset(SIGSYS, ill_sig);    sigset(SIGPIPE, ill_sig);#endif#ifdef	BSD42    signal(SIGQUIT, ill_sig);    signal(SIGALRM, SIG_IGN);    signal(SIGTERM, SIG_IGN);    signal(SIGTSTP, SIG_IGN);    signal(SIGTTIN, SIG_IGN);    signal(SIGTTOU, SIG_IGN);    signal(SIGINT, ill_sig);    signal(SIGHUP, SIG_DFL);    signal(SIGTRAP, ill_sig);    signal(SIGIOT, ill_sig);    signal(SIGEMT, ill_sig);    signal(SIGFPE, ill_sig);    signal(SIGBUS, ill_sig);    signal(SIGSEGV, ill_sig);    signal(SIGSYS, ill_sig);    signal(SIGPIPE, ill_sig);#endif#ifdef	SYS3    signal(SIGINT, SIG_IGN);    signal(SIGQUIT, SIG_IGN);    signal(SIGTERM, SIG_IGN);    signal(SIGALRM, SIG_IGN);    signal(SIGHUP, ill_sig);    signal(SIGTRAP, ill_sig);    signal(SIGIOT, ill_sig);    signal(SIGEMT, ill_sig);    signal(SIGFPE, ill_sig);    signal(SIGBUS, ill_sig);    signal(SIGSEGV, ill_sig);    signal(SIGSYS, ill_sig);    signal(SIGPIPE, ill_sig);#endif#ifdef	SYS5    signal(SIGINT, SIG_IGN);    signal(SIGQUIT, SIG_IGN);    signal(SIGTERM, SIG_IGN);    signal(SIGALRM, SIG_IGN);    signal(SIGHUP, ill_sig);    signal(SIGTRAP, ill_sig);    signal(SIGIOT, ill_sig);    signal(SIGEMT, ill_sig);    signal(SIGFPE, ill_sig);    signal(SIGBUS, ill_sig);    signal(SIGSEGV, ill_sig);    signal(SIGSYS, ill_sig);    signal(SIGPIPE, ill_sig);#endif    initscr();		/* turn on curses */    noecho();		/* do not echo input */    crmode();		/* do not process erase, kill */    clear();    refresh();    Windows = TRUE;	/* mark the state */}/**//************************************************************************// FUNCTION NAME: cleanup()// FUNCTION: close some files, and maybe exit// AUTHOR: E. A. Estes, 12/4/85// ARGUMENTS:/	bool doexit - exit flag// RETURN VALUE: none// MODULES CALLED: exit(), wmove(), fclose(), endwin(), nocrmode(), wrefresh()// GLOBAL INPUTS: *Energyvoidfp, LINES, *stdscr, Windows, *Monstfp, /	*Messagefp, *Playersfp// GLOBAL OUTPUTS: none// DESCRIPTION:/	Close all open files.  If we are "in curses" terminate curses./	If 'doexit' is set, exit, otherwise return.//************************************************************************/cleanup(doexit)bool	doexit;{    if (Windows)	{	move(LINES - 2, 0);	refresh();	nocrmode();	endwin();	}    fclose(Playersfp);    fclose(Monstfp);    fclose(Messagefp);    fclose(Energyvoidfp);    if (doexit)	exit(0);	/*NOTREACHED*/}

⌨️ 快捷键说明

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