Source:NetHack 3.0.0/rumors.c

Below is the full text to rumors.c from the source code of NetHack 3.0.0. To link to a particular line, write [[NetHack 3.0.0/rumors.c#line123 ]], for example.

Warning! This is the source code from an old release. For the latest release, see Source code

1.   /*	SCCS Id: @(#)rumors.c	3.0	89/02/08 2.   /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ 3.    /* NetHack may be freely redistributed. See license for details. */ 4.    /* hack.rumors.c - version 1.0.3 */ 5.    6.    #include	"hack.h"		/* for RUMORFILE and BSD (index) */ 7.    8.    /* Rumors has been entirely rewritten to speed up the access. This is 9.     * essential when working from floppies. Using fseek the way that's done 10.   * here means rumors following longer rumors are output more often than those 11.   * following shorter rumors. Also, you may see the same rumor more than once 12.   * in a particular game (although the odds are highly against it), but 13.   * this also happens with real fortune cookies. Besides, a person can 14.   * just read the rumor file if they desire. -dgk 15.   */  16.    17.   /* The rumors file consists of a long giving the number of bytes of useful/true 18.   * rumors, followed by the true rumors (one per line), followed by the useless/ 19.   * false/misleading/cute rumors (one per line). 20.   */  21.    22.   /* The oracle file consists of a number of multiple-line records, separated 23.   * (but not terminated) by "-" lines. 24.   */  25.    26.   long first_rumor = sizeof(long); 27.  long true_rumor_size, false_rumor_size, end_rumor_file; 28.  #ifdef ORACLE 29.  long oracle_size; 30.  #endif 31.   32.   static void 33.  init_rumors 34.  {  35.   	register FILE *fp; 36.   37.   	if(fp = fopen(RUMORFILE, "r")) { 38.  	    (void) fread((genericptr_t)&true_rumor_size,sizeof(long),1,fp); 39.  	    (void) fseek(fp, 0L, 2); 40.  	    end_rumor_file = ftell(fp); 41.  	    false_rumor_size = (end_rumor_file-sizeof(long)) - true_rumor_size; 42.  	    (void) fclose(fp); 43.  	} else { 44.  		pline("Can't open rumors file!"); 45.  		end_rumor_file = -1;	/* don't try to open it again */ 46.  	}  47.   #ifdef ORACLE 48.  	if(fp = fopen(ORACLEFILE, "r")) { 49.  	    (void) fseek(fp, 0L, 2); 50.  	    oracle_size = ftell(fp); 51.  	    (void) fclose(fp); 52.  	} else { 53.  		pline("Can't open oracles file!"); 54.  		oracle_size = -1;	/* don't try to open it again */ 55.  	}  56.   #endif 57.  }  58.    59.    60.   void 61.  outrumor(truth,cookie) 62.  int truth; /* 1=true, -1=false, 0=either */ 63.  boolean cookie; 64.  {  65.   	static const char fortune_msg[] = 66.  		"This cookie has a scrap of paper inside."; 67.  	char	line[COLNO]; 68.  	char	*endp; 69.  	FILE	*rumors; 70.  	long tidbit, beginning; 71.   72.   	if (cookie && Blind) { 73.  		pline(fortune_msg); 74.  		pline("What a pity that you cannot read it!"); 75.  		return; 76.  	}  77.   	if (end_rumor_file < 0) /* We couldn't open RUMORFILE */ 78.  		return; 79.  	if(rumors = fopen(RUMORFILE, "r")) { 80.  		if (!end_rumor_file) {	/* if this is the first outrumor */ 81.  			init_rumors; 82.  		}  83.   		if (!truth) truth = (rn2(100) >= 50 ? 1 : -1); 84.  		/* otherwise, 50% chance of being true */ 85.  		switch(truth) { 86.  		    case 1: beginning = first_rumor; 87.  			tidbit = Rand % true_rumor_size; 88.  			break; 89.  		    case -1: beginning = first_rumor + true_rumor_size; 90.  			tidbit = true_rumor_size + Rand % false_rumor_size; 91.  			break; 92.  		}  93.   		(void) fseek(rumors, first_rumor + tidbit, 0); 94.  		(void) fgets(line, COLNO, rumors); 95.  		if (!fgets(line, COLNO, rumors) || (truth == 1 && 96.  		    (ftell(rumors) > true_rumor_size + sizeof(long)))) { 97.  			/* reached end of rumors -- go back to beginning */ 98.  			(void) fseek(rumors, beginning, 0); 99.  			(void) fgets(line, COLNO, rumors); 100. 		}  101.  		if (endp = index(line, '\n')) *endp = 0; 102. 		if (cookie) { 103. 			pline(fortune_msg); 104. 			pline("It reads:"); 105. 		} else pline("Tidbit of information #%ld: ",tidbit); 106. 		pline(line); 107. 		(void) fclose(rumors); 108. 	} else { 109. 		pline("Can't open rumors file!"); 110. 		end_rumor_file = -1;	/* don't try to open it again */ 111. 	}  112.  }  113.   114.  #ifdef ORACLE 115. static void 116. outoracle 117. {  118.  	char	line[COLNO]; 119. 	char	*endp; 120. 	FILE	*oracles; 121.  122.  	if (oracle_size < 0)	/* We couldn't open ORACLEFILE */ 123. 		return; 124. 	if(oracles = fopen(ORACLEFILE, "r")) { 125. 		if (!oracle_size) {	/* if this is the first outrumor */ 126. 			init_rumors; 127. 		}  128.  		(void) fseek(oracles, Rand % oracle_size, 0); 129. 		(void) fgets(line, COLNO, oracles); 130. 		while (1) 131. 		    if (!fgets(line, COLNO, oracles)) { 132. 			/* reached end of oracle info -- go back to beginning */ 133. 			(void) fseek(oracles, 0L, 0); 134. 			break; 135. 		    } else if (!strncmp(line,"-",5)) { 136. 			/* found end of an oracle proclamation */ 137. 			break; 138. 		    }  139.  		pline("The Oracle meditates for a moment and then intones: "); 140. 		cornline(0,NULL); 141. 		while (fgets(line, COLNO, oracles) && strncmp(line,"-",5)) { 142. 			if (endp = index(line, '\n')) *endp = 0; 143. 			cornline(1,line); 144. 		}  145.  		cornline(2,""); 146. 		(void) fclose(oracles); 147. 	} else { 148. 		pline("Can't open oracles file!"); 149. 		oracle_size = -1;	/* don't try to open it again */ 150. 	}  151.  }  152.   153.  int 154. doconsult(oracl) 155. register struct monst *oracl; 156. {  157.  	register char ans; 158.  159.  	multi = 0; 160. 	(void) inshop; 161.  162.  	if(!oracl) { 163. 		pline("There is no one here to consult."); 164. 		return(0); 165. 	}  166.  	if(!oracl->mpeaceful) { 167. 		pline("The Oracle is in no mood for consultations."); 168. 		return(0); 169. 	} else { 170. 		if(!u.ugold) { 171. 			You("have no money."); 172. 			return(0); 173. 		}  174.  		pline("\"Wilt thou settle for a minor consultation?\"  (50 Zorkmids) "); 175. 		ans = ynq; 176. 		if(ans == 'y') { 177. 			if(u.ugold < 50) { 178. 			    You("don't even have enough money for that!"); 179. 			    return(0); 180. 			}  181.  			u.ugold -= 50; 182. 			oracl->mgold += 50; 183. 			flags.botl = 1; 184. 			outrumor(1, FALSE); 185. 			return(1); 186. 		} else if(ans == 'q') return(0); 187. 		else { 188. 			pline("\"Then dost thou desire a major one?\"  (1000 Zorkmids) "); 189. 			if (yn != 'y') return(0); 190. 		}  191.  		if(u.ugold < 1000) { 192. 		pline("The Oracle scornfully takes all your money and says:"); 193. cornline(0,NULL); 194. cornline(1,"\"...it is rather disconcerting to be confronted with the");  195.  cornline(1,"following theorem from [Baker, Gill, and Solovay, 1975].");  196.  cornline(1,"");  197.  cornline(1,"Theorem 7.18  There exist recursive languages A and B such that");  198.  cornline(1,"  (1)  P(A) == NP(A), and");  199.  cornline(1,"  (2)  P(B) != NP(B)");  200.  cornline(1,"");  201.  cornline(1,"This provides impressive evidence that the techniques that are");  202.  cornline(1,"currently available will not suffice for proving that P != NP or");  203.  cornline(1,"that P == NP.\"  [Garey and Johnson, p. 185.]"); 204. cornline(2,""); 205. 		    oracl->mgold += u.ugold; 206. 		    u.ugold = 0; 207. 		    flags.botl = 1; 208. 		    return(1); 209. 		}  210.  		u.ugold -= 1000; 211. 		oracl->mgold += 1000; 212. 		flags.botl = 1; 213. 		outoracle; 214. 		return(1); 215. 	}  216.  }  217.   218.  #endif