Source:NetHack 3.1.0/botl.c

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

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

1.   /*	SCCS Id: @(#)botl.c	3.1	93/01/17	*/ 2.   /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ 3.    /* NetHack may be freely redistributed. See license for details. */ 4.     5.    #include "hack.h"  6. 7.   #ifdef OVL0 8.   extern const char *hu_stat[];	/* defined in eat.c */ 9.    10.   const char *enc_stat[] = { 11.  	"",  12.   	"Burdened", 13.  	"Stressed", 14.  	"Strained", 15.  	"Overtaxed", 16.  	"Overloaded" 17.  };  18.    19.   static void NDECL(bot1); 20.  static void NDECL(bot2); 21.  #endif /* OVL0 */ 22.   23.   /* 100 suffices for bot; must be larger than COLNO */ 24.  #if COLNO <= 80 25.  #define MAXCO 100 26.  #else 27.  #define MAXCO (COLNO+20) 28.  #endif 29.   30.   #ifndef OVLB 31.  STATIC_DCL int mrank_sz; 32.  #else /* OVLB */ 33.  STATIC_OVL int NEARDATA mrank_sz = 0; /* loaded by max_rank_sz (from u_init) */ 34.  #endif /* OVLB */ 35.   36.   struct rank_title { 37.      char const * const	m;	/* male title */ 38.      char const * const	f;	/* female title, or 0 if same as male */ 39.  };  40.   struct class_ranks { 41.      char		plclass, fill_; 42.      short		mplayer_class; 43.      struct rank_title	titles[9]; 44.  };  45.    46.   STATIC_DCL const struct rank_title *FDECL(rank_array, (CHAR_P)); 47.  STATIC_DCL const char *NDECL(rank); 48.   49.   #ifdef OVL1 50.   51.   /* 9 pairs of ranks for each class */ 52.   53.   static const 54.  struct class_ranks all_classes[] = { 55.    {					'A',0,	PM_ARCHEOLOGIST, { 56.  	{"Digger",	0}, 57.  	{"Field Worker",0}, 58.  	{"Investigator",0}, 59.  	{"Exhumer",	0}, 60.  	{"Excavator",	0}, 61.  	{"Spelunker",	0}, 62.  	{"Speleologist",0}, 63.  	{"Collector",	0}, 64.  	{"Curator",	0} 65.    } },  66.     {					'B',0,	PM_BARBARIAN, { 67.  	{"Plunderer",	"Plunderess"}, 68.  	{"Pillager",	0}, 69.  	{"Bandit",	0}, 70.  	{"Brigand",	0}, 71.  	{"Raider",	0}, 72.  	{"Reaver",	0}, 73.  	{"Slayer",	0}, 74.  	{"Chieftain",	"Chieftainess"}, 75.  	{"Conqueror",	"Conqueress"} 76.    } },  77.     {					'C',0,	PM_CAVEMAN, { 78.  	{"Troglodyte",	0}, 79.  	{"Aborigine",	0}, 80.  	{"Wanderer",	0}, 81.  	{"Vagrant",	0}, 82.  	{"Wayfarer",	0}, 83.  	{"Roamer",	0}, 84.  	{"Nomad",	0}, 85.  	{"Rover",	0}, 86.  	{"Pioneer",	0} 87.    } },  88.     {					'E',0,	PM_ELF, { 89.  	{"Edhel",	"Elleth"}, 90.  	{"Edhel",	"Elleth"},	/* elf-maid */ 91.  	{"Ohtar",	"Ohtie"},	/* warrior */ 92.  	{"Kano",			/* commander (Q.) ['a] */ 93.  			"Kanie"}, /* educated guess, until further research- SAC */ 94.  	{"Arandur",		  /* king's servant, minister (Q.) - guess */ 95.  			"Aranduriel"},	/* educated guess */ 96.  	{"Hir",		"Hiril"},	/* lord, lady (S.) ['ir] */ 97.  	{"Aredhel",	"Arwen"},	/* noble elf, maiden (S.) */ 98.  	{"Ernil",	"Elentariel"},	/* prince (S.), elf-maiden (Q.) */ 99.  	{"Elentar",	"Elentari"}	/* Star-king, -queen (Q.) */ 100.   } },  101.    {					'H',0,	PM_HEALER, { 102. 	{"Barber",	"Midwife"}, 103. 	{"Leech",	0}, 104. 	{"Embalmer",	0}, 105. 	{"Dresser",	0}, 106. 	{"Bone Setter",	0}, 107. 	{"Herbalist",	0}, 108. 	{"Apothecary",	0}, 109. 	{"Physician",	0}, 110. 	{"Chirurgeon",	0} 111.   } },  112.    {					'K',0,	PM_KNIGHT, { 113. 	{"Gallant",	0}, 114. 	{"Esquire",	0}, 115. 	{"Bachelor",	0}, 116. 	{"Sergeant",	0}, 117. 	{"Knight",	0}, 118. 	{"Banneret",	0}, 119. 	{"Chevalier",	0}, 120. 	{"Seignieur",	0}, 121. 	{"Paladin",	0} 122.   } },  123.    {					'P',0,	PM_PRIEST, { 124. 	{"Aspirant",	0}, 125. 	{"Acolyte",	0}, 126. 	{"Adept",	0}, 127. 	{"Priest",	"Priestess"}, 128. 	{"Curate",	0}, 129. 	{"Canon",	"Canoness"}, 130. 	{"Lama",	0}, 131. 	{"Patriarch",	"Matriarch"}, 132. 	{"High Priest", "High Priestess"} 133.   } },  134.    {					'R',0,	PM_ROGUE, { 135. 	{"Footpad",	0}, 136. 	{"Cutpurse",	0}, 137. 	{"Rogue",	0}, 138. 	{"Pilferer",	0}, 139. 	{"Robber",	0}, 140. 	{"Burglar",	0}, 141. 	{"Filcher",	0}, 142. 	{"Magsman",	"Magswoman"}, 143. 	{"Thief",	0} 144.   } },  145.    {					'S',0,	PM_SAMURAI, { 146. 	{"Hatamoto",	0},  /* Banner Knight */ 147. 	{"Ronin",	0},  /* no allegiance */ 148. 	{"Ninja",	0},  /* secret society */ 149. 	{"Joshu",	0},  /* heads a castle */ 150. 	{"Ryoshu",	0},  /* has a territory */ 151. 	{"Kokushu",	0},  /* heads a province */ 152. 	{"Daimyo",	0},  /* a samurai lord */ 153. 	{"Kuge",	0},  /* Noble of the Court */ 154. 	{"Shogun",	0}   /* supreme commander, warlord */ 155.   } },  156.  #ifdef TOURIST 157.   {					'T',0,	PM_TOURIST, { 158. 	{"Rambler",	0}, 159. 	{"Sightseer",	0}, 160. 	{"Excursionist",0}, 161. 	{"Peregrinator","Peregrinatrix"}, 162. 	{"Traveler",	0}, 163. 	{"Journeyer",	0}, 164. 	{"Voyager",	0}, 165. 	{"Explorer",	0}, 166. 	{"Adventurer",	0} 167.   } },  168.  #endif 169.   {					'V',0,	PM_VALKYRIE, { 170. 	{"Stripling",	0}, 171. 	{"Skirmisher",	0}, 172. 	{"Fighter",	0}, 173. 	{"Man-at-arms", "Woman-at-arms"}, 174. 	{"Warrior",	0}, 175. 	{"Swashbuckler",0}, 176. 	{"Hero",	"Heroine"}, 177. 	{"Champion",	0}, 178. 	{"Lord",	"Lady"} 179.   } },  180.    {					'W',0,	PM_WIZARD, { 181. 	{"Evoker",	0}, 182. 	{"Conjurer",	0}, 183. 	{"Thaumaturge", 0}, 184. 	{"Magician",	0}, 185. 	{"Enchanter",	"Enchantress"}, 186. 	{"Sorcerer",	"Sorceress"}, 187. 	{"Necromancer", 0}, 188. 	{"Wizard",	0}, 189. 	{"Mage",	0} 190.   } },  191.  };  192.   193.  STATIC_OVL const struct rank_title * 194. rank_array(pc) 195. char pc; 196. {  197.  	register int i;  198. 199. 	for (i = 0; i < SIZE(all_classes); i++) 200. 	    if (all_classes[i].plclass == pc) return all_classes[i].titles; 201. 	return 0; 202. }  203.   204.  /* convert experience level (1..30) to rank index (0..8) */ 205. int xlev_to_rank(xlev) 206. int xlev; 207. {  208.  	return (xlev <= 2) ? 0 : (xlev <= 30) ? ((xlev + 2) / 4) : 8; 209. }  210.   211.  #if 0	/* not currently needed */ 212. /* convert rank index (0..8) to experience level (1..30) */ 213. int rank_to_xlev(rank) 214. int rank; 215. {  216.  	return (rank <= 0) ? 1 : (rank <= 8) ? ((rank * 4) - 2) : 30; 217. }  218.  #endif 219.  220.  const char * 221. rank_of(lev, pc, female) 222. register unsigned lev; 223. char pc; 224. boolean female; 225. {  226.  	register int idx = xlev_to_rank((int)lev); 227. 	const struct rank_title *ranks = rank_array(pc); 228.  229.  	if (ranks) 230. 	    return( female && ranks[idx].f ? ranks[idx].f : ranks[idx].m ); 231. 	return(pl_character); 232. }  233.   234.  STATIC_OVL const char * 235. rank 236. {  237.  	return(rank_of(u.ulevel, pl_character[0], flags.female)); 238. }  239.   240.  int 241. title_to_mon(str, rank_indx, title_length) 242. const char *str; 243. int *rank_indx, *title_length; 244. {  245.  	register int i, j;  246. register const struct rank_title *ttl; 247.  248.  	for (i = 0; i < SIZE(all_classes); i++) 249. 	    for (j = 0; j < 9; j++) { 250. 		ttl = &all_classes[i].titles[j]; 251. 		if (!strncmpi(ttl->m, str, strlen(ttl->m))) { 252. 		    if (rank_indx) *rank_indx = j;  253. if (title_length) *title_length = strlen(ttl->m); 254. 		    return all_classes[i].mplayer_class; 255. 		} else if (ttl->f && !strncmpi(ttl->f, str, strlen(ttl->f))) { 256. 		    if (rank_indx) *rank_indx = j;  257. if (title_length) *title_length = strlen(ttl->f); 258. 		    return all_classes[i].plclass == 'C' ? PM_CAVEWOMAN : 259. 			   all_classes[i].plclass == 'P' ? PM_PRIESTESS : 260. 			   all_classes[i].mplayer_class; 261. 		}  262.  	    }  263.  	return -1;	/* not found */ 264. }  265.   266.  #endif /* OVL1 */ 267. #ifdef OVLB 268.  269.  void 270. max_rank_sz 271. {  272.  	register int i, r, maxr = 0; 273. 	const struct rank_title *ranks = rank_array(pl_character[0]); 274.  275.  	if (ranks) { 276. 	    for (i = 0; i < 9; i++) { 277. 		if ((r = strlen(ranks[i].m)) > maxr) maxr = r;  278. if (ranks[i].f) 279. if ((r = strlen(ranks[i].f)) > maxr) maxr = r; 280. } 281.  	    mrank_sz = maxr; 282. 	}  283.  	else mrank_sz = strlen(pl_character); 284. }  285.   286.  #endif /* OVLB */ 287. #ifdef OVL0 288.  289.  static void 290. bot1 291. {  292.  	char newbot1[MAXCO]; 293. 	register char *nb; 294. 	register int i,j; 295.  296.  	Strcpy(newbot1, plname); 297. 	if('a' <= newbot1[0] && newbot1[0] <= 'z') newbot1[0] += 'A'-'a'; 298. 	newbot1[10] = 0; 299. 	Sprintf(nb = eos(newbot1)," the "); 300. #ifdef POLYSELF 301. 	if (u.mtimedone) { 302. 		char mbot[BUFSZ]; 303. 		int k = 0; 304.  305.  		Strcpy(mbot, mons[u.umonnum].mname); 306. 		while(mbot[k] != 0) { 307. 		    if ((k == 0 || (k > 0 && mbot[k-1] == ' ')) &&  308.  					'a' <= mbot[k] && mbot[k] <= 'z') 309. 			mbot[k] += 'A' - 'a'; 310. 		    k++; 311. 		}  312.  		Sprintf(nb = eos(nb), mbot); 313. 	} else 314. 		Sprintf(nb = eos(nb), rank); 315. #else 316. 	Sprintf(nb = eos(nb), rank); 317. #endif 318. 	Sprintf(nb = eos(nb),"  "); 319. 	i = mrank_sz + 15; 320. 	j = (nb + 2) - newbot1; /* aka strlen(newbot1) but less computation */ 321. 	if((i - j) > 0) 322. 		Sprintf(nb = eos(nb),"%*s", i-j, " ");	/* pad with spaces */ 323. 	if (ACURR(A_STR) > 18) { 324. 		if (ACURR(A_STR) > 118) 325. 		    Sprintf(nb = eos(nb),"St:%2d ",ACURR(A_STR)-100); 326. 		else if (ACURR(A_STR) < 118) 327. 		    Sprintf(nb = eos(nb), "St:18/%02d ",ACURR(A_STR)-18); 328. 		else 329. 		    Sprintf(nb = eos(nb),"St:18/** "); 330. 	} else 331. 		Sprintf(nb = eos(nb), "St:%-1d ",ACURR(A_STR)); 332. 	Sprintf(nb = eos(nb),  333.  		"Dx:%-1d Co:%-1d In:%-1d Wi:%-1d Ch:%-1d",  334.  		ACURR(A_DEX), ACURR(A_CON), ACURR(A_INT), ACURR(A_WIS), ACURR(A_CHA)); 335. 	Sprintf(nb = eos(nb), (u.ualign.type == A_CHAOTIC) ? "  Chaotic" :  336.  			(u.ualign.type == A_NEUTRAL) ? "  Neutral" : "  Lawful"); 337. #ifdef SCORE_ON_BOTL 338. 	if (flags.showscore) { 339. 	    int deepest = deepest_lev_reached(FALSE); 340. 	    long ugold = u.ugold + hidden_gold; 341.  342.  	    if ((ugold -= u.ugold0) < 0L) ugold = 0L; 343. 	    Sprintf(nb = eos(nb), " S:%ld",  344.  		    ugold + u.urexp + (long)(50 * (deepest - 1))  345.  			  + (long)(deepest > 30 ? 10000 : 346.  				   deepest > 20 ? 1000*(deepest - 20) : 0)); 347. 	}  348.  #endif 349. 	curs(WIN_STATUS, 1, 0); 350. 	putstr(WIN_STATUS, 0, newbot1); 351. }  352.   353.  static void 354. bot2 355. {  356.  	char  newbot2[MAXCO]; 357. 	register char *nb; 358. 	int hp, hpmax; 359. 	int cap = near_capacity; 360.  361.  #ifdef POLYSELF 362. 	hp = u.mtimedone ? u.mh : u.uhp; 363. 	hpmax = u.mtimedone ? u.mhmax : u.uhpmax; 364. #else 365. 	hp = u.uhp; 366. 	hpmax = u.uhpmax; 367. #endif 368. 	if(hp < 0) hp = 0; 369. /* TODO:	Add in dungeon name */ 370. #ifdef MULDGN 371. 	if(Is_knox(&u.uz)) Sprintf(newbot2, "%s ", dungeons[u.uz.dnum].dname); 372. 	else 373. 	if(In_quest(&u.uz)) Sprintf(newbot2, "Home %d ", dunlev(&u.uz)); 374. 	else 375. #endif 376. 	if(In_endgame(&u.uz)) 377. 		Sprintf(newbot2,  378.  			Is_astralevel(&u.uz) ? "Astral Plane " : "End Game "); 379. 	else 380. 		Sprintf(newbot2, "Dlvl:%-2d ", depth(&u.uz)); 381. 	Sprintf(nb = eos(newbot2),  382.  		"%c:%-2ld HP:%d(%d) Pw:%d(%d) AC:%-2d", oc_syms[GOLD_CLASS],  383.  		u.ugold, hp, hpmax, u.uen, u.uenmax, u.uac); 384. #ifdef POLYSELF 385. 	if (u.mtimedone) 386. 		Sprintf(nb = eos(nb), " HD:%d", mons[u.umonnum].mlevel); 387. 	else 388. #endif 389. #ifdef EXP_ON_BOTL 390. 	if(flags.showexp) 391. 		Sprintf(nb = eos(nb), " Xp:%u/%-1ld", u.ulevel,u.uexp); 392. 	else 393. #endif 394. 	Sprintf(nb = eos(nb), " Exp:%u", u.ulevel); 395. 	if(flags.time) 396. 	    Sprintf(nb = eos(nb), " T:%ld", moves); 397. 	if(strcmp(hu_stat[u.uhs], "        ")) { 398. 		Sprintf(nb = eos(nb), " "); 399. 		Strcat(newbot2, hu_stat[u.uhs]); 400. 	}  401.  	if(Confusion)	   Sprintf(nb = eos(nb), " Conf"); 402. 	if(Sick)	   Sprintf(nb = eos(nb), " Sick"); 403. 	if(Blind)	   Sprintf(nb = eos(nb), " Blind"); 404. 	if(Stunned)	   Sprintf(nb = eos(nb), " Stun"); 405. 	if(Hallucination)  Sprintf(nb = eos(nb), " Hallu"); 406. 	if(cap > UNENCUMBERED) 407. 		Sprintf(nb = eos(nb), " %s", enc_stat[cap]); 408. 	curs(WIN_STATUS, 1, 1); 409. 	putstr(WIN_STATUS, 0, newbot2); 410. }  411.   412.  void 413. bot 414. {  415.  	bot1; 416. 	bot2; 417. 	flags.botl = flags.botlx = 0; 418. }  419.   420.  #endif /* OVL0 */ 421.  422.  /*botl.c*/