Metropoli BBS
VIEWER: drugwar.s MODE: TEXT (ASCII)
*********************************************************************************
*                                 DRUGWAR                                       *
*                         THIS PROGRAM IS FREEWARE                              *
*            PLEASE EDIT, CHANGE, IMPROVE, UPGRADE, DISTRIBUTE                  *
*                              THIS GAME!!!                                     *
*********************************************************************************

* This is Drugwar Version 1.0 for the G/GX calculators ONLY.
* This is not an original idea, but rather a clone of the popular TI game under
* the same name.  Only this version has improved features.
* I take no credit for the idea of the game, but only for the code which runs it.
* I hold no responsibility for the well being of the calculator that runs this.
* Please edit, upgrade, improve this program, and send it to k3g1@pipeline.com -
* my friends and I would love to play new, improved versions.
* I wrote this at the request of my peers.
* There is no malicious intent towards police officers, or drug enforcement officials.
* This is a "joke" game for entertainment purposes only.  If you are offended,
* don't play this, but please don't think I mean what I say in this game...like
* I said, it is only a "joke".
* Thanks go to Jim Donnelly for his great book "An Introduction to HP 48 System RPL
* and Assembly Language Programming", it was a great use and I recommend it to
* anyone wishing to REALLY program the HP48.
* Please excuse me for sloppy programming, this was an attempt to make this work
* with speed and size in mind, not organization.  Good luck w/reading the code.
*                                              - Adam Klein <k3g1@pipeline.com>

ASSEMBLE
	 NIBASC /HPHP48-A/

* These are definitions for external libraries found ONLY in G/GX calculators!

~DoKeyOK     EQU #5A0B0
~DoKeyCancel EQU #590B0
~IFMenuRow1  EQU #050B0
~gFldVal     EQU #C50B0

RPL

******************************************************
*          DEFINEs for use with InputForms           *
*                                                    *
******************************************************

DEFINE FTYPE_TEXT	ONE

DEFINE OBTYPE_ANY	MINUSONE
DEFINE FMT_STD		FOUR

DEFINE LROW1		TEN
DEFINE LROW2		NINETEEN
DEFINE LROW3		TWENTYEIGHT
DEFINE LROW4		THIRTYSEVEN
DEFINE LROW5		FORTYSIX

DEFINE FROW1		EIGHT
DEFINE FROW2		SEVENTEEN
DEFINE FROW3		TWENTYSIX
DEFINE FROW4		THIRTYFIVE
DEFINE FROW5		FORTYFOUR

DEFINE COL1		ONE
DEFINE COL2		SEVEN
DEFINE COL3		THIRTEEN
DEFINE COL4		NINETEEN
DEFINE COL5		TWENTYFIVE
DEFINE COL6		THIRTYONE
DEFINE COL7		THIRTYSEVEN
DEFINE COL8		FORTYTHREE
DEFINE COL9		FORTYNINE
DEFINE COL10   FIFTYFIVE
DEFINE COL11		SIXTYONE
DEFINE COL12		FOURTHREE ( decimal 67 )
DEFINE COL13		73
DEFINE COL14		SEVENTYNINE
DEFINE COL15		2LIST ( decimal 85 )
DEFINE COL16		BINT_91d
DEFINE COL17		IDREAL ( decimal 97 )
DEFINE COL18		103
DEFINE COL19		109
DEFINE COL20		BINT_115d
DEFINE COL21		121
DEFINE COL22		127
DEFINE FHEIGHT		NINE ( field height )
DEFINE FWIDTH1		SEVEN
DEFINE FWIDTH2		THIRTEEN
DEFINE FWIDTH3		NINETEEN
DEFINE FWIDTH4		TWENTYFIVE
DEFINE FWIDTH5		THIRTYONE
DEFINE FWIDTH6		THIRTYSEVEN
DEFINE FWIDTH7		FORTYTHREE
DEFINE FWIDTH8		FORTYNINE
DEFINE FWIDTH9		FIFTYFIVE
DEFINE FWIDTH10		SIXTYONE
DEFINE FWIDTH11		FOURTHREE ( decimal 67 )
DEFINE FWIDTH12		73
DEFINE FWIDTH13		SEVENTYNINE
DEFINE FWIDTH14		2LIST ( decimal 85 )
DEFINE FWIDTH15		BINT_91d
DEFINE FWIDTH16		IDREAL ( decimal 97 )
DEFINE FWIDTH17		103
DEFINE FWIDTH18		109
DEFINE FWIDTH19		BINT_115d
DEFINE FWIDTH20		121
DEFINE FWIDTH21		127

DEFINE NOVAL		MINUSONE
DEFINE OPTDATA_NULL	MINUSONE

**************************************************
*  EXTERNAL data for G/GX only!!! Careful!       *
**************************************************

EXTERNAL DoKeyOK
EXTERNAL DoKeyCancel
EXTERNAL IFMenuRow1
EXTERNAL gFldVal

* these are definitions for game variables and constants

DEFINE err ZERO
DEFINE interest % 0.07
DEFINE tsize    % 200
DEFINE bankint  % 0.07

DEFINE bronx ONE
DEFINE brook TWO
DEFINE manha THREE
DEFINE getto FOUR
DEFINE cpark FIVE

DEFINE mag  ONE
DEFINE nmm  TWO
DEFINE spec THREE
DEFINE none ZERO

DEFINE cops       17GETLAM
DEFINE STOcops    17PUTLAM
DEFINE free       22GETLAM EVAL
DEFINE incday     23 GETLAM EVAL
DEFINE sdrugskey  24 GETLAM EVAL
DEFINE bdrugskey  25 GETLAM EVAL
DEFINE dummy      26 GETLAM
DEFINE STOdummy   26 PUTLAM
DEFINE stocks     28 GETLAM
DEFINE STOstocks  28 PUTLAM

DEFINE wallstreet 27 GETLAM EVAL
DEFINE inputfm    21GETLAM EVAL
DEFINE selldrugs  20GETLAM EVAL
DEFINE buydrugs   19GETLAM EVAL
DEFINE gobank     18GETLAM EVAL
DEFINE copchase   16GETLAM EVAL
DEFINE doevent    15GETLAM EVAL
DEFINE jet        14GETLAM EVAL
DEFINE trenchcoat 13GETLAM EVAL
DEFINE shark      12GETLAM EVAL
DEFINE mainmenu   11GETLAM EVAL
DEFINE dispprices 10GETLAM EVAL
DEFINE randomize  9GETLAM  EVAL

DEFINE prices  8GETLAM
DEFINE locat   7GETLAM
DEFINE account 6GETLAM
DEFINE wallet  5GETLAM
DEFINE weapon  4GETLAM
DEFINE day     3GETLAM
DEFINE debt    2GETLAM
DEFINE trench  1GETLAM
DEFINE STOprices  8PUTLAM
DEFINE STOlocat   7PUTLAM
DEFINE STOaccount 6PUTLAM
DEFINE STOwallet  5PUTLAM
DEFINE STOweapon  4PUTLAM
DEFINE STOday     3PUTLAM
DEFINE STOdebt    2PUTLAM
DEFINE STOtrench  1PUTLAM

:: AtUserStack ClrDA1IsStat

* Put everything on the stack - then into local variables...
%0

* this is the wallstreet procedure
' :: CLEARVDISP ZERO
	  BEGIN
		  DROP ZERO ZERO
		  " $$$ Stock Market $$$ " $>GROB INVGROB XYGROBDISP
		  "  1 - Invest"  DISPROW3
		  "  2 - Sell Stock" DISPROW4
		  "  3 - Scram"    DISPROW5
		  "  Stock Value: " stocks a%>$ &$ DISPROW7
		  "       Wallet: " wallet a%>$ &$ EIGHT DISPN
		  WaitForKey DROP
		  :: DUP FORTYONE  #= case
				:: DROP inputfm
					DUP wallet %> IT :: DROP wallet ;
					DUP %0     %< IT :: DROP % 0 ;
					DUP wallet SWAP %- STOwallet stocks %+ STOstocks
					CLEARVDISP err
				;
			  DUP FORTYTWO  #= case
				:: DROP
					inputfm
					DUP stocks %> IT :: DROP stocks ;
					DUP %0 %< IT :: DROP % 0 ;
					DUP wallet %+ STOwallet stocks SWAP %- STOstocks
					CLEARVDISP err
				;
			  DUP FORTYTHREE #= case
				::
					 DROP ONE
				;
			  DROP err
		  ; DUP err #= NOT UNTIL DROP
	;
ZERO

* this is to get how many drugs to buy
' :: STOdummy DROP inputfm
				  DUP %0   %< IT :: DROP %0 ;
				  DUP free %> IT :: DROP free ;
				  DUP wallet prices dummy NTHCOMPDROP %/ %IP %>
				  IT :: DROP wallet prices dummy NTHCOMPDROP %/ %IP ;
				  DUP trench dummy NTHCOMPDROP %+ dummy trench PUTLIST
				  STOtrench prices dummy
				  NTHCOMPDROP %* wallet SWAP %- STOwallet err
  ;

* this is to get how many drugs to sell after user hits a valid key
' :: STOdummy
				  DROP inputfm
				  DUP %0 %< IT :: DROP %0 ;
				  DUP trench dummy NTHELCOMP DROP %>
				  IT :: DROP trench dummy NTHELCOMP DROP ;
				  DUP prices dummy NTHELCOMP DROP %* wallet %+ STOwallet
				  trench dummy NTHELCOMP DROP SWAP %- dummy trench PUTLIST STOtrench
				  err
  ;

* this procedure increments the day
' :: day %1 %+ STOday randomize debt DUP interest %* %+ %0 RNDXY STOdebt
	  stocks %RAN %10 %* %1 %+ %IP %4 %- % 0.05 %* %* stocks %+ %IP STOstocks
	  account account bankint %* %IP %+ STOaccount ;

* this procedure finds how much more drugs you can hold
' :: tsize trench INNERCOMP ONE DO %+ LOOP %- ;

* input form procedure
  ' ::
					"Enter Amount >>:" COL1 LROW3
					'DROPFALSE
					COL12 FROW3
					FWIDTH11 FHEIGHT
					FTYPE_TEXT OBTYPE_ANY FMT_STD NOVAL OPTDATA_NULL OPTDATA_NULL NOVAL NOVAL
					ONE ONE
					' :: FIFTEEN #<> case FALSE ' NoExitAction
						 IFMenuRow1
							{
							  NULL{}
							  NULL{}
							  { "Deal" :: TakeOver ONE gFldVal TYPEREAL? case :: DoKeyOK ; ; }
							}
						 &COMP TWO ::N
						 TRUE
						; "Drug Underworld" DoInputForm DROP %0 RNDXY TURNMENUOFF
	  ;

* sell drugs procedure
 ' :: CLEARVDISP ZERO
	  BEGIN
		  DROP ZERO ZERO
		  "Drug       Amount     " $>GROB INVGROB XYGROBDISP
		  "1-Cocaine    " trench ONE NTHCOMPDROP a%>$ &$ DISPROW2
		  "2-Heroin     " trench TWO NTHCOMPDROP a%>$ &$ DISPROW3
		  "3-Acid       " trench THREE NTHCOMPDROP a%>$ &$ DISPROW4
		  "4-Weed       " trench FOUR NTHCOMPDROP a%>$ &$ DISPROW5
		  "5-Speed      " trench FIVE NTHCOMPDROP a%>$ &$ DISPROW6
		  "6-Ludes      " trench SIX NTHCOMPDROP a%>$ &$ DISPROW7
		  "7-Exit       " EIGHT DISPN
		  WaitForKey DROP
		  :: DUP FORTYONE    #= case
				 :: ONE sdrugskey ;
			  DUP FORTYTWO    #= case
				 :: TWO sdrugskey ;
			  DUP FORTYTHREE  #= case
				 :: THREE sdrugskey ;
			  DUP THIRTYSIX   #= case
				 :: FOUR sdrugskey ;
			  DUP THIRTYSEVEN #= case
				 :: FIVE sdrugskey ;
			  DUP THIRTYEIGHT #= case
				 :: SIX sdrugskey ;
			  DUP THIRTYONE   #= case
				 :: DROP ONE ;
			  DROP err
		  ;
	  DUP err #= NOT UNTIL DROP
	 ;

* buy drugs procedure
  ' ::
	  CLEARVDISP ZERO
	  BEGIN
		  DROP ZERO ZERO
		  "Drug      #  Afford   " $>GROB INVGROB XYGROBDISP
		  "1-Cocaine    " wallet prices ONE NTHELCOMP DROP %/ %IP a%>$ &$ DISPROW2
		  "2-Heroin     " wallet prices TWO NTHELCOMP DROP %/ %IP a%>$ &$ DISPROW3
		  "3-Acid       " wallet prices THREE NTHELCOMP DROP %/ %IP a%>$ &$ DISPROW4
		  "4-Weed       " wallet prices FOUR NTHELCOMP DROP %/ %IP a%>$ &$ DISPROW5
		  "5-Speed      " wallet prices FIVE NTHELCOMP DROP %/ %IP a%>$ &$ DISPROW6
		  "6-Ludes      " wallet prices SIX NTHELCOMP DROP %/ %IP a%>$ &$ DISPROW7
		  "7-Exit       FREE=" free a%>$ &$ EIGHT DISPN
		  WaitForKey DROP
		  :: DUP FORTYONE  #= case
				 :: ONE bdrugskey ;
			  DUP FORTYTWO    #= case
				 :: TWO bdrugskey ;
			  DUP FORTYTHREE  #= case
				 :: THREE bdrugskey ;
			  DUP THIRTYSIX   #= case
				 :: FOUR bdrugskey ;
			  DUP THIRTYSEVEN #= case
				 :: FIVE bdrugskey ;
			  DUP THIRTYEIGHT #= case
				 :: SIX bdrugskey ;
			  DUP THIRTYONE   #= case
				 :: DROP ONE ;
			  DROP err
		  ;
	  DUP err #= NOT UNTIL DROP
	 ;

* bank procedure
  ' :: CLEARVDISP ZERO
	  BEGIN
		  DROP ZERO ZERO
		  "   $$$ NYC BANK $$$   " $>GROB INVGROB XYGROBDISP
		  "  1 - Deposit"  DISPROW3
		  "  2 - Withdraw" DISPROW4
		  "  3 - Scram"    DISPROW5
		  "  ACCOUNT:   " account a%>$ &$ DISPROW7
		  "  WALLET: " wallet a%>$ &$ EIGHT DISPN
		  WaitForKey DROP
		  :: DUP FORTYONE  #= case
				:: DROP
					inputfm
					DUP wallet %> IT :: DROP wallet ;
					DUP %0     %< IT :: DROP % 0 ;
					DUP wallet SWAP %- STOwallet account %+ STOaccount
					CLEARVDISP err
				;
			  DUP FORTYTWO  #= case
				:: DROP
					inputfm
					DUP account %> IT :: DROP account ;
					DUP %0 %< IT :: DROP % 0 ;
					DUP wallet %+ STOwallet account SWAP %- STOaccount
					CLEARVDISP err
				;
			  DUP FORTYTHREE #= case
				::
					 DROP ONE
				;
			  DROP err
		  ; DUP err #= NOT UNTIL DROP
	 ;
  THREE

* copchase routine...check if cops are after you!
  ' ::
	 BEGIN ONE cops ZERO #= NOT IT
	  ::
	  DROP CLEARVDISP ZERO ZERO
	  "       COPCHASE       " $>GROB INVGROB XYGROBDISP
	  "  1 - Fight "  DISPROW2
	  "  2 - Run   "  DISPROW3
	  "  3 - PayOff"  DISPROW4
	  "  Weapon: "
	  { "None" "Magnum" "Nine mm" "S.N. Special" } weapon ONE #+ NTHELCOMP DROP &$ DISPROW6
	  "    Cops: " cops UNCOERCE a%>$ &$ DISPROW7
	  WaitForKey DROP
			::
			  DUP FORTYONE #= case
				  :: DROP
					  weapon mag #= case
					  :: CLEARVDISP %RAN % 0.2 %> ITE
						  :: "     You got one!" BIGDISPROW2 cops ONE #- STOcops err WaitForKey 2DROP ;
						  :: "  Hit!!! Lose 1 Day" BIGDISPROW2 incday err WaitForKey 2DROP ;
					  ;
					  weapon nmm #= case
					  :: CLEARVDISP %RAN % 0.4 %> ITE
						 :: "     You got one!" BIGDISPROW2 cops ONE #- STOcops err WaitForKey 2DROP ;
						 :: "  Hit!!! Lose 1 Day" BIGDISPROW2 incday err WaitForKey 2DROP ;
					  ;
					  weapon spec #= case
					  :: CLEARVDISP %RAN % 0.6 %> ITE
						  :: "     You got one!" BIGDISPROW2 cops ONE #- STOcops err WaitForKey 2DROP ;
						  :: "  Hit!!! Lose 1 Day" BIGDISPROW2 incday err WaitForKey 2DROP ;
					  ;
					  CLEARVDISP weapon none #= case
						  :: "  Hit!!! Lose 1 Day" BIGDISPROW2 incday err WaitForKey 2DROP ;
				  ;
				DUP FORTYTWO #= case
				  :: DROP
					  CLEARVDISP %RAN % 0.4 %> ITE
						 :: "    You got away!"  BIGDISPROW2 WaitForKey 2DROP ONE ;
						 :: "   They found you!" BIGDISPROW2
							 "     Lose 2 Days!"  BIGDISPROW3 incday incday err WaitForKey 2DROP
						 ;
				  ;
				DUP FORTYTHREE #= case
				  :: DROP CLEARVDISP " The Cops take your $ " BIGDISPROW2 %0 STOwallet WaitForKey 2DROP ONE ;
				DROP err
			;
		;
		err #= NOT UNTIL THREE STOcops
  ;

* Choose event routine for after "Jet"
  ' :: randomize CLEARVDISP ZERO ZERO %RAN % 200 %* %RANDOMIZE
	  "   !!!  SUBWAY  !!!   " $>GROB INVGROB XYGROBDISP
		{
		 :: " You find 5 units of" DISPROW3
			 %RAN %6 %* %1 %+ %IP DUP DUP
			 { "       Cocaine" "       Heroin" "       Acid" "       Weed"
				"       Speed" "       Ludes" }
			 SWAP COERCE NTHCOMPDROP DISPROW4
			 " On a dead guy in the" DISPROW5
			 "        Subway" DISPROW6
			 trench SWAP COERCE NTHCOMPDROP
			 free %5 %< ITE :: DROP free ; %5 %+ SWAP COERCE trench PUTLIST STOtrench
			 WaitForKey 2DROP
		 ;
		 :: " 3 Cops Are After You" DISPROW4 WaitForKey 2DROP copchase ;
		 :: "   You found a used" DISPROW3
			 %RAN %3 %* %1 %+ %IP DUP
			 { "       Magnum!" "   Nine Millimeter!" "    S.N. Special!" }
			 SWAP COERCE NTHCOMPDROP DISPROW4
			 COERCE STOweapon WaitForKey 2DROP
		 ;
		 :: "   Cops are selling   " DISPROW3
			 %RAN %6 %* %1 %+ %IP DUP DUP
			 { "       Cocaine" "       Heroin" "       Acid" "       Weed"
				"       Speed" "       Ludes" }
			 SWAP COERCE NTHCOMPDROP DISPROW4
			 "real cheap from raid!!" DISPROW5
			 { % 10000 % 7000 % 500 % 200 % 100 %2 }
			 SWAP COERCE NTHCOMPDROP SWAP COERCE prices PUTLIST STOprices
			 WaitForKey 2DROP
		 ;
		 ::  %RAN %6 %* %1 %+ %IP DUP DUP
			 { "  Cocaine" " Heroin" "  Acid" "  Weed"
				" Speed" "  Ludes" } SWAP COERCE NTHCOMPDROP
			 " addicts are" &$ DISPROW3
			 " buying at outrageous" DISPROW4
			 "        prices!"       DISPROW5
			 { % 52443 % 35118 % 26561 % 20965 % 14931 % 7000 }
			 SWAP COERCE NTHCOMPDROP SWAP COERCE prices PUTLIST STOprices
			 WaitForKey 2DROP
		 ;
		 :: " You are mugged !!!!" DISPROW3
			 "    All your drugs" DISPROW4
			 "      Are gone!" DISPROW5
			 { %0 %0 %0 %0 %0 %0 } STOtrench WaitForKey 2DROP
		 ;
		 :: "       BUSTED !!!" DISPROW3
			 "   Cops take your $" DISPROW4
			 "  and beat you up !!!" DISPROW5
			 "     LOSE 1 DAY" DISPROW6
			 incday %0 STOwallet WaitForKey 2DROP
		 ;
		}
	  %RAN %12 %* %1 %+ %IP
	  DUP %8 %= case :: DROP TWO NTHCOMPDROP EVAL ;
	  DUP %9 %= case :: DROP ONE NTHCOMPDROP EVAL ;
	  DUP %10 %= case :: DROP THREE NTHCOMPDROP EVAL ;
	  DUP %11 %= case :: DROP FOUR NTHCOMPDROP EVAL ;
	  DUP %12 %= case :: DROP FIVE NTHCOMPDROP EVAL ;
	  COERCE NTHCOMPDROP EVAL
;

* Jet routine handler
  ' ::
	 ZERO
	 BEGIN
		DROP ZERO ZERO
		CLEARVDISP "     <-- JET! -->     " $>GROB INVGROB XYGROBDISP
		"1 - The Bronx"    DISPROW2
		"2 - Brooklyn"     DISPROW3
		"3 - Manhattan"    DISPROW4
		"4 - The Ghetto"   DISPROW5
		"5 - Central Park" DISPROW6
		"6 - Oops...Stay"  DISPROW7
		"7 - Suicide"      EIGHT DISPN
		WaitForKey DROP
			::	DUP FORTYONE    #= case :: DROP locat bronx #= case :: err ; bronx STOlocat incday day % 30 %>=
													case :: err ONE ; doevent ONE ONE ;
				DUP FORTYTWO    #= case :: DROP locat brook #= case :: err ; brook STOlocat incday day % 30 %>=
													case :: err ONE ; doevent ONE ONE ;
				DUP FORTYTHREE  #= case :: DROP manha locat #= case :: err ; manha STOlocat incday day % 30 %>=
													case :: err ONE ; doevent ONE ONE ;
				DUP THIRTYSIX   #= case :: DROP getto locat #= case :: err ; getto STOlocat incday day % 30 %>=
													case :: err ONE ; doevent ONE ONE ;
				DUP THIRTYSEVEN #= case :: DROP cpark locat #= case :: err ; cpark STOlocat incday day % 30 %>=
													case :: err ONE ; doevent ONE ONE ;
				DUP THIRTYEIGHT #= case :: DROP ONE ONE ;
				DUP THIRTYONE   #= case :: DROP err ONE ;
				DROP err
			;
		DUP err #= NOT UNTIL DROP
	  ;

* show whats in the trenchcoat routine
  ' ::
		CLEARVDISP
		"Cocaine:      " trench ONE   NTHCOMPDROP a%>$ &$ DISPROW1
		"Heroin:       " trench TWO   NTHCOMPDROP a%>$ &$ DISPROW2
		"Acid:         " trench THREE NTHCOMPDROP a%>$ &$ DISPROW3
		"Weed:         " trench FOUR  NTHCOMPDROP a%>$ &$ DISPROW4
		"Speed:        " trench FIVE  NTHCOMPDROP a%>$ &$ DISPROW5
		"Ludes:        " trench SIX   NTHCOMPDROP a%>$ &$ DISPROW6
		"     WEAPON:  " { "none" "Magnum" "NMM" "S.N.S" } weapon ONE #+ NTHCOMPDROP &$ DISPROW7
		"     WALLET:  " wallet a%>$ &$ EIGHT DISPN
		WaitForKey 2DROP
	 ;

* loan shark procedure
  ' :: CLEARVDISP ZERO
	  BEGIN
		  DROP ZERO ZERO
		  "  $$$ LOAN SHARK $$$  " $>GROB INVGROB XYGROBDISP
		  "  1 - Repay"  DISPROW3
		  "  2 - Borrow" DISPROW4
		  "  3 - Scram"  DISPROW5
		  "  DEBT:   " debt a%>$ &$ DISPROW7
		  "  WALLET: " wallet a%>$ &$ EIGHT DISPN
		  WaitForKey DROP
		  :: DUP FORTYONE  #= case
				:: DROP
					inputfm
					DUP wallet %> IT :: DROP wallet ;
					DUP debt   %> IT :: DROP debt ;
					DUP %0     %< IT :: DROP % 0 ;
					DUP wallet SWAP %- STOwallet debt SWAP %- STOdebt
					CLEARVDISP err
				;
			  DUP FORTYTWO  #= case
				:: DROP
					 inputfm
					 DUP % 5000 %> IT :: DROP % 5000 ;
					 DUP %0 %< IT :: DROP % 0 ;
					 DUP wallet %+ STOwallet debt %+ STOdebt
					 CLEARVDISP err
				;
			  DUP FORTYTHREE #= case
				::
					 DROP ONE
				;
			  DROP err
		  ; DUP err #= NOT UNTIL
		  DROP
	 ;

* main menu procedure
	' :: CLEARVDISP ZERO
		  BEGIN DROP ZERO ZERO
			"      DRUGWAR!!!      " $>GROB INVGROB XYGROBDISP
			"  1 - See Prices" DISPROW2
			"  2 - Trenchcoat" DISPROW3
			"  3 - Buy" 		 DISPROW4
			"  4 - Sell" 		 DISPROW5
			"  5 - Jet"			 DISPROW6
			bronx locat #= IT  :: "  6 - See Loan Shark" DISPROW7 ;
			brook locat #= IT  :: "  6 - Go To Bank"  DISPROW7 ;
			manha locat #= IT  :: "  6 - Wall Street" DISPROW7 ;
			WaitForKey DROP
			::	DUP FORTYONE    #= case :: DROP ONE ;
				DUP FORTYTWO    #= case :: DROP TWO ;
				DUP FORTYTHREE  #= case :: DROP THREE ;
				DUP THIRTYSIX   #= case :: DROP FOUR ;
				DUP THIRTYSEVEN #= case :: DROP FIVE ;
				DUP THIRTYEIGHT #= locat bronx #= AND case :: DROP SIX ;
				DUP THIRTYEIGHT #= locat brook #= AND case :: DROP SEVEN ;
				DUP THIRTYEIGHT #= locat manha #= AND case :: DROP EIGHT ;
				DROP err
			;
			DUP err #= NOT UNTIL
	  ;

* display prices procedure
  ' ::
		CLEARVDISP ZERO ZERO
		"        PRICES        " $>GROB INVGROB XYGROBDISP
		"Cocaine:      " prices ONE   NTHCOMPDROP a%>$ &$ DISPROW2
		"Heroin:       " prices TWO   NTHCOMPDROP a%>$ &$ DISPROW3
		"Acid:         " prices THREE NTHCOMPDROP a%>$ &$ DISPROW4
		"Weed:         " prices FOUR  NTHCOMPDROP a%>$ &$ DISPROW5
		"Speed:        " prices FIVE  NTHCOMPDROP a%>$ &$ DISPROW6
		"Ludes:        " prices SIX   NTHCOMPDROP a%>$ &$ DISPROW7
		"        Day[" day a%>$ &$ "]" &$ EIGHT DISPN
		WaitForKey 2DROP
	 ;

* randomize prices procedure
  ' ::
		%0 %RANDOMIZE NULL{}
		%RAN % 10000 %* % 15000 %+ %0 RNDXY >TCOMP
		%RAN % 9000 %* % 9000   %+ %0 RNDXY >TCOMP
		%RAN % 4000 %* % 2001   %+ %0 RNDXY >TCOMP
		%RAN % 2000 %* % 400    %+ %0 RNDXY >TCOMP
		%RAN % 400  %* % 100    %+ %0 RNDXY >TCOMP
		%RAN % 200  %* % 20     %+ %0 RNDXY >TCOMP
		STOprices
	 ;

  { %0 %0 %0 %0 %0 %0 } bronx %0 % 2000 none %1 % 5000 { %0 %0 %0 %0 %0 %0 }


  ' NULLLAM TWENTYSEVEN NDUPN
  TWENTYEIGHT DOBIND CLEARMENU RECLAIMDISP TURNMENUOFF

ASSEMBLE
	CON(5) =DOGROB
	REL(5) end
	CON(5) 56
	CON(5) 130
	NIBHEX 00000000000000000000000000000000000000000000
	NIBHEX 000000000000000000000000CCF00000000000000003
	NIBHEX 00030000000000CFF100000000000000030103000000
	NIBHEX 0000C383000000000000000381030000000000C18300
	NIBHEX 0000000000000381030000000000C007000000000000
	NIBHEX 000383030000000000C0060000000000000003838300
	NIBHEX 00000000C006000000000000000383810000000000C0
	NIBHEX 06000000000000000383810083000000C0060037083C
	NIBHEX 000C7003C78100F7007E00C00600BF083C000E7006C6
	NIBHEX 810836006F00C00600FD003C00037006C6C10C1600ED
	NIBHEX 10C00600FC003C00817006C6C0080600EC10C006007C
	NIBHEX 003C0081700646C00006006C00C0070030003C00C070
	NIBHEX 046CC00007006000C0070030003C00C070046CC000C7
	NIBHEX 006000C0030030003C00E0700C6C4000F6006000C083
	NIBHEX 0030003C0068700C28600836006000C0810030003C00
	NIBHEX 68700C38700C16006000C0C10030003C0068700C3870
	NIBHEX 0C07006000C0E00030003C006C700C38700687006000
	NIBHEX C8700030083E0066600C187006C6006000CD30003000
	NIBHEX BF0066600C103006E6006000CF00007000FD10E3600C
	NIBHEX 10300E76007000C300003000FC00C1600800300E1200
	NIBHEX 20000000000000000000700000000000000000000000
	NIBHEX 00000000007000000000000000000000000000000000
	NIBHEX 30000000000000000000000000000000003000000000
	NIBHEX 0000000000000000408100C830000000000000000000
	NIBHEX 000000C98100CF10000000000000000000000000C991
	NIBHEX 008F0000000000000000000000007003130000000000
	NIBHEX 000000000000000800E1033100000000000000000000
	NIBHEX 00000C10830623000000000000000000000000083007
	NIBHEX 322300000000000000000000000000F1062223000000
	NIBHEX 00000000000000000000C30462660000000000000000
	NIBHEX 00000000000F06424E30000000000000000000000000
	NIBHEX 0C1646081000000000000000000000000008164E0000
	NIBHEX 00000000000000000000000000364EF0000000000000
	NIBHEX 000000000000000076C070CFFFFFFFF7000000000000
	NIBHEX 0000002C800EFFFFFFFFFF1000000000000000002C93
	NIBHEX 0FF70E1E10FD7000000000000000002B32CFFF1C3C70
	NIBHEX 83E700000000000000002370EF783070F0078F000000
	NIBHEX 000000000022E1CF70F0C1C0060C0000000000000000
	NIBHEX 2E30CF70C181810E0F00000000000000002C300FF081
	NIBHEX 83810CC7000000000000000070000EFF0303030CF100
	NIBHEX 00000000000000608FF0CFF7078FFF10000000000000
	NIBHEX 0000CFFFF108FFFFFFFF0000000000000000008FF000
	NIBHEX 00000000000000000000000000000000000000000000000000000000
end
RPL
  ZERO SWAP ZERO SWAP XYGROBDISP WaitForKey 2DROP randomize err
  BEGIN err #= WHILE
  mainmenu
  ::
	 DUP ONE   #= case :: DROP dispprices err ;
	 DUP TWO   #= case :: DROP trenchcoat err ;
	 DUP THREE #= case :: DROP buydrugs   err ;
	 DUP FOUR  #= case :: DROP selldrugs  err ;
	 DUP FIVE  #= case :: DROP jet err #= ITE ONE err ;
	 DUP SIX   #= case :: DROP shark  err ;
	 DUP SEVEN #= case :: DROP gobank err ;
	 DUP EIGHT #= case :: DROP wallstreet err ;
  ;
  REPEAT
	CLEARVDISP
	"   GAME OVER STATUS   " BIGDISPROW2
	wallet account %+ stocks %+ debt %- DUP %0 %< IT :: DROP %0 ;
	::
		DUP % 20000 %< case :: DROP    "       Druggie" ;
		DUP % 50000 %< case :: DROP    "        Pusher" ;
		DUP % 200000 %< case :: DROP   "       Gangster" ;
		DUP % 500000 %< case :: DROP   "         Lord" ;
		DUP % 900000 %<= case :: DROP   "     Ring Leader" ;
		DUP % 900000 %> case :: DROP "  DEA Administrator" ;
	;
	BIGDISPROW3 WaitForKey 2DROP ABND GARBAGE
	TURNMENUON ClrDAsOK 
;
[ RETURN TO DIRECTORY ]