From 013ac7742311556022304e8b30ca170d48b3a016 Mon Sep 17 00:00:00 2001 From: "B. Watson" Date: Thu, 7 May 2015 16:32:32 -0400 Subject: initial commit --- larn/store.c | 910 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 910 insertions(+) create mode 100644 larn/store.c (limited to 'larn/store.c') diff --git a/larn/store.c b/larn/store.c new file mode 100644 index 0000000..2d33538 --- /dev/null +++ b/larn/store.c @@ -0,0 +1,910 @@ +/* $NetBSD: store.c,v 1.16 2012/06/19 05:30:44 dholland Exp $ */ + +/*- + * Copyright (c) 1988 The Regents of the University of California. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include +#ifndef lint +#if 0 +static char sccsid[] = "@(#)store.c 5.4 (Berkeley) 5/13/91"; +#else +__RCSID("$NetBSD: store.c,v 1.16 2012/06/19 05:30:44 dholland Exp $"); +#endif +#endif /* not lint */ + +/* store.c Larn is copyrighted 1986 by Noah Morgan. */ +#include "header.h" +#include "extern.h" + +static void handsfull(void); +static void outofstock(void); +static void nogold(void); +static void dnditem(int); +static void banktitle(const char *); +static void obanksub(void); +static void otradhead(void); +static void cnsitm(void); + +static int dndcount = 0, dnditm = 0; + +/* number of items in the dnd inventory table */ +#define MAXITM 83 + +/* this is the data for the stuff in the dnd store */ +struct _itm itm[90] = { + /* + * cost iven name iven arg how gp + * iven[] ivenarg[] many + */ + + {2, OLEATHER, 0, 3}, + {10, OSTUDLEATHER, 0, 2}, + {40, ORING, 0, 2}, + {85, OCHAIN, 0, 2}, + {220, OSPLINT, 0, 1}, + {400, OPLATE, 0, 1}, + {900, OPLATEARMOR, 0, 1}, + {2600, OSSPLATE, 0, 1}, + {150, OSHIELD, 0, 1}, + + /* + * cost iven name iven arg how gp + * iven[] ivenarg[] many + */ + + {2, ODAGGER, 0, 3}, + {20, OSPEAR, 0, 3}, + {80, OFLAIL, 0, 2}, + {150, OBATTLEAXE, 0, 2}, + {450, OLONGSWORD, 0, 2}, + {1000, O2SWORD, 0, 2}, + {5000, OSWORD, 0, 1}, + {16500, OLANCE, 0, 1}, + {6000, OSWORDofSLASHING, 0, 0}, + {10000, OHAMMER, 0, 0}, + + /* + * cost iven name iven arg how gp + * iven[] ivenarg[] many + */ + + {150, OPROTRING, 1, 1}, + {85, OSTRRING, 1, 1}, + {120, ODEXRING, 1, 1}, + {120, OCLEVERRING, 1, 1}, + {180, OENERGYRING, 0, 1}, + {125, ODAMRING, 0, 1}, + {220, OREGENRING, 0, 1}, + {1000, ORINGOFEXTRA, 0, 1}, + + {280, OBELT, 0, 1}, + + {400, OAMULET, 0, 1}, + + {6500, OORBOFDRAGON, 0, 0}, + {5500, OSPIRITSCARAB, 0, 0}, + {5000, OCUBEofUNDEAD, 0, 0}, + {6000, ONOTHEFT, 0, 0}, + + {590, OCHEST, 6, 1}, + {200, OBOOK, 8, 1}, + {10, OCOOKIE, 0, 3}, + + /* + * cost iven name iven arg how gp + * iven[] ivenarg[] many + */ + + {20, OPOTION, 0, 6}, + {90, OPOTION, 1, 5}, + {520, OPOTION, 2, 1}, + {100, OPOTION, 3, 2}, + {50, OPOTION, 4, 2}, + {150, OPOTION, 5, 2}, + {70, OPOTION, 6, 1}, + {30, OPOTION, 7, 7}, + {200, OPOTION, 8, 1}, + {50, OPOTION, 9, 1}, + {80, OPOTION, 10, 1}, + + /* + * cost iven name iven arg how gp + * iven[] ivenarg[] many + */ + + {30, OPOTION, 11, 3}, + {20, OPOTION, 12, 5}, + {40, OPOTION, 13, 3}, + {35, OPOTION, 14, 2}, + {520, OPOTION, 15, 1}, + {90, OPOTION, 16, 2}, + {200, OPOTION, 17, 2}, + {220, OPOTION, 18, 4}, + {80, OPOTION, 19, 6}, + {370, OPOTION, 20, 3}, + {50, OPOTION, 22, 1}, + {150, OPOTION, 23, 3}, + + /* + * cost iven name iven arg how gp + * iven[] ivenarg[] many + */ + + {100, OSCROLL, 0, 2}, + {125, OSCROLL, 1, 2}, + {60, OSCROLL, 2, 4}, + {10, OSCROLL, 3, 4}, + {100, OSCROLL, 4, 3}, + {200, OSCROLL, 5, 2}, + {110, OSCROLL, 6, 1}, + {500, OSCROLL, 7, 2}, + {200, OSCROLL, 8, 2}, + {250, OSCROLL, 9, 4}, + {20, OSCROLL, 10, 5}, + {30, OSCROLL, 11, 3}, + + /* + * cost iven name iven arg how gp + * iven[] ivenarg[] many + */ + + {340, OSCROLL, 12, 1}, + {340, OSCROLL, 13, 1}, + {300, OSCROLL, 14, 2}, + {400, OSCROLL, 15, 2}, + {500, OSCROLL, 16, 2}, + {1000, OSCROLL, 17, 1}, + {500, OSCROLL, 18, 1}, + {340, OSCROLL, 19, 2}, + {220, OSCROLL, 20, 3}, + {3900, OSCROLL, 21, 0}, + {610, OSCROLL, 22, 1}, + {3000, OSCROLL, 23, 0} +}; + +/* + function for the dnd store + */ +static void +dnd_2hed(void) +{ + lprcat("Welcome to the Larn Thrift Shoppe. We stock many items explorers find useful\n"); + lprcat(" in their adventures. Feel free to browse to your hearts content.\n"); + lprcat("Also be advised, if you break 'em, you pay for 'em."); +} + +static void +dnd_hed(void) +{ + int i; + for (i = dnditm; i < 26 + dnditm; i++) + dnditem(i); + cursor(50, 18); + lprcat("You have "); +} + +static void +handsfull(void) +{ + lprcat("\nYou can't carry anything more!"); + lflush(); + nap(2200); +} + +static void +outofstock(void) +{ + lprcat("\nSorry, but we are out of that item."); + lflush(); + nap(2200); +} + +static void +nogold(void) +{ + lprcat("\nYou don't have enough gold to pay for that!"); + lflush(); + nap(2200); +} + +void +dndstore(void) +{ + int i; + dnditm = 0; + nosignal = 1; /* disable signals */ + clear(); + dnd_2hed(); + if (outstanding_taxes > 0) { + lprcat("\n\nThe Larn Revenue Service has ordered us to not do business with tax evaders.\n"); + beep(); + lprintf("They have also told us that you owe %ld gp in back taxes, and as we must\n", (long) outstanding_taxes); + lprcat("comply with the law, we cannot serve you at this time. Soo Sorry.\n"); + cursors(); + lprcat("\nPress "); + standout("escape"); + lprcat(" to leave: "); + lflush(); + i = 0; + while (i != '\33') + i = ttgetch(); + drawscreen(); + nosignal = 0; /* enable signals */ + return; + } + dnd_hed(); + while (1) { + cursor(59, 18); + lprintf("%ld gold pieces", (long) c[GOLD]); + cltoeoln(); + cl_dn(1, 20); /* erase to eod */ + lprcat("\nEnter your transaction ["); + standout("space"); + lprcat(" for more, "); + standout("escape"); + lprcat(" to leave]? "); + i = 0; + while ((i < 'a' || i > 'z') && (i != ' ') && (i != '\33') && (i != 12)) + i = ttgetch(); + if (i == 12) { + clear(); + dnd_2hed(); + dnd_hed(); + } else if (i == '\33') { + drawscreen(); + nosignal = 0; /* enable signals */ + return; + } else if (i == ' ') { + cl_dn(1, 4); + if ((dnditm += 26) >= MAXITM) + dnditm = 0; + dnd_hed(); + } else { /* buy something */ + lprc(i);/* echo the byte */ + i += dnditm - 'a'; + if (i >= MAXITM) + outofstock(); + else if (itm[i].qty <= 0) + outofstock(); + else if (pocketfull()) + handsfull(); + else if (c[GOLD] < itm[i].price * 10) + nogold(); + else { + if (itm[i].obj == OPOTION) { + potionname[itm[i].arg] = potionhide[itm[i].arg]; + } else if (itm[i].obj == OSCROLL) { + scrollname[itm[i].arg] = scrollhide[itm[i].arg]; + } + c[GOLD] -= itm[i].price * 10; + itm[i].qty--; + take(itm[i].obj, itm[i].arg); + if (itm[i].qty == 0) + dnditem(i); + nap(1001); + } + } + + } +} + +/* + dnditem(index) + + to print the item list; used in dndstore() enter with the index into itm + */ +static void +dnditem(int i) +{ + int j, k; + if (i >= MAXITM) + return; + cursor((j = (i & 1) * 40 + 1), (k = ((i % 26) >> 1) + 5)); + if (itm[i].qty == 0) { + lprintf("%39s", ""); + return; + } + lprintf("%c) ", (i % 26) + 'a'); + if (itm[i].obj == OPOTION) { + lprintf("potion of%s", potionhide[itm[i].arg]); + } else if (itm[i].obj == OSCROLL) { + lprintf("scroll of%s", scrollhide[itm[i].arg]); + } else + lprintf("%s", objectname[itm[i].obj]); + cursor(j + 31, k); + lprintf("%6ld", (long) (itm[i].price * 10)); +} + + + +/* + for the college of larn + */ +u_char course[26] = {0}; /* the list of courses taken */ +static char coursetime[] = {10, 15, 10, 20, 10, 10, 10, 5}; +/* + function to display the header info for the school + */ +static void +sch_hed(void) +{ + clear(); + lprcat("The College of Larn offers the exciting opportunity of higher education to\n"); + lprcat("all inhabitants of the caves. Here is a list of the class schedule:\n\n\n"); + lprcat("\t\t Course Name \t Time Needed\n\n"); + + if (course[0] == 0) + lprcat("\t\ta) Fighters Training I 10 mobuls"); /* line 7 of crt */ + lprc('\n'); + if (course[1] == 0) + lprcat("\t\tb) Fighters Training II 15 mobuls"); + lprc('\n'); + if (course[2] == 0) + lprcat("\t\tc) Introduction to Wizardry 10 mobuls"); + lprc('\n'); + if (course[3] == 0) + lprcat("\t\td) Applied Wizardry 20 mobuls"); + lprc('\n'); + if (course[4] == 0) + lprcat("\t\te) Behavioral Psychology 10 mobuls"); + lprc('\n'); + if (course[5] == 0) + lprcat("\t\tf) Faith for Today 10 mobuls"); + lprc('\n'); + if (course[6] == 0) + lprcat("\t\tg) Contemporary Dance 10 mobuls"); + lprc('\n'); + if (course[7] == 0) + lprcat("\t\th) History of Larn 5 mobuls"); + + lprcat("\n\n\t\tAll courses cost 250 gold pieces."); + cursor(30, 18); + lprcat("You are presently carrying "); +} + +void +oschool(void) +{ + int i; + long time_used; + nosignal = 1; /* disable signals */ + sch_hed(); + while (1) { + cursor(57, 18); + lprintf("%ld gold pieces. ", (long) c[GOLD]); + cursors(); + lprcat("\nWhat is your choice ["); + standout("escape"); + lprcat(" to leave] ? "); + yrepcount = 0; + i = 0; + while ((i < 'a' || i > 'h') && (i != '\33') && (i != 12)) + i = ttgetch(); + if (i == 12) { + sch_hed(); + continue; + } else if (i == '\33') { + nosignal = 0; + drawscreen(); /* enable signals */ + return; + } + lprc(i); + if (c[GOLD] < 250) + nogold(); + else if (course[i - 'a']) { + lprcat("\nSorry, but that class is filled."); + nap(1000); + } else if (i <= 'h') { + c[GOLD] -= 250; + time_used = 0; + switch (i) { + case 'a': + c[STRENGTH] += 2; + c[CONSTITUTION]++; + lprcat("\nYou feel stronger!"); + cl_line(16, 7); + break; + + case 'b': + if (course[0] == 0) { + lprcat("\nSorry, but this class has a prerequisite of Fighters Training I"); + c[GOLD] += 250; + time_used = -10000; + break; + } + lprcat("\nYou feel much stronger!"); + cl_line(16, 8); + c[STRENGTH] += 2; + c[CONSTITUTION] += 2; + break; + + case 'c': + c[INTELLIGENCE] += 2; + lprcat("\nThe task before you now seems more attainable!"); + cl_line(16, 9); + break; + + case 'd': + if (course[2] == 0) { + lprcat("\nSorry, but this class has a prerequisite of Introduction to Wizardry"); + c[GOLD] += 250; + time_used = -10000; + break; + } + lprcat("\nThe task before you now seems very attainable!"); + cl_line(16, 10); + c[INTELLIGENCE] += 2; + break; + + case 'e': + c[CHARISMA] += 3; + lprcat("\nYou now feel like a born leader!"); + cl_line(16, 11); + break; + + case 'f': + c[WISDOM] += 2; + lprcat("\nYou now feel more confident that you can find the potion in time!"); + cl_line(16, 12); + break; + + case 'g': + c[DEXTERITY] += 3; + lprcat("\nYou feel like dancing!"); + cl_line(16, 13); + break; + + case 'h': + c[INTELLIGENCE]++; + lprcat("\nYour instructor told you that the Eye of Larn is rumored to be guarded\n"); + lprcat("by a platinum dragon who possesses psionic abilities. "); + cl_line(16, 14); + break; + } + time_used += coursetime[i - 'a'] * 100; + if (time_used > 0) { + gltime += time_used; + course[i - 'a']++; /* remember that he has + * taken that course */ + c[HP] = c[HPMAX]; + c[SPELLS] = c[SPELLMAX]; /* he regenerated */ + + if (c[BLINDCOUNT]) + c[BLINDCOUNT] = 1; /* cure blindness too! */ + if (c[CONFUSE]) + c[CONFUSE] = 1; /* end confusion */ + adjusttime((long) time_used); /* adjust parameters for + * time change */ + } + nap(1000); + } + } +} + + +/* + * for the first national bank of Larn + */ +int lasttime = 0; /* last time he was in bank */ + +void +obank(void) +{ + banktitle(" Welcome to the First National Bank of Larn."); +} +void +obank2(void) +{ + banktitle("Welcome to the 5th level branch office of the First National Bank of Larn."); +} + +static void +banktitle(const char *str) +{ + nosignal = 1; /* disable signals */ + clear(); + lprcat(str); + if (outstanding_taxes > 0) { + int i; + lprcat("\n\nThe Larn Revenue Service has ordered that your account be frozen until all\n"); + beep(); + lprintf("levied taxes have been paid. They have also told us that you owe %ld gp in\n", (long) outstanding_taxes); + lprcat("taxes, and we must comply with them. We cannot serve you at this time. Sorry.\n"); + lprcat("We suggest you go to the LRS office and pay your taxes.\n"); + cursors(); + lprcat("\nPress "); + standout("escape"); + lprcat(" to leave: "); + lflush(); + i = 0; + while (i != '\33') + i = ttgetch(); + drawscreen(); + nosignal = 0; /* enable signals */ + return; + } + lprcat("\n\n\tGemstone\t Appraisal\t\tGemstone\t Appraisal"); + obanksub(); + nosignal = 0; /* enable signals */ + drawscreen(); +} + +/* + * function to put interest on your bank account + */ +void +ointerest(void) +{ + int i; + if (c[BANKACCOUNT] < 0) + c[BANKACCOUNT] = 0; + else if ((c[BANKACCOUNT] > 0) && (c[BANKACCOUNT] < 500000)) { + i = (gltime - lasttime) / 100; /* # mobuls elapsed */ + while ((i-- > 0) && (c[BANKACCOUNT] < 500000)) + c[BANKACCOUNT] += c[BANKACCOUNT] / 250; + if (c[BANKACCOUNT] > 500000) + c[BANKACCOUNT] = 500000; /* interest limit */ + } + lasttime = (gltime / 100) * 100; +} + +static short gemorder[26] = {0}; /* the reference to screen location + * for each */ +static long gemvalue[26] = {0}; /* the appraisal of the gems */ +void +obanksub(void) +{ + long amt; + int i, k; + ointerest(); /* credit any needed interest */ + + for (k = i = 0; i < 26; i++) + switch (iven[i]) { + case OLARNEYE: + case ODIAMOND: + case OEMERALD: + case ORUBY: + case OSAPPHIRE: + + if (iven[i] == OLARNEYE) { + gemvalue[i] = 250000 - ((gltime * 7) / 100) * 100; + if (gemvalue[i] < 50000) + gemvalue[i] = 50000; + } else + gemvalue[i] = (255 & ivenarg[i]) * 100; + gemorder[i] = k; + cursor((k % 2) * 40 + 1, (k >> 1) + 4); + lprintf("%c) %s", i + 'a', objectname[iven[i]]); + cursor((k % 2) * 40 + 33, (k >> 1) + 4); + lprintf("%5ld", (long) gemvalue[i]); + k++; + }; + cursor(31, 17); + lprintf("You have %8ld gold pieces in the bank.", (long) c[BANKACCOUNT]); + cursor(40, 18); + lprintf("You have %8ld gold pieces", (long) c[GOLD]); + if (c[BANKACCOUNT] + c[GOLD] >= 500000) + lprcat("\nNote: Larndom law states that only deposits under 500,000gp can earn interest."); + while (1) { + cl_dn(1, 20); + lprcat("\nYour wish? [("); + standout("d"); + lprcat(") deposit, ("); + standout("w"); + lprcat(") withdraw, ("); + standout("s"); + lprcat(") sell a stone, or "); + standout("escape"); + lprcat("] "); + yrepcount = 0; + i = 0; + while (i != 'd' && i != 'w' && i != 's' && i != '\33') + i = ttgetch(); + switch (i) { + case 'd': + lprcat("deposit\nHow much? "); + amt = readnum((long) c[GOLD]); + if (amt < 0) { + lprcat("\nSorry, but we can't take negative gold!"); + nap(2000); + amt = 0; + } else if (amt > c[GOLD]) { + lprcat(" You don't have that much."); + nap(2000); + } else { + c[GOLD] -= amt; + c[BANKACCOUNT] += amt; + } + break; + + case 'w': + lprcat("withdraw\nHow much? "); + amt = readnum((long) c[BANKACCOUNT]); + if (amt < 0) { + lprcat("\nSorry, but we don't have any negative gold!"); + nap(2000); + amt = 0; + } else if (amt > c[BANKACCOUNT]) { + lprcat("\nYou don't have that much in the bank!"); + nap(2000); + } else { + c[GOLD] += amt; + c[BANKACCOUNT] -= amt; + } + break; + + case 's': + lprcat("\nWhich stone would you like to sell? "); + i = 0; + while ((i < 'a' || i > 'z') && i != '*') + i = ttgetch(); + if (i == '*') + for (i = 0; i < 26; i++) { + if (gemvalue[i]) { + c[GOLD] += gemvalue[i]; + iven[i] = 0; + gemvalue[i] = 0; + k = gemorder[i]; + cursor((k % 2) * 40 + 1, (k >> 1) + 4); + lprintf("%39s", ""); + } + } + else { + if (gemvalue[i = i - 'a'] == 0) { + lprintf("\nItem %c is not a gemstone!", i + 'a'); + nap(2000); + break; + } + c[GOLD] += gemvalue[i]; + iven[i] = 0; + gemvalue[i] = 0; + k = gemorder[i]; + cursor((k % 2) * 40 + 1, (k >> 1) + 4); + lprintf("%39s", ""); + } + break; + + case '\33': + return; + }; + cursor(40, 17); + lprintf("%8ld", (long) c[BANKACCOUNT]); + cursor(49, 18); + lprintf("%8ld", (long) c[GOLD]); + } +} + +#if 0 /* XXX: apparently unused */ +/* + subroutine to appraise any stone for the bank + */ +static void +appraise(int gemstone) +{ + int j, amt; + for (j = 0; j < 26; j++) + if (iven[j] == gemstone) { + lprintf("\nI see you have %s", objectname[gemstone]); + if (gemstone == OLARNEYE) + lprcat(" I must commend you. I didn't think\nyou could get it."); + lprcat(" Shall I appraise it for you? "); + yrepcount = 0; + if (getyn() == 'y') { + lprcat("yes.\n Just one moment please \n"); + nap(1000); + if (gemstone == OLARNEYE) { + amt = 250000 - ((gltime * 7) / 100) * 100; + if (amt < 50000) + amt = 50000; + } else + amt = (255 & ivenarg[j]) * 100; + lprintf("\nI can see this is an excellent stone, It is worth %ld", (long) amt); + lprcat("\nWould you like to sell it to us? "); + yrepcount = 0; + if (getyn() == 'y') { + lprcat("yes\n"); + c[GOLD] += amt; + iven[j] = 0; + } else + lprcat("no thank you.\n"); + if (gemstone == OLARNEYE) + lprcat("It is, of course, your privilege to keep the stone\n"); + } else + lprcat("no\nO. K.\n"); + } +} +#endif /* 0 - unused */ + +/* + function for the trading post + */ +static void +otradhead(void) +{ + clear(); + lprcat("Welcome to the Larn Trading Post. We buy items that explorers no longer find\n"); + lprcat("useful. Since the condition of the items you bring in is not certain,\n"); + lprcat("and we incur great expense in reconditioning the items, we usually pay\n"); + lprcat("only 20% of their value were they to be new. If the items are badly\n"); + lprcat("damaged, we will pay only 10% of their new value.\n\n"); +} + +void +otradepost(void) +{ + int i, j, value, isub, izarg; + dnditm = dndcount = 0; + nosignal = 1; /* disable signals */ + resetscroll(); + otradhead(); + while (1) { + lprcat("\nWhat item do you want to sell to us ["); + standout("*"); + lprcat(" for list, or "); + standout("escape"); + lprcat("] ? "); + i = 0; + while (i > 'z' || (i < 'a' && i != '*' && i != '\33' && i != '.')) + i = ttgetch(); + if (i == '\33') { + setscroll(); + recalc(); + drawscreen(); + nosignal = 0; /* enable signals */ + return; + } + isub = i - 'a'; + j = 0; + if (iven[isub] == OSCROLL) + if (scrollname[ivenarg[isub]][0] == 0) { + j = 1; + cnsitm(); + } /* can't sell unidentified item */ + if (iven[isub] == OPOTION) + if (potionname[ivenarg[isub]][0] == 0) { + j = 1; + cnsitm(); + } /* can't sell unidentified item */ + if (!j) { + if (i == '*') { + clear(); + qshowstr(); + otradhead(); + } else if (iven[isub] == 0) + lprintf("\nYou don't have item %c!", isub + 'a'); + else { + for (j = 0; j < MAXITM; j++) + if ((itm[j].obj == iven[isub]) || (iven[isub] == ODIAMOND) || (iven[isub] == ORUBY) || (iven[isub] == OEMERALD) || (iven[isub] == OSAPPHIRE)) { + srcount = 0; + show3(isub); /* show what the item + * was */ + if ((iven[isub] == ODIAMOND) || (iven[isub] == ORUBY) + || (iven[isub] == OEMERALD) || (iven[isub] == OSAPPHIRE)) + value = 20 * ivenarg[isub]; + else if ((itm[j].obj == OSCROLL) || (itm[j].obj == OPOTION)) + value = 2 * itm[j + ivenarg[isub]].price; + else { + izarg = ivenarg[isub]; + value = itm[j].price; /* appreciate if a +n + * object */ + if (izarg >= 0) + value *= 2; + while ((izarg-- > 0) && ((value = 14 * (67 + value) / 10) < 500000)); + } + lprintf("\nItem (%c) is worth %ld gold pieces to us. Do you want to sell it? ", i, (long) value); + yrepcount = 0; + if (getyn() == 'y') { + lprcat("yes\n"); + c[GOLD] += value; + if (c[WEAR] == isub) + c[WEAR] = -1; + if (c[WIELD] == isub) + c[WIELD] = -1; + if (c[SHIELD] == isub) + c[SHIELD] = -1; + adjustcvalues(iven[isub], ivenarg[isub]); + iven[isub] = 0; + } else + lprcat("no thanks.\n"); + j = MAXITM + 100; /* get out of the inner + * loop */ + } + if (j <= MAXITM + 2) + lprcat("\nSo sorry, but we are not authorized to accept that item."); + } + } + } +} + +static void +cnsitm(void) +{ + lprcat("\nSorry, we can't accept unidentified objects."); +} + +/* + * for the Larn Revenue Service + */ +void +olrs(void) +{ + int i, first; + long amt; + first = nosignal = 1; /* disable signals */ + clear(); + resetscroll(); + cursor(1, 4); + lprcat("Welcome to the Larn Revenue Service district office. How can we help you?"); + while (1) { + if (first) { + first = 0; + goto nxt; + } + cursors(); + lprcat("\n\nYour wish? [("); + standout("p"); + lprcat(") pay taxes, or "); + standout("escape"); + lprcat("] "); + yrepcount = 0; + i = 0; + while (i != 'p' && i != '\33') + i = ttgetch(); + switch (i) { + case 'p': + lprcat("pay taxes\nHow much? "); + amt = readnum((long) c[GOLD]); + if (amt < 0) { + lprcat("\nSorry, but we can't take negative gold\n"); + amt = 0; + } else if (amt > c[GOLD]) + lprcat(" You don't have that much.\n"); + else + c[GOLD] -= paytaxes(amt); + break; + + case '\33': + nosignal = 0; /* enable signals */ + setscroll(); + drawscreen(); + return; + }; + +nxt: cursor(1, 6); + if (outstanding_taxes > 0) + lprintf("You presently owe %ld gp in taxes. ", (long) outstanding_taxes); + else + lprcat("You do not owe us any taxes. "); + cursor(1, 8); + if (c[GOLD] > 0) + lprintf("You have %6ld gp. ", (long) c[GOLD]); + else + lprcat("You have no gold pieces. "); + } +} -- cgit v1.2.3