Fandom

Wikihack

Source:Botl.c

2,034pages on
this wiki
Add New Page
Talk0

Ad blocker interference detected!


Wikia is a free-to-use site that makes money from advertising. We have a modified experience for viewers using ad blockers

Wikia is not accessible if you’ve made further modifications. Remove the custom ad blocker rule(s) and the page will load as expected.

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

Top of file Edit

1.    /*	SCCS Id: @(#)botl.c	3.4	1996/07/15	*/
2.    /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
3.    /* NetHack may be freely redistributed.  See license for details. */
4.    
The NetHack General Public License applies to screenshots, source code and other content from NetHack.
5.    #include "hack.h"
6.    
7.    #ifdef OVL0
8.    extern const char *hu_stat[];	/* defined in eat.c */
9.    
10.   const char * const enc_stat[] = {
11.   	"",
12.   	"Burdened",
13.   	"Stressed",
14.   	"Strained",
15.   	"Overtaxed",
16.   	"Overloaded"
17.   };
18.   
19.   STATIC_DCL void NDECL(bot1);
20.   STATIC_DCL void NDECL(bot2);
21.   #endif /* OVL0 */
22.   
23.   /* MAXCO must hold longest uncompressed status line, and must be larger
24.    * than COLNO
25.    *
26.    * longest practical second status line at the moment is
27.    *	Astral Plane $:12345 HP:700(700) Pw:111(111) AC:-127 Xp:30/123456789
28.    *	T:123456 Satiated Conf FoodPois Ill Blind Stun Hallu Overloaded
29.    * -- or somewhat over 130 characters
30.    */
31.   #if COLNO <= 140
32.   #define MAXCO 160
33.   #else
34.   #define MAXCO (COLNO+20)
35.   #endif
36.   
37.   #ifndef OVLB
38.   STATIC_DCL int mrank_sz;
39.   #else /* OVLB */
40.   STATIC_OVL NEARDATA int mrank_sz = 0; /* loaded by max_rank_sz (from u_init) */
41.   #endif /* OVLB */
42.   
43.   STATIC_DCL const char *NDECL(rank);
44.   

xlev_to_rank Edit

45.   #ifdef OVL1
46.   
47.   /* convert experience level (1..30) to rank index (0..8) */
48.   int
49.   xlev_to_rank(xlev)
50.   int xlev;
51.   {
52.   	return (xlev <= 2) ? 0 : (xlev <= 30) ? ((xlev + 2) / 4) : 8;
53.   }
54.   

The conversion produces the following result:

Rank 0 1 2
Level 1 to 2 3 to 5 6 to 9
Rank 3 4 5
Level 10 to 13 14 to 17 18 to 21
Rank 6 7 8
Level 22 to 25 26 to 29 30

rank_to_xlev Edit

55.   #if 0	/* not currently needed */
56.   /* convert rank index (0..8) to experience level (1..30) */
57.   int
58.   rank_to_xlev(rank)
59.   int rank;
60.   {
61.   	return (rank <= 0) ? 1 : (rank <= 8) ? ((rank * 4) - 2) : 30;
62.   }
63.   #endif
64.   

rank_of Edit

65.   const char *
66.   rank_of(lev, monnum, female)
67.   	int lev;
68.   	short monnum;
69.   	boolean female;
70.   {
71.   	register struct Role *role;
72.   	register int i;
73.   
74.   
75.   	/* Find the role */
76.   	for (role = (struct Role *) roles; role->name.m; role++)
77.   	    if (monnum == role->malenum || monnum == role->femalenum)
78.   	    	break;
79.   	if (!role->name.m)
80.   	    role = &urole;
81.   
82.   	/* Find the rank */
83.   	for (i = xlev_to_rank((int)lev); i >= 0; i--) {
84.   	    if (female && role->rank[i].f) return (role->rank[i].f);
85.   	    if (role->rank[i].m) return (role->rank[i].m);
86.   	}
87.   
88.   	/* Try the role name, instead */
89.   	if (female && role->name.f) return (role->name.f);
90.   	else if (role->name.m) return (role->name.m);
91.   	return ("Player");
92.   }
93.   
94.   

rank Edit

95.   STATIC_OVL const char *
96.   rank()
97.   {
98.   	return(rank_of(u.ulevel, Role_switch, flags.female));
99.   }
100.  

title_to_mon Edit

101.  int
102.  title_to_mon(str, rank_indx, title_length)
103.  const char *str;
104.  int *rank_indx, *title_length;
105.  {
106.  	register int i, j;
107.  
108.  
109.  	/* Loop through each of the roles */
110.  	for (i = 0; roles[i].name.m; i++)
111.  	    for (j = 0; j < 9; j++) {
112.  	    	if (roles[i].rank[j].m && !strncmpi(str,
113.  	    			roles[i].rank[j].m, strlen(roles[i].rank[j].m))) {
114.  	    	    if (rank_indx) *rank_indx = j;
115.  	    	    if (title_length) *title_length = strlen(roles[i].rank[j].m);
116.  	    	    return roles[i].malenum;
117.  	    	}
118.  	    	if (roles[i].rank[j].f && !strncmpi(str,
119.  	    			roles[i].rank[j].f, strlen(roles[i].rank[j].f))) {
120.  	    	    if (rank_indx) *rank_indx = j;
121.  	    	    if (title_length) *title_length = strlen(roles[i].rank[j].f);
122.  	    	    return ((roles[i].femalenum != NON_PM) ?
123.  	    	    		roles[i].femalenum : roles[i].malenum);
124.  	    	}
125.  	    }
126.  	return NON_PM;
127.  }
128.  
129.  #endif /* OVL1 */

max_rank_sz Edit

130.  #ifdef OVLB
131.  
132.  void
133.  max_rank_sz()
134.  {
135.  	register int i, r, maxr = 0;
136.  	for (i = 0; i < 9; i++) {
137.  	    if (urole.rank[i].m && (r = strlen(urole.rank[i].m)) > maxr) maxr = r;
138.  	    if (urole.rank[i].f && (r = strlen(urole.rank[i].f)) > maxr) maxr = r;
139.  	}
140.  	mrank_sz = maxr;
141.  	return;
142.  }
143.  
144.  #endif /* OVLB */

botl_score Edit

145.  #ifdef OVL0
146.  
147.  #ifdef SCORE_ON_BOTL
148.  long
149.  botl_score()
150.  {
151.      int deepest = deepest_lev_reached(FALSE);
152.  #ifndef GOLDOBJ
153.      long ugold = u.ugold + hidden_gold();
154.  
155.      if ((ugold -= u.ugold0) < 0L) ugold = 0L;
156.      return ugold + u.urexp + (long)(50 * (deepest - 1))
157.  #else
158.      long umoney = money_cnt(invent) + hidden_gold();
159.  
160.      if ((umoney -= u.umoney0) < 0L) umoney = 0L;
161.      return umoney + u.urexp + (long)(50 * (deepest - 1))
162.  #endif
163.  			  + (long)(deepest > 30 ? 10000 :
164.  				   deepest > 20 ? 1000*(deepest - 20) : 0);
165.  }
166.  #endif
167.  

botl Edit

168.  STATIC_OVL void
169.  bot1()
170.  {
171.  	char newbot1[MAXCO];
172.  	register char *nb;
173.  	register int i,j;
174.  
175.  	Strcpy(newbot1, plname);
176.  	if('a' <= newbot1[0] && newbot1[0] <= 'z') newbot1[0] += 'A'-'a';
177.  	newbot1[10] = 0;
178.  	Sprintf(nb = eos(newbot1)," the ");
179.  
180.  	if (Upolyd) {
181.  		char mbot[BUFSZ];
182.  		int k = 0;
183.  
184.  		Strcpy(mbot, mons[u.umonnum].mname);
185.  		while(mbot[k] != 0) {
186.  		    if ((k == 0 || (k > 0 && mbot[k-1] == ' ')) &&
187.  					'a' <= mbot[k] && mbot[k] <= 'z')
188.  			mbot[k] += 'A' - 'a';
189.  		    k++;
190.  		}
191.  		Sprintf(nb = eos(nb), mbot);
192.  	} else
193.  		Sprintf(nb = eos(nb), rank());
194.  
195.  	Sprintf(nb = eos(nb),"  ");
196.  	i = mrank_sz + 15;
197.  	j = (nb + 2) - newbot1; /* aka strlen(newbot1) but less computation */
198.  	if((i - j) > 0)
199.  		Sprintf(nb = eos(nb),"%*s", i-j, " ");	/* pad with spaces */
200.  	if (ACURR(A_STR) > 18) {
201.  		if (ACURR(A_STR) > STR18(100))
202.  		    Sprintf(nb = eos(nb),"St:%2d ",ACURR(A_STR)-100);
203.  		else if (ACURR(A_STR) < STR18(100))
204.  		    Sprintf(nb = eos(nb), "St:18/%02d ",ACURR(A_STR)-18);
205.  		else
206.  		    Sprintf(nb = eos(nb),"St:18/** ");
207.  	} else
208.  		Sprintf(nb = eos(nb), "St:%-1d ",ACURR(A_STR));
209.  	Sprintf(nb = eos(nb),
210.  		"Dx:%-1d Co:%-1d In:%-1d Wi:%-1d Ch:%-1d",
211.  		ACURR(A_DEX), ACURR(A_CON), ACURR(A_INT), ACURR(A_WIS), ACURR(A_CHA));
212.  	Sprintf(nb = eos(nb), (u.ualign.type == A_CHAOTIC) ? "  Chaotic" :
213.  			(u.ualign.type == A_NEUTRAL) ? "  Neutral" : "  Lawful");
214.  #ifdef SCORE_ON_BOTL
215.  	if (flags.showscore)
216.  	    Sprintf(nb = eos(nb), " S:%ld", botl_score());
217.  #endif
218.  	curs(WIN_STATUS, 1, 0);
219.  	putstr(WIN_STATUS, 0, newbot1);
220.  }
221.  

describe_level Edit

222.  /* provide the name of the current level for display by various ports */
223.  int
224.  describe_level(buf)
225.  char *buf;
226.  {
227.  	int ret = 1;
228.  
229.  	/* TODO:	Add in dungeon name */
230.  	if (Is_knox(&u.uz))
231.  		Sprintf(buf, "%s ", dungeons[u.uz.dnum].dname);
232.  	else if (In_quest(&u.uz))
233.  		Sprintf(buf, "Home %d ", dunlev(&u.uz));
234.  	else if (In_endgame(&u.uz))
235.  		Sprintf(buf,
236.  			Is_astralevel(&u.uz) ? "Astral Plane " : "End Game ");
237.  	else {
238.  		/* ports with more room may expand this one */
239.  		Sprintf(buf, "Dlvl:%-2d ", depth(&u.uz));
240.  		ret = 0;
241.  	}
242.  	return ret;
243.  }
244.  

bot2 Edit

245.  STATIC_OVL void
246.  bot2()
247.  {
248.  	char  newbot2[MAXCO];
249.  	register char *nb;
250.  	int hp, hpmax;
251.  	int cap = near_capacity();
252.  
253.  	hp = Upolyd ? u.mh : u.uhp;
254.  	hpmax = Upolyd ? u.mhmax : u.uhpmax;
255.  
256.  	if(hp < 0) hp = 0;
257.  	(void) describe_level(newbot2);
258.  	Sprintf(nb = eos(newbot2),
259.  		"%c:%-2ld HP:%d(%d) Pw:%d(%d) AC:%-2d", oc_syms[COIN_CLASS],
260.  #ifndef GOLDOBJ
261.  		u.ugold,
262.  #else
263.  		money_cnt(invent),
264.  #endif
265.  		hp, hpmax, u.uen, u.uenmax, u.uac);
266.  
267.  	if (Upolyd)
268.  		Sprintf(nb = eos(nb), " HD:%d", mons[u.umonnum].mlevel);
269.  #ifdef EXP_ON_BOTL
270.  	else if(flags.showexp)
271.  		Sprintf(nb = eos(nb), " Xp:%u/%-1ld", u.ulevel,u.uexp);
272.  #endif
273.  	else
274.  		Sprintf(nb = eos(nb), " Exp:%u", u.ulevel);
275.  
276.  	if(flags.time)
277.  	    Sprintf(nb = eos(nb), " T:%ld", moves);
278.  	if(strcmp(hu_stat[u.uhs], "        ")) {
279.  		Sprintf(nb = eos(nb), " ");
280.  		Strcat(newbot2, hu_stat[u.uhs]);
281.  	}
282.  	if(Confusion)	   Sprintf(nb = eos(nb), " Conf");
283.  	if(Sick) {
284.  		if (u.usick_type & SICK_VOMITABLE)
285.  			   Sprintf(nb = eos(nb), " FoodPois");
286.  		if (u.usick_type & SICK_NONVOMITABLE)
287.  			   Sprintf(nb = eos(nb), " Ill");
288.  	}
289.  	if(Blind)	   Sprintf(nb = eos(nb), " Blind");
290.  	if(Stunned)	   Sprintf(nb = eos(nb), " Stun");
291.  	if(Hallucination)  Sprintf(nb = eos(nb), " Hallu");
292.  	if(Slimed)         Sprintf(nb = eos(nb), " Slime");
293.  	if(cap > UNENCUMBERED)
294.  		Sprintf(nb = eos(nb), " %s", enc_stat[cap]);
295.  	curs(WIN_STATUS, 1, 1);
296.  	putstr(WIN_STATUS, 0, newbot2);
297.  }
298.  

bot Edit

299.  void
300.  bot()
301.  {
302.  	bot1();
303.  	bot2();
304.  	flags.botl = flags.botlx = 0;
305.  }
306.  
307.  #endif /* OVL0 */
308.  
309.  /*botl.c*/

Also on Fandom

Random Wiki