-+-+-+-+-+-+-+-+ START OF PART 86 -+-+-+-+-+-+-+-+ X`09`09`09`09bid_time`09: QUAD_TYPE; X`09`09`09`09best_bid`09: INTEGER; X`09`09`09`09best_bidder`09: ssn_type X`09`09`09`09`09`09); X`09`09`09cash`09`09:`09( X`09`09`09`09amount`09`09: INTEGER; X`09`09`09`09owner`09`09: ssn_type;`09`7B py.misc.ssn `7D X`09`09`09`09`09`09); X`09`09END; X X`09inven_record = RECORD X`09`09data`09: trade_record_type; X`09`09next`09: `5Einven_record; X`09`09prev`09: `5Einven_record; X`09END; X X`09inven_ptr = `5Einven_record; X X`09trade_file_type = FILE of trade_record_type; XVAR X X`09exit_flag, entered`09: BOOLEAN; X`09sales`09`09`09: trade_file_type; X`09inv`09`09`09: inven_ptr; X`09cur_top`09`09`09: inven_ptr; X`09blegga`09`09`09: inven_ptr; X`09cur_display`09`09: ARRAY `5B1..display_size`5D OF inven_ptr; X`09cur_display_size`09: INTEGER; X`09shop_owner`09`09: vtype; X`09profits`09`09`09: trade_record_type; X`09full_ssn`09`09: ssn_type; X`09tics`09`09`09: integer; X X XPROCEDURE open_trade_file; X X`09`5BEXTERNAL`5D FUNCTION net_open`09( X`09`09`09VAR`09FAB`09: FAB$TYPE; X`09`09`09VAR`09RAB`09: RAB$TYPE; X`09`09`09VAR`09F`09: trade_file_type X`09`09`09`09`09) : INTEGER; X`09`09EXTERN; X X`09BEGIN X X`09 msg_print ( 'You knock on the door to the Trading Post. . . ' ) ; X`09 put_qio; X`09 CASE randint(4) OF X1 : shop_owner := 'Ollie North (arms) Trading Post'; X2 : shop_owner := 'Uncle Sam (wasp) Trading Post'; X3 : shop_owner := 'Jimmy Hoffa (missing link) Trading Post'; X4 : shop_owner := 'Gary Hart (presidential) Trading Post'; X`09 END; X`09 OPEN (sales, FILE_NAME:=moria_trd, HISTORY:=OLD, SHARING:=NONE, X`09`09ERROR:=CONTINUE); X`09 if (py.misc.max_exp < 30+randint(30)) then X`09 begin X`09`09msg_print('"Hmmmm...we don''t need no novice adventurers hanging aroun Vd here..."'); X`09`09msg_print('"Now GET LOST!!!"'); X`09`09msg_print('A couple of huge fighters appear from behind a curtain...') V; X`09`09take_hit(damroll('2d6'),'some burly barbarians.'); X`09`09msg_print('They heave you unceremoniously outside.'); X`09`09exit_flag := TRUE; X`09 end X`09 else IF (STATUS(sales) <> 0) THEN X`09 BEGIN X`09 IF wizard1 AND ((STATUS(sales) = PAS$K_FILNOTFOU) or X`09`09`09 (status(sales) = pas$k_recleninc)) THEN X`09`09BEGIN X`09`09 priv_switch(0); X`09`09 OPEN( sales, FILE_NAME:=moria_trd, X`09`09`09HISTORY:=NEW, SHARING:=NONE, ERROR:=CONTINUE); X`09`09 IF (STATUS(sales) = 0) THEN X`09`09 BEGIN X`09`09 msg_print('Created '+moria_trd); X`09`09 CLOSE( sales, ERROR:=CONTINUE ); X`09`09 exit_flag := TRUE; X`09`09 END X`09`09 ELSE X`09`09 BEGIN X`09`09 msg_print('Couldn''t create '+moria_trd); X`09`09 exit_flag := TRUE; X`09`09 END X`09`09END X`09 ELSE X`09`09BEGIN X`09`09 IF (STATUS(sales) = PAS$K_FILNOTFOU) THEN X`09`09 msg_print( 'and the doors are locked. ' + X`09`09`09 'Only a moria wizard can open them.' ) X`09`09 ELSE X`09`09 msg_print( 'but the storekeeper is helping someone else.' ); X`09`09 exit_flag := TRUE; X`09`09END; X`09 END X`09END; X XPROCEDURE display_gold; X`09VAR X`09`09out_val`09`09: vtype; X`09BEGIN X`09`09WRITEV( out_val, 'Gold Remaining : ', py.misc.money`5Btotal$`5D:1); X`09`09prt( out_val, 19, 18 ); X`09END; X XPROCEDURE display_commands; X`09BEGIN Xprt('You may:',21,1); Xprt(' p) Bid on an item. browse store''s inventory.',22, V1); Xprt(' s) Put an item up for bid. i) Inventory and Equipment Lists.',23,1 V); Xprt('`5EZ) Exit from Building. `5ER) Redraw the screen.',`09`0924,1); X`09END; X X XPROCEDURE read_inv; X X`09VAR X X`09`09item`09`09: inven_ptr; X`09`09first`09`09: BOOLEAN; X X`09BEGIN X X`09 RESET( sales ); X`09 first := TRUE; X`09 inv := NIL; X`09 cur_top := NIL; X`09 profits.trade_type := profit_type; X`09 profits.money := 0; X`09 WHILE NOT EOF( sales ) DO X`09 BEGIN X`09 NEW( item ); X`09 READ( sales, item`5E.data, ERROR:=continue ); X`09 IF ( status(sales) > 0 ) THEN IF uw$id THEN X`09`09BEGIN X`09`09 WRITEV( out_val, 'Error #', status(sales):1, X`09`09`09' reading inventory.', X`09`09`09'Please report (via MAIL) to MAX::GAMES' ); X`09`09 msg_print( out_val ); X`09`09 msg_print( '' ); X`09`09END; X`09 IF( item`5E.data.trade_type = profit_type ) THEN X`09`09begin X`09`09 profits.money := item`5E.data.money; X`09`09 dispose(item); X`09`09end X`09 ELSE IF( first ) THEN X`09`09BEGIN X`09`09 item`5E.prev := NIL; X`09`09 inv := item; X`09`09 cur_top := item; X`09`09 first := FALSE; X`09`09END X`09 ELSE X`09`09BEGIN X`09 cur_top`5E.next := item; X`09`09 item`5E.prev := cur_top; X`09 cur_top := item; X`09`09END X`09 END; X`09 IF cur_top <> NIL THEN cur_top`5E.next := NIL; X`09 cur_top := inv; X X`09END; X Xprocedure clear_display; forward; X XPROCEDURE write_inv; X X`09VAR X X`09`09out_val`09`09: vtype; X`09`09dead, item`09: inven_ptr; X X`09BEGIN X X`09 REWRITE( sales ); X`09 WRITE( sales, profits, ERROR:=CONTINUE ); X`09 item := inv; X`09 inv := nil; X`09 cur_top := nil; X`09 blegga := nil; X`09 clear_display; X`09 WHILE( item <> NIL ) DO X`09 BEGIN X`09 WRITE( sales, item`5E.data, ERROR:=CONTINUE ); X`09 IF ( status(sales) > 0 ) THEN IF uw$id THEN X`09`09BEGIN X`09`09 WRITEV( out_val, 'Error #', status(sales):1, X`09`09`09' writing inventory.', X`09`09`09'Please report (via MAIL) to MAX::GAMES.' ); X`09`09 msg_print( out_val ); X`09`09 msg_print( '' ); X`09`09END; X`09 dead := item; X`09 item := item`5E.next; X`09 dead`5E.next := nil; X`09 if item <> nil then item`5E.prev := nil; X`09 DISPOSE( dead ); X`09 END; X X`09END; X XPROCEDURE display_inv( start : inven_ptr ); X X`09VAR X X`09`09count, old_display_size`09: INTEGER; X`09`09out_val1, out_val2`09: vtype; X X`09BEGIN X`09 old_display_size := cur_display_size; X`09 count := 0; X`09 WHILE ( start <> NIL ) and ( count < display_size ) DO X`09 BEGIN X`09 IF ( start`5E.data.trade_type = for_sale ) THEN X`09`09BEGIN X`09`09 count := count + 1; X`09`09 IF cur_display`5Bcount`5D <> start THEN X`09`09 BEGIN X`09`09 cur_display`5Bcount`5D := start; X`09`09 inven_temp`5E.data := start`5E.data.object; X`09`09 objdes( out_val1, inven_temp, true ); X`09`09 WRITEV( out_val2, chr(96+count), ') ', out_val1 ); X`09`09 prt( out_val2, count+5, 1 ); X`09`09 WRITEV( out_val2, start`5E.data.best_bid ); X`09`09 prt( out_val2, count+5, 60 ); X`09`09 IF wizard2 THEN X`09`09`09BEGIN X`09`09`09 WRITEV( out_val2, item_value( start`5E.data.object ):9, X`09`09`09`09error := continue ); X`09`09`09 prt( out_val2, count+5, 71 ); X`09`09`09END X`09`09 ELSE IF ( start`5E.data.seller = py.misc.ssn ) THEN X`09`09`09prt( 'your sale!', count+5, 71 ) X`09`09 ELSE IF ( start`5E.data.best_bidder = py.misc.ssn ) THEN X`09`09 prt( 'your bid!', count+5, 71 ); X END; X`09`09END; X`09 start := start`5E.next; X`09 END; X`09 cur_display_size := count; X`09 WHILE old_display_size > cur_display_size DO X`09 BEGIN X`09 erase_line( old_display_size+5, 1 ); X`09 cur_display`5Bold_display_size`5D := NIL; X`09 old_display_size := old_display_size - 1; X`09 END; X`09 IF (start = NIL) X`09 THEN blegga := inv X`09 ELSE blegga := start X`09END; X XPROCEDURE clear_display; X X`09VAR X X`09`09index`09`09: INTEGER; X X`09BEGIN X`09`09cur_display_size := 0; X`09`09FOR index := 1 TO display_size DO cur_display`5Bindex`5D := NIL; X`09END; X XPROCEDURE display_store; X X`09BEGIN X X`09`09clear( 1, 1 ); X`09`09prt( shop_owner,`094, 10); X`09`09prt( ' Item',`09`095, 1); X`09`09prt( 'Top bid',`09`095, 63 ); X`09`09IF wizard2 THEN prt( 'Value', 5, 75 ); X`09`09display_gold; X`09`09display_commands; X`09`09clear_display; X`09`09display_inv(cur_top); X X`09END; X XFUNCTION find_money_order( owner : ssn_type; var item : inven_ptr ) : BOOLEA VN; X X`09VAR X X`09`09looking`09`09: BOOLEAN; X X`09BEGIN X`09 looking := TRUE; X`09 item := inv; X`09 WHILE looking DO X`09 IF item = NIL X`09 THEN looking := FALSE X`09 ELSE IF ( item`5E.data.trade_type = cash ) AND X`09`09 ( item`5E.data.owner = owner ) X`09`09 THEN looking := FALSE X`09`09 ELSE item := item`5E.next; X`09 find_money_order := item <> NIL; X`09END; X XPROCEDURE send_money`09( X`09`09owner`09: ssn_type; X`09`09amount`09: INTEGER X`09`09`09); X`09VAR X X`09`09item`09`09: inven_ptr; X X`09BEGIN X`09 IF find_money_order( owner, item ) THEN X`09 item`5E.data.amount := item`5E.data.amount + amount X`09 ELSE BEGIN X`09 NEW( item ); X`09 item`5E.prev := NIL; X`09 item`5E.next := inv; X`09 item`5E.data.trade_type := cash; X`09 item`5E.data.owner := owner; X`09 item`5E.data.amount := amount; X`09 inv`5E.prev := item; X`09 inv := item; X`09 END; X`09 SYS$GETTIM( item`5E.data.time ); X`09END; X XPROCEDURE made_profit( amount : INTEGER ); X`09BEGIN X`7B Try to trap so there isn't INTEGER overflow `7D X`09 IF MAXINT - profits.money < amount THEN X`09 profits.money := MAXINT X`09 ELSE X`09 profits.money := profits.money + amount; X`09END; X XPROCEDURE delete_item( VAR item : inven_ptr ); X X`09VAR X X`09`09next`09`09`09: inven_ptr; X X`09BEGIN X`09 next := item`5E.next; X`09 IF item`5E.prev <> NIL X`09 THEN item`5E.prev`5E.next := next X`09 ELSE IF inv = item X`09`09 THEN inv := next X`09`09 ELSE IF uw$id X`09`09 THEN BEGIN X`09`09`09 msg_print( 'Something truly bizarre happened in delete_item.' ); X`09`09`09 msg_print( 'Please report (via MAIL) to MAX::GAMES. Thanks.' ); X`09`09`09 msg_print( '' ); X`09`09`09END; X`09 IF next <> NIL THEN next`5E.prev := item`5E.prev; X`09 IF cur_top = item THEN cur_top := next; X`09 item`5E.prev := nil; X`09 item`5E.next := nil; X`09 DISPOSE( item ); X`09 item := next; X`09END; X XPROCEDURE deliver; X X`09VAR X X`09`09weight_changed, gold_changed`09: BOOLEAN; X `09`09item, next`09`09`09: inven_ptr; X`09`09temp_ptr`09`09`09: treas_ptr; X`09`09out_val1, out_val2`09`09: vtype; X`09`09redisplay`09`09`09: boolean; X X`09FUNCTION enough_time`09`09( X`09`09`09sale_time`09: QUAD_TYPE; X`09`09`09waiting_days`09: INTEGER; X`09`09`09waiting_hours`09: INTEGER X`09`09`09`09`09) : BOOLEAN; X X`09`09VAR X X`09`09`09out_val1, out_val2`09`09: vtype; X`09`09`09current_time, delta_time`09: QUAD_TYPE; X`09`09`09time`09`09`09`09: time_type; X X`09`09`5Bexternal`5D PROCEDURE sub_quadtime( X`09`09`09`09a, b, c : `5BREFERENCE`5D QUAD_TYPE X`09`09`09`09`09`09); extern; X X`09`09BEGIN X`09`09 SYS$GETTIM( current_time ); X`09`09 sub_quadtime( current_time, sale_time, delta_time ); X`09`09 SYS$NUMTIM( time, delta_time ); X`09`09 enough_time := (time.days > waiting_days) or X`09`09`09`09 ((time.days = waiting_days) and X`09`09`09`09 (time.hours >= waiting_hours)); X`09`09END; X X`09BEGIN X`09 weight_changed := FALSE; X`09 gold_changed := FALSE; X`09 redisplay := false; X`09 item := inv; X`09 WHILE (NOT exit_flag) AND (item <> NIL) DO BEGIN X IF( enough_time( item`5E.data.time, expire_time_days, X`09`09`09 expire_time_hours ) ) X`09 THEN X`09 BEGIN X`09`09IF ( item`5E.data.trade_type = for_sale ) THEN X`09`09 BEGIN X`09`09 send_money( item`5E.data.seller, ROUND( item_value( X`09`09`09item`5E.data.object ) * refund_on_sale ) ); X`09`09 made_profit( ROUND( item_value( item`5E.data.object ) * X`09`09`09profit_from_sale ) ); X`09`09 redisplay := true; X`09`09 END; X`09`09delete_item( item ); X`09 END X`09 ELSE IF`09( item`5E.data.trade_type = for_sale ) THEN BEGIN X`09 IF`09( item`5E.data.best_bidder = py.misc.ssn ) AND X`09`09`09( enough_time( item`5E.data.time, bid_wait_days, X`09`09`09`09 bid_wait_hours ) ) THEN X`09 BEGIN X`09`09 IF (item`5E.data.best_bid < X`09`09`09ROUND(`09take_the_money_and_run * X`09`09`09`09item_value( item`5E.data.object ) ) ) X`09`09 THEN X X`7B`09The best bidder bid less than 90% of the value of the object, so X`09the storekeeper will bid 5% more than the best_bidder, sell the X`09object to a "store", and make a nice profit.`09`09`09`7D X X`09`09 BEGIN X`09`09 send_money( item`5E.data.best_bidder, X`09`09`09ROUND(`09refund_on_bid * item`5E.data.best_bid ) ); X`09`09 item`5E.data.best_bid := X`09`09`09ROUND(`09item`5E.data.best_bid * bid_increment_factor * X`09`09`09`09refund_on_sale ); X`09`09 send_money( item`5E.data.seller, X`09`09`09ROUND(`09refund_on_sale * item`5E.data.best_bid ) ); X`09`09 made_profit(item_value(item`5E.data.object) - X`09`09`09`09item`5E.data.best_bid ); X`09`09 redisplay := true; X`09`09 delete_item( item ); X`09`09 END X`09`09 ELSE X`09`09 BEGIN X`09`09 msg_print( 'Hmm, you''re supposed to get something.' ); X`09`09 inven_temp`5E.data := item`5E.data.object; X`09`09 IF (inven_check_num AND inven_check_weight) THEN X`09`09`09BEGIN X`09`09`09 temp_ptr := inven_carry; X`09`09`09 msg_print( 'You are now the proud owner of' ); X`09`09`09 objdes( out_val1, temp_ptr, true ); X`09`09`09 msg_print( out_val1 + '.' ); X`09`09`09 send_money( item`5E.data.seller, X`09`09`09`09ROUND( refund_on_sale * item`5E.data.best_bid ) ); X`09`09`09 made_profit( ROUND(`09profit_from_sale * X`09`09`09`09`09`09item`5E.data.best_bid ) ); X`09`09`09 delete_item( item ); X`09`09`09 redisplay := true; X`09`09`09 weight_changed := TRUE; X`09`09`09END X`09`09 ELSE X`09`09`09BEGIN X`09`09`09 msg_print( 'The shopkeeper had something to give you, but' ); X`09`09`09 msg_print( 'you couldn''t carry it. Come back when you can.' ); X`09`09`09 exit_flag := TRUE; X`09`09`09END; X`09`09 END; X`09 END X`09 ELSE item := item`5E.next END X`09 ELSE item := item`5E.next; X`09 END; X`09 WHILE find_money_order( py.misc.ssn, item ) DO X`09 BEGIN X`09 add_money(item`5E.data.amount*gold$value); X`09 WRITEV( out_val2, 'The shopkeeper gave you ', item`5E.data.amount:1 V, X`09`09`09' gold pieces.' ); X`09 msg_print( out_val2 ); X`09 delete_item( item ); X`09 gold_changed := TRUE; X`09 END; X`09 IF exit_flag THEN X`09 BEGIN +-+-+-+-+-+-+-+- END OF PART 86 +-+-+-+-+-+-+-+-