Mercurial > hg > early-roguelike
comparison arogue7/trader.c @ 125:adfa37e67084
Import Advanced Rogue 7.7 from the Roguelike Restoration Project (r1490)
author | John "Elwin" Edwards |
---|---|
date | Fri, 08 May 2015 15:24:40 -0400 |
parents | |
children | f9ef86cf22b2 |
comparison
equal
deleted
inserted
replaced
124:d10fc4a065ac | 125:adfa37e67084 |
---|---|
1 /* | |
2 * trader.c - Anything to do with trading posts | |
3 * | |
4 * Advanced Rogue | |
5 * Copyright (C) 1984, 1985, 1986 Michael Morgan, Ken Dalka and AT&T | |
6 * All rights reserved. | |
7 * | |
8 * Based on "Rogue: Exploring the Dungeons of Doom" | |
9 * Copyright (C) 1980, 1981 Michael Toy, Ken Arnold and Glenn Wichman | |
10 * All rights reserved. | |
11 * | |
12 * See the file LICENSE.TXT for full copyright and licensing information. | |
13 */ | |
14 | |
15 /* | |
16 * Anything to do with trading posts | |
17 */ | |
18 | |
19 #include "curses.h" | |
20 #include "rogue.h" | |
21 | |
22 | |
23 | |
24 | |
25 | |
26 /* | |
27 * buy_it: | |
28 * Buy the item on which the hero stands | |
29 */ | |
30 buy_it() | |
31 { | |
32 reg int wh; | |
33 struct linked_list *item; | |
34 | |
35 if (purse <= 0) { | |
36 msg("You have no money."); | |
37 return; | |
38 } | |
39 if (curprice < 0) { /* if not yet priced */ | |
40 wh = price_it(); | |
41 if (!wh) /* nothing to price */ | |
42 return; | |
43 msg("Do you want to buy it? "); | |
44 do { | |
45 wh = tolower(readchar()); | |
46 if (wh == ESCAPE || wh == 'n') { | |
47 msg(""); | |
48 return; | |
49 } | |
50 } until(wh == 'y'); | |
51 } | |
52 mpos = 0; | |
53 if (curprice > purse) { | |
54 msg("You can't afford to buy that %s !",curpurch); | |
55 return; | |
56 } | |
57 /* | |
58 * See if the hero has done all his transacting | |
59 */ | |
60 if (!open_market()) | |
61 return; | |
62 /* | |
63 * The hero bought the item here | |
64 */ | |
65 item = find_obj(hero.y, hero.x); | |
66 mpos = 0; | |
67 if (add_pack(NULL, TRUE, &item)) { /* try to put it in his pack */ | |
68 purse -= curprice; /* take his money */ | |
69 ++trader; /* another transaction */ | |
70 trans_line(); /* show remaining deals */ | |
71 curprice = -1; /* reset stuff */ | |
72 curpurch[0] = 0; | |
73 whatis (item); /* identify it after purchase */ | |
74 (OBJPTR(item))->o_flags &= ~ISPOST; /* turn off ISPOST */ | |
75 msg("%s", inv_name(OBJPTR(item), TRUE)); | |
76 } | |
77 } | |
78 | |
79 /* | |
80 * do_post: | |
81 * Put a trading post room and stuff on the screen | |
82 */ | |
83 do_post(startup) | |
84 bool startup; /* True if equipping the player at the beginning of the game */ | |
85 { | |
86 coord tp; | |
87 reg int i, j, k; | |
88 reg struct room *rp; | |
89 reg struct object *op; | |
90 reg struct linked_list *ll; | |
91 | |
92 o_free_list(lvl_obj); /* throw old items away */ | |
93 | |
94 for (rp = rooms; rp < &rooms[MAXROOMS]; rp++) | |
95 rp->r_flags = ISGONE; /* kill all rooms */ | |
96 | |
97 rp = &rooms[0]; /* point to only room */ | |
98 rp->r_flags = 0; /* this room NOT gone */ | |
99 rp->r_max.x = 40; | |
100 rp->r_max.y = 10; /* 10 * 40 room */ | |
101 rp->r_pos.x = (cols - rp->r_max.x) / 2; /* center horizontal */ | |
102 rp->r_pos.y = 1; /* 2nd line */ | |
103 draw_room(rp); /* draw the only room */ | |
104 | |
105 /* Are we equipping the player? */ | |
106 if (startup) { | |
107 int wpt; | |
108 | |
109 /* | |
110 * Give the rogue some weaponry. | |
111 */ | |
112 for (wpt=0; wpt<MAXWEAPONS; wpt++) { | |
113 ll = spec_item(WEAPON, wpt, rnd(2), rnd(2)+1); | |
114 attach(lvl_obj, ll); | |
115 op = OBJPTR(ll); | |
116 op->o_flags |= (ISPOST | ISKNOW); | |
117 do { | |
118 rnd_pos(rp,&tp); | |
119 } until (mvinch(tp.y, tp.x) == FLOOR); | |
120 op->o_pos = tp; | |
121 mvaddch(tp.y,tp.x,op->o_type); | |
122 } | |
123 | |
124 /* | |
125 * And his suit of armor....... | |
126 * Thieves can only wear leather armor, | |
127 * so make sure some is available for them. | |
128 */ | |
129 for (i=0; i<MAXARMORS; i++) { | |
130 ll = spec_item(ARMOR, i, 0, 0); | |
131 attach(lvl_obj, ll); | |
132 op = OBJPTR(ll); | |
133 op->o_flags |= (ISPOST | ISKNOW); | |
134 op->o_weight = armors[i].a_wght; | |
135 do { | |
136 rnd_pos(rp,&tp); | |
137 } until (mvinch(tp.y, tp.x) == FLOOR); | |
138 op->o_pos = tp; | |
139 mvaddch(tp.y,tp.x,op->o_type); | |
140 } | |
141 | |
142 /* Now create some wands */ | |
143 for (i=rnd(4)+2; i>0; i--) { | |
144 switch (rnd(8)) { | |
145 case 0: j = WS_SLOW_M; | |
146 when 1: j = WS_TELMON; | |
147 when 2: j = WS_CONFMON; | |
148 when 3: j = WS_PARALYZE; | |
149 when 4: j = WS_MDEG; | |
150 when 5: j = WS_WONDER; | |
151 when 6: j = WS_FEAR; | |
152 when 7: j = WS_LIGHT; | |
153 } | |
154 ll = spec_item(STICK, j, 0, 0); | |
155 attach(lvl_obj, ll); | |
156 op = OBJPTR(ll); | |
157 | |
158 /* Let clerics and MU'S know what kind they are */ | |
159 switch (player.t_ctype) { | |
160 case C_MAGICIAN: | |
161 case C_CLERIC: | |
162 case C_DRUID: | |
163 op->o_flags |= (ISPOST | ISKNOW); | |
164 otherwise: | |
165 op->o_flags |= ISPOST; | |
166 } | |
167 fix_stick(op); | |
168 do { | |
169 rnd_pos(rp,&tp); | |
170 } until (mvinch(tp.y, tp.x) == FLOOR); | |
171 op->o_pos = tp; | |
172 mvaddch(tp.y,tp.x,op->o_type); | |
173 } | |
174 | |
175 /* Now let's make some rings */ | |
176 for (i=rnd(4)+3; i>0; i--) { | |
177 k = 0; | |
178 switch (rnd(15)) { | |
179 case 0: j = R_PROTECT; k = roll(1,2); | |
180 when 1: j = R_ADDSTR; k = roll(1,3); | |
181 when 2: j = R_ADDHIT; k = roll(1,3); | |
182 when 3: j = R_ADDDAM; k = roll(1,3); | |
183 when 4: j = R_DIGEST; k = 1; | |
184 when 5: j = R_ADDINTEL; k = roll(1,3); | |
185 when 6: j = R_ADDWISDOM;k = roll(1,3); | |
186 when 7: j = R_SUSABILITY; | |
187 when 8: j = R_SEEINVIS; | |
188 when 9: j = R_ALERT; | |
189 when 10:j = R_HEALTH; | |
190 when 11:j = R_HEROISM; | |
191 when 12:j = R_FIRE; | |
192 when 13:j = R_WARMTH; | |
193 when 14:j = R_FREEDOM; | |
194 } | |
195 ll = spec_item(RING, j, k, 0); | |
196 attach(lvl_obj, ll); | |
197 op = OBJPTR(ll); | |
198 | |
199 /* | |
200 * Let fighters, assassins, monks, and thieves know what kind | |
201 * of rings these are. | |
202 */ | |
203 switch (player.t_ctype) { | |
204 case C_FIGHTER: | |
205 case C_THIEF: | |
206 case C_ASSASIN: | |
207 case C_MONK: | |
208 op->o_flags |= (ISPOST | ISKNOW); | |
209 otherwise: | |
210 op->o_flags |= ISPOST; | |
211 } | |
212 do { | |
213 rnd_pos(rp,&tp); | |
214 } until (mvinch(tp.y, tp.x) == FLOOR); | |
215 op->o_pos = tp; | |
216 mvaddch(tp.y,tp.x,op->o_type); | |
217 } | |
218 | |
219 /* Let's offer some potions */ | |
220 for (i=rnd(3)+1; i>0; i--) { | |
221 /* Choose the type of potion */ | |
222 if (i == 1 && player.t_ctype == C_ASSASIN) j = P_POISON; | |
223 else switch (rnd(8)) { | |
224 case 0: j = P_CLEAR; | |
225 when 1: j = P_HEALING; | |
226 when 2: j = P_MFIND; | |
227 when 3: j = P_TFIND; | |
228 when 4: j = P_HASTE; | |
229 when 5: j = P_RESTORE; | |
230 when 6: j = P_FLY; | |
231 when 7: j = P_FFIND; | |
232 } | |
233 | |
234 /* Make the potion */ | |
235 ll = spec_item(POTION, j, 0, 0); | |
236 attach(lvl_obj, ll); | |
237 op = OBJPTR(ll); | |
238 op->o_flags |= ISPOST; | |
239 | |
240 /* Place the potion */ | |
241 do { | |
242 rnd_pos(rp,&tp); | |
243 } until (mvinch(tp.y, tp.x) == FLOOR); | |
244 op->o_pos = tp; | |
245 mvaddch(tp.y,tp.x,op->o_type); | |
246 } | |
247 | |
248 /* Let's offer some scrolls */ | |
249 for (i=rnd(3)+1; i>0; i--) { | |
250 /* Choose the type of scrolls */ | |
251 switch (rnd(8)) { | |
252 case 0: j = S_CONFUSE; | |
253 when 1: j = S_MAP; | |
254 when 2: j = S_LIGHT; | |
255 when 3: j = S_SLEEP; | |
256 when 4: j = S_IDENT; | |
257 when 5: j = S_GFIND; | |
258 when 6: j = S_REMOVE; | |
259 when 7: j = S_CURING; | |
260 } | |
261 | |
262 /* Make the scroll */ | |
263 ll = spec_item(SCROLL, j, 0, 0); | |
264 attach(lvl_obj, ll); | |
265 op = OBJPTR(ll); | |
266 op->o_flags |= ISPOST; | |
267 | |
268 /* Place the scroll */ | |
269 do { | |
270 rnd_pos(rp,&tp); | |
271 } until (mvinch(tp.y, tp.x) == FLOOR); | |
272 op->o_pos = tp; | |
273 mvaddch(tp.y,tp.x,op->o_type); | |
274 } | |
275 | |
276 /* And finally, let's get some food */ | |
277 for (i=rnd(3)+1; i>0; i--) { | |
278 ll = spec_item(FOOD, 0, 0, 0); | |
279 attach(lvl_obj, ll); | |
280 op = OBJPTR(ll); | |
281 op->o_weight = things[TYP_FOOD].mi_wght; | |
282 op->o_flags |= ISPOST; | |
283 do { | |
284 rnd_pos(rp,&tp); | |
285 } until (mvinch(tp.y, tp.x) == FLOOR); | |
286 op->o_pos = tp; | |
287 mvaddch(tp.y,tp.x,op->o_type); | |
288 } | |
289 } | |
290 else { | |
291 i = roll(10, 4); /* 10 to 40 items */ | |
292 for (; i > 0 ; i--) { /* place all the items */ | |
293 ll = new_thing(ALL, TRUE); /* get something */ | |
294 attach(lvl_obj, ll); | |
295 op = OBJPTR(ll); | |
296 op->o_flags |= ISPOST; /* object in trading post */ | |
297 do { | |
298 rnd_pos(rp,&tp); | |
299 } until (mvinch(tp.y, tp.x) == FLOOR); | |
300 op->o_pos = tp; | |
301 mvaddch(tp.y,tp.x,op->o_type); | |
302 } | |
303 } | |
304 wmove(cw,12,0); | |
305 trader = 0; | |
306 if (startup) { | |
307 waddstr(cw,"Welcome to Friendly Fiend's Equipage\n\r"); | |
308 waddstr(cw,"====================================\n\r"); | |
309 } | |
310 else { | |
311 waddstr(cw,"Welcome to Friendly Fiend's Flea Market\n\r"); | |
312 waddstr(cw,"=======================================\n\r"); | |
313 } | |
314 waddstr(cw,"$: Prices object that you stand upon.\n\r"); | |
315 waddstr(cw,"#: Buys the object that you stand upon.\n\r"); | |
316 waddstr(cw,"%: Trades in something in your pack for gold.\n\r"); | |
317 trans_line(); | |
318 } | |
319 | |
320 | |
321 /* | |
322 * get_worth: | |
323 * Calculate an objects worth in gold | |
324 */ | |
325 get_worth(obj) | |
326 reg struct object *obj; | |
327 { | |
328 reg int worth, wh; | |
329 | |
330 worth = 0; | |
331 wh = obj->o_which; | |
332 switch (obj->o_type) { | |
333 case FOOD: | |
334 worth = 2; | |
335 when WEAPON: | |
336 if (wh < MAXWEAPONS) { | |
337 worth = weaps[wh].w_worth; | |
338 worth += s_magic[S_ALLENCH].mi_worth * | |
339 (obj->o_hplus + obj->o_dplus); | |
340 } | |
341 when ARMOR: | |
342 if (wh < MAXARMORS) { | |
343 worth = armors[wh].a_worth; | |
344 worth += s_magic[S_ALLENCH].mi_worth * | |
345 (armors[wh].a_class - obj->o_ac); | |
346 } | |
347 when SCROLL: | |
348 if (wh < MAXSCROLLS) | |
349 worth = s_magic[wh].mi_worth; | |
350 when POTION: | |
351 if (wh < MAXPOTIONS) | |
352 worth = p_magic[wh].mi_worth; | |
353 when RING: | |
354 if (wh < MAXRINGS) { | |
355 worth = r_magic[wh].mi_worth; | |
356 worth += obj->o_ac * 40; | |
357 } | |
358 when STICK: | |
359 if (wh < MAXSTICKS) { | |
360 worth = ws_magic[wh].mi_worth; | |
361 worth += 20 * obj->o_charges; | |
362 } | |
363 when MM: | |
364 if (wh < MAXMM) { | |
365 worth = m_magic[wh].mi_worth; | |
366 switch (wh) { | |
367 case MM_BRACERS: worth += 40 * obj->o_ac; | |
368 when MM_PROTECT: worth += 60 * obj->o_ac; | |
369 when MM_DISP: /* ac already figured in price*/ | |
370 otherwise: worth += 20 * obj->o_ac; | |
371 } | |
372 } | |
373 when RELIC: | |
374 if (wh < MAXRELIC) { | |
375 worth = rel_magic[wh].mi_worth; | |
376 if (wh == quest_item) worth *= 10; | |
377 } | |
378 otherwise: | |