Source:NetHack 1.3d/write.c

From NetHackWiki
Jump to: navigation, search

Below is the full text to write.c from the source code of NetHack 1.3d. To link to a particular line, write [[NetHack 1.3d/write.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: @(#)write.c	1.3	87/07/14
2.    /* write.c - version 1.0.3 */
3.    
4.    #include "hack.h"
5.    
6.    extern char pl_character[];
7.    
8.    #ifdef MARKER
9.    
10.   /*
11.    * returns basecost of a scroll
12.    */
13.   int
14.   cost(scroll)
15.   register struct obj *scroll;
16.   {
17.   	switch(scroll->otyp)  {
18.   # ifdef MAIL
19.   	case SCR_MAIL:
20.   # endif
21.   		return(0);
22.   		break;
23.   	case SCR_LIGHT:
24.   	case SCR_GOLD_DETECTION:
25.   	case SCR_FOOD_DETECTION:
26.   	case SCR_MAGIC_MAPPING:
27.   	case SCR_AMNESIA:
28.   	case SCR_FIRE:
29.   		return(8);
30.   		break;
31.   	case SCR_DESTROY_ARMOR:
32.   	case SCR_DAMAGE_WEAPON:
33.   	case SCR_CREATE_MONSTER:
34.   	case SCR_PUNISHMENT:
35.   		return(10);
36.   		break;
37.   	case SCR_CONFUSE_MONSTER:
38.   		return(12);
39.   		break;
40.   	case SCR_IDENTIFY:
41.   		return(14);
42.   		break;
43.   	case SCR_ENCHANT_ARMOR:
44.   	case SCR_REMOVE_CURSE:
45.   	case SCR_ENCHANT_WEAPON:
46.   		return(16);
47.   		break;
48.   	case SCR_SCARE_MONSTER:
49.   	case SCR_TAMING:
50.   	case SCR_TELEPORTATION:
51.   		return(20);
52.   		break;
53.   	case SCR_GENOCIDE:
54.   		return(30);
55.   		break;
56.   	case SCR_BLANK_PAPER:
57.   	default:
58.   		impossible("You can't write such a weird scroll!");
59.   		return(1000);
60.   	}
61.   }
62.   
63.   
64.   dowrite(pen)
65.   	register struct obj *pen;
66.   {
67.   	register struct obj *paper;
68.   	char namebuf[BUFSZ], scrbuf[BUFSZ];
69.   	register struct obj *newscroll;
70.   	extern struct obj *readobjnam(), *addinv();
71.   	int basecost, actualcost;
72.   	int newquan;
73.   	
74.   	if(!pen)
75.   		return(0);
76.   	if(pen->otyp != MAGIC_MARKER)  {
77.   		pline("You can't write with that!");
78.   		return(0);
79.   	}
80.   	
81.   	/* get paper to write on */
82.   	paper = getobj("?","write on");
83.   	if(!paper)
84.   		return(0);
85.   	if(!(objects[paper->otyp].oc_name_known))  {
86.   		pline("In your haste, you rip the scroll to pieces.");
87.   		useup(paper);
88.   		return(1);
89.   	}
90.   # ifndef KAA
91.   /* If this is included, the strategy would be to name all scrolls so that
92.    * you can test them for blankness with a magic marker.  This is tedious,
93.    * thus, let's make it easier. */
94.   	if(!(objects[paper->otyp].oc_name_known))  {
95.   		pline("In your haste, you rip the scroll to pieces.");
96.   		useup(paper);
97.   		return(0);
98.   	}
99.   # endif
100.  	if(paper->otyp != SCR_BLANK_PAPER)  {
101.  		pline("You fool, that scroll's not blank!");
102.  		return(0);
103.  	}
104.  	
105.  	/* what to write */
106.  	pline("What do you want to write? ");
107.  	getlin(namebuf);
108.  	if(namebuf[0] == '\033' || !namebuf[0])
109.  		return(0);
110.  	strcpy(scrbuf,"scroll of ");
111.  	strcat(scrbuf,namebuf);
112.  	newscroll = readobjnam(scrbuf);
113.  	if(newscroll->olet != SCROLL_SYM ||
114.  	   newscroll->otyp == SCR_BLANK_PAPER)  {
115.  		pline("You can't write that!");
116.  		pline("It's obscene!");
117.  		return(0);
118.  	}
119.  	
120.  	/* see if there's enough ink */
121.  	basecost = cost(newscroll);
122.  	if(pen->spe < basecost/2)  {
123.  		pline("You marker is too dried out to write that!");
124.  		obfree(newscroll, (struct obj *) 0);
125.  		return(0);
126.  	}
127.  	
128.  	/* we're really going to write now, so calculate
129.  	 * cost and useup old scroll
130.  	 */
131.  	actualcost = rn1(basecost/2,basecost/2);
132.  	useup(paper);
133.  	
134.  	/* dry out marker */
135.  	if(pen->spe < actualcost)  {
136.  		pline("Your marker dries out!");
137.  		pline("The scroll is now useless and disappears!");
138.  		pen->spe = 0;
139.  		obfree(newscroll, (struct obj *) 0);
140.  		return(1);
141.  	}
142.  	pen->spe -= actualcost;
143.  # ifdef KAA /* Since the KAA modification allows writing on unknown blank
144.  		paper, identify blank paper. */
145.  	objects[SCR_BLANK_PAPER].oc_name_known=1;
146.  # endif
147.  	
148.  	/* can't write if we don't know it - unless we're lucky */
149.  	if(!(objects[newscroll->otyp].oc_name_known) && 
150.  # ifdef KAA
151.  	   !(objects[newscroll->otyp].oc_uname) && 
152.  # endif
153.  	   ((pl_character[0] == 'W' && rn2(3)) ||
154.  	    (pl_character[0] != 'W' && rn2(10))))  {
155.  		pline("You don't know how to write that!");
156.  		pline("You write \"Shah was here!\" and the scroll disappears.");
157.  		obfree(newscroll, (struct obj *) 0);
158.  		return(1);
159.  	}
160.  	
161.  	/* and now you know it! */
162.  	objects[newscroll->otyp].oc_name_known = 1;
163.  	
164.  	/* success - don't forget to fool prinv() */
165.  	newscroll = addinv(newscroll);
166.  	newquan = newscroll->quan;
167.  	newscroll->quan = 1;
168.  	prinv(newscroll);
169.  	newscroll->quan = newquan;
170.  	
171.  	return(1);
172.  }
173.  # endif /* MARKER /**/