Wikihack
Advertisement

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

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

The NetHack General Public License applies to screenshots, source code and other content from NetHack.
1.    /*	SCCS Id: @(#)write.c	3.1	91/01/04
2.    /* NetHack may be freely redistributed.  See license for details. */
3.    
4.    #include "hack.h"
5.    
6.    static int FDECL(cost,(struct obj *));
7.    
8.    /*
9.     * returns basecost of a scroll or a spellbook
10.    */
11.   static int
12.   cost(otmp)
13.   register struct obj *otmp;
14.   {
15.   
16.   	if (otmp->oclass == SPBOOK_CLASS)
17.   		return(10 * objects[otmp->otyp].oc_level);
18.   
19.   	switch(otmp->otyp)  {
20.   # ifdef MAIL
21.   	case SCR_MAIL:
22.   		return(2);
23.   /*		break; */
24.   # endif
25.   	case SCR_LIGHT:
26.   	case SCR_GOLD_DETECTION:
27.   	case SCR_FOOD_DETECTION:
28.   	case SCR_MAGIC_MAPPING:
29.   	case SCR_AMNESIA:
30.   	case SCR_FIRE:
31.   		return(8);
32.   /*		break; */
33.   	case SCR_DESTROY_ARMOR:
34.   	case SCR_CREATE_MONSTER:
35.   	case SCR_PUNISHMENT:
36.   		return(10);
37.   /*		break; */
38.   	case SCR_CONFUSE_MONSTER:
39.   		return(12);
40.   /*		break; */
41.   	case SCR_IDENTIFY:
42.   		return(14);
43.   /*		break; */
44.   	case SCR_ENCHANT_ARMOR:
45.   	case SCR_REMOVE_CURSE:
46.   	case SCR_ENCHANT_WEAPON:
47.   	case SCR_CHARGING:
48.   		return(16);
49.   /*		break; */
50.   	case SCR_SCARE_MONSTER:
51.   	case SCR_TAMING:
52.   	case SCR_TELEPORTATION:
53.   		return(20);
54.   /*		break; */
55.   	case SCR_GENOCIDE:
56.   		return(30);
57.   /*		break; */
58.   	case SCR_BLANK_PAPER:
59.   	default:
60.   		impossible("You can't write such a weird scroll!");
61.   	}
62.   	return(1000);
63.   }
64.   
65.   static const char NEARDATA write_on[] = { SCROLL_CLASS, SPBOOK_CLASS, 0 };
66.   
67.   int
68.   dowrite(pen)
69.   register struct obj *pen;
70.   {
71.   	register struct obj *paper;
72.   	char namebuf[BUFSZ], scrbuf[BUFSZ];
73.   	register struct obj *new_obj;
74.   	int basecost, actualcost;
75.   	int curseval;
76.   	char qbuf[QBUFSZ];
77.   	
78.   	if(!pen)
79.   		return(0);
80.   	/* already tested before only call of dowrite() (from doapply())
81.   	if(pen->otyp != MAGIC_MARKER)  {
82.   		You("can't write with that!");
83.   		return(0);
84.   	}
85.   	*/
86.   
87.   	/* get paper to write on */
88.   	paper = getobj(write_on,"write on");
89.   	if(!paper)
90.   		return(0);
91.   	if(Blind && !paper->dknown) {
92.   		You("can't tell if that %s's blank or not!",
93.   		      paper->oclass == SPBOOK_CLASS ? "spellbook" :
94.   		      "scroll");
95.   		return(1);
96.   	}
97.   	paper->dknown = 1;
98.   	if(paper->otyp != SCR_BLANK_PAPER && paper->otyp != SPE_BLANK_PAPER) {
99.   		You("fool, that %s's not blank!",
100.  		    paper->oclass == SPBOOK_CLASS ? "spellbook" :
101.  		    "scroll");
102.  		return(1);
103.  	}
104.  
105.  	/* what to write */
106.  	Sprintf(qbuf, "What type of %s do you want to write? ",
107.  	      paper->oclass == SPBOOK_CLASS ? "spellbook" :
108.  	      "scroll");
109.  	getlin(qbuf, namebuf);
110.  	if(namebuf[0] == '\033' || !namebuf[0])
111.  		return(1);
112.  	scrbuf[0] = '\0';
113.  	if (paper->oclass == SPBOOK_CLASS) {
114.  		if(strncmp(namebuf,"spellbook of ",13) != 0)
115.  			Strcpy(scrbuf,"spellbook of ");
116.  	}
117.  	else if(strncmp(namebuf,"scroll of ",10) != 0)
118.  		Strcpy(scrbuf,"scroll of ");
119.  	Strcat(scrbuf,namebuf);
120.  	new_obj = readobjnam(scrbuf);
121.  
122.  	new_obj->bknown = (paper->bknown && pen->bknown);
123.  
124.  	if((new_obj->oclass != SCROLL_CLASS ||
125.  	              new_obj->otyp == SCR_BLANK_PAPER)
126.  	    && (new_obj->oclass != SPBOOK_CLASS || 
127.                        new_obj->otyp == SPE_BLANK_PAPER)) {
128.  		You("can't write that!");
129.  		pline("It's obscene!");
130.  		obfree(new_obj, (struct obj *) 0); /* pb@ethz.uucp */
131.  		return(1);
132.  	}
133.  
134.  	/* see if there's enough ink */
135.  	basecost = cost(new_obj);
136.  	if(pen->spe < basecost/2)  {
137.  		Your("marker is too dry to write that!");
138.  		obfree(new_obj, (struct obj *) 0);
139.  		return(1);
140.  	}
141.  
142.  	/* we're really going to write now, so calculate cost
143.  	 */
144.  	actualcost = rn1(basecost/2,basecost/2);
145.  	curseval = bcsign(pen) + bcsign(paper);
146.  	exercise(A_WIS, TRUE);
147.  	/* dry out marker */
148.  	if(pen->spe < actualcost)  {
149.  		Your("marker dries out!");
150.  		/* scrolls disappear, spellbooks don't */
151.  		if (paper->oclass == SPBOOK_CLASS)
152.  			pline("The spellbook is left unfinished.");
153.  		else {
154.  			pline("The scroll is now useless and disappears!");
155.  			useup(paper);
156.  		}
157.  		pen->spe = 0;
158.  		obfree(new_obj, (struct obj *) 0);
159.  		return(1);
160.  	}
161.  	pen->spe -= actualcost;
162.  
163.  	/* can't write if we don't know it - unless we're lucky */
164.  	if(!(objects[new_obj->otyp].oc_name_known) && 
165.  	   !(objects[new_obj->otyp].oc_uname) && 
166.  	   (rnl(pl_character[0] == 'W' ? 3 : 15))) {
167.  		You("don't know how to write that!");
168.  		/* scrolls disappear, spellbooks don't */
169.  		if (paper->oclass == SPBOOK_CLASS)
170.  			You("write in your best handwriting:  \"My Diary\".");
171.  		else {
172.  			You("write \"%s was here!\" and the scroll disappears.",plname);
173.  			useup(paper);
174.  		}
175.  		obfree(new_obj, (struct obj *) 0);
176.  		return(1);
177.  	}
178.  
179.  	/* useup old scroll / spellbook */
180.  	useup(paper);
181.  
182.  	/* now you know it! */
183.  	makeknown(new_obj->otyp);
184.  
185.  	/* success */
186.  	new_obj = addinv(new_obj);
187.  	new_obj->blessed = (curseval > 0);
188.  	new_obj->cursed = (curseval < 0);
189.  	prinv(NULL, new_obj, 1L);
190.  #ifdef MAIL
191.  	if (new_obj->otyp == SCR_MAIL) new_obj->spe = 1;
192.  #endif
193.  	new_obj->known = 1;
194.  	return(1);
195.  }
196.  
197.  /*write.c*/
Advertisement