Selective menus not working?

Blitz3D Forums/Blitz3D Programming/Selective menus not working?

Crinkle(Posted 2011) [#1]
I have now commandeered the f12 key to help me debug. But even that wont tell me why this code isn't working now.

in the init_button_list the program creates generic menu items which are available on each page.

INIT_MENU is used to prepare button images for display from the blits/b-list's (button lists).

At first, now, it works fine. At the main menu it only brings the main menu buttons up. And on the EDIT_MAIN screen it does as well.

However going into one of the weapons/vehicles or player menu removes the "*" categorized menu buttons (HOME SETUP and EXIT) from appearing. Yet they are still there in the b-lists menu so should be delected to be made from init_menu, yet they dont. Why is this? They are not deleted, f12 confirms the "*" b-list items are still there!



Global settings_file$="setup.txt"
SeedRnd MilliSecs()

Graphics 1024,768,32,2
SetBuffer BackBuffer()


Global t#
Global menu_setup=0

;these are important for figuring out what section we are in
Global menu$="MAIN_MENU"
Global file$=""
Global section$=""
Global subsection$=""


Global mouse_timeout#=0
Global ERROR_COUNT=0
Global mouse_width=100
Global font_X=LoadFont("Courier New.ttf",48,1,0,0)
Global font_L=LoadFont("Courier New.ttf",36,1,0,0)
Global font_M=LoadFont("Courier New.ttf",20,0,0,0)
Global font_S=LoadFont("Courier New.ttf",14,0,0,0)


Global gfx_mouse=CreateImage(5,5)
SetBuffer ImageBuffer(gfx_mouse)
Color 255,255,255
Rect 0,0,10,10
SetBuffer BackBuffer()
MidHandle gfx_mouse
; pre setup stuff	


 init_button_list()

HidePointer()

;main stuff
starttime=MilliSecs()
ClsColor 25*2,15*2,10*2

While KeyDown(1)=0
	SetBuffer BackBuffer()
	
	fps=fps+1
	If MilliSecs()-starttime>1000 Then
		starttime=MilliSecs()
		fps_old=fps
		fps=0
	EndIf
	If menu_setup=0
		init_menu() ; load all menu bits
	EndIf

	draw_mouse()
	draw_buttons()
	
	
	draw_mouse()

	Color 255,255,255
	SetFont font_S
	Text GraphicsWidth()-95,0,"x="+MouseX()+"  y="+MouseY()
	Text 20,30,"FPS="+fps_old
	Text 20,10,"MENU NAME="+menu$
	Text 20,50,"TIMEOUT="+mouse_timeout
	buts=0
	For b.but = Each but
		buts=buts+1
	Next
	Text 20,70,"BUTTONZ="+buts
	If MouseDown(1) Then mouse_width=mouse_width+10

	If KeyDown(88) Then 
	Cls
	SetFont font_S
	Color 255,255,255
	Text 20,20,"BUTTONS"
	yoff = 40
	For b.but = Each but
		Text 20,yoff,"---"+b\click_cmd+"     "+b\menu
		yoff=yoff+12	
	Next

	Color 255,255,255
	Text 420,20,"BLISTS"
	yoff = 40
	For bl.blist = Each blist
		Text 420,yoff,"---"+bl\txt$+"     "+bl\menu$
		yoff=yoff+12	
	Next

	Flip
	Delay 10
	EndIf
	

	Flip ; flip buffer
	Cls
	Delay (1000/50)-(MilliSecs()-frame_now)
	mouse_timeout=mouse_timeout-(MilliSecs()-frame_now)
	If mouse_timeout<0 Then mouse_timeout=0
	frame_now=MilliSecs()

Wend


;functions

Function interpret_click_command(CMD$)
;	Delay 1000
	If CMD$="program exit" Then RuntimeError "You have exited the program"
	If Left$(CMD$,4)="menu" Then ; ITS A MENU CHANGE!
		menu$=Right$(CMD$,Len(CMD)-5)
		mouse_width=2000
		mouse_timeout=440
		init_menu()
	EndIf
	;errorpoint() ; ERROR LINE ---- DO NOT CROSS ----ERROR LINE ---- DO NOT CROSS ----ERROR LINE ---- DO NOT CROSS ----ERROR LINE ---- DO NOT CROSS  

End Function

Function draw_mouse()
	Color 255,255,255
	DrawImage gfx_mouse,MouseX(),MouseY()
	mouse_width=mouse_width*0.8
	If mouse_width<6 Then mouse_width=6
	For t = 1 To 180 
		Line MouseX()+Sin((MilliSecs()/10)+t)*mouse_width,MouseY()+Cos((MilliSecs()/10)+t)*mouse_width,MouseX()+Sin((MilliSecs()/10)+t)*-mouse_width,MouseY()+Cos((MilliSecs()/10)+t)*-mouse_width
		t=t+17
	Next
	Color 0,0,0
	strength#=mouse_timeout*3
	Oval MouseX()-(strength/2),MouseY()-(strength/2),strength,strength
End Function

Type but
	Field img,x#,y#,click_cmd$,menu$,todraw
End Type

Function draw_buttons()
	For b.but = Each but
		b\todraw=0
	Next
	If menu="MAIN_MENU" Then
		xpos=300
		For b.but = Each but
			If b\menu<>"*" And b\menu<>"EDIT_" Then
			b\todraw=1
			DrawImage b\img,GraphicsWidth()/2,xpos
			If ImagesOverlap(gfx_mouse,MouseX(),MouseY(),b\img,GraphicsWidth()/2,xpos)=1 Then
				mouse_over_object=1
				DrawImage b\img,GraphicsWidth()/2,xpos,1
				Color 255,255,255
				Text MouseX()+30,MouseY()+30,b\click_cmd
				If mouse_over_object=1 And MouseDown(1)=1 Then
					interpret_click_command(b\click_cmd)
				EndIf
			EndIf
			If xpos=300 Then
				xpos=xpos+200
				Else
				xpos=xpos+100
			EndIf
			EndIf
		Next
	EndIf
	If menu<>"MAIN_MENU" Then
		For b.but = Each but
			If b\menu="*" ; if the button belongs to this menu or is generic.
				b\todraw=1
				If b\click_cmd="menu MAIN_MENU" Then 
					xpos=100
					ypos=100
				EndIf
				If b\click_cmd="menu SETUP" Then 
					xpos=85
					ypos=680
				EndIf
				If b\click_cmd="program exit" Then 
					xpos=100
					ypos=740
				EndIf
				Color 155,155,155
				For t=1 To 5
					Line 162+t,0,162+t,800
				Next			
				DrawImage b\img,xpos,ypos
				If ImagesOverlap(gfx_mouse,MouseX(),MouseY(),b\img,xpos,ypos)=1 Then
					mouse_over_object=1
					DrawImage b\img,xpos,ypos,1
					Color 255,255,255
					Text MouseX()+30,MouseY()+30,b\click_cmd
					If mouse_over_object=1 And MouseDown(1)=1 Then
						interpret_click_command(b\click_cmd)
					EndIf
				EndIf
				xpos=xpos+100
			EndIf	
		Next
	EndIf
	If Left$(menu$,5)="EDIT_" Then
		xpos=5
		ypos=140
		For b.but = Each but
			If b\menu$="EDIT_" Then  ; if the button belongs to this menu or is generic.
				ypos=ypos+30
				b\todraw=1
				DrawImage b\img,xpos,ypos
				If ImagesOverlap(gfx_mouse,MouseX(),MouseY(),b\img,xpos,ypos)=1 Then
					mouse_over_object=1
					DrawImage b\img,xpos,ypos,1
					Color 255,255,255
					Text MouseX()+30,MouseY()+30,b\click_cmd
					If mouse_over_object=1 And MouseDown(1)=1 Then
						interpret_click_command(b\click_cmd)
					EndIf
				EndIf
			EndIf	
		Next
	EndIf
	For b.but = Each but
		If b\todraw=0
			FreeImage b\img
			Delete b
		EndIf
	Next

End Function

Function errorpoint()
	ERROR_COUNT=ERROR_COUNT+1	
	For t = 1 To 100
		If Rnd(1,100)>85 Then Color Rnd(255,155),Rnd(255,155),Rnd(255,155)
		Rect 0+t,0+t,GraphicsWidth(),GraphicsHeight(),0
	Next	
	Color 0,0,0
	Text 20,20,"BREAKPOINT REACHED! TIME="+MilliSecs()	
	Text 20,35,"WE HAVE REACHED THE POINT YOU WANTED ME TO STOP AND TELL YOU WE HAD REACHED.
	Text 20+1,35,"WE HAVE REACHED THE POINT YOU WANTED ME TO STOP AND TELL YOU WE HAD REACHED.
	Text 20,50,"RESUMING IN 5 SECONDS..."
	Text 20+1,50,"RESUMING IN 5 SECONDS..."
	Color 0,0,0
	Rect 10,72,200,22
	Color 255,255,255
	Text 20,75,"ERROR NUMBER="+ERROR_COUNT

	Flip
	Delay 3000
End Function

Function gen_menu_but(txt$,action$,colour$,size$,bmenu$)
	b.but = New but
	If size="X" Then 
		SetFont font_X
		add=32
	EndIf
	If size="L" Then 
		SetFont font_L
		add=24
	EndIf
	If size="M" Then 
		SetFont font_M
		add=4
	EndIf
	If size="S" Then 
		SetFont font_S
	EndIf
	
	tempimage=CreateImage(Len(txt$)*(12+(add*0.6)),16+add,2) 

	frame=0
	SetBuffer ImageBuffer(tempimage,frame)
	Color 155,155,155
	Rect 0,0,ImageWidth(tempimage),ImageHeight(tempimage)
	Color 0,0,0
	Rect 1+(add/12),1+(add/12),ImageWidth(tempimage)-(2+(add/6)),ImageHeight(tempimage)-(2+(add/6))
	getcolour(colour$)
	Text ImageWidth(tempimage)/2,ImageHeight(tempimage)/2,txt$,1,1

	frame=1
	SetBuffer ImageBuffer(tempimage,frame)
	Color 155,155,155
	Rect 0,0,ImageWidth(tempimage),ImageHeight(tempimage)
	getcolour(colour$)
	Color ColorRed()/2,ColorGreen()/2,ColorBlue()/2
	Rect 1+(add/12),1+(add/12),ImageWidth(tempimage)-(2+(add/6)),ImageHeight(tempimage)-(2+(add/6))
	getcolour(colour$)
	Text ImageWidth(tempimage)/2,ImageHeight(tempimage)/2,txt$,1,1
	If Left$(txt$,1)<>">" Then MidHandle tempimage
	b\img=CopyImage(tempimage)
	b\click_cmd$=action$
	b\menu$=bmenu$
	FreeImage tempimage
	
End Function

Function init_menu()
	For b.but = Each but ; clear old menu's buttons
		FreeImage b\img
		Delete b
	Next	
	For bl.blist = Each blist ; scan button list for this menu's buttons
		If bl\menu$=menu$ Or bl\menu$="*" Or bl\menu="EDIT_" Then
			gen_menu_but(bl\txt$,bl\action$,bl\colour,bl\size$,bl\menu$)
		EndIf
	Next
	menu_setup=1
End Function

Type BLIST
    Field txt$,menu$,action$,colour$,size$
End Type

Function init_button_list()

new_blist("EDIT GAME","MAIN_MENU","menu EDIT_MAIN","green","X")
new_blist("SETUP THIS PROGRAM","MAIN_MENU","menu SETUP","yellow","X")
new_blist("EXIT THIS PROGRAM","MAIN_MENU","program exit","red","X")

new_blist("HOME","*","menu MAIN_MENU","green","X")
new_blist("SETUP","*","menu SETUP","yellow","X")
new_blist("EXIT","*","program exit","red","X")

  new_blist(">PLAYER","EDIT_","menu EDIT_PLYR","cyan","M")
 new_blist(">WEAPONS","EDIT_","menu EDIT_WEPS","cyan","M")
new_blist(">VEHICLES","EDIT_","menu EDIT_VEHS","cyan","M")

End Function

Function new_blist(txt$,bmenu$,action$,colour$,size$)
	bl.blist = New blist
	bl\txt$=txt$
	bl\menu$=bmenu$
	bl\action$=action$
	bl\colour$=colour$
	bl\size$=size$
End Function


Function getcolour(colour$)
	If colour$="red" Then Color 255,0,0
	If colour$="green" Then Color 0,255,0
	If colour$="blue" Then Color 0,0,255
	If colour$="yellow" Then Color 255,255,0
	If colour$="purple" Then Color 255,0,255
	If colour$="cyan" Then Color 0,255,255
	If colour$="grey" Then Color 155,155,155
End Function