All pastes #9873 Raw Edit

Untitled

public text v1 · immutable
#9873 ·published 2005-04-20 05:19 UTC
rendered paste body
Extrn   GetDec:Far, PutDec:Far, PutDec:Far, Putstrng:Far, NewLine:Far     ; #include "iostream.h"

Data    Segment
;######Game variables#################
	DAY		dw	1
	GlassesSold	dw	?
	PriceperGlass	dw	5
	Income		dw	?
	Expenses	dw	?
	GlassesMade	dw	4
	AdvertisingMade	dw	20
	AdvertisingCost	dw	15
	Profit		dw	?
	Assets		dw	?
	CurrentAssets	dw	200	;starting amount
	DaystoPlay	dw	?
        weathercond	dw	?
	costperglass	dw	5
;######inputforday function prompts######
	OnDay		db	"On day " ; length 7
	LemonadeCost	db	", The Cost of Lemonade is " ; length 26
                        
;######Random number function vars#######
	RAND_seed     	dw      ? 
;######prompts###########################
	intro		db	"Welcome to Lemonade Stand"	  ; basic intro prompt 25
	weather		db	'Todays weather is'		  ; weather report 17
	dailystatement	db	'Lemonade stand Daily Statement:' ; daily statement 31
	date		db	'On day: '			  ; day output
	sales		db	'Glasses sold: '		  ; glasses sold 14
	priceprompt	db	'Price per glass: '		  ; price per glass 17
	production	db	'Glasses made: '		  ; glasses made 14
	advertsprompt	db	'Signs made: '			  ; signs made 12
	profitprompt	db	'Profit: '			  ; profit prompt 8
	AssetsPrompt	db	'Assets: '		          ; asset prompt 8
	glassesprompt	db	'How many glasses of lemonade do you wish to make? '        ; length 50
        advertisingprompt db   	'How many advertising signs do you wish to make (15 cents each)? ' ; 64
	lemonadepriceprompt db	'What price (in cents) do you wish to charge for lemonade? '       ; 56
	daysprompt	db	'Please enter the number of days to run the stand (1-30): '        ; 57
	numberoutofrange	db	"Number out of range, try again" ; 30
	cannotafford	db	'You cannot afford this many '           ; 28
	gameover	db	'Game Over - you are out of money'       ; 32
;########Weather report########
	weather0	db	'Todays weather is hot and humid'	; 32
	weather1	db	'Todays weather is sunny'		; 24
	weather2	db	'Todays weather is fair'		; 23
	weather3	db	'Todays weather is cloudy and cool'	; 34
	weather4	db	'Todays weather is raining'		; 26
;#######Glasses Sold###########
	maxprice	dw	?	;max price of lemondade for a given day 
	maxglassessold	dw	?	;max number of glasses sold in one day	
	Glassmul	dw	?
;#######Game Graphics##########
	logo01		db	'  888                                                            888          ' ; 78
	logo02		db	'  888                                                            888          '
	logo03		db	'  888                                                            888          '
	logo04		db	'  888      .d88b.  88888b.d88b.   .d88b.  88888b.   8888b.   .d88888  .d88b.  '
	logo05		db	'  888     d8P  Y8b 888 "888 "88b d88""88b 888 "88b     "88b d88" 888 d8P  Y8b '
	logo06		db	'  888     88888888 888  888  888 888  888 888  888 .d888888 888  888 88888888 '
	logo07		db	'  888     Y8b.     888  888  888 Y88..88P 888  888 888  888 Y88b 888 Y8b.     '
	logo08		db	'  88888888 "Y8888  888  888  888  "Y88P"  888  888 "Y888888  "Y88888  "Y8888  '
	logo09		db	'                                                                              '                                                                            
	logo10		db	'                                                                              '                                                                            
	logo11		db	'                                                                              '	                                                                            
	logo12		db	'   .d8888b.  888                           888                                '
	logo13		db	'  d88P  Y88b 888                           888                                '
	logo14		db	'  Y88b.      888                           888                                '
	logo15		db	'   "Y888b.   888888  8888b.  88888b.   .d88888                                '
	logo16		db	'      "Y88b. 888        "88b 888 "88b d88" 888                                '
	logo17		db	'        "888 888    .d888888 888  888 888  888                                '
	logo18		db	'  Y88b  d88P Y88b.  888  888 888  888 Y88b 888                                '
	logo19		db	'   "Y8888P"   "Y888 "Y888888 888  888  "Y88888                                '
	logo20		db	'                                                                              '		                                                     

Data    Ends

Code    Segment
        Assume  Cs:Code, Ds:Data, Ss:Sseg

;#####Convert to Dollar#######
;takes 1 value converts it front cents
;to dollars
;Returns Whole # in Ax
;Cents # in DX
@CentstoDollars Proc Near C, @CASH:WORD
	push	Bx
	xor	dx,dx
	mov	Ax, @Cash
	cwd
	mov	Bx, 100
	iDiv	Bx
	pop	Bx
@ctdif:
	cmp	Dx, 0
	jl	@ctdthen
	jmp	@ctdendif
@ctdthen:
	neg	Dx
	jmp	@ctdendif
@ctdendif:
	
	ret
@CentstoDollars Endp	

;#####random number generator#######
;gets a large number, a seed, and an upper limit
;seed is wiped out initially
;system time is used for seed
;answer is returned in Ax
@RANDOMNUMBER Proc Near C, @high:word
	
	push	Bx
	push 	Cx
	push	Dx

	xor 	Ax, Ax		;clear AX
	mov 	ah, 2Ch		;load 2Ch into ah
	int	21h		;load system time into registers
	mov	RAND_seed, Dx	;dh holds seconds, dl holds ms, move to seed
	
	mov	bx, @high
	add	bx, 1
	mov	ax, RAND_seed
	xor	dx,dx
	cwd
	div	bx
	mov	ax, dx
	
	
	pop	Dx
	pop	cx
	pop	Bx

	ret 


@RANDOMNUMBER ENDp

;####ClearScreen######
;clears the screen with a loop
;puts @line # of new lines on the screen

@cLEARSCREEN 	Proc Near C, @lines:word
	push 	Ax
	push	Bx
	push	Cx
	push	Dx
	
	mov 	Bx, @lines
@CSfor:	cmp 	bx, 0
	ja 	@CSdo
	jmp	@CSendfor
@CSdo:	
	call	newline
	dec	Bx
	jmp	@CSfor
@CSendfor: 
	pop	Dx
	pop	Cx
	pop	Bx
	pop	Ax

	ret
          
@CLEARSCREEN ENDp

;######outputs cents formated nicely#####
;outputs -3453 or 300 as $34.53 or $3.00
;input is money in cents
@outputdollars Proc Near C, @money:word
	push	ax
	push	bx
	push	cx
	push	dx

	invoke	@CentstoDollars, @money 	;break money apart into 
						;dollars and cents
	push 	Ax
	push	dx	
	xor	ax, ax
	xor	dx, dx
	mov 	ah, 02h
	mov	Dl, 36
	int	21h
	pop	Dx
	pop	Ax
	
@optif2:
	cmp 	@money, 0
	jl 	@optand2
	jmp	@optendif2
@optand2:
	cmp	@money, -100
	jg	@optthen2
	jmp	@optendif2
	
@optthen2:

	push 	Ax
	push	dx	
	xor	ax, ax
	xor	dx, dx
	mov 	ah, 02h
	mov	Dl, 45
	int	21h
	pop	Dx
	pop	Ax
	jmp	@optendif2

@optendif2:

	call	putdec
	
	push 	Ax
	push	dx	
	xor	ax, ax
	xor	dx, dx
	mov 	ah, 02h
	mov	Dl, 46
	int	21h
	pop	Dx
	pop	Ax
	
	mov	Ax, Dx
@optif:
	cmp	Ax, 10
	Jb 	@optthen
	jmp	@optendif
@optthen:
	push	Ax
	mov 	Ax, 0
	call	putdec
	pop	Ax
	jmp	@optendif
@optendif:
	call	putdec
		
	pop	dx
	pop	cx
	pop	bx
	pop	ax

	ret

@outputdollars ENDp

;#########INPUT FOR DAY###########
;gets input for the day
;provides error handling for
;entering data also
;#################################
@InputForDay Proc Near C
	push	ax
	push	bx
	push	cx
	push	dx
	
	Mov     Cx, 7
        Lea     Di, onday
        Call    Putstrng   
	
	mov 	Ax, DAY
	call	putdec
	
	Mov     Cx, 26
        Lea     Di, lemonadecost
        Call    Putstrng  
	
	invoke	@outputdollars, costPerglass
	
	call	newline
	
	Mov     Cx, 7
        Lea     Di, assetsprompt
        Call    Putstrng  
	invoke	@outputdollars, currentassets

@if1:	
	call	newline

	Mov     Cx, 50
        Lea     Di, glassesprompt
        Call    Putstrng  

	call	getdec
	
	mov	GlassesMade, Ax
	call	newline

	mul	costperglass
	mov	expenses, Ax
	cmp	Ax, currentassets
	jg	@then1
	jmp	@endif1
@then1:
	Mov     Cx, 28
        Lea     Di, cannotafford
        Call    Putstrng  
	invoke	@outputdollars, Ax
	jmp	@if1
@endif1:
	
@if2:	
	call	newline
	Mov     Cx, 64
        Lea     Di, advertisingprompt
        Call    Putstrng  

	call	getdec
	
	mov	advertisingmade, Ax
	call	newline
	
	mul	advertisingcost
	add	Ax, Expenses
	cmp	Ax, currentassets
	jg	@then2
	jmp	@endif2
@then2:
	Mov     Cx, 28
        Lea     Di, cannotafford
        Call    Putstrng  
	invoke	@outputdollars, Ax
	jmp	@if2
@endif2:

	Mov     Cx, 58
        Lea     Di, lemonadepriceprompt
        Call    Putstrng  
	
	call	getdec
	mov	priceperglass, Ax
	
	pop	dx
	pop	cx
	pop	bx
	pop	ax

	ret

@InputForDay endp

;#######Asset Statement############
@AssetStatement	Proc Near C

	push	cx
	push	ax

	mov	ax,PricePerGlass
	mul	GlassesSold
	mov	Income,ax

	mov	ax,AdvertisingCost
	mul	AdvertisingMade
	mov	Expenses,ax

	mov	ax,CostPerGlass
	mul	GlassesMade
	add	Expenses,ax
	
	mov	ax,Income
	sub	ax,Expenses
	mov	Profit,ax
	
	add	ax,CurrentAssets
	mov	Assets,ax
	
	mov	Currentassets, Ax
	
	invoke	@clearscreen,25
	mov	cx,31
	lea	di,dailystatement
	call	putstrng
	invoke	@clearscreen,2

	mov	cx,8
	lea	di,date
	call	putstrng
	mov	ax,day
	call	putdec
	call	newline

	mov	cx,12
	lea	di,advertsprompt
	call	putstrng
	mov	ax,AdvertisingMade	
	call	putdec
	call	newline	

	mov	cx,14
	lea	di,production
	call	putstrng
	mov	ax,GlassesMade
	call	putdec
	call	newline

	mov	cx,17
	lea	di,priceprompt
	call	putstrng
	invoke	@outputdollars,PriceperGlass
	call	newline

	mov	cx,14
	lea	di,sales
	call	putstrng
	mov	ax,GlassesSold
	call	putdec
	call	newline

	mov	cx,8
	lea	di,profitprompt
	call	putstrng
	invoke	@outputdollars,Profit
	call	newline

	lea	di,assetsprompt
	call	putstrng
	invoke	@outputdollars,assets
	call	newline
	
	inc	day

	pop	cx
	pop	ax

	ret
@AssetStatement ENDp

@PromptforDays	proc near C

	push	cx
	push	ax
	
@pfdfor:
	mov	cx,57
	lea	di,daysprompt
	call	putstrng
	
	call	getdec
	cmp	ax,30
	jg	@pfdtryagain
	cmp	ax,0
	jle	@pfdtryagain
	jmp	@pfdendfor
@pfdtryagain:
	mov	cx,30
	lea	di,numberoutofrange
	call	putstrng
	call	newline
	jmp	@pfdfor
@pfdendfor:

	mov	DaystoPlay,ax

	pop	cx
	pop	ax

	ret
@promptforDays	endp

;########Generate weather report########
;Generates the weather report for the day
@GenerateWeather Proc near C
	push	ax
	push	bx
	push	cx
	push	dx

	invoke 	@randomnumber, 4

@gswitch:	
	cmp	ax, 0
	je	@gcase0
	cmp	ax, 1
	je	@gcase1
	cmp	ax, 2
	je	@gcase2
	cmp	ax, 3
	je 	@gcase3
	cmp	ax, 4
	je	@gcase4
	jmp	@gdefault
@gcase0:
	Mov     Cx, 31
        Lea     Di, weather0
        Call    Putstrng
	Call	Newline    
	mov	weathercond, 0
	jmp	@gendswitch
@gcase1:
	Mov     Cx, 23
        Lea     Di, weather1
        Call    Putstrng
	Call	Newline 
	mov	weathercond, 1
	jmp	@gendswitch
@gcase2:
	Mov     Cx, 22
        Lea     Di, weather2
        Call    Putstrng
	Call	Newline 
	mov	weathercond, 2
	jmp	@gendswitch
@gcase3:
	Mov     Cx, 33
        Lea     Di, weather3
        Call    Putstrng
	Call	Newline 
	mov	weathercond, 3
	jmp	@gendswitch
@gcase4:
	Mov     Cx, 25
        Lea     Di, weather4
        Call    Putstrng
	Call	Newline 
	mov	weathercond, 4
	jmp	@gendswitch
@gdefault:
@gendswitch:
	
	pop	dx
	pop	cx
	pop	bx
	pop	ax	
	ret
@generateweather endp

;#########Glasses Sold########
;Figures the #of glasses sold
;Based on the weather, advertising
;and price charged.
@glassessold Proc Near

	push	ax
	push	bx
	push	cx
	push	dx
	
	invoke	@randomnumber, 20 	;generate the max selling price
	mov	maxprice, ax		;move into max selling variable

					
	mov	Ax, weathercond		;Adjust max price to reflect the weather

					;switch changes max price to a percentage multiplier

@mxswitch:	
	cmp	ax, 0
	je	@mxcase0
	cmp	ax, 1
	je	@mxcase1
	cmp	ax, 2
	je	@mxcase2
	cmp	ax, 3
	je 	@mxcase3
	cmp	ax, 4
	je	@mxcase4
	jmp	@mxdefault
@mxcase0:
	
	mov	weathercond, 40
	jmp	@mxendswitch
@mxcase1:
	
	mov	weathercond, 20
	jmp	@mxendswitch
@mxcase2:
	
	mov	weathercond, 4
	jmp	@mxendswitch
@mxcase3:
	
	mov	weathercond, 2
	jmp	@mxendswitch
@mxcase4:
	
	mov	weathercond, 1
	jmp	@mxendswitch
@mxdefault:
@mxendswitch:
	
	mov	Ax, maxprice
	mov	Bx, weathercond		;conditions
	xor	dx,dx			;Divide by weather condition add result to
	cwd				;max price  
	idiv	bx			;effect is a higher max price based on higher
	add	maxprice, Ax		;weather condition
	
	invoke	@randomnumber,10		;generate random number between 0-10
	add	Ax, 5			;shifts the range to 5-15
	mov	maxglassessold, Ax
	mov	Bx, weathercond		
	xor	dx,dx			;Divide by weather condition add result to
	cwd				;maxglasses sold  
	idiv	bx			;effect is a higher max glasses sold based on higher
	add	maxglassessold, Ax	;weather condition
	
	mov	ax, advertisingmade
@adswitch:	
	cmp	ax, 5
	jl	@adcase0
	cmp	ax, 10
	jl	@adcase1
	cmp	ax, 15
	jl	@adcase2
	cmp	ax, 21
	jl 	@adcase3
	jmp	@addefault
@adcase0:
	
	mov	glassmul, 15
	jmp	@adendswitch
@adcase1:
	
	mov	glassmul, 8
	jmp	@adendswitch
@adcase2:
	
	mov	glassmul, 3
	jmp	@adendswitch
@adcase3:
	
	mov	glassmul, 1
	jmp	@adendswitch
@addefault:
@adendswitch:

	mov	Ax, maxglassessold	;further increase the max # of  glasses sold by
					;figure the multipier for Glasses based on advertising

	mov	Bx, glassmul		;using the advertising multiplier
	xor	dx, dx
	cwd
	idiv	bx			;divide by the number
	add	maxglassessold, Ax	;add it to maxglasses sold

	invoke	@randomnumber, 10	; randomly add/subtract from glasses

@adif:	cmp	Ax, 5
	jl	@adthen
	jmp	@adelse
@adthen:
	invoke	@randomnumber, 5	;add a random component from max glasses sold
	add	maxglassessold, ax
@adelse:
	invoke	@randomnumber, 5	;subtract a random component from max glasses sold
	sub	maxglassessold, ax
@adendif:



;#######
;At this point your ideal max glasses sold and ideal maxprice is figured
;so if your price/glass = maxprice you're going to sell all your glasses up to 
;maxglassessold
;#######
	mov	Cx, Priceperglass	
@glif:		
	cmp	Cx, maxprice		;compare the price/glass to max price
	jg	@glthen			;if it's greater then glasses sold
	jmp	@glendif		;will need to be reduced proportionally
@glthen:
	mov	Ax, Priceperglass
	mov	cx, maxprice
	xor	dx, dx
	cwd
	div	Cx			;divide priceperglass by max price
						
	mov	bx, Ax					
	mov	Ax, maxglassessold	
	xor	dx, dx
	cwd
	div	bx			;divide by divider
	
	mov	maxglassessold, Ax	;replace the reduced maxglassessold with 
					;the divided value

@glendif:	;####END IF

	mov	bx, maxglassessold
	mov	glassessold, bx		;populate glassessold with final number
	mov	cx, glassesmade		;load how many were made into Cx
@gsif:	
	cmp	cx, glassessold		;if glasses made > glasses sold then
	jl	@gsthen
	jmp	@gsendif
@gsthen:
	mov	glassessold, cx		;glasses sold = glasses made
	jmp	@gsendif
@gsendif:	
	
;####
;glassessold is ultimately the output of this function
;it is a global variable therefore the function is a void
;###	
	pop	dx
	pop	cx
	pop	bx
	pop	ax

	ret
@glassessold endp


;###########MAIN#############
main   	Proc    Far
	MOV     AX,SEG DATA  
        MOV     DS,AX 
        MOV     ES,AX 
	
	invoke	@clearscreen, 25
	
	Mov     Cx, 25
        Lea     Di, intro
        Call    Putstrng
	invoke	@clearscreen,2
	mov	cx,78
	lea	di, logo01
	call	putstrng
	call	newline

	lea	di, logo02
	call	putstrng
	call	newline

	lea	di, logo03
	call	putstrng
	call	newline

	lea	di, logo04
	call	putstrng
	call	newline

	lea	di, logo05
	call	putstrng
	call	newline

	lea	di, logo06
	call	putstrng
	call	newline

	lea	di, logo07
	call	putstrng
	call	newline

	lea	di, logo08
	call	putstrng
	call	newline

	lea	di, logo09
	call	putstrng
	call	newline

	lea	di, logo10
	call	putstrng
	call	newline

	lea	di, logo11
	call	putstrng
	call	newline

	lea	di, logo12
	call	putstrng
	call	newline

	lea	di, logo13
	call	putstrng
	call	newline

	lea	di, logo14
	call	putstrng
	call	newline

	lea	di, logo15
	call	putstrng
	call	newline

	lea	di, logo16
	call	putstrng
	call	newline

	lea	di, logo17
	call	putstrng
	call	newline

	lea	di, logo18
	call	putstrng
	call	newline

	lea	di, logo19
	call	putstrng
	call	newline

	lea	di, logo20
	call	putstrng
	call	newline

	invoke	@promptfordays

	invoke	@clearscreen,25
@for:
	cmp	DaystoPlay,0
	jg	@do
	jmp	@endfor
@do:
	invoke	@generateweather
	call	newline
	invoke	@inputforday
	call	newline
	invoke	@glassessold
	call	newline
	invoke	@assetstatement
	call	newline
	mov	Ax, costperglass
@if:
	cmp	currentassets, ax
	jl	@then
	jmp	@endif
@then:	
	Mov     Cx, 32		
        Lea     Di, gameover
        Call    Putstrng
	Call	Newline  
	jmp	@endfor
@endif:

	dec	daystoplay
	jmp	@for

@endfor:
 
        Mov     Ah, 4Ch
        Int     21h
main   Endp

Code    Ends

SSeg    Segment        STACK       
         DB            254 dup(?)
SSeg    Ends

        End     main