diff -bruNX ignore.txt ..\official/include/config.h ./include/config.h --- ..\official/include/config.h Mon Dec 8 01:39:14 2003 +++ ./include/config.h Sun Jul 18 23:56:48 2004 @@ -351,6 +351,9 @@ /*#define GOLDOBJ */ /* Gold is kept on obj chains - Helge Hafting */ /*#define AUTOPICKUP_EXCEPTIONS */ /* exceptions to autopickup */ +#define SHOP_CREDIT /* Dropped gold does not increase credit, + credit is (p)urchased - Topi Linkala */ + /* End of Section 5 */ #include "global.h" /* Define everything else according to choices above */ diff -bruNX ignore.txt ..\official/include/extern.h ./include/extern.h --- ..\official/include/extern.h Mon Dec 8 01:39:14 2003 +++ ./include/extern.h Sun Jul 18 23:57:50 2004 @@ -1825,7 +1825,9 @@ E void FDECL(shk_chat, (struct monst *)); E void FDECL(check_unpaid_usage, (struct obj *,BOOLEAN_P)); E void FDECL(check_unpaid, (struct obj *)); +#ifndef SHOP_CREDIT E void FDECL(costly_gold, (XCHAR_P,XCHAR_P,long)); +#endif E boolean FDECL(block_door, (XCHAR_P,XCHAR_P)); E boolean FDECL(block_entry, (XCHAR_P,XCHAR_P)); E char *FDECL(shk_your, (char *,struct obj *)); diff -bruNX ignore.txt ..\official/src/dokick.c ./src/dokick.c --- ..\official/src/dokick.c Mon Dec 8 01:39:14 2003 +++ ./src/dokick.c Mon Jul 19 00:01:12 2004 @@ -568,9 +568,12 @@ /* the object might have fallen down a hole */ if (kickobj->where == OBJ_MIGRATING) { if (costly) { +#ifndef SHOP_CREDIT if(isgold) costly_gold(x, y, kickobj->quan); - else (void)stolen_value(kickobj, x, y, + else +#endif + (void)stolen_value(kickobj, x, y, (boolean)shkp->mpeaceful, FALSE); } return 1; @@ -579,9 +582,12 @@ bhitroom = *in_rooms(bhitpos.x, bhitpos.y, SHOPBASE); if (costly && (!costly_spot(bhitpos.x, bhitpos.y) || *in_rooms(x, y, SHOPBASE) != bhitroom)) { +#ifndef SHOP_CREDIT if(isgold) costly_gold(x, y, kickobj->quan); - else (void)stolen_value(kickobj, x, y, + else +#endif + (void)stolen_value(kickobj, x, y, (boolean)shkp->mpeaceful, FALSE); } diff -bruNX ignore.txt ..\official/src/pickup.c ./src/pickup.c --- ..\official/src/pickup.c Mon Dec 8 01:39:14 2003 +++ ./src/pickup.c Mon Jul 19 00:02:04 2004 @@ -1284,7 +1284,9 @@ nearloadmsg, gold_capacity, plur(gold_capacity)); u.ugold += gold_capacity; obj->quan -= gold_capacity; +#ifndef SHOP_CREDIT costly_gold(obj->ox, obj->oy, gold_capacity); +#endif } else { u.ugold += count; if ((nearload = near_capacity()) != 0) @@ -1294,7 +1296,9 @@ count, plur(count)); else prinv((char *) 0, obj, count); +#ifndef SHOP_CREDIT costly_gold(obj->ox, obj->oy, count); +#endif if (count == obj->quan) delobj(obj); else diff -bruNX ignore.txt ..\official/src/shk.c ./src/shk.c --- ..\official/src/shk.c Mon Dec 8 01:39:14 2003 +++ ./src/shk.c Mon Jul 19 02:10:22 2004 @@ -1103,6 +1103,11 @@ int pass, tmp, sk = 0, seensk = 0; boolean paid = FALSE, stashed_gold = (hidden_gold() > 0L); +#ifdef SHOP_CREDIT + char buf[BUFSZ]; + long offer = 0; +#endif + multi = 0; /* find how many shk's there are, how many are in */ @@ -1260,11 +1265,86 @@ #endif if(!ltmp && NOTANGRY(shkp)) { You("do not owe %s anything.", mon_nam(shkp)); + +#ifdef SHOP_CREDIT + if (eshkp->credit) + if (yn("Would you like to get your credit back? [y,n]") != 'n') { + +#ifndef GOLDOBJ + if(offer = shkp->mgold) { +#else + if(offer = money_cnt(shkp->minvent)) { +#endif + offer = min(offer,eshkp->credit); + eshkp->credit -= offer; +#ifndef GOLDOBJ + u.ugold += offer; + shkp->mgold -= offer; +#else + (void) money2mon(shkp, offer); +#endif + pline("%s credited you %ld gold.", Monnam(shkp), offer); + if(!(eshkp->credit)) + Your("credit is erased."); + else + You("still have %ld gold credit with %s", eshkp->credit, Monnam(shkp)); + } else { + offer = 1; /* used to check if you wanted your money back before asking if you want new credit */ + pline("%s has no money.", Monnam(shkp)); + } + } +#ifndef GOLDOBJ + if (u.ugold && (offer==0)) +#else + if (umoney && (offer==0)) +#endif + if (yn("Would you like to buy credit in this store? [y,n]") != 'n') { + getlin("How much credit would you like to purchase?", buf); + if (sscanf(buf, "%ld", &offer) != 1) offer = 0L; + if (offer < 0L) { + You("try to shortchange %s, but fumble.", Monnam(shkp)); + exercise(A_WIS, FALSE); + } else if (offer == 0L) + You("refuse."); +#ifndef GOLDOBJ + else { + if (offer >= u.ugold) { + You("purchase credit from %s with all your gold.", Monnam(shkp)); + offer = u.ugold; + } else + You("purchase %ld gold of credit from %s.", offer, Monnam(shkp)); + u.ugold -= offer; + shkp->mgold += offer; + eshkp->credit += offer; + } +#else + else { + if (offer >= umoney) { + You("purchase credit from %s with all your gold.", Monnam(shkp)); + offer = umoney; + } else You("purchase %ld gold of credit from %s.", offer, Monnam(shkp)); + (void) money2mon(shkp, offer); + eshkp->credit += offer; + } +#endif + } + +#ifndef GOLDOBJ + if(!u.ugold && (offer <= 0L)) +#else + if(!umoney && (offer <= 0L)) +#endif + +#else /* SHOP_CREDIT */ + #ifndef GOLDOBJ if (!u.ugold) #else if (!umoney) #endif + +#endif /* SHOP_CREDIT */ + pline(no_money, stashed_gold ? " seem to" : ""); } else if(ltmp) { pline("%s is after blood, not money!", Monnam(shkp)); @@ -2194,6 +2274,9 @@ register struct monst *shkp; register char roomno = *u.ushops; long ltmp = 0L, cltmp = 0L, gltmp = 0L; +#ifdef SHOP_CREDIT + long content_cost; +#endif register boolean container = Has_contents(obj); if(!*u.ushops) return; @@ -2211,12 +2294,12 @@ You("got that for free!"); return; } - if(obj->oclass == COIN_CLASS) { +#ifndef SHOP_CREDIT costly_gold(obj->ox, obj->oy, obj->quan); +#endif return; } - if(!obj->no_charge) ltmp = get_cost(obj, shkp); @@ -2226,7 +2309,12 @@ } if(container) { +#ifdef SHOP_CREDIT + content_cost = contained_cost(obj, shkp, cltmp, FALSE, FALSE); + if(!content_cost) { +#else if(obj->cobj == (struct obj *)0) { +#endif if(obj->no_charge) { obj->no_charge = 0; return; @@ -2235,8 +2323,12 @@ goto speak; } } else { +#ifdef SHOP_CREDIT + cltmp += content_cost; +#else cltmp += contained_cost(obj, shkp, cltmp, FALSE, FALSE); gltmp += contained_gold(obj); +#endif } if(ltmp) add_one_tobill(obj, dummy); @@ -2246,7 +2338,9 @@ ltmp += cltmp; if(gltmp) { +#ifndef SHOP_CREDIT costly_gold(obj->ox, obj->oy, gltmp); +#endif if(!ltmp) return; } @@ -2458,7 +2552,9 @@ register boolean ininv = !!count_unpaid(obj->cobj); value += stolen_container(obj, shkp, value, ininv); +#ifndef SHOP_CREDIT if(!ininv) gvalue += contained_gold(obj); +#endif } else if (!obj->no_charge && saleable(shkp, obj)) { value += get_cost(obj, shkp); } @@ -2549,6 +2645,10 @@ boolean isgold = (obj->oclass == COIN_CLASS); boolean only_partially_your_contents = FALSE; +#ifdef SHOP_CREDIT + if(isgold) return; +#endif + if(!(shkp = shop_keeper(*in_rooms(x, y, SHOPBASE))) || !inhishop(shkp)) return; if(!costly_spot(x, y)) return; @@ -2562,7 +2662,9 @@ /* find the price of content before subfrombill */ cltmp += contained_cost(obj, shkp, cltmp, TRUE, FALSE); /* find the value of contained gold */ +#ifndef SHOP_CREDIT gltmp += contained_gold(obj); +#endif cgold = (gltmp > 0L); } @@ -3927,6 +4029,7 @@ check_unpaid_usage(otmp, FALSE); /* normal item use */ } +#ifndef SHOP_CREDIT void costly_gold(x, y, amount) register xchar x, y; @@ -3961,6 +4064,7 @@ eshkp->credit = 0L; } } +#endif /* used in domove to block diagonal shop-exit */ /* x,y should always be a door */