Source:NetHack 1.3d/mkobj.c

From NetHackWiki
Jump to: navigation, search

Below is the full text to mkobj.c from the source code of NetHack 1.3d. To link to a particular line, write [[NetHack 1.3d/mkobj.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: @(#)mkobj.c	1.3	87/07/14
2.    /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
3.    /* mkobj.c - version 1.0.3 */
4.    
5.    #include "hack.h"
6.    #ifdef SPELLS
7.    char mkobjstr[] = "))[[!!!!????+%%%%/=**))[[!!!!????+%%%%/=**(%";
8.    #else
9.    char mkobjstr[] = "))[[!!!!????%%%%/=**))[[!!!!????%%%%/=**(%";
10.   #endif
11.   
12.   struct obj *mkobj(), *mksobj();
13.   
14.   struct obj *
15.   mkobj_at(let,x,y)
16.   register let,x,y;
17.   {
18.   	register struct obj *otmp = mkobj(let);
19.   	otmp->ox = x;
20.   	otmp->oy = y;
21.   	otmp->nobj = fobj;
22.   	fobj = otmp;
23.   	return(otmp);
24.   }
25.   
26.   mksobj_at(otyp,x,y)
27.   register otyp,x,y;
28.   {
29.   	register struct obj *otmp = mksobj(otyp);
30.   	otmp->ox = x;
31.   	otmp->oy = y;
32.   	otmp->nobj = fobj;
33.   	fobj = otmp;
34.   }
35.   
36.   struct obj *
37.   mkobj(let) {
38.   int realtype;
39.   	switch (let) {
40.   		case 0: {
41.   			realtype=probtype(mkobjstr[rn2(sizeof(mkobjstr)-1)]);
42.   			break;
43.   		}
44.   		case '9': { realtype = DEAD_GIANT; break; }
45.   		case '&': { realtype = DEAD_DEMON; break; }
46.   		default: realtype = letter(let) ?
47.   				CORPSE + ((let>'Z') ? (let-'a'+'Z'-'@'+1) : (let-'@'))
48.   			:	probtype(let);
49.   	}
50.   	return(mksobj(realtype));
51.   }
52.   	
53.   
54.   struct obj zeroobj;
55.   
56.   struct obj *
57.   mksobj(otyp)
58.   register otyp;
59.   {
60.   	register struct obj *otmp;
61.   	char let = objects[otyp].oc_olet;
62.   
63.   	otmp = newobj(0);
64.   	*otmp = zeroobj;
65.   	otmp->age = moves;
66.   	otmp->o_id = flags.ident++;
67.   	otmp->quan = 1;
68.   	otmp->olet = let;
69.   	otmp->otyp = otyp;
70.   	otmp->dknown = index(
71.   #ifdef KAA
72.   #ifdef SPELLS
73.   	"/=!?*+)",
74.   #else
75.   	"/=!?*)",
76.   #endif
77.   #else
78.   #ifdef SPELLS
79.   	"/=!?*+",
80.   #else
81.   	"/=!?*",
82.   #endif
83.   #endif
84.   		    let) ? 0 : 1;
85.   	switch(let) {
86.   	case WEAPON_SYM:
87.   		otmp->quan = (otmp->otyp <= ROCK) ? rn1(6,6) : 1;
88.   		if(!rn2(11)) otmp->spe = rnd(3);
89.   		else if(!rn2(10)) {
90.   			otmp->cursed = 1;
91.   			otmp->spe = -rnd(3);
92.   		}
93.   		break;
94.   	case FOOD_SYM:
95.   		if(otmp->otyp >= CORPSE) break;
96.   #ifdef NOT_YET_IMPLEMENTED
97.   		/* if tins are to be identified, need to adapt doname() etc */
98.   		if(otmp->otyp == TIN)
99.   			otmp->spe = rnd(...);
100.  #endif
101.  		/* fall into next case */
102.  	case GEM_SYM:
103.  		otmp->quan = rn2(6) ? 1 : 2;
104.  	case TOOL_SYM:
105.  	case CHAIN_SYM:
106.  	case BALL_SYM:
107.  	case ROCK_SYM:
108.  	case POTION_SYM:
109.  	case SCROLL_SYM:
110.  	case AMULET_SYM:
111.  		break;
112.  #ifdef SPELLS
113.  	case SPBOOK_SYM:
114.  		if(!rn2(17)) otmp->cursed = 1;
115.  		break;
116.  #endif
117.  	case ARMOR_SYM:
118.  		if(!rn2(8)) otmp->cursed = 1;
119.  		if(!rn2(10)) otmp->spe = rnd(3);
120.  		else if(!rn2(9)) {
121.  			otmp->spe = -rnd(3);
122.  			otmp->cursed = 1;
123.  		}
124.  		break;
125.  	case WAND_SYM:
126.  		if(otmp->otyp == WAN_WISHING) otmp->spe = 3; else
127.  		otmp->spe = rn1(5,
128.  			(objects[otmp->otyp].bits & NODIR) ? 11 : 4);
129.  		break;
130.  	case RING_SYM:
131.  		if(objects[otmp->otyp].bits & SPEC) {
132.  			if(!rn2(3)) {
133.  				otmp->cursed = 1;
134.  				otmp->spe = -rnd(2);
135.  			} else otmp->spe = rnd(2);
136.  		} else if(otmp->otyp == RIN_TELEPORTATION ||
137.  			  otmp->otyp == RIN_AGGRAVATE_MONSTER ||
138.  			  otmp->otyp == RIN_HUNGER || !rn2(9))
139.  			otmp->cursed = 1;
140.  		break;
141.  	default:
142.  		panic("impossible mkobj %d", otmp->otyp);
143.  	}
144.  	otmp->owt = weight(otmp);
145.  	return(otmp);
146.  }
147.  
148.  letter(c) {
149.  	return(('@' <= c && c <= 'Z') || ('a' <= c && c <= 'z'));
150.  }
151.  
152.  weight(obj)
153.  register struct obj *obj;
154.  {
155.  register int wt = objects[obj->otyp].oc_weight;
156.  	return(wt ? wt*obj->quan : (obj->quan + 1)/2);
157.  }
158.  
159.  mkgold(num,x,y)
160.  register long num;
161.  {
162.  	register struct gold *gold;
163.  	register long amount = (num ? num : 1 + (rnd(dlevel+2) * rnd(30)));
164.  
165.  	if(gold = g_at(x,y))
166.  		gold->amount += amount;
167.  	else {
168.  		gold = newgold();
169.  		gold->ngold = fgold;
170.  		gold->gx = x;
171.  		gold->gy = y;
172.  		gold->amount = amount;
173.  		fgold = gold;
174.  		/* do sth with display? */
175.  	}
176.  }