Source:NetHack 1.3d/options.c
Jump to navigation
Jump to search
Below is the full text to options.c from the source code of NetHack 1.3d. To link to a particular line, write [[NetHack 1.3d/options.c#line123]], for example.
Warning! This is the source code from an old release. For the latest release, see Source code
Screenshots and source code from Hack are used under the CWI license.
1. /* SCCS Id: @(#)options.c 1.3 87/07/14 2. /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ 3. /* options.c - version 1.0.3 */ 4. 5. #include "config.h" 6. #include "hack.h" 7. extern char *eos(); 8. #ifdef SORTING 9. static boolean set_order; 10. #endif 11. 12. initoptions() 13. { 14. register char *opts; 15. extern char *getenv(); 16. 17. flags.time = flags.nonews = flags.notombstone = flags.end_own = 18. flags.standout = flags.nonull = FALSE; 19. flags.no_rest_on_space = TRUE; 20. flags.invlet_constant = TRUE; 21. flags.end_top = 5; 22. flags.end_around = 4; 23. flags.female = FALSE; /* players are usually male */ 24. #ifdef SORTING 25. flags.sortpack = TRUE; 26. #endif 27. #ifdef SAFE_ATTACK 28. flags.confirm = TRUE; 29. #endif 30. #ifdef DGKMOD 31. flags.silent = flags.pickup = TRUE; 32. #endif 33. #ifdef DGK 34. flags.IBMBIOS = flags.DECRainbow = flags.rawio = FALSE; 35. read_config_file(); 36. #else 37. if(opts = getenv("HACKOPTIONS")) 38. parseoptions(opts,TRUE); 39. #endif 40. } 41. 42. parseoptions(opts, from_env) 43. register char *opts; 44. boolean from_env; 45. { 46. register char *op,*op2; 47. unsigned num; 48. boolean negated; 49. 50. if(op = index(opts, ',')) { 51. *op++ = 0; 52. parseoptions(op, from_env); 53. } 54. if(op = index(opts, ' ')) { 55. op2 = op; 56. while(*op++) 57. if(*op != ' ') *op2++ = *op; 58. } 59. if(!*opts) return; 60. negated = FALSE; 61. while((*opts == '!') || !strncmp(opts, "no", 2)) { 62. if(*opts == '!') opts++; else opts += 2; 63. negated = !negated; 64. } 65. 66. #ifndef DGK 67. if(!strncmp(opts,"standout",4)) { 68. flags.standout = !negated; 69. return; 70. } 71. 72. if(!strncmp(opts,"null",4)) { 73. flags.nonull = negated; 74. return; 75. } 76. 77. if(!strncmp(opts,"tombstone",4)) { 78. flags.notombstone = negated; 79. return; 80. } 81. 82. if(!strncmp(opts,"news",4)) { 83. flags.nonews = negated; 84. return; 85. } 86. #endif 87. 88. #ifdef SAFE_ATTACK 89. if (!strncmp(opts, "conf", 4)) { 90. flags.confirm = !negated; 91. return; 92. } 93. 94. #endif 95. #ifdef DGKMOD 96. if (!strncmp(opts, "sile", 4)) { 97. flags.silent = !negated; 98. return; 99. } 100. 101. if (!strncmp(opts, "pick", 4)) { 102. flags.pickup = !negated; 103. return; 104. } 105. #endif 106. #ifdef DGK 107. if (!strncmp(opts, "IBMB", 4)) { 108. flags.IBMBIOS = !negated; 109. return; 110. } 111. 112. if (!strncmp(opts, "rawi", 4)) { 113. if (from_env) 114. flags.rawio = !negated; 115. else 116. pline("'rawio' only settable from %s.", configfile); 117. return; 118. } 119. 120. if (!strncmp(opts, "DECR", 4)) { 121. flags.DECRainbow = !negated; 122. return; 123. } 124. #endif 125. 126. #ifdef SORTING 127. if (!strncmp(opts, "sort", 4)) { 128. flags.sortpack = !negated; 129. return; 130. } 131. 132. /* 133. * the order to list the pack 134. */ 135. if (!strncmp(opts,"packorder",4)) { 136. register char *sp, *tmp; 137. extern char inv_order[]; 138. int tmpend; 139. 140. op = index(opts,':'); 141. if(!op) goto bad; 142. op++; /* skip : */ 143. 144. /* Missing characters in new order are filled in at the end 145. * from inv_order. 146. */ 147. for (sp = op; *sp; sp++) 148. if (!index(inv_order, *sp)) 149. goto bad; /* bad char in order */ 150. else if (index(sp + 1, *sp)) 151. goto bad; /* dup char in order */ 152. tmp = (char *) alloc(strlen(inv_order) + 1); 153. (void) strcpy(tmp, op); 154. for (sp = inv_order, tmpend = strlen(tmp); *sp; sp++) 155. if (!index(tmp, *sp)) { 156. tmp[tmpend++] = *sp; 157. tmp[tmpend] = 0; 158. } 159. (void) strcpy(inv_order, tmp); 160. free(tmp); 161. set_order = TRUE; 162. return; 163. } 164. #endif 165. 166. if(!strncmp(opts,"time",4)) { 167. flags.time = !negated; 168. flags.botl = 1; 169. return; 170. } 171. 172. if(!strncmp(opts,"restonspace",4)) { 173. flags.no_rest_on_space = negated; 174. return; 175. } 176. 177. #ifndef DGK 178. if(!strncmp(opts,"fixinv",4)) { 179. if(from_env) 180. flags.invlet_constant = !negated; 181. else 182. pline("The fixinvlet option must be in HACKOPTIONS."); 183. return; 184. } 185. #endif 186. 187. if(!strncmp(opts,"male",4)) { 188. #ifdef KAA 189. if(!from_env && flags.female != negated) 190. pline("That is not anatomically possible."); 191. else 192. #endif 193. flags.female = negated; 194. return; 195. } 196. if(!strncmp(opts,"female",6)) { 197. #ifdef KAA 198. if(!from_env && flags.female == negated) 199. pline("That is not anatomically possible."); 200. else 201. #endif 202. flags.female = !negated; 203. return; 204. } 205. 206. /* name:string */ 207. if(!strncmp(opts,"name",4)) { 208. extern char plname[PL_NSIZ]; 209. if(!from_env) { 210. #ifdef DGK 211. pline("'name' only settable from %s.", configfile); 212. #else 213. pline("The playername can be set only from HACKOPTIONS."); 214. #endif 215. return; 216. } 217. op = index(opts,':'); 218. if(!op) goto bad; 219. (void) strncpy(plname, op+1, sizeof(plname)-1); 220. return; 221. } 222. 223. /* endgame:5t[op] 5a[round] o[wn] */ 224. if(!strncmp(opts,"endgame",3)) { 225. op = index(opts,':'); 226. if(!op) goto bad; 227. op++; 228. while(*op) { 229. num = 1; 230. if(digit(*op)) { 231. num = atoi(op); 232. while(digit(*op)) op++; 233. } else 234. if(*op == '!') { 235. negated = !negated; 236. op++; 237. } 238. switch(*op) { 239. case 't': 240. flags.end_top = num; 241. break; 242. case 'a': 243. flags.end_around = num; 244. break; 245. case 'o': 246. flags.end_own = !negated; 247. break; 248. default: 249. goto bad; 250. } 251. while(letter(*++op)) ; 252. if(*op == '/') op++; 253. } 254. return; 255. } 256. bad: 257. if(!from_env) { 258. if(!strncmp(opts, "help", 4)) { 259. pline("%s%s%s", 260. #ifdef DGK 261. 262. "To set options use OPTIONS=<options> in ", configfile, 263. " or give the command \"O\" followed by the line <options> while playing. ", 264. "Here <options> is a list of options separated by commas." ); 265. pline("%s%s", 266. "Boolean options are confirm, pickup, rawio, silent, sortpack, time, IBMBIOS,", 267. " and DECRainbow. These can be negated by prefixing them with '!' or \"no\"." ); 268. pline("%s%s%s", 269. "The compound options are name, as in OPTIONS=name:Merlin-W,", 270. #ifdef SORTING 271. " packorder, which lists the order that items should appear in your pack", 272. #ifdef SPELLS 273. " (the default is: packorder:\")[%?+/=!(*0 ), and endgame." ); 274. #else 275. " (the default is: packorder:\")[%?/=!(*0 ), and endgame." ); 276. #endif /* SPELLS /**/ 277. #else 278. "and engame.", ""); 279. #endif /* SORTING /**/ 280. pline("%s%s%s", 281. "Endgame is followed by a description of which parts of the scorelist ", 282. "you wish to see. You might for example say: ", 283. "\"endgame:own scores/5 top scores/4 around my score\"." ); 284. 285. #else 286. 287. "To set options use `HACKOPTIONS=\"<options>\"' in your environment, or ", 288. "give the command 'O' followed by the line `<options>' while playing. ", 289. "Here <options> is a list of <option>s separated by commas." ); 290. pline("%s%s%s", 291. "Simple (boolean) options are rest_on_space, news, time, ", 292. "null, tombstone, (fe)male. ", 293. "These can be negated by prefixing them with '!' or \"no\"." ); 294. pline("%s%s%s", 295. "The compound options are name, as in OPTIONS=name:Merlin-W,", 296. #ifdef SORTING 297. " packorder, which lists the order that items should appear in your pack", 298. #ifdef SPELLS 299. " (the default is: packorder:\")[%?+/=!(*0 ), and endgame." ); 300. #else 301. " (the default is: packorder:\")[%?/=!(*0 ), and endgame." ); 302. #endif /* SPELLS /**/ 303. #else 304. "and engame.", ""); 305. #endif /* SORTING /**/ 306. pline("%s%s%s", 307. "Endgame is followed by a description of what parts of the scorelist", 308. "you want to see. You might for example say: ", 309. "`endgame:own scores/5 top scores/4 around my score'." ); 310. 311. #endif /* DGK /**/ 312. return; 313. } 314. pline("Bad option: %s.", opts); 315. pline("Type `o help<cr>' for help."); 316. return; 317. } 318. #ifdef DGK 319. printf("Bad syntax in OPTIONS in %s.", configfile); 320. #else 321. puts("Bad syntax in HACKOPTIONS."); 322. puts("Use for example:"); 323. puts( 324. "HACKOPTIONS=\"!restonspace,notombstone,endgame:own/5 topscorers/4 around me\"" 325. ); 326. #endif 327. getret(); 328. } 329. 330. doset() 331. { 332. char buf[BUFSZ]; 333. #ifdef SORTING 334. extern char inv_order[]; 335. #endif 336. 337. pline("What options do you want to set? "); 338. getlin(buf); 339. if(!buf[0] || buf[0] == '\033') { 340. #ifdef DGK 341. (void) strcpy(buf,"OPTIONS="); 342. #else 343. (void) strcpy(buf,"HACKOPTIONS="); 344. (void) strcat(buf, flags.female ? "female," : "male,"); 345. if(flags.standout) (void) strcat(buf,"standout,"); 346. if(flags.nonull) (void) strcat(buf,"nonull,"); 347. if(flags.nonews) (void) strcat(buf,"nonews,"); 348. if(flags.notombstone) (void) strcat(buf,"notombstone,"); 349. if(flags.no_rest_on_space) (void) strcat(buf,"!rest_on_space,"); 350. #endif 351. #ifdef SORTING 352. if (flags.sortpack) (void) strcat(buf,"sortpack,"); 353. if (set_order){ 354. (void) strcat(buf, "packorder: "); 355. (void) strcat(buf, inv_order); 356. (void) strcat(buf, ","); 357. } 358. #endif 359. #ifdef SAFE_ATTACK 360. if (flags.confirm) (void) strcat(buf,"confirm,"); 361. #endif 362. #ifdef DGKMOD 363. if (flags.pickup) (void) strcat(buf,"pickup,"); 364. if (flags.silent) (void) strcat(buf,"silent,"); 365. #endif 366. #ifdef DGK 367. if (flags.rawio) (void) strcat(buf,"rawio,"); 368. if (flags.IBMBIOS) (void) strcat(buf,"IBMBIOS,"); 369. if (flags.DECRainbow) (void) strcat(buf,"DECRainbow,"); 370. #endif 371. if(flags.time) (void) strcat(buf,"time,"); 372. if(flags.end_top != 5 || flags.end_around != 4 || flags.end_own){ 373. (void) sprintf(eos(buf), "endgame: %u topscores/%u around me", 374. flags.end_top, flags.end_around); 375. if(flags.end_own) (void) strcat(buf, "/own scores"); 376. } else { 377. register char *eop = eos(buf); 378. if(*--eop == ',') *eop = 0; 379. } 380. pline(buf); 381. } else 382. parseoptions(buf, FALSE); 383. 384. return(0); 385. } 386. 387. #ifdef DGKMOD 388. dotogglepickup() { 389. flags.pickup = !flags.pickup; 390. pline("Pickup: %s.", flags.pickup ? "ON" : "OFF"); 391. return (0); 392. } 393. #endif