comparison urogue/trader.c @ 256:c495a4f288c6

Import UltraRogue from the Roguelike Restoration Project (r1490)
author John "Elwin" Edwards
date Tue, 31 Jan 2017 19:56:04 -0500
parents
children 0250220d8cdd
comparison
equal deleted inserted replaced
253:d9badb9c0179 256:c495a4f288c6
1 /*
2 trader.c - Anything to do with trading posts
3
4 UltraRogue: The Ultimate Adventure in the Dungeons of Doom
5 Copyright (C) 1985, 1986, 1992, 1993, 1995 Herb Chong
6 All rights reserved.
7
8 Based on "Advanced Rogue"
9 Copyright (C) 1984, 1985 Michael Morgan, Ken Dalka
10 All rights reserved.
11
12 Based on "Rogue: Exploring the Dungeons of Doom"
13 Copyright (C) 1980, 1981 Michael Toy, Ken Arnold and Glenn Wichman
14 All rights reserved.
15
16 See the file LICENSE.TXT for full copyright and licensing information.
17 */
18
19 #include <string.h>
20 #include <stdlib.h>
21 #include <ctype.h>
22 #include "rogue.h"
23
24 #define EFFECTIVE_PURSE ((player.t_ctype==C_PALADIN)?(9 * purse / 10) : purse)
25
26 /*
27 do_post()
28 Buy and sell things in a trading post
29 */
30
31 void
32 display_postinfo(void)
33 {
34 wclear(hw);
35 wstandout(hw);
36 mvwaddstr(hw, 0, COLS / 2 - 30,
37 "Welcome to Friendly Fiend's Flea Market" );
38 wstandend(hw);
39 wclrtoeol(hw);
40 trans_line();
41 }
42
43 void
44 do_post(void)
45 {
46 int bad_letter = FALSE;
47
48 player.t_trans = 0;
49
50 for (;;)
51 {
52 if (!open_market())
53 return;
54
55 display_postinfo();
56
57 if (bad_letter)
58 {
59 bad_letter = FALSE;
60 wstandout(hw);
61 mvwaddstr(hw, 7, 0, "Type 'i' or 'I' to inventory, "
62 "'l' to leave, 'b' to buy, or 's' to sell");
63 wstandend(hw);
64 }
65
66 mvwaddstr(hw, 6, 0, "Do you wish to buy, sell, inventory, or leave?");
67 wrefresh(hw);
68
69 switch(readcharw(hw))
70 {
71 case 'b':
72 mvwaddstr(hw, 7, 0,
73 "Lets go into the buying section of the store...");
74 touchwin(hw);
75 wrefresh(hw);
76 buy_it('\0', ISNORMAL);
77 break;
78
79 case 's':
80 mvwaddstr(hw, 7, 0,
81 "Lets go into the selling section of the store...");
82 touchwin(hw);
83 wrefresh(hw);
84 sell_it();
85 break;
86
87 case 'i':
88 inventory(pack, '*');
89 break;
90
91 case 'I':
92 wclear(hw);
93 wrefresh(hw);
94 inventory(pack, 0);
95 msg(" ");
96 msg("");
97 break;
98
99 case 'l':
100 wclear(hw);
101 wrefresh(hw);
102 return;
103
104 default:
105 bad_letter = TRUE;
106 break;
107 }
108 }
109 }
110
111 void
112 buy_it(char itemtype, int flags)
113 {
114 int i;
115 int blessed = flags & ISBLESSED;
116 int cursed = flags & ISCURSED;
117 int is_spell = flags & SCR_MAGIC;
118 int array_size; /* # of items within type */
119 int which_type = 0; /* Which type to buy */
120 int which_one; /* Which one within type */
121 int plus_or_minus = 0; /* for magic items */
122 const struct magic_item *magic_array = NULL;
123 struct linked_list *item;
124 struct object *obj;
125 char buf[2 * LINELEN];
126
127 buy_more:
128
129 display_postinfo();
130
131 do
132 {
133 array_size = 0;
134
135 if (itemtype == '\0')
136 {
137 mpos = 0;
138 wmove(hw,10,0);
139 wclrtoeol(hw);
140 mvwaddstr(hw, 11, 0, "WHAT\tTYPE\n! Potion\n? Scroll\n"
141 "= Ring\n/ Stick\n] Armor\n) Weapon\n: Food");
142
143 if (wizard)
144 mvwaddstr(hw, 19, 0, ", Artifact");
145
146 mvwaddstr(hw, 9, 0, "What type of item do you want? ");
147 wclrtoeol(hw);
148 touchwin(hw);
149 wrefresh(hw);
150 itemtype = readcharw(hw);
151 }
152
153 switch(itemtype)
154 {
155 case POTION:
156 which_type = TYP_POTION;
157 array_size = maxpotions;
158 magic_array = p_magic;
159 break;
160
161 case SCROLL:
162 which_type = TYP_SCROLL;
163 array_size = maxscrolls;
164 magic_array = s_magic;
165 break;
166
167 case FOOD:
168 which_type = TYP_FOOD;
169 array_size = maxfoods;
170 magic_array = fd_data;
171 break;
172
173 case WEAPON:
174 which_type = TYP_WEAPON;
175 array_size = maxweapons;
176 break;
177
178 case ARMOR:
179 which_type = TYP_ARMOR;
180 array_size = maxarmors;
181 break;
182
183 case RING:
184 which_type = TYP_RING;
185 array_size = maxrings;
186 magic_array = r_magic;
187 break;
188
189 case STICK:
190 which_type = TYP_STICK;
191 array_size = maxsticks;
192 magic_array = ws_magic;
193 break;
194
195 case ARTIFACT:
196 if (!wizard)
197 {
198 itemtype = '\0';
199 continue;
200 }
201
202 which_type = TYP_ARTIFACT;
203 array_size = maxartifact;
204 break;
205
206 case ESCAPE:
207 return;
208
209 default:
210 wstandout(hw);
211 mvwaddstr(hw, 10, 0, "We don't stock any of those.");
212 wstandend(hw);
213 itemtype = '\0';
214 continue;
215 }
216 }
217 while (array_size == 0);
218
219 which_one = array_size;
220
221 do
222 {
223 const struct magic_item *m_item;
224
225 display_postinfo();
226
227 mpos = 0;
228 sprintf(buf, "Which kind of %s do you wish to have (* for list)? ",
229 things[which_type].mi_name);
230
231 mvwaddstr(hw, 9, 0, buf);
232
233 touchwin(hw);
234 wrefresh(hw);
235 buf[0] = '\0';
236
237 switch (get_string(buf, hw))
238 {
239 case QUIT:
240 case ESCAPE:
241 itemtype = '\0';
242 goto buy_more;
243 }
244
245 if (buf[0] == '*') /* print list */
246 {
247 add_line(" ID BASECOST NAME");
248
249 switch (which_type)
250 {
251 case TYP_RING:
252 case TYP_POTION:
253 case TYP_STICK:
254 case TYP_SCROLL:
255 case TYP_FOOD:
256
257 for(i=0,m_item=magic_array; i < array_size; i++, m_item++)
258 if (!is_spell && m_item->mi_worth > 0)
259 {
260 sprintf(buf, "%3d) %8d %s", i, m_item->mi_worth,
261 m_item->mi_name);
262 add_line(buf);
263 }
264 break;
265
266 case TYP_ARMOR:
267 for (i = 0; i < array_size; i++)
268 if (!is_spell && armors[i].a_worth > 0)
269 {
270 sprintf(buf, "%3d) %8d %s", i, armors[i].a_worth,
271 armors[i].a_name);
272
273 add_line(buf);
274 }
275 break;
276
277 case TYP_WEAPON:
278 for (i = 0; i < array_size; i++)
279 if (!is_spell && weaps[i].w_worth > 0)
280 {
281 sprintf(buf, "%3d) %8d %s", i, weaps[i].w_worth,
282 weaps[i].w_name);
283 add_line(buf);
284 }
285 break;
286
287 case TYP_ARTIFACT:
288 for (i = 0; i < array_size; i++)
289 {
290 sprintf(buf, "%3d) %8d %s", i, arts[i].ar_worth,
291 arts[i].ar_name);
292 add_line(buf);
293 }
294 break;
295
296 default:
297 add_line("What a strange type.");
298 }
299
300 end_line();
301 touchwin(hw);
302 wrefresh(hw);
303 continue;
304 }
305
306 if (isdigit(buf[0]))
307 which_one = atoi(buf);
308 else
309 switch (which_type)
310 {
311 case TYP_RING:
312 case TYP_POTION:
313 case TYP_STICK:
314 case TYP_SCROLL:
315 case TYP_FOOD:
316 for (i=0,m_item=magic_array; i < array_size; i++, m_item++)
317 if (strcmp(buf, m_item->mi_name) == 0)
318 which_one = i;
319 break;
320
321 case TYP_ARMOR:
322 for (i = 0; i < array_size; i++)
323 if (strcmp(buf, armors[i].a_name) == 0)
324 which_one = i;
325 break;
326
327 case TYP_WEAPON:
328 for (i = 0; i < array_size; i++)
329 if (strcmp(buf, weaps[i].w_name) == 0)
330 which_one = i;
331 break;
332
333 case TYP_ARTIFACT:
334 for (i = 0; i < array_size; i++)
335 if (strcmp(buf, arts[i].ar_name) == 0)
336 which_one = i;
337 break;
338
339 default:
340 msg("What a strange type.");
341 }
342
343 if (which_one < 0 || which_one >= array_size)
344 {
345 wstandout(hw);
346 mvwaddstr(hw, 10, 0, "Type the name or an ID number.");
347 wstandend(hw);
348 }
349 }
350 while (which_one < 0 || which_one >= array_size);
351
352 item = new_item(sizeof *obj);
353 obj = OBJPTR(item);
354
355 if (which_type == TYP_ARTIFACT)
356 {
357 new_artifact(which_one, obj);
358 add_pack(item, NOMESSAGE);
359 itemtype = '\0';
360 goto buy_more;
361 }
362
363 obj->o_type = itemtype;
364 obj->o_which = which_one;
365 obj->o_mark[0] = '\0';
366 obj->o_group = 0;
367 obj->o_count = 1;
368 obj->o_weight = 0;
369 obj->o_dplus = obj->o_hplus = 0;
370 obj->o_worth = 0;
371
372 if (!is_spell)