📄 main.c
字号:
// 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 + -