''Egg's path
''Lemmings clone


#Include "fbgfx.bi"
#include "file.bi"


Type Point_2D
	X As Integer
	Y As Integer
End Type

Type Point_2DS
	X As Single
	Y As Single
End Type


Declare Sub Ustaw_Tryb_gry(ByVal ustawiany_tryb As UByte)

Type Struktura_ludzika
	widoczny As Integer
	pozycja As Point_2d
	pozycjaS As Point_2ds
	pozycja_shifted As Point_2d	''for faster collision check
	kierunek As Point_2d
	spada As Integer
	czynnosc As Integer	''co robi, stop - nawracanie, spadochron - opadanie
	klatka As Integer		''aktualna klatka animacji, domyslna grafika ma 6 klatek animacji
	aktywny As Integer	''is it active - podswietlenie ludzika
	last_poz_stania As Integer	''last standing Y position, potrzebne do sprawdzenia czy nie spadal ze zbyt wysokiego terenu
	czas_robienia As Integer
	czas_detonacji As Integer	''ile do zdetonowania, mniejsze niz 10 to detonowac
End Type

Const As Integer Max_ludziki = 99
Dim Shared As Struktura_ludzika tab_ludziki(Max_ludziki)
Dim Shared As Integer Aktualna_czynnosc, Robic_glowne
Dim Shared As Integer map_config_data(9)


#Include "pg_module.bas"
#Include "tmx_to_image.bas"


Declare Sub Main_loop()
Declare Sub Wyswietlanie()
Declare Function KeyPress(Key As Integer) As Integer
Declare Sub Sprawdz_klikniecie_game()
Declare Function Wczytaj_mape() As Integer


Dim Shared As Integer Tryb_gry, Przesuniecie_mapy_X, Przesuniecie_mapy_Y
Dim Shared As Integer Mysz_X, Mysz_Y, Mysz_przyciski
Dim Shared As UInteger tab_kolorow_ludziki(10)
Dim Shared As Integer Widoczne_ludziki, licznik_spawnu, ostatnio_stworzony_ludzik, Ile_uratowanych, Ile_uratowac, Nr_aktualnej_mapy, Ostatnio_zaznaczony_ludzik
Dim Shared As Integer Fps_juz, Fps_obliczone, lps_juz, lps_obliczone
Dim Shared As Integer Global_map_size_x, Global_map_size_y, Gra_trwa
Dim Shared As Integer tab_lldt(9)	''liczba_ludzikow_danego_typu

ScreenRes 640, 480, 32, 2

Dim As String czs1
Dim Shared map_surface As FB.Image Ptr
map_surface = ImageCreate(1, 1, , 32)
''BLoad "map1.bmp", map_surface
Dim Shared glowna_grafika As FB.Image Ptr
glowna_grafika = ImageCreate(290, 384, , 32)
BLoad "data\main.bmp", glowna_grafika


tryb_gry = 1
Aktualna_czynnosc = 1
Ustaw_Tryb_gry(2)


Dim Shared map_pixdata_ptr As Any Ptr, map_pitch As Integer, map_pixdata As UInteger Ptr
ImageInfo map_surface, , , ,map_pitch, map_pixdata_ptr
map_pixdata = map_pixdata_ptr
ReDim Shared As UByte map_tabdata(1, 1)


''helping terrain array
Dim As Integer czi1, czi2, czi3



tab_kolorow_ludziki(1) = &HFFFFAAAA
tab_kolorow_ludziki(2) = &HFFFF1111
tab_kolorow_ludziki(3) = &HFF1111FF
tab_kolorow_ludziki(4) = &HFFAA5555
tab_kolorow_ludziki(5) = &HFF555555
tab_kolorow_ludziki(6) = &HFFCCCCCC
tab_kolorow_ludziki(7) = &HFFAAAAAA
tab_kolorow_ludziki(8) = &HFF333333

''Print "dupczak"
''Draw String (0, 15),"LELUM"


Main_loop()


''cleanup
ImageDestroy(map_surface)
ImageDestroy(glowna_grafika)


''Sleep


End



Sub Main_loop()
Dim As Integer Robic_glowne1
Dim As Double Czas_fps, Czas_fps_stary, czas_lps, czas_lps_stary, czas_render, czas_render_last, czas_anim, czas_anim_last, czas_ui, czas_ui_last
Dim As Integer czi1, czi2, czi3, czi4, czi5, czig1, czig2, czig3, czig4
Dim As Integer map_max_ludziki, loc_mapsx, loc_mapsy	''loc_mapsx -> local_map_size_x

map_max_ludziki = map_config_data(0)
loc_mapsx = Global_map_size_x
loc_mapsy = Global_map_size_y
/'
For czi1 = 0 To map_max_ludziki
	tab_ludziki(czi1).widoczny = 1
	tab_ludziki(czi1).pozycjas.X = 100+Int(Rnd * 500)
	tab_ludziki(czi1).pozycjas.Y = 150
	tab_ludziki(czi1).kierunek.X = -1
	tab_ludziki(czi1).czynnosc = 1
Next
'/

''Robic_glowne1 = 1
Do While Robic_glowne
	map_max_ludziki = map_config_data(0)
	loc_mapsx = Global_map_size_x
	loc_mapsy = Global_map_size_y
	
	''free some cpu
	Sleep 20
	
	czas_lps = Timer()
	If (czas_lps - czas_lps_stary >= 0.0002) Then
	''game logic, desired to be 50 logic cycles per second
	If Tryb_gry = 1 Then
	widoczne_ludziki = 0
	For czi1 = 0 To map_max_ludziki
		If tab_ludziki(czi1).widoczny = 1 Then
			widoczne_ludziki += 1
			tab_ludziki(czi1).pozycja.X = Int(tab_ludziki(czi1).pozycjas.X)
			tab_ludziki(czi1).pozycja.y = Int(tab_ludziki(czi1).pozycjas.y)
			'tab_ludziki(czi1).pozycja_shifted.X = (tab_ludziki(czi1).pozycja.X-4) Shr 5
			'tab_ludziki(czi1).pozycja_shifted.y = (tab_ludziki(czi1).pozycja.Y-4) Shr 5
			''move in correct direction - if not falling, todo
			If tab_ludziki(czi1).spada = 0 Then
				'If tab_ludziki(czi1).pozycja.Y - tab_ludziki(czi1).last_poz_stania > 10 Then tab_ludziki(czi1).czynnosc = 1
				''zaleznie czy ludzik cos robi
				Select Case As Const tab_ludziki(czi1).czynnosc
					Case 1, 6, 7:	''normaln walking, spadochroniarz, wpinajacy sie
						''sprawdzic kolizje czy nie koliduje z nawracaczem
						
						For czi2 = 0 To map_max_ludziki
							If tab_ludziki(czi2).czynnosc = 2 Then
								czi3 = tab_ludziki(czi1).pozycja.X - tab_ludziki(czi2).pozycja.X
								If Abs(czi3) < 17 Then
									czi4 = tab_ludziki(czi1).pozycja.y - tab_ludziki(czi2).pozycja.y
									If Abs(czi4) < 7 Then
										''jest kolizja z bobem
										''jezeli to nawracacz, nawroc dziada
										If czi3 < 0 Then
											tab_ludziki(czi1).kierunek.X = -1
										Else
											tab_ludziki(czi1).kierunek.X = 1
										EndIf
										If tab_ludziki(czi1).czynnosc = 7 Then tab_ludziki(czi1).czynnosc = 1
										tab_ludziki(czi1).czas_robienia = 1
									EndIf
								EndIf
							EndIf
						Next czi2
						'/
						/'
						''buggy
						''new collision, using shifting - faster about 80% than this: If Abs(tab_ludziki(czi1).pozycja.X - tab_ludziki(czi2).pozycja.X) < 17 Then
						For czi2 = 0 To map_max_ludziki
							If tab_ludziki(czi2).czynnosc = 2 Then
								If tab_ludziki(czi1).pozycja_shifted.X = tab_ludziki(czi2).pozycja_shifted.X Then
									If tab_ludziki(czi1).pozycja_shifted.y = tab_ludziki(czi2).pozycja_shifted.y Then
										'WindowTitle("kolizja!")
										''jest kolizja z bobem
										''jezeli to nawracacz, nawroc dziada
										tab_ludziki(czi1).kierunek.X = -tab_ludziki(czi1).kierunek.X
										/'
										If czi3 < 0 Then
											tab_ludziki(czi1).kierunek.X = -1
										Else
											tab_ludziki(czi1).kierunek.X = 1
										EndIf'/
									EndIf
								EndIf
							EndIf
						Next czi2
						'/
						/'
						If Not tab_ludziki(czi1).kierunek.Y = 0 Then
							tab_ludziki(czi1).pozycjas.y += tab_ludziki(czi1).kierunek.Y
							tab_ludziki(czi1).kierunek.Y = 0
							Exit Select
						EndIf
						czi2 = 0
						czi3 = 0 ''opusc sprawdzanie, wystapil teren
						czi4 = 0
						For czi2 = 6 To 1 Step -1
							'If map_pixdata[(tab_ludziki(czi1).pozycja.X+tab_ludziki(czi1).kierunek.X) + (tab_ludziki(czi1).pozycja.y + czi2)*map_pitch] = &HFFFF00FF Then 
							If map_tabdata(tab_ludziki(czi1).pozycja.X+tab_ludziki(czi1).kierunek.X, tab_ludziki(czi1).pozycja.y + czi2) = 0 Then 
								'map_pixdata[(tab_ludziki(czi1).pozycja.X+tab_ludziki(czi1).kierunek.X)+tab_ludziki(czi1).pozycja.y*map_pitch] = 0
								Exit For
							ElseIf map_tabdata(tab_ludziki(czi1).pozycja.X+tab_ludziki(czi1).kierunek.X, tab_ludziki(czi1).pozycja.y + czi2) = 13 Then
								czi4 += 1
							EndIf
						Next
						For czi3 = 7 To 9
							'If Point(tab_ludziki(czi1).pozycja.X+tab_ludziki(czi1).kierunek.X, tab_ludziki(czi1).pozycja.y + czi3, map_surface) = &HFFFF00FF Then 
							If map_tabdata(tab_ludziki(czi1).pozycja.X+tab_ludziki(czi1).kierunek.X, tab_ludziki(czi1).pozycja.y + czi3) = 0 Then 
								Exit For
							EndIf
						Next
						If (czi2 = 6) Then
								tab_ludziki(czi1).pozycjaS.x += tab_ludziki(czi1).kierunek.X
						ElseIf (czi2 >= 4) Or (czi2>=2 And czi4>=2) Then
							tab_ludziki(czi1).pozycjaS.x += tab_ludziki(czi1).kierunek.X
							tab_ludziki(czi1).kierunek.Y = -(6 - czi2)
						ElseIf (czi3<9) Or (tab_ludziki(czi1).czynnosc = 7 And czi2<4)Then
							''sprawdz czy moze zejsc nizej
							tab_ludziki(czi1).kierunek.y = -(6 - czi2)
						Else
							''wzniesienie zbyt wysokie
							tab_ludziki(czi1).kierunek.X = -tab_ludziki(czi1).kierunek.X
						EndIf
						'/
						''trzeba tez sprawdzic czy sie zmiesci w tym przejsiu
						czi3 = 0
						For czi2 = 5 To -8 Step -1
							If (map_tabdata(tab_ludziki(czi1).pozycja.X+tab_ludziki(czi1).kierunek.X, tab_ludziki(czi1).pozycja.y + czi2) = 255) Then
								czi3 += 1
							EndIf
						Next
						If czi3<5 Then
							''new method
							If Not (map_tabdata(tab_ludziki(czi1).pozycja.X+tab_ludziki(czi1).kierunek.X, tab_ludziki(czi1).pozycja.y + 5) = 0) Then
								''sprawdz czy moze isc w gore
								For czi2 = 4 To -1 Step -1
									If map_tabdata(tab_ludziki(czi1).pozycja.X+tab_ludziki(czi1).kierunek.X, tab_ludziki(czi1).pozycja.y + czi2) = 0 Then 
										Exit For
									ElseIf map_tabdata(tab_ludziki(czi1).pozycja.X+tab_ludziki(czi1).kierunek.X, tab_ludziki(czi1).pozycja.y + czi2) = 13 Then
										czi4 += 1
									EndIf
								Next
								If (czi2>=3) Then	''moze wejsc normalnie, male wzniesienie
									tab_ludziki(czi1).pozycjaS.y -= 0.5
								ElseIf (czi2>=1 And czi4>0) Or (tab_ludziki(czi1).czynnosc = 7	) Then
									tab_ludziki(czi1).pozycjaS.y -= 0.5
								Else	''obroc kierunek
									tab_ludziki(czi1).kierunek.X = -tab_ludziki(czi1).kierunek.X
								EndIf
							ElseIf Not (map_tabdata(tab_ludziki(czi1).pozycja.X+tab_ludziki(czi1).kierunek.X, tab_ludziki(czi1).pozycja.y + 6) = 0) Then
								''idz w bok
								tab_ludziki(czi1).pozycjaS.x += tab_ludziki(czi1).kierunek.X
								''dla upewnienia sie, ze wspinajacy zamini sie w chodzacego
								If tab_ludziki(czi1).czas_robienia > 100 And tab_ludziki(czi1).czynnosc = 7 Then tab_ludziki(czi1).czynnosc = 1: tab_ludziki(czi1).czas_robienia = 1
							Else
								''schodz w dol, sprawdz czy spada
								For czi2 = 7 To 9
									If Not map_tabdata(tab_ludziki(czi1).pozycja.X+tab_ludziki(czi1).kierunek.X, tab_ludziki(czi1).pozycja.y + czi2) = 0 Then 
										Exit For
									EndIf
								Next
								If (czi2 < 9) Then
									''moze zejsc normalnie
									tab_ludziki(czi1).pozycjaS.y += 0.5
								Else	''zbyt stromo, spada
									tab_ludziki(czi1).spada = 1
									tab_ludziki(czi1).pozycjaS.x += tab_ludziki(czi1).kierunek.X
								EndIf
							EndIf
						ElseIf (tab_ludziki(czi1).czynnosc = 7	) Then	''pionowa sciana
							''sprawdz czy nie jest blokowany od gory
							For czi2 = 0 To -7 Step -1
								If (map_tabdata(tab_ludziki(czi1).pozycja.X, tab_ludziki(czi1).pozycja.y + czi2) = 255) Then Exit For
							Next czi2
							If czi2 < -5 Then
								''niemiesci sie ale jest wspinajacy
								tab_ludziki(czi1).pozycjaS.y -= 0.5
							Else
								tab_ludziki(czi1).kierunek.X = -tab_ludziki(czi1).kierunek.X
								tab_ludziki(czi1).czynnosc = 1: tab_ludziki(czi1).czas_robienia = 1
							EndIf
							
						Else
							''nie miesci sie
							tab_ludziki(czi1).kierunek.X = -tab_ludziki(czi1).kierunek.X
						EndIf
						If tab_ludziki(czi1).czas_robienia > 1000 Then tab_ludziki(czi1).czas_robienia = 0
						''check if in end platform
						If (tab_ludziki(czi1).pozycja.X > tab_platformy(0).X - 4) Then
							If (tab_ludziki(czi1).pozycja.X < tab_platformy(0).X + 20) Then
								If (tab_ludziki(czi1).pozycja.y > tab_platformy(0).y - 0) Then
									If (tab_ludziki(czi1).pozycja.y < tab_platformy(0).y + 32) Then
										''on platform
										ile_uratowanych += 1
										tab_ludziki(czi1).widoczny = 0
									EndIf
								EndIf
							EndIf
						EndIf
					Case 2:	''stopper, turn in opossite direction
					Case 3:	''builder, builder stairs
						For czi2 = 0 To (1*tab_ludziki(czi1).kierunek.X) Step tab_ludziki(czi1).kierunek.X
							For czi3 = 7 To 7
								PSet map_surface, (tab_ludziki(czi1).pozycja.X + czi2, tab_ludziki(czi1).pozycja.Y + czi3), &HFFFF3333
								map_tabdata(tab_ludziki(czi1).pozycja.X + czi2, tab_ludziki(czi1).pozycja.Y + czi3) = 13
							Next
							''PSet map_surface, (tab_ludziki(czi1).pozycja.X + czi2, tab_ludziki(czi1).pozycja.Y + 5), &HFFFF00FF
						Next
						tab_ludziki(czi1).pozycjas.Y -= 0.1
						tab_ludziki(czi1).pozycjas.x += (tab_ludziki(czi1).kierunek.X * 0.25)
						''sprawdz czy doszedl do krawedzi
						czi3 = 0
						For czi2 = -5 To 5
							'If Point (tab_ludziki(czi1).pozycja.X + (2*tab_ludziki(czi1).kierunek.X), tab_ludziki(czi1).pozycja.Y + czi2, map_surface) = &HFFFF00FF Then czi3 += 1
							If map_tabdata(tab_ludziki(czi1).pozycja.X + (2*tab_ludziki(czi1).kierunek.X), tab_ludziki(czi1).pozycja.Y + czi2) = 0 Then czi3 += 1
						Next czi2
						If czi3 < 7 Then tab_ludziki(czi1).czynnosc = 1
						If tab_ludziki(czi1).czas_robienia > 350 Then tab_ludziki(czi1).czynnosc = 1: tab_ludziki(czi1).czas_robienia = 1
					Case 4:	''driller
						For czi2 = -8 To 8
							PSet map_surface, (tab_ludziki(czi1).pozycja.X - czi2, tab_ludziki(czi1).pozycja.Y + 6), &HFFFF00FF
							PSet map_surface, (tab_ludziki(czi1).pozycja.X - czi2, tab_ludziki(czi1).pozycja.Y + 5), &HFFFF00FF
							map_tabdata(tab_ludziki(czi1).pozycja.X - czi2, tab_ludziki(czi1).pozycja.Y + 6) = 0
							map_tabdata(tab_ludziki(czi1).pozycja.X - czi2, tab_ludziki(czi1).pozycja.Y + 5) = 0
						Next
						tab_ludziki(czi1).pozycjas.Y += 0.5
						If tab_ludziki(czi1).czas_robienia > 200 Then tab_ludziki(czi1).czynnosc = 1
						''check if falling
						If map_tabdata(tab_ludziki(czi1).pozycja.X, tab_ludziki(czi1).pozycja.y + 7) = 0 Then
							tab_ludziki(czi1).spada = 1
							tab_ludziki(czi1).czynnosc = 1
							tab_ludziki(czi1).pozycjas.y += 2
						EndIf
					Case 5:	''wall destroyer
						For czi3 = 1*tab_ludziki(czi1).kierunek.X To 5*tab_ludziki(czi1).kierunek.X Step tab_ludziki(czi1).kierunek.X
							For czi2 = -13 To 5
								PSet map_surface, (tab_ludziki(czi1).pozycja.X + czi3, tab_ludziki(czi1).pozycja.Y + czi2), &HFFFF00FF
								map_tabdata(tab_ludziki(czi1).pozycja.X + czi3, tab_ludziki(czi1).pozycja.Y + czi2) = 0
							Next
						Next
						tab_ludziki(czi1).pozycjas.x += tab_ludziki(czi1).kierunek.X*0.5
						If tab_ludziki(czi1).czas_robienia > 100 Then tab_ludziki(czi1).czynnosc = 1
						If map_tabdata(tab_ludziki(czi1).pozycja.X, tab_ludziki(czi1).pozycja.y + 7) = 0 Then
							tab_ludziki(czi1).spada = 1
							tab_ludziki(czi1).czynnosc = 1
							tab_ludziki(czi1).pozycjas.y += 2
						EndIf
						''check if no wall
						/'
						czi3 = 0
						For czi2 = 5 To -8 Step -1
							If (map_tabdata(tab_ludziki(czi1).pozycja.X+6*tab_ludziki(czi1).kierunek.X, tab_ludziki(czi1).pozycja.y + czi2) = 255) Then
								czi3 += 1
							EndIf
						Next
						If czi3 < 5 Then tab_ludziki(czi1).czynnosc = 1
						'/
				End Select
				tab_ludziki(czi1).last_poz_stania = tab_ludziki(czi1).pozycja.Y
				tab_ludziki(czi1).czas_robienia += 1
			Else	''spada
			
			''fall down
			If (tab_ludziki(czi1).pozycja.Y > loc_mapsy) Then tab_ludziki(czi1).widoczny = 0
			'If Point(tab_ludziki(czi1).pozycja.X, tab_ludziki(czi1).pozycja.y + 7, map_surface) = &HFFFF00FF Then
			If map_tabdata(tab_ludziki(czi1).pozycja.X, tab_ludziki(czi1).pozycja.y + 7) = 0 Then
				If Not tab_ludziki(czi1).czynnosc = 7 Then
					tab_ludziki(czi1).spada = 1
					If tab_ludziki(czi1).czynnosc = 6 Then
						tab_ludziki(czi1).pozycjas.y += 0.5
					Else
						''jezeli nie spadochroniarz to zmien na chodzacego
						tab_ludziki(czi1).czynnosc = 1
						tab_ludziki(czi1).pozycjas.y += 2
					EndIf
				Else	''spada wspinajacy sie
					tab_ludziki(czi1).spada = 1
					tab_ludziki(czi1).pozycjas.y += 2
				EndIf
			Else
				''check
				tab_ludziki(czi1).spada = 0
				If (tab_ludziki(czi1).pozycja.Y - tab_ludziki(czi1).last_poz_stania > 100) Then
					''ludzik sie zabil, spadal z klifu
					If (tab_ludziki(czi1).czynnosc = 6) Then
						tab_ludziki(czi1).czynnosc = 1
					Else
						tab_ludziki(czi1).widoczny = 0	''die
					EndIf
				Else
					''tab_ludziki(czi1).czynnosc = 1
				EndIf
			EndIf
			
			EndIf
			''out of bounds
			If (tab_ludziki(czi1).pozycjaS.x <= 2 Or tab_ludziki(czi1).pozycjaS.x	>= loc_mapsx) Then
				''WindowTitle("znikl")
				tab_ludziki(czi1).widoczny = 0			
			ElseIf (tab_ludziki(czi1).pozycjaS.y <= 2 Or tab_ludziki(czi1).pozycjaS.y	>= loc_mapsy) Then
				tab_ludziki(czi1).widoczny = 0				
			EndIf
			'';]
		EndIf
	Next
	licznik_spawnu += 1
	If licznik_spawnu >= 50 Then
		''drop one lemming
		''WindowTitle("tera: " & Str(ostatnio_stworzony_ludzik) & ", max: " & Str(map_max_ludziki))
		If ostatnio_stworzony_ludzik <= map_max_ludziki Then	''map_config_data(0)
			tab_ludziki(ostatnio_stworzony_ludzik).pozycjaS.x = tab_platformy(1).X+8 '+24
			tab_ludziki(ostatnio_stworzony_ludzik).pozycjaS.y = tab_platformy(1).y+4 '+28
			tab_ludziki(ostatnio_stworzony_ludzik).last_poz_stania = tab_ludziki(ostatnio_stworzony_ludzik).pozycjaS.y
			tab_ludziki(ostatnio_stworzony_ludzik).widoczny = 1
			tab_ludziki(ostatnio_stworzony_ludzik).kierunek.x = 1
			tab_ludziki(ostatnio_stworzony_ludzik).czynnosc = 1
			tab_ludziki(ostatnio_stworzony_ludzik).spada = 1
			tab_ludziki(ostatnio_stworzony_ludzik).czas_robienia = 0
			tab_ludziki(ostatnio_stworzony_ludzik).czas_detonacji = 10
			ostatnio_stworzony_ludzik += 1
		EndIf
		licznik_spawnu = 0
	EndIf
	EndIf
	czas_lps_stary = czas_lps
	lps_juz += 1
	EndIf
	
	
	''animations
	czas_anim = Timer()
	If (czas_anim - czas_anim_last >= 0.075) Then
		''nastepne klatki animacji
		For czi1 = 0 To map_max_ludziki
			If tab_ludziki(czi1).widoczny = 1 Then
				tab_ludziki(czi1).klatka += 1
				If tab_ludziki(czi1).klatka >=7 Then tab_ludziki(czi1).klatka = 1
			EndIf
		Next czi1
		czas_anim_last = czas_anim
	EndIf	

	''render
	czas_render = Timer()
	If (czas_render - czas_render_last >= 0.02) Then
		For czi1 = 1 To 8
			tab_lldt(czi1) = 0
		Next czi1
		For czi1 = 0 To map_max_ludziki
			If tab_ludziki(czi1).widoczny = 1 Then
				tab_lldt(tab_ludziki(czi1).czynnosc) += 1
				If tab_ludziki(czi1).czas_detonacji < 10 Then tab_lldt(8) += 1
			EndIf
		Next czi1
		Wyswietlanie()
		fps_juz+=1
		czas_render_last = czas_render
	EndIf
	
	''key input
	czas_ui = Timer()
	If (czas_ui - czas_ui_last >= 0.02) Then
		If (KeyPress(FB.SC_Escape)) Then
			Select Case Tryb_gry
				Case 1: Ustaw_Tryb_gry(7)
				Case 7: Ustaw_Tryb_gry(1)
			End Select
		EndIf
		
		
		If (MultiKey(FB.SC_Right)) Then Przesuniecie_mapy_x -= 5
		If (MultiKey(FB.SC_Left)) Then Przesuniecie_mapy_x += 5
		If Przesuniecie_mapy_X < (640 - Global_map_size_x) Then	''-300
			Przesuniecie_mapy_X = (640 - Global_map_size_x)
		ElseIf Przesuniecie_mapy_X > 0 Then
			Przesuniecie_mapy_X = 0
		EndIf
		If (MultiKey(FB.SC_Up)) Then Przesuniecie_mapy_y += 5
		If (MultiKey(FB.SC_Down)) Then Przesuniecie_mapy_y -= 5
		If Przesuniecie_mapy_y < (400 - Global_map_size_y) Then	''-90
			Przesuniecie_mapy_y = (400 - Global_map_size_y)
		ElseIf Przesuniecie_mapy_y > 0 Then
			Przesuniecie_mapy_y = 0
		EndIf
	
		If (MultiKey(FB.SC_1)) Then Aktualna_czynnosc = 1
		If (MultiKey(FB.SC_2)) Then Aktualna_czynnosc = 2
		If (MultiKey(FB.SC_3)) Then Aktualna_czynnosc = 3
		If (MultiKey(FB.SC_4)) Then Aktualna_czynnosc = 4
		If (MultiKey(FB.SC_5)) Then Aktualna_czynnosc = 5
		If (MultiKey(FB.SC_6)) Then Aktualna_czynnosc = 6
		If (MultiKey(FB.SC_7)) Then Aktualna_czynnosc = 7
		If (MultiKey(FB.SC_8)) Then Aktualna_czynnosc = 8
		
		''deselect selected unit
		''tab_ludziki(czi1).aktywny = 0
		If Not (Ostatnio_zaznaczony_ludzik = -1) Then
			tab_ludziki(Ostatnio_zaznaczony_ludzik).aktywny = 0
		Else
			Ostatnio_zaznaczony_ludzik = -1	''nothing
		EndIf
		
		''if mouse on window
		''If GetMouse(Mysz_x, Mysz_y, , Mysz_przyciski) = 0 Then
		If GetMouse(Kursor_myszy.X, Kursor_myszy.Y, , Przyciski_myszy) = 0 Then
			Sprawdz_zaznaczenie()
			Sprawdz_klikniecie()
			Sprawdz_klikniecie_game()
		EndIf
		
		czas_ui_last = czas_ui	
	EndIf
	
	
	''fps
	czas_fps = Timer()
	If (czas_fps - czas_fps_stary >= 1) Then
		fps_obliczone = fps_juz
		fps_juz = 0
		lps_obliczone = lps_juz
		lps_juz = 0
		czas_fps_stary = czas_fps
		
		If (tryb_gry = 1) And (widoczne_ludziki = 0) And (ostatnio_stworzony_ludzik > 0) Then
			Ustaw_Tryb_gry(3)
		EndIf
		
		For czi1 = 0 To map_max_ludziki
			If tab_ludziki(czi1).widoczny = 1 Then
				If tab_ludziki(czi1).czas_detonacji < 10 Then
					tab_ludziki(czi1).czas_detonacji -= 1
					If tab_ludziki(czi1).czas_detonacji = 0 Then
						''dodaj detonacje i wybusz
						tab_ludziki(czi1).czas_detonacji = 10
						tab_ludziki(czi1).widoczny = 0
						
						Circle map_surface, (tab_ludziki(czi1).pozycja.X, tab_ludziki(czi1).pozycja.Y), 15, &HFFFF00FF, , , ,F
						For czi2 = -15 To 15
							For czi3 = -15 To 15
								If Point(tab_ludziki(czi1).pozycja.X + czi3, tab_ludziki(czi1).pozycja.Y + czi2, map_surface) = &HFFFF00FF Then
									map_tabdata(tab_ludziki(czi1).pozycja.X + czi3, tab_ludziki(czi1).pozycja.Y + czi2) = 0
								EndIf
							Next
						Next

					EndIf
				EndIf
			EndIf
		Next czi1
		
		''WindowTitle("tryb gy: " & Str(tryb_gry))
	EndIf
	
Loop


End Sub



''render
Sub Wyswietlanie()
Dim As Integer czi1, czi2, czi3, czi4
Dim As Integer czig1, czig2, czig3, czig4
Dim As Integer map_max_ludziki

map_max_ludziki = map_config_data(0)
	
ScreenLock
Line (0,0)-(639,479), &HFF3333BB, bf

Select Case As Const Tryb_gry
	Case 1	''game
	
	''Cls
		Put (Przesuniecie_mapy_x,Przesuniecie_mapy_y), map_surface, Trans
	''draw start/end platform
	''new platform
	Put (tab_platformy(0).X + przesuniecie_mapy_x -16, tab_platformy(0).y + przesuniecie_mapy_y -8), glowna_grafika, (40, 332)-(87,373), Trans
	Put (tab_platformy(1).X + przesuniecie_mapy_x -12, tab_platformy(1).y + przesuniecie_mapy_y -16), glowna_grafika, (0, 326)-(39,349), Trans
	''Line (tab_platformy(0).X + przesuniecie_mapy_x-4, tab_platformy(0).y + przesuniecie_mapy_y-0)-(tab_platformy(0).X+20 + przesuniecie_mapy_x, tab_platformy(0).y+32 + przesuniecie_mapy_y), &HFFAAAAFF, bf
	''Line (tab_platformy(1).X + przesuniecie_mapy_x, tab_platformy(1).y + przesuniecie_mapy_y)-(tab_platformy(1).X+48 + przesuniecie_mapy_x, tab_platformy(1).y+32 + przesuniecie_mapy_y), &HFF00FF00, bf
	
	
	For czi1 = 0 To map_max_ludziki
		If tab_ludziki(czi1).widoczny = 1 Then
			''nowy sposob z grafiki
			''normalna
			If tab_ludziki(czi1).kierunek.x = 1 Then
				Put (tab_ludziki(czi1).pozycja.X - 20 + przesuniecie_mapy_x, tab_ludziki(czi1).pozycja.Y - 31 + przesuniecie_mapy_y), glowna_grafika, (tab_ludziki(czi1).klatka*40-40, 32+tab_ludziki(czi1).czynnosc*42-42)-(tab_ludziki(czi1).klatka*40, 32+tab_ludziki(czi1).czynnosc*42-1), Trans
			Else
				''odbicie lustrzane
				czig2 = tab_ludziki(czi1).pozycja.X - 20 + przesuniecie_mapy_x
				czig3 = 32+tab_ludziki(czi1).czynnosc*42-42
				czig4 = 32+tab_ludziki(czi1).czynnosc*42-1
				For czig1 = tab_ludziki(czi1).klatka*40 To tab_ludziki(czi1).klatka*40-40 Step -1
					Put (czig2, tab_ludziki(czi1).pozycja.Y - 31 + przesuniecie_mapy_y), glowna_grafika, (czig1, czig3)-(czig1, czig4), Trans
					czig2 += 1
				Next czig1
			EndIf
			
			If tab_ludziki(czi1).aktywny = 1 Then
				Line (tab_ludziki(czi1).pozycja.X - 22 + przesuniecie_mapy_x, tab_ludziki(czi1).pozycja.Y - 33 + przesuniecie_mapy_y) - (tab_ludziki(czi1).pozycja.X + 22 + przesuniecie_mapy_x, tab_ludziki(czi1).pozycja.Y + 11 + przesuniecie_mapy_y), &HFF333333, B
				Line (tab_ludziki(czi1).pozycja.X - 21 + przesuniecie_mapy_x, tab_ludziki(czi1).pozycja.Y - 32 + przesuniecie_mapy_y) - (tab_ludziki(czi1).pozycja.X + 21 + przesuniecie_mapy_x, tab_ludziki(czi1).pozycja.Y + 10 + przesuniecie_mapy_y), &HFF707070, B
				''tab_ludziki(czi1).aktywny = 0
			EndIf
			''kolor zalezny od czynnosci
			''Circle (tab_ludziki(czi1).pozycja.X + przesuniecie_mapy_x, tab_ludziki(czi1).pozycja.Y + przesuniecie_mapy_y), 8, tab_kolorow_ludziki(tab_ludziki(czi1).czynnosc), , , ,F
			''Circle (tab_ludziki(czi1).pozycja.X + przesuniecie_mapy_x, tab_ludziki(czi1).pozycja.Y + przesuniecie_mapy_y), 11, &HFFAAFFAA, , , ,F
			''sprawdz czy wybucha - wyswietlanie napisu
			If tab_ludziki(czi1).czas_detonacji < 10 Then
				Draw String (tab_ludziki(czi1).pozycja.X + przesuniecie_mapy_x - 3, tab_ludziki(czi1).pozycja.Y + przesuniecie_mapy_y - 30),  Str(tab_ludziki(czi1).czas_detonacji)
			EndIf
		EndIf
	Next

/'
	For czi1 = 0 To Global_map_size_y - 1
		For czi2 = 0 To Global_map_size_x - 1
			PSet (czi2, czi1), RGB(map_tabdata(czi2, czi1), map_tabdata(czi2, czi1), map_tabdata(czi2, czi1))
		Next
	Next
'/

	''wyswietlanie panelu
	Line (0, 400)-(639, 479), &HFF806040, bf
	/'
	Line (30 + Aktualna_czynnosc*50 - 4, 421)-(30 + Aktualna_czynnosc*50 + 35, 460), &HFF000000, b
	Line (30 + Aktualna_czynnosc*50 - 3, 422)-(30 + Aktualna_czynnosc*50 + 34, 459), &HFF707070, b
	Line (30 + Aktualna_czynnosc*50 - 2, 423)-(30 + Aktualna_czynnosc*50 + 33, 458), &HFFA0A0A0, b
	'/
	Line (30 + Aktualna_czynnosc*50 - 4, 421)-(30 + Aktualna_czynnosc*50 + 35, 460), &HFF005000, b
	Line (30 + Aktualna_czynnosc*50 - 3, 422)-(30 + Aktualna_czynnosc*50 + 34, 459), &HFF009000, b
	Line (30 + Aktualna_czynnosc*50 - 2, 423)-(30 + Aktualna_czynnosc*50 + 33, 458), &HFF00C000, b
	
	Rysuj_PG()
	
	For czi1 = 1 To 9
		''Circle (50 + czi1*50, 450), 15, tab_kolorow_ludziki(czi1), , , ,F
		''new
		Put (30 + czi1*50, 425), glowna_grafika, (czi1*32-32, 0)-(czi1*32-2, 30), Trans
		Draw String (40 + czi1*50, 410), Str(tab_lldt(czi1))
		If czi1 > 1 And czi1 < 9 Then
			Draw String (40 + czi1*50, 465), Str(map_config_data(czi1))
		EndIf
	Next
	Draw String (10, 410), "Curr: "
	Draw String (10, 465), "Max: "
	
	Draw String (0,0), "FPS: " & Str(fps_obliczone) & ", Lps: " & Str(lps_obliczone)
	Draw String (0, 10), "Aktualna czynnosc: " & Str(aktualna_czynnosc) & ", last created: " & Str(ostatnio_stworzony_ludzik)
	Draw String (0, 20), "ludzik0: " & Str(tab_ludziki(0).pozycja.X) & "x" & Str(tab_ludziki(0).pozycja.Y) & ", single: "  & Str(tab_ludziki(0).pozycjas.X) & "x" & Str(tab_ludziki(0).pozycjas.Y) & ", czynnosc: " & Str(tab_ludziki(0).czynnosc) & ", spada: " & Str(tab_ludziki(0).spada)
	Draw String (0, 30), "widoczne: " & Str(widoczne_ludziki) & "/" & Str(map_max_ludziki+1) & ", uratowane: " & Str(ile_uratowanych)
	


End Select

If Not (tryb_gry = 1) Then Rysuj_PG()
ScreenUnLock

	
End Sub


''KeyPress function by vdecampo
''http://www.freebasic.net/forum/viewtopic.php?t=10398
Function KeyPress(Key As Integer) As Integer
Static LastKey(255) As Integer

        If MultiKey(Key) = -1 Then
                If Key = LastKey(Key) Then
                        Return (0)
                Else
                        LastKey(Key)=Key
                        Return (-1)
                Endif
        Else
                LastKey(Key)=0
                Return (0)
        End If

End Function


Sub Sprawdz_klikniecie_game()
Dim As Integer czi1, czi2

	
Select Case As Const Tryb_gry
	Case 1	''game
		For czi1 = map_config_data(0) To 0 Step -1
			If (tab_ludziki(czi1).widoczny = 1) Then
				If Abs(tab_ludziki(czi1).pozycja.X + przesuniecie_mapy_x - Kursor_myszy.x) < 13 Then
					If Abs(tab_ludziki(czi1).pozycja.y + przesuniecie_mapy_y - Kursor_myszy.y) < 13 Then
						tab_ludziki(czi1).aktywny = 1
						Ostatnio_zaznaczony_ludzik = czi1
						''if clicked then change state of egg
						If (Przyciski_myszy And 1) Then 
							If Not (tab_ludziki(czi1).spada=1) Then
								If (map_config_data(Aktualna_czynnosc) > 0) Then
									If Aktualna_czynnosc < 8 And (tab_ludziki(czi1).czynnosc=1) Then
										tab_ludziki(czi1).czynnosc = Aktualna_czynnosc
										tab_ludziki(czi1).czas_robienia = 0
										map_config_data(Aktualna_czynnosc) -= 1
									ElseIf Aktualna_czynnosc = 8 Then
										''tab_ludziki(czi1).czynnosc = 1
										tab_ludziki(czi1).czas_robienia = 0
										tab_ludziki(czi1).czas_detonacji = 6
										map_config_data(Aktualna_czynnosc) -= 1
									EndIf
								EndIf
							EndIf
						EndIf
						Exit For
					EndIf
				EndIf
			EndIf
		Next
End Select


End Sub



Function Wczytaj_mape() As Integer
''wczytywanie mapy poprzez plik mapXX.dat
''zwracane wartosci:
''0 - poprawne
''1 - nie mozna otworzyc pliku
''2 - plik otwarty, problem z odczytaniem
''3 - tmx loading error
Dim As String czs1
Dim As Integer wp1, czi1, czi2, czi3
Dim As Integer tab_data(9)

czi1 = 0
wp1 = FreeFile
If Not (Open("maps\map" & Str(nr_aktualnej_mapy) & ".dat" For Input As #wp1)) Then
	Do While Not Eof(wp1) And czi1 < 10
		Input #wp1, czs1
		tab_data(czi1) = Val(czs1)
		czi1 += 1
	Loop
Close #wp1
Else
	''map loading error
	Return 1
EndIf


For czi1 = 0 To 9
	map_config_data(czi1) = tab_data(czi1)
Next czi1


ImageDestroy(map_surface)
If Not Convert_tmx_to_image("maps\map" & Str(nr_aktualnej_mapy) & ".tmx", map_surface, czs1, Global_map_size_x, Global_map_size_y) = 0 Then
	Print "Map loading error! tmx loading sub, Info: " & czs1
	Sleep 3000
	Return 3
EndIf


ReDim map_tabdata(Global_map_size_x, Global_map_size_y) As UByte
''creating help table for checking ground
For czi1 = 0 To Global_map_size_y - 1
	For czi2 = 0 To Global_map_size_x - 1
		If Point(czi2, czi1, map_surface) = &HFFFF00FF Then
			map_tabdata(czi2, czi1) = 0
		Else
			map_tabdata(czi2, czi1) = 255
			''PSet (czi2, czi1), &HFFFFFFFF
		EndIf
	Next
Next

''Sleep

Return 0	''all ok

End Function



Public Sub Ustaw_Tryb_gry(ByVal ustawiany_tryb As UByte)
Dim As Integer czi1, czi2
Dim As String czs1
Wyczysc_PG()
Tryb_gry = ustawiany_tryb
	
	Select Case As Const ustawiany_tryb
		Case 0	''not specifed, clearing variables
			Robic_glowne = 1
			nr_aktualnej_mapy = 1
			Line (0, 160)-(640, 480), RGB(200, 200, 210), bf
			Wczytaj_mape()
			
		Case 1	''game
			''something
			Robic_glowne = 1
			Wyczysc_PG()
			For czi1 = 1 To 8
				''Put (35 + czi1*50, 425), glowna_grafika, (czi1*32-32, 0)-(czi1*32-2, 30), Trans
				Dodaj_przycisk_PG(Podstaw_Point2D(29 + czi1*50, 424), Podstaw_Point2D(34, 34), 3, "", 0, 3, czi1)
			Next
			Dodaj_przycisk_PG(Podstaw_Point2D(29 + 9*50, 424), Podstaw_Point2D(34, 34), 3, "x", 0, 4, 0)
			Aktualna_czynnosc = 1
			Gra_trwa = 1
		
		Case 2	''main menu
			Robic_glowne = 1
			nr_aktualnej_mapy = 1
			''add PG elements
			Wyczysc_PG()
			Dodaj_przycisk_PG(Podstaw_Point2D(260, 150), Podstaw_Point2D(120, 30), 3, "Play Game", 0, 1, 3)
			Dodaj_przycisk_PG(Podstaw_Point2D(260, 200), Podstaw_Point2D(120, 30), 3, "Options", 0, 1, 4)
			Dodaj_przycisk_PG(Podstaw_Point2D(260, 250), Podstaw_Point2D(120, 30), 3, "Credits", 0, 0, 0)
			Dodaj_przycisk_PG(Podstaw_Point2D(260, 300), Podstaw_Point2D(120, 30), 3, "Exit Game", 0, 1, 6)
			Gra_trwa = 0
			
			/'
			For czi1 = 0 To czi2 Step 10
				Line (0, czi1)-(640, czi1+9), RGB(80/czi2*czi1, 80/czi2*czi1, 180+70/czi2*czi1), bf
				Line (0, 480-czi1)-(640, 480-czi1+9), RGB(180-100/czi2*czi1, 180-100/czi2*czi1, 250), bf
			Next czi1
			Line (0, 0)-(640, 480), &HFF007fff, bf
			For czi1 = 0 To 240
				Line (0, czi1)-(640, czi1), RGB(0, 63+Int(64/240*czi1), 191+Int(64/240*czi1)), bf
			Next
			'/

		Case 3	''Play Game
			Wyczysc_PG()
			Dodaj_przycisk_PG(Podstaw_Point2D(240, 350), Podstaw_Point2D(160, 30), 3, "<<-- Back to menu", 0, 1, 2)
			If Gra_trwa = 1 Then
				Dodaj_etykiete_PG(Podstaw_Point2D(220, 100), Podstaw_Point2D(200, 30), 4, "You should save: " & Str(map_config_data(1)), 0, 0, 0)
				Dodaj_etykiete_PG(Podstaw_Point2D(220, 130), Podstaw_Point2D(200, 30), 4, "You have saved: " & Str(Ile_uratowanych), 0, 0, 0)
				''podzial ze wzgledu czy osiagnieta zmaierzana ilosc ocalonych
				If (Ile_uratowanych < map_config_data(1)) Then
					''lose, replay this level
					Dodaj_etykiete_PG(Podstaw_Point2D(220, 180), Podstaw_Point2D(200, 30), 4, "You have lost!", 0, 0, 0)
					Dodaj_przycisk_PG(Podstaw_Point2D(250, 250), Podstaw_Point2D(140, 30), 3, "Replay level", 0, 1, 8)
				Else
					''won, play next level
					Dodaj_etykiete_PG(Podstaw_Point2D(220, 180), Podstaw_Point2D(200, 30), 4, "You have won!", 0, 0, 0)
					Dodaj_przycisk_PG(Podstaw_Point2D(250, 250), Podstaw_Point2D(140, 30), 3, "Play next level", 0, 1, 8)
					
					For czi1 = nr_aktualnej_mapy To 100
						If FileExists("maps\map" & Str(czi1) & ".dat") Then
							''znaleziono mape
							nr_aktualnej_mapy = czi1
							Exit For
						EndIf
					Next czi1
					If nr_aktualnej_mapy = 100 Then nr_aktualnej_mapy = 1: Ustaw_Tryb_gry(2)
				EndIf
			Else
				Dodaj_przycisk_PG(Podstaw_Point2D(250, 250), Podstaw_Point2D(140, 30), 3, "Play level", 0, 1, 8)
			EndIf
			
		Case 4	''options
			Wyczysc_PG()
			''Dodaj_przycisk_PG(Podstaw_Point2D(220, 150), Podstaw_Point2D(200, 30), 3, "Resolution", 0, 0, 0)
			Dodaj_przycisk_PG(Podstaw_Point2D(220, 190), Podstaw_Point2D(200, 30), 3, "Full Screen", 0, 3, 0)
			Dodaj_przycisk_PG(Podstaw_Point2D(220, 230), Podstaw_Point2D(200, 30), 3, "Music Volume", 0, 0, 0)
			Dodaj_przycisk_PG(Podstaw_Point2D(220, 270), Podstaw_Point2D(200, 30), 3, "Sound Volume", 0, 0, 0)
			''Dodaj_pole_tekstowe_PG(Podstaw_Point2D(420, 310), Podstaw_Point2D(200, 30), 6, Str(net_port), 0, 3, 0)
			
			Dodaj_przycisk_PG(Podstaw_Point2D(260, 350), Podstaw_Point2D(120, 30), 3, "<<-- Back", 0, 1, 2)

		Case 5	''credits
			Ustaw_Tryb_gry(2)

		Case 6	''exit game
			Wyczysc_PG()
			Dodaj_etykiete_PG(Podstaw_Point2D(160, 150), Podstaw_Point2D(330, 30), 4, "Do You really want to exit game?", 0, 0, 0)
			Dodaj_przycisk_PG(Podstaw_Point2D(200, 200), Podstaw_Point2D(60, 30), 3, "Yes", 0, 1, 255)
			Dodaj_przycisk_PG(Podstaw_Point2D(380, 200), Podstaw_Point2D(60, 30), 3, "No", 0, 1, 2)
			
		Case 7	''pause
			Wyczysc_PG()
			Dodaj_etykiete_PG(Podstaw_Point2D(250, 150), Podstaw_Point2D(140, 30), 4, "Pause", 0, 0, 0)
			Dodaj_przycisk_PG(Podstaw_Point2D(250, 200), Podstaw_Point2D(140, 30), 3, "Return to menu", 0, 1, 2)
			Dodaj_przycisk_PG(Podstaw_Point2D(250, 350), Podstaw_Point2D(140, 30), 3, "<<-- Back", 0, 1, 1)
		
		Case 8	''loading game
			Wyczysc_PG()
			Cls
			Print "Loading..."
			Robic_glowne = 1
			Wyczysc_PG()
			For czi1 = 0 To max_ludziki
				tab_ludziki(czi1).widoczny = 0
				tab_ludziki(czi1).pozycjaS.x = -100
				tab_ludziki(czi1).czynnosc = 1
			Next
			Wczytaj_mape()
			ostatnio_stworzony_ludzik = 0
			''wyswietla info ile trzeba ocalic
			Draw String (240, 230), "You must save: " & map_config_data(1) & " eggs."
			Draw String (240, 300), "Press any key to continue."
			Sleep
			Ustaw_Tryb_gry(1)

		Case 255	''exit game
			Robic_glowne = 0
	End Select

	
End Sub
