summaryrefslogtreecommitdiffstats
path: root/hack/hack.mkobj.c
blob: 9e0240e6a397335b36e87e232d53ad25a7cf7d3e (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
/*	$NetBSD: hack.mkobj.c,v 1.5 2001/03/25 20:44:01 jsm Exp $	*/

/*
 * Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985.
 */

#include <sys/cdefs.h>
#ifndef lint
__RCSID("$NetBSD: hack.mkobj.c,v 1.5 2001/03/25 20:44:01 jsm Exp $");
#endif				/* not lint */

#include "hack.h"
#include "extern.h"

char            mkobjstr[] = "))[[!!!!????%%%%/=**))[[!!!!????%%%%/=**(%";

struct obj     *
mkobj_at(let, x, y)
	int let, x, y;
{
	struct obj     *otmp = mkobj(let);
	otmp->ox = x;
	otmp->oy = y;
	otmp->nobj = fobj;
	fobj = otmp;
	return (otmp);
}

void
mksobj_at(otyp, x, y)
	int otyp, x, y;
{
	struct obj     *otmp = mksobj(otyp);
	otmp->ox = x;
	otmp->oy = y;
	otmp->nobj = fobj;
	fobj = otmp;
}

struct obj     *
mkobj(let)
	int let;
{
	if (!let)
		let = mkobjstr[rn2(sizeof(mkobjstr) - 1)];
	return (
		mksobj(
		       letter(let) ?
	  CORPSE + ((let > 'Z') ? (let - 'a' + 'Z' - '@' + 1) : (let - '@'))
		       : probtype(let)
		       )
		);
}


struct obj      zeroobj;

struct obj     *
mksobj(otyp)
	int otyp;
{
	struct obj     *otmp;
	char            let = objects[otyp].oc_olet;

	otmp = newobj(0);
	*otmp = zeroobj;
	otmp->age = moves;
	otmp->o_id = flags.ident++;
	otmp->quan = 1;
	otmp->olet = let;
	otmp->otyp = otyp;
	otmp->dknown = strchr("/=!?*", let) ? 0 : 1;
	switch (let) {
	case WEAPON_SYM:
		otmp->quan = (otmp->otyp <= ROCK) ? rn1(6, 6) : 1;
		if (!rn2(11))
			otmp->spe = rnd(3);
		else if (!rn2(10)) {
			otmp->cursed = 1;
			otmp->spe = -rnd(3);
		}
		break;
	case FOOD_SYM:
		if (otmp->otyp >= CORPSE)
			break;
#ifdef NOT_YET_IMPLEMENTED
		/* if tins are to be identified, need to adapt doname() etc */
		if (otmp->otyp == TIN)
			otmp->spe = rnd(...);
#endif	/* NOT_YET_IMPLEMENTED */
		/* fall into next case */
	case GEM_SYM:
		otmp->quan = rn2(6) ? 1 : 2;
	case TOOL_SYM:
	case CHAIN_SYM:
	case BALL_SYM:
	case ROCK_SYM:
	case POTION_SYM:
	case SCROLL_SYM:
	case AMULET_SYM:
		break;
	case ARMOR_SYM:
		if (!rn2(8))
			otmp->cursed = 1;
		if (!rn2(10))
			otmp->spe = rnd(3);
		else if (!rn2(9)) {
			otmp->spe = -rnd(3);
			otmp->cursed = 1;
		}
		break;
	case WAND_SYM:
		if (otmp->otyp == WAN_WISHING)
			otmp->spe = 3;
		else
			otmp->spe = rn1(5,
			       (objects[otmp->otyp].bits & NODIR) ? 11 : 4);
		break;
	case RING_SYM:
		if (objects[otmp->otyp].bits & SPEC) {
			if (!rn2(3)) {
				otmp->cursed = 1;
				otmp->spe = -rnd(2);
			} else
				otmp->spe = rnd(2);
		} else if (otmp->otyp == RIN_TELEPORTATION ||
			   otmp->otyp == RIN_AGGRAVATE_MONSTER ||
			   otmp->otyp == RIN_HUNGER || !rn2(9))
			otmp->cursed = 1;
		break;
	default:
		panic("impossible mkobj");
	}
	otmp->owt = weight(otmp);
	return (otmp);
}

int
letter(c)
	int c;
{
	return (('@' <= c && c <= 'Z') || ('a' <= c && c <= 'z'));
}

int
weight(obj)
	struct obj     *obj;
{
	int             wt = objects[obj->otyp].oc_weight;
	return (wt ? wt * obj->quan : (obj->quan + 1) / 2);
}

void
mkgold(long num, int x, int y)
{
	struct gold    *gold;
	long            amount = (num ? num : 1 + (rnd(dlevel + 2) * rnd(30)));

	if ((gold = g_at(x, y)) != NULL)
		gold->amount += amount;
	else {
		gold = newgold();
		gold->ngold = fgold;
		gold->gx = x;
		gold->gy = y;
		gold->amount = amount;
		fgold = gold;
		/* do sth with display? */
	}
}