xref: /dragonfly/games/larn/store.c (revision ed183f8c2f9bb14cbccb8377f3cdd29e0971d8a0)
1 /*-
2  * Copyright (c) 1988 The Regents of the University of California.
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  * 1. Redistributions of source code must retain the above copyright
9  *    notice, this list of conditions and the following disclaimer.
10  * 2. Redistributions in binary form must reproduce the above copyright
11  *    notice, this list of conditions and the following disclaimer in the
12  *    documentation and/or other materials provided with the distribution.
13  * 3. Neither the name of the University nor the names of its contributors
14  *    may be used to endorse or promote products derived from this software
15  *    without specific prior written permission.
16  *
17  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
18  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
21  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
23  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
24  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
26  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
27  * SUCH DAMAGE.
28  *
29  * @(#)store.c      5.4 (Berkeley) 5/13/91
30  * $FreeBSD: src/games/larn/store.c,v 1.5 1999/11/30 03:49:00 billf Exp $
31  */
32 
33 /* store.c                    Larn is copyrighted 1986 by Noah Morgan. */
34 #include <sys/param.h>
35 
36 #include "header.h"
37 
38 static void dnd_2hed(void);
39 static void dnd_hed(void);
40 static void handsfull(void);
41 static void outofstock(void);
42 static void nogold(void);
43 static void dnditem(int);
44 static void sch_hed(void);
45 static void banktitle(const char *);
46 static void obanksub(void);
47 static void otradhead(void);
48 static void cnsitm(void);
49 
50 static int dndcount = 0, dnditm = 0;
51 
52 /* this is the data for the stuff in the dnd store */
53 int maxitm = 83;    /* number of items in the dnd inventory table */
54 struct _itm itm_[90] = {
55 /*cost              iven name           iven arg  how
56   gp                iven[]                        ivenarg[] many */
57 
58 { 2,                OLEATHER,           0,                  3         },
59 { 10,               OSTUDLEATHER,                 0,                  2         },
60 { 40,               ORING,                        0,                  2         },
61 { 85,               OCHAIN,                       0,                  2         },
62 { 220,              OSPLINT,            0,                  1         },
63 { 400,              OPLATE,                       0,                  1         },
64 { 900,              OPLATEARMOR,                  0,                  1         },
65 { 2600,             OSSPLATE,           0,                  1         },
66 { 150,              OSHIELD,            0,                  1         },
67 
68 /*cost              iven name           iven arg  how
69   gp                iven[]                        ivenarg[] many */
70 
71 { 2,                ODAGGER,            0,                  3         },
72 { 20,               OSPEAR,                       0,                  3         },
73 { 80,               OFLAIL,                       0,                  2         },
74 { 150,              OBATTLEAXE,                   0,                  2         },
75 { 450,              OLONGSWORD,                   0,                  2         },
76 { 1000,             O2SWORD,            0,                  2         },
77 { 5000,             OSWORD,                       0,                  1         },
78 { 16500,  OLANCE,                       0,                  1         },
79 { 6000,             OSWORDofSLASHING,   0,                  0         },
80 { 10000,  OHAMMER,            0,                  0         },
81 
82 /*cost              iven name           iven arg  how
83   gp                iven[]                        ivenarg[] many */
84 
85 { 150,              OPROTRING,                    1,                  1         },
86 { 85,               OSTRRING,           1,                  1         },
87 { 120,              ODEXRING,           1,                  1         },
88 { 120,              OCLEVERRING,                  1,                  1         },
89 { 180,              OENERGYRING,                  0,                  1         },
90 { 125,              ODAMRING,           0,                  1         },
91 { 220,              OREGENRING,                   0,                  1         },
92 { 1000,             ORINGOFEXTRA,                 0,                  1         },
93 
94 { 280,              OBELT,                        0,                  1         },
95 
96 { 400,              OAMULET,            0,                  1         },
97 
98 { 6500,             OORBOFDRAGON,                 0,                  0         },
99 { 5500,             OSPIRITSCARAB,                0,                  0         },
100 { 5000,             OCUBEofUNDEAD,                0,                  0         },
101 { 6000,             ONOTHEFT,           0,                  0         },
102 
103 { 590,              OCHEST,                       6,                  1         },
104 { 200,              OBOOK,                        8,                  1         },
105 { 10,               OCOOKIE,            0,                  3         },
106 
107 /*cost              iven name           iven arg  how
108   gp                iven[]                        ivenarg[] many */
109 
110 { 20,               OPOTION,            0,                  6         },
111 { 90,               OPOTION,            1,                  5         },
112 { 520,              OPOTION,            2,                  1         },
113 { 100,              OPOTION,            3,                  2         },
114 { 50,               OPOTION,            4,                  2         },
115 { 150,              OPOTION,            5,                  2         },
116 { 70,               OPOTION,            6,                  1         },
117 { 30,               OPOTION,            7,                  7         },
118 { 200,              OPOTION,            8,                  1         },
119 { 50,               OPOTION,            9,                  1         },
120 { 80,               OPOTION,            10,                 1         },
121 
122 /*cost              iven name           iven arg  how
123   gp                iven[]                        ivenarg[] many */
124 
125 { 30,               OPOTION,            11,                 3         },
126 { 20,               OPOTION,            12,                 5         },
127 { 40,               OPOTION,            13,                 3         },
128 { 35,               OPOTION,            14,                 2         },
129 { 520,              OPOTION,            15,                 1         },
130 { 90,               OPOTION,            16,                 2         },
131 { 200,              OPOTION,            17,                 2         },
132 { 220,              OPOTION,            18,                 4         },
133 { 80,               OPOTION,            19,                 6         },
134 { 370,              OPOTION,            20,                 3         },
135 { 50,               OPOTION,            22,                 1         },
136 { 150,              OPOTION,            23,                 3         },
137 
138 /*cost              iven name           iven arg  how
139   gp                iven[]                        ivenarg[] many */
140 
141 { 100,              OSCROLL,            0,                  2         },
142 { 125,              OSCROLL,            1,                  2         },
143 { 60,               OSCROLL,            2,                  4         },
144 { 10,               OSCROLL,            3,                  4         },
145 { 100,              OSCROLL,            4,                  3         },
146 { 200,              OSCROLL,            5,                  2         },
147 { 110,              OSCROLL,            6,                  1         },
148 { 500,              OSCROLL,            7,                  2         },
149 { 200,              OSCROLL,            8,                  2         },
150 { 250,              OSCROLL,            9,                  4         },
151 { 20,               OSCROLL,            10,                 5         },
152 { 30,               OSCROLL,            11,                 3         },
153 
154 /*cost              iven name           iven arg  how
155   gp                iven[]                        ivenarg[] many */
156 
157 { 340,              OSCROLL,            12,                 1         },
158 { 340,              OSCROLL,            13,                 1         },
159 { 300,              OSCROLL,            14,                 2         },
160 { 400,              OSCROLL,            15,                 2         },
161 { 500,              OSCROLL,            16,                 2         },
162 { 1000,             OSCROLL,            17,                 1         },
163 { 500,              OSCROLL,            18,                 1         },
164 { 340,              OSCROLL,            19,                 2         },
165 { 220,              OSCROLL,            20,                 3         },
166 { 3900,             OSCROLL,            21,                 0         },
167 { 610,              OSCROLL,            22,                 1         },
168 { 3000,             OSCROLL,            23,                 0         }
169 };
170 
171 /*
172           function for the dnd store
173  */
174 static void
dnd_2hed(void)175 dnd_2hed(void)
176 {
177           lprcat("Welcome to the Larn Thrift Shoppe.  We stock many items explorers find useful\n");
178           lprcat(" in their adventures.  Feel free to browse to your hearts content.\n");
179           lprcat("Also be advised, if you break 'em, you pay for 'em.");
180 }
181 
182 static void
dnd_hed(void)183 dnd_hed(void)
184 {
185           int i;
186           for (i = dnditm; i < 26 + dnditm; i++)
187                     dnditem(i);
188           cursor(50, 18);
189           lprcat("You have ");
190 }
191 
192 static void
handsfull(void)193 handsfull(void)
194 {
195           lprcat("\nYou can't carry anything more!");
196           lflush();
197           nap(2200);
198 }
199 
200 static void
outofstock(void)201 outofstock(void)
202 {
203           lprcat("\nSorry, but we are out of that item.");
204           lflush();
205           nap(2200);
206 }
207 
208 static void
nogold(void)209 nogold(void)
210 {
211           lprcat("\nYou don't have enough gold to pay for that!");
212           lflush();
213           nap(2200);
214 }
215 
216 void
dndstore(void)217 dndstore(void)
218 {
219           int i;
220           dnditm = 0;
221           nosignal = 1;                 /* disable signals */
222           clear();
223           dnd_2hed();
224           if (outstanding_taxes > 0) {
225                     lprcat("\n\nThe Larn Revenue Service has ordered us to not do business with tax evaders.\n");
226                     beep();
227                     lprintf("They have also told us that you owe %d gp in back taxes, and as we must\n", (long)outstanding_taxes);
228                     lprcat("comply with the law, we cannot serve you at this time.  Soo Sorry.\n");
229                     cursors();
230                     lprcat("\nPress ");
231                     standout("escape");
232                     lprcat(" to leave: ");
233                     lflush();
234                     i = 0;
235                     while (i != '\33')
236                               i = getchr();
237                     drawscreen();
238                     nosignal = 0;       /* enable signals */
239                     return;
240           }
241 
242           dnd_hed();
243           while (1) {
244                     cursor(59, 18);
245                     lprintf("%d gold pieces", (long)c[GOLD]);
246                     cltoeoln();
247                     cl_dn(1, 20);       /* erase to eod */
248                     lprcat("\nEnter your transaction [");
249                     standout("space");
250                     lprcat(" for more, ");
251                     standout("escape");
252                     lprcat(" to leave]? ");
253                     i = 0;
254                     while ((i < 'a' || i > 'z') && (i != ' ') && (i != '\33') && (i != 12))
255                               i = getchr();
256                     if (i == 12) {
257                               clear();
258                               dnd_2hed();
259                               dnd_hed();
260                     } else if (i == '\33') {
261                               drawscreen();
262                               nosignal = 0;       /* enable signals */
263                               return;
264                     } else if (i == ' ') {
265                               cl_dn(1, 4);
266                               if ((dnditm += 26) >= maxitm)
267                                         dnditm = 0;
268                               dnd_hed();
269                     } else {  /* buy something */
270                               lprc(i);/* echo the byte */
271                               i += dnditm - 'a';
272                               if (i >= maxitm)
273                                         outofstock();
274                               else if (itm_[i].qty <= 0)
275                                         outofstock();
276                               else if (pocketfull())
277                                         handsfull();
278                               else if (c[GOLD] < itm_[i].price * 10)
279                                         nogold();
280                               else {
281                                         if (itm_[i].obj == OPOTION)
282                                                   potionname[itm_[i].arg] = potionhide[itm_[i].arg];
283                                         else if (itm_[i].obj == OSCROLL)
284                                                   scrollname[itm_[i].arg] = scrollhide[itm_[i].arg];
285                                         c[GOLD] -= itm_[i].price * 10;
286                                         itm_[i].qty--;
287                                         take(itm_[i].obj, itm_[i].arg);
288                                         if (itm_[i].qty == 0)
289                                                   dnditem(i);
290                                         nap(1001);
291                               }
292                     }
293           }
294 }
295 
296 /*
297           dnditem(index)
298 
299           to print the item list;  used in dndstore() enter with the index into itm_
300  */
301 static void
dnditem(int i)302 dnditem(int i)
303 {
304           int j, k;
305           if (i >= maxitm)
306                     return;
307           cursor((j = (i & 1) * 40 + 1), (k = ((i % 26) >> 1) + 5));
308           if (itm_[i].qty == 0) {
309                     lprintf("%39s", "");
310                     return;
311           }
312           lprintf("%c) ", (i % 26) + 'a');
313           if (itm_[i].obj == OPOTION) {
314                     lprcat("potion of ");
315                     lprintf("%s", potionhide[itm_[i].arg]);
316           } else if (itm_[i].obj == OSCROLL) {
317                     lprcat("scroll of ");
318                     lprintf("%s", scrollhide[itm_[i].arg]);
319           } else
320                     lprintf("%s", objectname[itm_[i].obj]);
321           cursor(j + 31, k);
322           lprintf("%6d", (long)(itm_[i].price * 10));
323 }
324 
325 /*
326           for the college of larn
327  */
328 char course[26] = { 0 };      /* the list of courses taken */
329 char coursetime[] = { 10, 15, 10, 20, 10, 10, 10, 5 };
330 /*
331           function to display the header info for the school
332  */
333 static void
sch_hed(void)334 sch_hed(void)
335 {
336           clear();
337           lprcat("The College of Larn offers the exciting opportunity of higher education to\n");
338           lprcat("all inhabitants of the caves.  Here is a list of the class schedule:\n\n\n");
339           lprcat("\t\t    Course Name \t       Time Needed\n\n");
340 
341           if (course[0] == 0)
342                     lprcat("\t\ta)  Fighters Training I         10 mobuls");    /* line 7 of crt */
343           lprc('\n');
344           if (course[1] == 0)
345                     lprcat("\t\tb)  Fighters Training II        15 mobuls");
346           lprc('\n');
347           if (course[2] == 0)
348                     lprcat("\t\tc)  Introduction to Wizardry    10 mobuls");
349           lprc('\n');
350           if (course[3] == 0)
351                     lprcat("\t\td)  Applied Wizardry            20 mobuls");
352           lprc('\n');
353           if (course[4] == 0)
354                     lprcat("\t\te)  Behavioral Psychology       10 mobuls");
355           lprc('\n');
356           if (course[5] == 0)
357                     lprcat("\t\tf)  Faith for Today             10 mobuls");
358           lprc('\n');
359           if (course[6] == 0)
360                     lprcat("\t\tg)  Contemporary Dance          10 mobuls");
361           lprc('\n');
362           if (course[7] == 0)
363                     lprcat("\t\th)  History of Larn              5 mobuls");
364 
365           lprcat("\n\n\t\tAll courses cost 250 gold pieces.");
366           cursor(30, 18);
367           lprcat("You are presently carrying ");
368 }
369 
370 void
oschool(void)371 oschool(void)
372 {
373           int i;
374           long time_used;
375           nosignal = 1;       /* disable signals */
376           sch_hed();
377           while (1) {
378                     cursor(57, 18);
379                     lprintf("%d gold pieces.   ", (long)c[GOLD]);
380                     cursors();
381                     lprcat("\nWhat is your choice [");
382                     standout("escape");
383                     lprcat(" to leave] ? ");
384                     yrepcount = 0;
385                     i = 0;
386                     while ((i < 'a' || i > 'h') && (i != '\33') && (i != 12))
387                               i = getchr();
388                     if (i == 12) {
389                               sch_hed();
390                               continue;
391                     } else if (i == '\33') {
392                               nosignal = 0;
393                               drawscreen();       /* enable signals */
394                               return;
395                     }
396                     lprc(i);
397                     if (c[GOLD] < 250)
398                               nogold();
399                     else if (course[i - 'a']) {
400                               lprcat("\nSorry, but that class is filled.");
401                               nap(1000);
402                     } else if (i <= 'h') {
403                               c[GOLD] -= 250;
404                               time_used = 0;
405                               switch (i) {
406                               case 'a':
407                                         c[STRENGTH] += 2;
408                                         c[CONSTITUTION]++;
409                                         lprcat("\nYou feel stronger!");
410                                         cl_line(16, 7);
411                                         break;
412 
413                               case 'b':
414                                         if (course[0] == 0) {
415                                                   lprcat("\nSorry, but this class has a prerequisite of Fighters Training I");
416                                                   c[GOLD] += 250;
417                                                   time_used = -10000;
418                                                   break;
419                                         }
420                                         lprcat("\nYou feel much stronger!");
421                                         cl_line(16, 8);
422                                         c[STRENGTH] += 2;
423                                         c[CONSTITUTION] += 2;
424                                         break;
425 
426                               case 'c':
427                                         c[INTELLIGENCE] += 2;
428                                         lprcat("\nThe task before you now seems more attainable!");
429                                         cl_line(16, 9);
430                                         break;
431 
432                               case 'd':
433                                         if (course[2] == 0) {
434                                                   lprcat("\nSorry, but this class has a prerequisite of Introduction to Wizardry");
435                                                   c[GOLD] += 250;
436                                                   time_used = -10000;
437                                                   break;
438                                         }
439                                         lprcat("\nThe task before you now seems very attainable!");
440                                         cl_line(16, 10);
441                                         c[INTELLIGENCE] += 2;
442                                         break;
443 
444                               case 'e':
445                                         c[CHARISMA] += 3;
446                                         lprcat("\nYou now feel like a born leader!");
447                                         cl_line(16, 11);
448                                         break;
449 
450                               case 'f':
451                                         c[WISDOM] += 2;
452                                         lprcat("\nYou now feel more confident that you can find the potion in time!");
453                                         cl_line(16, 12);
454                                         break;
455 
456                               case 'g':
457                                         c[DEXTERITY] += 3;
458                                         lprcat("\nYou feel like dancing!");
459                                         cl_line(16, 13);
460                                         break;
461 
462                               case 'h':
463                                         c[INTELLIGENCE]++;
464                                         lprcat("\nYour instructor told you that the Eye of Larn is rumored to be guarded\n");
465                                         lprcat("by a platinum dragon who possesses psionic abilities. ");
466                                         cl_line(16, 14);
467                                         break;
468                               }
469                               time_used += coursetime[i - 'a'] * 100;
470                               if (time_used > 0) {
471                                         gtime += time_used;
472                                         course[i - 'a']++; /* remember that he has taken that course */
473                                         c[HP] = c[HPMAX];
474                                         c[SPELLS] = c[SPELLMAX];      /* he regenerated */
475 
476                                         if (c[BLINDCOUNT])
477                                                   c[BLINDCOUNT] = 1;  /* cure blindness too! */
478                                         if (c[CONFUSE])
479                                                   c[CONFUSE] = 1;               /* end confusion */
480                                         larn_adjtime((long)time_used);          /* adjust parameters for time change */
481                               }
482                               nap(1000);
483                     }
484           }
485 }
486 
487 /*
488  *        for the first national bank of Larn
489  */
490 int lasttime = 0;   /* last time he was in bank */
491 
492 void
obank(void)493 obank(void)
494 {
495           banktitle("    Welcome to the First National Bank of Larn.");
496 }
497 
498 void
obank2(void)499 obank2(void)
500 {
501           banktitle("Welcome to the 5th level branch office of the First National Bank of Larn.");
502 }
503 
504 static void
banktitle(const char * str)505 banktitle(const char *str)
506 {
507           nosignal = 1;                 /* disable signals */
508           clear();
509           lprcat(str);
510           if (outstanding_taxes > 0) {
511                     int i;
512                     lprcat("\n\nThe Larn Revenue Service has ordered that your account be frozen until all\n");
513                     beep();
514                     lprintf("levied taxes have been paid.  They have also told us that you owe %d gp in\n", (long)outstanding_taxes);
515                     lprcat("taxes, and we must comply with them. We cannot serve you at this time.  Sorry.\n");
516                     lprcat("We suggest you go to the LRS office and pay your taxes.\n");
517                     cursors();
518                     lprcat("\nPress ");
519                     standout("escape");
520                     lprcat(" to leave: ");
521                     lflush();
522                     i = 0;
523                     while (i != '\33')
524                               i = getchr();
525                     drawscreen();
526                     nosignal = 0;       /* enable signals */
527                     return;
528           }
529           lprcat("\n\n\tGemstone\t      Appraisal\t\tGemstone\t      Appraisal");
530           obanksub();
531           nosignal = 0;                 /* enable signals */
532           drawscreen();
533 }
534 
535 /*
536  *        function to put interest on your bank account
537  */
538 void
ointerest(void)539 ointerest(void)
540 {
541           int i;
542           if (c[BANKACCOUNT] < 0)
543                     c[BANKACCOUNT] = 0;
544           else if ((c[BANKACCOUNT] > 0) && (c[BANKACCOUNT] < 500000)) {
545                     i = (gtime - lasttime) / 100; /* # mobuls elapsed */
546                     while ((i-- > 0) && (c[BANKACCOUNT] < 500000))
547                               c[BANKACCOUNT] += c[BANKACCOUNT] / 250;
548                     if (c[BANKACCOUNT] > 500000)
549                               c[BANKACCOUNT] = 500000;      /* interest limit */
550           }
551           lasttime = rounddown(gtime, 100);
552 }
553 
554 static short gemorder[26] = { 0 };      /* the reference to screen location for each */
555 static long gemvalue[26] = { 0 };       /* the appraisal of the gems */
556 
557 static void
obanksub(void)558 obanksub(void)
559 {
560           unsigned long amt;
561           int i, k;
562           ointerest();                  /* credit any needed interest */
563 
564           for (k = i = 0; i < 26; i++)
565                     switch (iven[i]) {
566                     case OLARNEYE:
567                     case ODIAMOND:
568                     case OEMERALD:
569                     case ORUBY:
570                     case OSAPPHIRE:
571 
572                               if (iven[i] == OLARNEYE) {
573                                         gemvalue[i] = 250000 -
574                                             rounddown(gtime * 7, 100);
575                                         if (gemvalue[i] < 50000)
576                                                   gemvalue[i] = 50000;
577                               } else
578                                         gemvalue[i] = (255 & ivenarg[i]) * 100;
579                               gemorder[i] = k;
580                               cursor((k % 2) * 40 + 1, (k >> 1) + 4);
581                               lprintf("%c) %s", i + 'a', objectname[(int)iven[i]]);
582                               cursor((k % 2) * 40 + 33, (k >> 1) + 4);
583                               lprintf("%5d", (long)gemvalue[i]);
584                               k++;
585                     }
586           cursor(31, 17);
587           lprintf("You have %8d gold pieces in the bank.", (long)c[BANKACCOUNT]);
588           cursor(40, 18);
589           lprintf("You have %8d gold pieces", (long)c[GOLD]);
590           if (c[BANKACCOUNT] + c[GOLD] >= 500000)
591                     lprcat("\nNote:  Larndom law states that only deposits under 500,000gp  can earn interest.");
592           while (1) {
593                     cl_dn(1, 20);
594                     lprcat("\nYour wish? [(");
595                     standout("d");
596                     lprcat(") deposit, (");
597                     standout("w");
598                     lprcat(") withdraw, (");
599                     standout("s");
600                     lprcat(") sell a stone, or ");
601                     standout("escape");
602                     lprcat("]  ");
603                     yrepcount = 0;
604                     i = 0;
605                     while (i != 'd' && i != 'w' && i != 's' && i != '\33')
606                               i = getchr();
607                     switch (i) {
608                     case 'd':
609                               lprcat("deposit\nHow much? ");
610                               amt = readnum((long)c[GOLD]);
611                               if (amt > (unsigned)c[GOLD]) {
612                                         lprcat("  You don't have that much.");
613                                         nap(2000);
614                               } else {
615                                         c[GOLD] -= amt;
616                                         c[BANKACCOUNT] += amt;
617                               }
618                               break;
619 
620                     case 'w':
621                               lprcat("withdraw\nHow much? ");
622                               amt = readnum((long)c[BANKACCOUNT]);
623                               if (amt > (unsigned)c[BANKACCOUNT]) {
624                                         lprcat("\nYou don't have that much in the bank!");
625                                         nap(2000);
626                               } else {
627                                         c[GOLD] += amt;
628                                         c[BANKACCOUNT] -= amt;
629                               }
630                               break;
631 
632                     case 's':
633                               lprcat("\nWhich stone would you like to sell? ");
634                               i = 0;
635                               while ((i < 'a' || i > 'z') && i != '*')
636                                         i = getchr();
637                               if (i == '*')
638                                         for (i = 0; i < 26; i++) {
639                                                   if (gemvalue[i]) {
640                                                             c[GOLD] += gemvalue[i];
641                                                             iven[i] = 0;
642                                                             gemvalue[i] = 0;
643                                                             k = gemorder[i];
644                                                             cursor((k % 2) * 40 + 1, (k >> 1) + 4);
645                                                             lprintf("%39s", "");
646                                                   }
647                                         }
648                               else {
649                                         if (gemvalue[i = i - 'a'] == 0) {
650                                                   lprintf("\nItem %c is not a gemstone!", i + 'a');
651                                                   nap(2000);
652                                                   break;
653                                         }
654                                         c[GOLD] += gemvalue[i];
655                                         iven[i] = 0;
656                                         gemvalue[i] = 0;
657                                         k = gemorder[i];
658                                         cursor((k % 2) * 40 + 1, (k >> 1) + 4);
659                                         lprintf("%39s", "");
660                               }
661                               break;
662 
663                     case '\33':
664                               return;
665                     }
666                     cursor(40, 17);
667                     lprintf("%8d", (long)c[BANKACCOUNT]);
668                     cursor(49, 18);
669                     lprintf("%8d", (long)c[GOLD]);
670           }
671 }
672 /*
673           function for the trading post
674  */
675 static void
otradhead(void)676 otradhead(void)
677 {
678           clear();
679           lprcat("Welcome to the Larn Trading Post.  We buy items that explorers no longer find\n");
680           lprcat("useful.  Since the condition of the items you bring in is not certain,\n");
681           lprcat("and we incur great expense in reconditioning the items, we usually pay\n");
682           lprcat("only 20% of their value were they to be new.  If the items are badly\n");
683           lprcat("damaged, we will pay only 10% of their new value.\n\n");
684 }
685 
686 void
otradepost(void)687 otradepost(void)
688 {
689           int i, j, value, isub, izarg;
690           dnditm = dndcount = 0;
691           nosignal = 1;                 /* disable signals */
692           resetscroll();
693           otradhead();
694           while (1) {
695                     lprcat("\nWhat item do you want to sell to us [");
696                     standout("*");
697                     lprcat(" for list, or ");
698                     standout("escape");
699                     lprcat("] ? ");
700                     i = 0;
701                     while (i > 'z' || (i < 'a' && i != '*' && i != '\33' && i != '.')) i = getchr();
702                     if (i == '\33') {
703                               setscroll();
704                               recalc();
705                               drawscreen();
706                               nosignal = 0;       /* enable signals */
707                               return;
708                     }
709                     isub = i - 'a';
710                     j = 0;
711                     if (iven[isub] == OSCROLL)
712                               if (scrollname[ivenarg[isub]][0] == 0) {
713                                         j = 1;
714                                         cnsitm();
715                               }         /* can't sell unidentified item */
716                     if (iven[isub] == OPOTION)
717                               if (potionname[ivenarg[isub]][0] == 0) {
718                                         j = 1;
719                                         cnsitm();
720                               }         /* can't sell unidentified item */
721                     if (!j) {
722                               if (i == '*') {
723                                         clear();
724                                         qshowstr();
725                                         otradhead();
726                               } else if (iven[isub] == 0)
727                                         lprintf("\nYou don't have item %c!", isub + 'a');
728                               else {
729                                         for (j = 0; j < maxitm; j++)
730                                                   if ((itm_[j].obj == iven[isub]) || (iven[isub] == ODIAMOND) || (iven[isub] == ORUBY) || (iven[isub] == OEMERALD) || (iven[isub] == OSAPPHIRE)) {
731                                                             srcount = 0;
732                                                             show3(isub);        /* show what the item was */
733                                                             if ((iven[isub] == ODIAMOND) || (iven[isub] == ORUBY)
734                                                                 || (iven[isub] == OEMERALD) || (iven[isub] == OSAPPHIRE))
735                                                                       value = 20 * ivenarg[isub];
736                                                             else if ((itm_[j].obj == OSCROLL) || (itm_[j].obj == OPOTION)) value = 2 * itm_[j + ivenarg[isub]].price;
737                                                             else {
738                                                                       izarg = ivenarg[isub];
739                                                                       value = itm_[j].price;  /* appreciate if a +n object */
740                                                                       if (izarg >= 0)
741                                                                                 value *= 2;
742                                                                       while ((izarg-- > 0) && ((value = 14 * (67 + value) / 10) < 500000))
743                                                                                 ;
744                                                             }
745                                                             lprintf("\nItem (%c) is worth %d gold pieces to us.  Do you want to sell it? ", i, (long)value);
746                                                             yrepcount = 0;
747                                                             if (getyn() == 'y') {
748                                                                       lprcat("yes\n");
749                                                                       c[GOLD] += value;
750                                                                       if (c[WEAR] == isub)
751                                                                                 c[WEAR] = -1;
752                                                                       if (c[WIELD] == isub)
753                                                                                 c[WIELD] = -1;
754                                                                       if (c[SHIELD] == isub)
755                                                                                 c[SHIELD] = -1;
756                                                                       adjustcvalues(iven[isub], ivenarg[isub]);
757                                                                       iven[isub] = 0;
758                                                             } else
759                                                                       lprcat("no thanks.\n");
760                                                             j = maxitm + 100;   /* get out of the inner loop */
761                                                   }
762                                         if (j <= maxitm + 2)
763                                                   lprcat("\nSo sorry, but we are not authorized to accept that item.");
764                               }
765                     }
766           }
767 }
768 
769 static void
cnsitm(void)770 cnsitm(void)
771 {
772           lprcat("\nSorry, we can't accept unidentified objects.");
773 }
774 
775 /*
776  *        for the Larn Revenue Service
777  */
778 void
olrs(void)779 olrs(void)
780 {
781           int i, first;
782           unsigned long amt;
783           first = nosignal = 1;         /* disable signals */
784           clear();
785           resetscroll();
786           cursor(1, 4);
787           lprcat("Welcome to the Larn Revenue Service district office.  How can we help you?");
788           while (1) {
789                     if (first) {
790                               first = 0;
791                               goto nxt;
792                     }
793                     cursors();
794                     lprcat("\n\nYour wish? [(");
795                     standout("p");
796                     lprcat(") pay taxes, or ");
797                     standout("escape");
798                     lprcat("]  ");
799                     yrepcount = 0;
800                     i = 0;
801                     while (i != 'p' && i != '\33')
802                               i = getchr();
803                     switch (i) {
804                     case 'p':
805                               lprcat("pay taxes\nHow much? ");
806                               amt = readnum((long)c[GOLD]);
807                               if (amt > (unsigned)c[GOLD])
808                                         lprcat("  You don't have that much.\n");
809                               else
810                                         c[GOLD] -= paytaxes((long)amt);
811                               break;
812 
813                     case '\33':
814                               nosignal = 0;       /* enable signals */
815                               setscroll();
816                               drawscreen();
817                               return;
818                     }
819 
820 nxt:      cursor(1, 6);
821                     if (outstanding_taxes > 0)
822                               lprintf("You presently owe %d gp in taxes.  ", (long)outstanding_taxes);
823                     else
824                               lprcat("You do not owe us any taxes.           ");
825                     cursor(1, 8);
826                     if (c[GOLD] > 0)
827                               lprintf("You have %6d gp.    ", (long)c[GOLD]);
828                     else
829                               lprcat("You have no gold pieces.  ");
830           }
831 }
832