
Function menu()
	Local leave=0
	Local mx, my, qm
	Local music=1
	RotateEntity camera, 0,0,0
	PositionEntity camera, 0,15,0
	StopChannel(sfx_chan)
	Local heading=CreateSprite()
	EntityTexture heading, gfx_heading
	EntityOrder heading,-1
	gfx_mask=CreateImage(640, 30)
	gfx_mask2=CreateImage(640, 30)
	EntityBlend heading,1
	ScaleSprite heading, 139*2, 154
	PositionEntity heading,((opt_sx/2)-139)-(opt_sx/2)+139,-(10)-77+(opt_sy/2), (opt_sx/2)
	CameraRange camera, 1, (opt_sx/2)+1000
	CameraFogRange camera, 5, (opt_sx/2)+1000
	HideEntity gui_kompass
	HideEntity gui_kompass_z
	menu_set(menu)
	
	While leave=0
		
		;Cachen
		ms=MilliSecs()
		mx=MouseX()
		my=MouseY()
		md=MouseHit(1)
		
		;Alle 25 MS (40 FPS)
		If ms-timer>=25 Then
			timer=ms
		
			
			;Input
			If KeyHit(1) Then menu_set(11)
			If KeyHit(50) Then music=1-music
						
			;Water
			watero#=watero# + 0.0002
			watero2#=watero2# + 0.0004
			wetalpha#=wetalpha#-0.005
			EntityAlpha wet, wetalpha#
			;HideEntity wet
			If watermode=0 Then
				watery#=watery#-0.01
				If watery#<0.5 Then watermode=1
			Else
				watery#=watery#+0.01
				If watery#>1.5 Then watermode=0: wetalpha#=0.8
			EndIf
			PositionEntity water, 0, watery#, 0
			PositionTexture gfx_water3, watero#, watero#
			PositionTexture gfx_water2, watero2#, watero2#
			
			lensflares()
			
			;Sound
			If music=1
				If Not ChannelPlaying(sfx_chan) Then
					If menu<>10 Then
						sfx_chan=PlaySound(sfx_track_menu)
						ChannelVolume sfx_chan, 0.3
					Else
						sfx_chan=PlaySound(sfx_track_credits)
					EndIf
				EndIf
			Else
				StopChannel(sfx_chan)
			EndIf
		
		EndIf
			
		;Rendern
		;Wasser
		If opt_cubemaps Then UpdateCubemap(gfx_water,camera)  
		;gras
		;UpdateGras()
		;Glow
		If opt_hdr Then RenderGlow
		RenderWorld
		
		;Menuabhängiges
		Select menu
			Case 3
				SetFont font_menu : Color 255,255,255 : Text GraphicsWidth()/2-StringWidth("Das Spiel wird nun zum Übernehmen neugestartet!")/2,GraphicsHeight()/2-25, "Das Spiel wird nun zum Übernehmen neugestartet!"
			Case 4
				SetFont font_menu : Color 255,255,255
				Text opt_sx/2-StringWidth("Der gewählte Anzeigemodus konnte nicht initialisiert werden!")/2,opt_sy/2-35, "Der gewählte Anzeigemodus konnte nicht initialisiert werden!"
				Text opt_sx/2-StringWidth("Die Standarteinstellungen wurden wiederhergestellt.")/2,opt_sy/2-10, "Die Standarteinstellungen wurden wiederhergestellt."
			Case 5
				If menu_mapname$="" Then
					SetFont font_menu : Color 255,0,0
					Text opt_sx/2-StringWidth("Keine Maps vorhanden")/2, opt_sy/2+50, "Keine Maps vorhanden"
				EndIf
			Case 10
				GrabImage gfx_mask,(opt_sx/2)-320,opt_sy-30
				GrabImage gfx_mask2,(opt_sx/2)-320,155
				For i=0 To 99
					SetFont font_menu : Color 255,255,255
					pos=menu_scroll+(opt_sy+i*30)
					If pos>155 And pos<opt_sy Then
					Text opt_sx/2, pos, credits$(i), 1
					EndIf
				Next
				If ms-timer2>50 Then
					timer2=ms
					menu_scroll=menu_scroll-1
				EndIf
				DrawBlock gfx_mask, (opt_sx/2)-320,opt_sy-30
				DrawBlock gfx_mask2, (opt_sx/2)-320,155
			Case 11
				SetFont font_menu : Color 255,255,255 : Text opt_sx/2-StringWidth("Willst du Stranded wirklich beenden?")/2,opt_sy/2-25, "Willst du Stranded wirklich beenden?"
		End Select
		
		;Buttons
		SetFont font_menu
		For but.button=Each button
			x=but\x
			y=but\y
			label$=but\label$
			Color 0,0,0
			Text x+1,y+2,label
			If mx>=x And my>=y And mx<=x+StringWidth(label$) And my<=y+25 Then
				Color 80,255,80
				y = y - 1
				If md Then
					leave=menu_input(label$, menu)
					If menu_newlabel$<>label$ Then but\label$=menu_newlabel$
					md=0
				EndIf
			Else
				Color 255,255,255
			EndIf
			Text x, y, label$
		Next
		
		;Version
		SetFont font_tiny
		Color 255,255,255
		Text opt_sx-StringWidth("V. "+version$+", "+release$), 1, "V."+version$+", "+release$
		
		;Pointer
		DrawImage gfx_gui_pointer, mx, my
				
		;Flippen
		Flip
		
	Wend
	
	;Free
	FreeEntity heading
	StopChannel sfx_chan
	FreeImage gfx_mask
	FreeImage gfx_mask2
	
	;Return
	Return leave
	
End Function


;-----Functions

;Menu setzen
Function menu_set(men)
	SetFont font_menu
	but.button = New button
	For but.button=Each button
		Delete but.button
	Next
	Select men
		Case 0
			but.button=New button : but\x=opt_sx/2 : but\y=opt_sy/2-80 : but\label$="Neues Spiel"
			but.button=New button : but\x=opt_sx/2 : but\y=opt_sy/2-30 : but\label$="Spiel laden"
			but.button=New button : but\x=opt_sx/2 : but\y=opt_sy/2+20 : but\label$="Optionen"
			but.button=New button : but\x=opt_sx/2 : but\y=opt_sy/2+70 : but\label$="Editor"
			but.button=New button : but\x=opt_sx/2 : but\y=opt_sy/2+120 : but\label$="Credits"
			but.button=New button : but\x=opt_sx/2 : but\y=opt_sy/2+170 : but\label$="Spiel beenden"
		Case 1
			but.button=New button : but\x=opt_sx/2-40 : but\y=opt_sy/2-50 : but\label$="Slot 1"
			but.button=New button : but\x=opt_sx/2+40 : but\y=opt_sy/2-50 : but\label$="Slot 2"
			but.button=New button : but\x=opt_sx/2-40 : but\y=opt_sy/2-0 : but\label$="Slot 3"
			but.button=New button : but\x=opt_sx/2+40 : but\y=opt_sy/2-0 : but\label$="Slot 4"
			but.button=New button : but\x=opt_sx/2 : but\y=opt_sy/2+50 : but\label$="Slot 5"
			but.button=New button : but\x=opt_sx/2-60 : but\y=opt_sy/2+100 : but\label$="Quick-Save"
			but.button=New button : but\x=opt_sx/2+60 : but\y=opt_sy/2+100 : but\label$="Auto-Save"
			but.button=New button : but\x=opt_sx/2 : but\y=opt_sy/2+150 : but\label$="Abbrechen"
		Case 2
			but.button=New button : but\x=opt_sx/2 : but\y=opt_sy/2-50
			opt_c_sx=opt_sx
			opt_c_sy=opt_sy
			Select opt_sx
				Case 640 but\label$="Auflösung: 640x480"
				Case 800 but\label$="Auflösung: 800x600"
				Case 1024 but\label$="Auflösung: 1024x768"
				Case 1280 but\label$="Auflösung: 1280x1024"
				Default but\label$="Auflösung: unbekannt"
			End Select
			but.button=New button : but\x=opt_sx/2 : but\y=opt_sy/2-0
			opt_c_sbyte=opt_sbyte
			Select opt_sbyte
				Case 16 but\label$="Farbtiefe: 16 Bit"
				Case 24 but\label$="Farbtiefe: 24 Bit"
				Case 32 but\label$="Farbtiefe: 32 Bit"
				Default but\label$="Farbtiefe: unbekannt"
			End Select
			but.button=New button : but\x=opt_sx/2 : but\y=opt_sy/2+50 : but\label$="Maus Sensibilität: Mittel"
			opt_c_msens#=opt_msens#
			Select opt_msens#
				Case 1 but\label$="Maus Sensibilität: sehr hoch"
				Case 2 but\label$="Maus Sensibilität: hoch"
				Case 3 but\label$="Maus Sensibilität: mittel"
				Case 4 but\label$="Maus Sensibilität: niedrig"
				Case 5 but\label$="Maus Sensibilität: sehr niedrig"
				Default but\label$="Maus Sensibilität: unbekannt"
			End Select
			but.button=New button : but\x=opt_sx/2 : but\y=opt_sy/2+100 : but\label$="Sichtweite: Mittel"
			opt_c_range=opt_range
			Select opt_range
				Case 70 but\label$="Sichtweite: sehr niedrig"
				Case 100 but\label$="Sichtweite: niedrig"
				Case 150 but\label$="Sichtweite: mittel"
				Case 200 but\label$="Sichtweite: hoch"
				Case 250 but\label$="Sichtweite: sehr hoch"
				Case 500 but\label$="Sichtweite: noch höher"
				Default but\label$="Sichtweite: unbekannt"
			End Select
			but.button=New button : but\x=opt_sx/2 : but\y=opt_sy/2+150 : but\label$="Schatten: detailiert"
			opt_c_shadows=opt_shadows
			Select opt_shadows
				Case 0 but\label$="Schatten: aus"
				Case 256 but\label$="Schatten: grob"
				Case 512 but\label$="Schatten: detailiert"
				Default but\label$="Schatten: unbekannt"
			End Select
			but.button=New button : but\x=opt_sx/2 : but\y=opt_sy/2+200 : but\label$="FakeHDRR: mittel"
			opt_c_hdr=opt_hdr
			Select opt_hdr
				Case 0 but\label$="FakeHDRR: aus"
				Case 64 but\label$="FakeHDRR: grob"
				Case 128 but\label$="FakeHDRR: mittel"
				Case 256 but\label$="FakeHDRR: hoch"
				Default but\label$="FakeHDRR: unbekannt"
			End Select
			but.button=New button : but\x=opt_sx/2 : but\y=opt_sy/2+250 : but\label$="Wasserreflexionen: mittel"
			opt_c_cubemaps=opt_cubemaps
			Select opt_cubemaps
				Case 0 but\label$="Wasserreflexion: aus"
				Case 128 but\label$="Wasserreflexion: grob"
				Case 256 but\label$="Wasserreflexion: mittel"
				Case 512 but\label$="Wasserreflexion: hoch"
				Default but\label$="Wasserreflexion: unbekannt"
			End Select
			but.button=New button : but\x=opt_sx/2-80 : but\y=opt_sy/2+300 : but\label$="Übernehmen"
			but.button=New button : but\x=opt_sx/2+80 : but\y=opt_sy/2+300 : but\label$="Abbrechen"
		Case 3
			but.button=New button : but\x=GraphicsWidth()/2 : but\y=GraphicsHeight()/2+25 : but\label$="Ok"
		Case 4
			but.button=New button : but\x=GraphicsWidth()/2 : but\y=GraphicsHeight()/2+25 : but\label$="Ok"
		Case 5
			but.button=New button : but\x=opt_sx/2 : but\y=opt_sy/2-50 : but\label$="Zufalls Insel"
			but.button=New button : but\x=opt_sx/2 : but\y=opt_sy/2+150 : but\label$="Abbrechen"
			but.button=New button : but\x=opt_sx/2-200 : but\y=opt_sy/2+50 : but\label$="<<"
			menu_getmap()
			but.button=New button : but\x=opt_sx/2+200 : but\y=opt_sy/2+50 : but\label$=">>"
		Case 10
			menu_scroll=0
			but.button=New button : but\x=opt_sx/2 : but\y=opt_sy-25 : but\label$="Abbrechen"
		Case 11
			but.button=New button : but\x=opt_sx/2-80 : but\y=opt_sy/2+25 : but\label$="Ja"
			but.button=New button : but\x=opt_sx/2+80 : but\y=opt_sy/2+25 : but\label$="Nein"
	End Select
	For but.button=Each button
		but\x=but\x-(StringWidth(but\label$)/2)
	Next
	menu=men
	FlushMouse()
End Function

;Klicken
Function menu_input(label$, menu)
	menu_newlabel$=label$
	Select menu
		Case 0
		Select label$
			Case "Neues Spiel" menu_set(5)
			Case "Spiel laden" menu_set(1)
			Case "Optionen" menu_set(2)
			Case "Editor" loadsaved$="" :Return 3
			Case "Credits" StopChannel sfx_chan: menu_set(10)
			Case "Spiel beenden" menu_set(11)
		End Select
		Case 1
		Select label$
			Case "Slot 1" loadsaved$="slot1":loaddir$="sav": Return 1
			Case "Slot 2" loadsaved$="slot2":loaddir$="sav": Return 1 
			Case "Slot 3" loadsaved$="slot3":loaddir$="sav": Return 1 
			Case "Slot 4" loadsaved$="slot4":loaddir$="sav": Return 1 
			Case "Slot 5" loadsaved$="slot5":loaddir$="sav": Return 1 
			Case "Quick-Save" loadsaved$="quicksave":loaddir$="sav": Return 1 
			Case "Auto-Save" loadsaved$="autosave":loaddir$="sav": Return 1 
			Case "Abbrechen" menu_set(0)
		End Select
		Case 2
		Select label$
			Case "Auflösung: 640x480" menu_newlabel$="Auflösung: 800x600": opt_c_sx=800 :opt_c_sy=600
			Case "Auflösung: 800x600" menu_newlabel$="Auflösung: 1024x768": opt_c_sx=1024 :opt_c_sy=768
			Case "Auflösung: 1024x768" menu_newlabel$="Auflösung: 1280x1024": opt_c_sx=1280 :opt_c_sy=1024
			Case "Auflösung: 1280x1024" menu_newlabel$="Auflösung: 640x480": opt_c_sx=640 :opt_c_sy=480
			Case "Auflösung: unbekannt" menu_newlabel$="Auflösung: 640x480": opt_c_sx=640 :opt_c_sy=480
			Case "Farbtiefe: 16 Bit" menu_newlabel$="Farbtiefe: 24 Bit": opt_c_sbyte=24
			Case "Farbtiefe: 24 Bit" menu_newlabel$="Farbtiefe: 32 Bit": opt_c_sbyte=32
			Case "Farbtiefe: 32 Bit" menu_newlabel$="Farbtiefe: 16 Bit": opt_c_sbyte=16
			Case "Farbtiefe: unbekannt" menu_newlabel$="Farbtiefe: 16 Bit": opt_c_sbyte=16
			Case "Maus Sensibilität: sehr hoch" menu_newlabel$="Maus Sensibilität: hoch": opt_c_msens#=2
			Case "Maus Sensibilität: hoch" menu_newlabel$="Maus Sensibilität: mittel": opt_c_msens#=3
			Case "Maus Sensibilität: mittel" menu_newlabel$="Maus Sensibilität: niedrig": opt_c_msens#=4
			Case "Maus Sensibilität: niedrig" menu_newlabel$="Maus Sensibilität: sehr niedrig": opt_c_msens#=5
			Case "Maus Sensibilität: sehr niedrig" menu_newlabel$="Maus Sensibilität: sehr hoch": opt_c_msens#=1
			Case "Maus Sensibilität: unbekannt" menu_newlabel$="Maus Sensibilität: sehr hoch": opt_c_msens#=1
			Case "Sichtweite: sehr niedrig" menu_newlabel$="Sichtweite: niedrig": opt_c_range=100
			Case "Sichtweite: niedrig" menu_newlabel$="Sichtweite: mittel": opt_c_range=150
			Case "Sichtweite: mittel" menu_newlabel$="Sichtweite: hoch": opt_c_range=200
			Case "Sichtweite: hoch" menu_newlabel$="Sichtweite: sehr hoch": opt_c_range=250
			Case "Sichtweite: sehr hoch" menu_newlabel$="Sichtweite: noch höher": opt_c_range=500
			Case "Sichtweite: noch höher" menu_newlabel$="Sichtweite: sehr niedrig": opt_c_range=70
			Case "Sichtweite: unbekannt" menu_newlabel$="Sichtweite: sehr niedrig": opt_c_range=70
			Case "Schatten: aus" menu_newlabel$="Schatten: grob": opt_c_shadows=256
			Case "Schatten: grob" menu_newlabel$="Schatten: detailiert": opt_c_shadows=512
			Case "Schatten: detailiert" menu_newlabel$="Schatten: aus": opt_c_shadows=0
			Case "Schatten: unbekannt" menu_newlabel$="Schatten: aus": opt_c_shadows=0
			Case "FakeHDRR: aus" menu_newlabel$="FakeHDRR: grob": opt_c_hdr=64
			Case "FakeHDRR: grob" menu_newlabel$="FakeHDRR: mittel": opt_c_hdr=128
			Case "FakeHDRR: mittel" menu_newlabel$="FakeHDRR: hoch": opt_c_hdr=256
			Case "FakeHDRR: hoch" menu_newlabel$="FakeHDRR: aus": opt_c_hdr=0
			Case "FakeHDRR: unbekannt" menu_newlabel$="FakeHDRR: aus": opt_c_hdr=0
			Case "Wasserreflexion: aus" menu_newlabel$="Wasserreflexion: grob": opt_c_cubemaps=128
			Case "Wasserreflexion: grob" menu_newlabel$="Wasserreflexion: mittel": opt_c_cubemaps=256
			Case "Wasserreflexion: mittel" menu_newlabel$="Wasserreflexion: hoch": opt_c_cubemaps=512
			Case "Wasserreflexion: hoch" menu_newlabel$="Wasserreflexion: aus": opt_c_cubemaps=0
			Case "Wasserreflexion: unbekannt" menu_newlabel$="Wasserreflexion: aus": opt_c_cubemaps=0
			Case "Abbrechen" menu_set(0)
			Case "Übernehmen"
				changes=0
				If opt_sx<>opt_c_sx Then changes=1
				If opt_sy<>opt_c_sy Then changes=1
				If opt_sbyte<>opt_c_sbyte Then changes=1
				opt_sx=opt_c_sx
				opt_sy=opt_c_sy
				opt_sbyte=opt_c_sbyte
				opt_msens#=opt_c_msens#
				opt_range=opt_c_range
				opt_shadows=opt_c_shadows
				opt_cubemaps=opt_c_cubemaps
				opt_hdr=opt_c_hdr
				file=WriteFile("settings.cfg")
				WriteLine file, opt_msens#
				WriteLine file, opt_range
				WriteLine file, opt_sx
				WriteLine file, opt_sy
				WriteLine file, opt_sbyte
				WriteLine file, opt_vsync
				WriteLine file, opt_shadows
				WriteLine file, opt_cubemaps
				WriteLine file, opt_hdr
				CloseFile(file)
				If changes=1 Then
					menu_set(3)
				Else
					menu_set(0)
				EndIf
		End Select
		Case 3
		Select label$
			Case "Ok" Return 2
		End Select
		Case 4
		Select label$
			Case "Ok" menu_set(0)
		End Select
		Case 5
		Select label$
			Case "<<" menu_map=menu_map-1: If menu_getmap()=0 Then menu_map=menu_map+1 menu_getmap()
			Case ">>" menu_map=menu_map+1: If menu_getmap()=0 Then menu_map=menu_map-1 menu_getmap()
			Case "Zufalls Insel" loadsaved$="":Return 1
			Case "Abbrechen" menu_set(0)
			Default
				If menu_mapname$<>"" Then
					loadsaved$=menu_mapname$
					loaddir$="maps"
					Return 1
				Else
					PlaySound sfx_error
				EndIf
		End Select
		Case 10
		Select label$
			Case "Abbrechen" StopChannel sfx_chan: menu_set(0)
		End Select
		Case 11
		Select label$
			Case "Ja": quit()
			Case "Nein" menu_set(0)	
		End Select	
	End Select
End Function


Function menu_getmap()
	Local dir,out$,i=0, ok=0
	dir=ReadDir("maps")
	If menu_map<1 Then menu_map=1
	While i<menu_map
		i=i+1
		out$=NextFile(dir)
		If Instr(out$,".sav")=0 Then i=i-1
		If out$="" Then menu_mapname$="": Return 0
	Wend
	CloseDir("maps")
	out$=Replace(out$,".sav","")
	For but.button=Each button
		If but\label$<>"Zufalls Insel" And but\label$<>"Abbrechen" And but\label$<>"<<" And but\label$<>">>" Then
			but\label$=out$
			but\x=opt_sx/2-StringWidth(out$)/2
			ok=1
			Exit	
		EndIf
	Next
	If ok=0 Then but.button = New button: but\x=opt_sx/2: but\y=(opt_sy/2)+50: but\label$=out$
	menu_mapname$=out$
	Return 1
End Function


	