'' Проект - КАРКАС, с разделами для порядка и удобства.
'' ----------------------------------------------------------------------------
'' Название проекта (игры):
'' Автор(ы) проекта: 
'' Дата начала создания проекта:
'' Дата окончания проекта:
'' ----------------------------------------------------------------------------
'' Краткое описание.
'' 
'' 
'' ----------------------------------------------------------------------------
'' Для удобства уберём подключение заголовков, а также разные пользовательские
'' (т.е. созданные вами) функции в отдельный модуль, который мы подключаем здесь,
'' в самом начале проекта.
#include "Options.bas"
'' Для удобства и порядка в коде можно убрать переменные, первоначальные настройки
'' и меню в отдельные модули и затем здесь подключить их.
'' ------------------------------------------------------------------------------
'' ГЛОБАЛЬНЫЕ ПЕРЕМЕННЫЕ
'' Для порядка в коде лучше разделить объявление переменных по типам, тогда сразу
'' будет видно, где какая переменная.

'' [1.] Для работы со звуками


'' [2.] Объекты WorldSim3D (Меши, Ноды, Текстуры, Камеры, Селекторы и т.д.)
Dim MapMesh As wMesh
DIM MapNode as wNode

DIM BotMesh as wMesh
DIM BotNode as wNode
Dim BotTexture As wTexture

Dim tech_num As Int32 = 103                           ' количество технологий 
DIM TechMesh as wMesh
DIM TechNode (1 To tech_num) as wNode
Dim TechTexture As wTexture

DIM Camera as wCamera
DIM CameraNode as wNode
DIM MapCollision as wSelector
Dim menu_font as wFont
DIM Collision_anim as wSelector
DIM KeyEvent as wKEY_EVENT PTR
DIM MouseEvent as wMOUSE_EVENT Ptr

DIM SkyBox as wNode
'' [3.] Другие переменные, не связанные напрямую с объектами и звуком. Это могут быть
'' разные флаги, счётчики, математика, а также для отладочных целей.
DIM XPOS as Float32
DIM YPOS as Float32
DIM ZPOS as Float32
DIM metrics as wstring * 256
Dim vX as wVECTOR
DIM vY as wVECTOR
DIM vZ as wVECTOR
DIM i As Int32
Dim flag As Int32
Dim Light As wNode

Dim As Float32 XPosition, YPosition, ZPosition 'положение 1-й камеры
'' [4.] Для работы с текстом, если в проекте много разных сообщений, выводимых на экран, например,
'' тексты для меню, диалогов между персонажами, GUI и т.д.
Dim gameover_mes As String

'' [5.] Для сохранения состояния игры, первоначальных настроек игры, таблицы результатов (рекордов)
'' и т.д.
Dim power As Float32 = 1000				'уровень здоровья игрока, в начале 100
'' [6.] Другие переменные, не вошедшие в предыдущие разделы.

'' Естественно, в зависимосчти от типа вашего проекта, какие-то разделы переменных вам не понадобятся,
'' а какие-то, наоборот, вы захотите добавить.
Dim distance_obs (1 To 3) As Float32 	'расстояние между камерой и 3-мя препятствиями
Dim b As Int32 								'счётчик для цикла проверки расстояния до препятствий
Dim obs As Int32 = 0 						'флаг для того, чтобы знать столкнулся ли игрок с препятствием

Dim Tech_sprite As wTexture 			'текстура для спрайта кристалла

Dim distance_cryst (1 To tech_num) As Float32 	'расстояние между камерой и технологиями
Dim closest_dist_cryst As Float32 = 49999 ' расстояние до ближайшего кристалла
Dim closest_cryst_ID As Int32			'номер (ID) ближайшего к камере кристалла
Dim c As Int32 								'счётчик для цикла проверки расстояния до кристаллов
Dim cryst As Int32 = 0					'сколько взято кристаллов; счётчик, чтобы вывести столько же спрайтов на экран
Dim cryst_near As Int32 = 0				'флаг - подошёл ли игрок к кристаллу на такое расстояние, чтобы его взять (0 - нет, 1 - да)
Dim collected_tech As Int32 = 0             ' сколько собрано технологий

Dim distance_start As Float32 				'расстояние до входа в лабиринт (Старт)
Dim start As Int32 = 0					'флаг для проверки, подошёл ли игрок к входу в лабиринт (Старту)

Dim distance_finish As Float32 			'расстояние до выхода из лабиринта (Финиш)
Dim finish As Int32 = 0					'флаг для проверки, подошёл ли игрок к выходу из лабиринта (Финишу)

DIM keyMapArray(0 To 4) as wKeyMap 		'массив для переопределения клавиш упрвления ФПС-камерой

Dim gameover As Int32 = 0 				'флаг для определения, проиграна ли игра. Если 1, то проиграна, или
													'если в игре несколько уровней, то уровень не пройден.

' =============================================================================================
'' =============================================================================================
'' Запускаем интерфейс WorldSim3D
wStartAdvanced ( wDT_OPENGL, scr_wid, scr_hei, bits_per_pix, fullscr, TRUE, TRUE, TRUE,  FALSE, doublebuffer, FALSE, TRUE)

wLogoWS3D (FALSE)

'' ++++++++++++++++++  ПЕРВОНАЧАЛЬНЫЕ НАСТРОЙКИ ПРОЕКТА  ++++++++++++++++++++++++++++++++++
'' Сюда включается всё, что должно быть выполнено только один раз или инициализировано для
'' последующей работы только один раз. Эта часть кода расположена до главного цикла,
'' который начинается с While wRunning. Также здесь расположены функции, инициализирующие
'' работу объектов WorldSim3D, которые будут продолжать работать и в главном цикле:
'' камеры, аниматоры и другие.
'' Также в этом разделе можно сделать работу меню, ведь обычно послезапуска игры сначала
'' появляется меню, из которого можно уже начать игру.

'' ------------------  ИНИЦИАЛИЗАЦИЯ РАБОТЫ ЗВУКОВ  ---------------------------------------
'' Показана на примере одного звука. Возможно вам не нужно озвучивание или вы предпочитаете
'' пользоваться другой звуковой библиотекой. Тогда просто уберите эту часть кода.
'' Расскомметируйте здесь, если вам нужно озвучивание и ниже. 
Dim As wNode sound1=wLoadSound("Assets/sounds/ambience.ogg")
Dim As wNode sound2=wLoadSound("Assets/sounds/collected.ogg")
Dim As wNode sound3=wLoadSound("Assets/sounds/start.ogg")
Dim As wNode sound4=wLoadSound("Assets/sounds/finish.ogg")
Dim As wNode sound5=wLoadSound("Assets/sounds/lost.ogg")

'' ---------------------------------------------------------------------------------------
' Устанавливаем текст заголовка окна приложения
wSetWindowCaption ( "Technologies Collector" )
' загружаем нужный шрифт из папки ресурсов через функцию wGetFont
''BitmapFont = wGetFont ( "Assets/3.png")
BitmapFont = wGetFont ( "Assets/myfont.bmp")
menu_font = wGetFont ( "Assets/Sci-fi_2.xml")
'' ------- ЗАГРУЗКА ИГРОВЫХ ОБЪЕКТОВ НА СЦЕНУ ---------------------------------------------
'' Загрузку игровых объектов (3D моделей, частиц, скайбоксов и др.) на сцену.
'' [1.] Ноды для 3D моделей
' ------------ Map ---------------------------------------------------------------
wAddZipFile( "Assets/monochromatic.pk3", TRUE,TRUE )
MapMesh = wGetMesh( "monochromatic.bsp" )
MapNode = wAddMeshToSceneAsOcttree( MapMesh )
' ------------ Bot -----------------------------------------------------------------
BotMesh = wGetMesh ( "Assets/models/scoutship/scoutship.x")
' load texture resources for texturing the scene nodes
BotTexture = wGetTexture ( "Assets/models/scoutship/2.jpg" )
BotNode = wAddMeshToScene (BotMesh )

wSetNodeScale ( BotNode, 1.0, 1.0, 1.0 )
wSetNodeMaterialTexture (BotNode, BotTexture, 0 )
wSetNodeMaterialFlag (BotNode, wMF_LIGHTING, TRUE)
wSetNodeEmissiveColor ( BotNode, RGBA ( 5, 255, 75, 0 ))
''wSetNodeMaterialFlag (BotNode, wMF_ANTI_ALIASING, TRUE)
''''wAddNodeShadow( BotNode )
' ------------------------------------- Tech --------------------------------------------------------------------------
TechMesh = wGetMesh( "Assets/models/Tech_2/Tech.x" )
For i = 1 To tech_num
TechNode (i) = wAddMeshToScene( TechMesh )
wSetNodeScale ( TechNode (i), 3.0, 10.5, 10.5 )
wSetNodeEmissiveColor ( TechNode (i), RGBA ( 0,125,125,0 ))
'''wAddNodeShadow( TechNode(i) )
'''wSetShadowColor( 50, 1, 20, 210 )
TechTexture = wGetTexture ( "Assets/models/Tech_2/6.png" )
wSetNodeMaterialTexture ( TechNode(i), TechTexture, 0 )
wSetNodeMaterialFlag( TechNode (i), wMF_LIGHTING, TRUE )
Dim Anim_Tech As wAnimator = wAddRotationAnimator( TechNode (i), 0.0, 0.9, 0.0 )
''' wAddNodeShadow( TechNode(i), SphereMesh)
Next i
wSetNodePosition( TechNode (1), -877.0, 154.0, -1815.0 )
wSetNodePosition( TechNode (2), 443, 1194, -957 )
wSetNodePosition( TechNode (3), 2191, 1534, -1269 )
wSetNodePosition( TechNode (4), 2096, 1746, -1597 )
wSetNodePosition( TechNode (5), 1647, 2085, -1542 )
wSetNodePosition( TechNode (6), 189, 2263, -1867 )
wSetNodePosition( TechNode (7), 161, 2694, 348 )
wSetNodePosition( TechNode (8), 1795, 2494, 168 )
wSetNodePosition( TechNode (9), 3233, 2494, 944 )
wSetNodePosition( TechNode (10), 4451, 2494, 939 )
wSetNodePosition( TechNode (11), 5822, 2494, 1 )
wSetNodePosition( TechNode (12), 6586, 2494, 321 )
wSetNodePosition( TechNode (13), 1741, 2085, -2428 )
wSetNodePosition( TechNode (14), 3856, 2263, -1363 )
wSetNodePosition( TechNode (15), 5616, 2494, -2129 )
wSetNodePosition( TechNode (16), 5543, 2155, -2503 )
wSetNodePosition( TechNode (17), 6496, 2694, 320 )
wSetNodePosition( TechNode (18), 8554, 2494, -1178 )
wSetNodePosition( TechNode (19), 7675, 2549, -4884 )
wSetNodePosition( TechNode (20), 7303, 2694, -6085 )

wSetNodePosition( TechNode (21), 8116.0, 2040.0, -2974.0 )

wSetNodePosition( TechNode (22), 7207, 2040, -2947 )

wSetNodePosition( TechNode (23), 5908, 2492, -6060 )

wSetNodePosition( TechNode (24), 4999, 2492, -6059 )
wSetNodePosition( TechNode (25), 4098, 2492, -6057 )

wSetNodePosition( TechNode (26), 3261, 2492, -6051 )
wSetNodePosition( TechNode (27), 2413, 2492, -6057 )
wSetNodePosition( TechNode (28), 1689, 2492, -6061 )
wSetNodePosition( TechNode (29), 969, 2492, -6059 )
wSetNodePosition( TechNode (30), 327, 2492, -6060 )

wSetNodePosition( TechNode (31), -278, 2492, -6064 )
wSetNodePosition( TechNode (32), -814, 2492, -6060 )
wSetNodePosition( TechNode (33), -1288, 2492, -6058 )
wSetNodePosition( TechNode (34), -1678, 2492, -6062 )
wSetNodePosition( TechNode (35), -2397, 2492, -6061 )
wSetNodePosition( TechNode (36), -3500, 2263, -4800 )

wSetNodePosition( TechNode (37), 259, 38, -1598 )
wSetNodePosition( TechNode (38), -957, 787, -2472 )
wSetNodePosition( TechNode (39), -1758, 1194, -2069 )
wSetNodePosition( TechNode (40), -1691, 1194, -1589 )
wSetNodePosition( TechNode (41), -2164, 1194, -1627 )
wSetNodePosition( TechNode (42), -2132, 1194, -2088 )
wSetNodePosition( TechNode (43), -2444, 2263, -2426 )
wSetNodePosition( TechNode (44), 1768, 2085, -3288 )
wSetNodePosition( TechNode (45), 1730, 2085, -4104 )
wSetNodePosition( TechNode (46), 1731, 2085, -4869 )
wSetNodePosition( TechNode (47), 1732, 2085, -5576 )
wSetNodePosition( TechNode (48), 1732, 2085, -6215 )
wSetNodePosition( TechNode (49), 1731, 2085, -6809 )
wSetNodePosition( TechNode (50), 1730, 2085, -7439 )
wSetNodePosition( TechNode (51), 1726, 2085, -7837 )
wSetNodePosition( TechNode (52), 1718, 2085, -8212 )

wSetNodePosition( TechNode (53), 1729, 2085, -8801 )
wSetNodePosition( TechNode (54), 1523, 2085, -9001 )
wSetNodePosition( TechNode (55), 1941, 2085, -9087 )
wSetNodePosition( TechNode (56), 1679, 2085, -9326 )

wSetNodePosition( TechNode (57), 1204, 467, -2571 )
wSetNodePosition( TechNode (58), 1781, 37, -3539 )
wSetNodePosition( TechNode (59), 3298, 246, -1153 )
wSetNodePosition( TechNode (60), 4391, 246, -1282 )
wSetNodePosition( TechNode (61), 4731, -314, -2742 )
wSetNodePosition( TechNode (62), 1761, -513, -3484 )
wSetNodePosition( TechNode (63), 882, 1194, -5203 )
wSetNodePosition( TechNode (64), 860, 1194, -4689 )
wSetNodePosition( TechNode (65), 412, 1194, -4723 )
wSetNodePosition( TechNode (66), 449, 1194, -5245 )
wSetNodePosition( TechNode (67), 3805, 1194, -3916 )
wSetNodePosition( TechNode (68), 3801, 1194, -4389 )
wSetNodePosition( TechNode (69), 4263, 1194, -4357 )
wSetNodePosition( TechNode (70), 4227, 1194, -3870 )
wSetNodePosition( TechNode (71), 3884, 506, -3131 )
wSetNodePosition( TechNode (72), 2831, 467, -2587 )
wSetNodePosition( TechNode (73), 3852, -218, -1789 )
wSetNodePosition( TechNode (74), 5216, 987, -4599 )
wSetNodePosition( TechNode (75), 3383, 734, -645 )
wSetNodePosition( TechNode (76), 5123, 506, -1797 )
wSetNodePosition( TechNode (77), 4979, 1194, -178 )
wSetNodePosition( TechNode (78), 4760, 2085, -6897 )
wSetNodePosition( TechNode (79), 7816, -2549, -7328 )
wSetNodePosition( TechNode (80), 3487, 2263, -7524 )

wSetNodePosition( TechNode (81), 7318, 1194, -3703 )
wSetNodePosition( TechNode (82), 5921, 1194, -5676 )
wSetNodePosition( TechNode (83), 6756, 2263, -8201 )
wSetNodePosition( TechNode (84), 1707, 2694, -9105 )
wSetNodePosition( TechNode (85), -179, 2263, -9404 )
wSetNodePosition( TechNode (86), -2112, 2040, -9286 )
wSetNodePosition( TechNode (87), -1672, 1194, -8084 )
wSetNodePosition( TechNode (88), -1296, 1194, -8063 )
wSetNodePosition( TechNode (89), -1296, 1194, -7600 )
wSetNodePosition( TechNode (90), -1772, 1194, -7624 )

wSetNodePosition( TechNode (91), 2557, 467, -4558 )
wSetNodePosition( TechNode (92), 1706, 506, -7319 )
wSetNodePosition( TechNode (93), 959, 1194, -7950 )
wSetNodePosition( TechNode (94), 667, 1194, -9145 )
wSetNodePosition( TechNode (95), -160, 734, -9066 )

wSetNodePosition( TechNode (96), 765, 467, -4052 )
wSetNodePosition( TechNode (97), 5269, 506, -8119 )
wSetNodePosition( TechNode (98), 6259, 787, -7874 )
wSetNodePosition( TechNode (99), 6611, 1194, -7449 )
wSetNodePosition( TechNode (100), -2725, 1394, -3737 )
wSetNodePosition( TechNode (101), -3717, 1209, -6108 )
wSetNodePosition( TechNode (102), -909, 802, -8856 )
wSetNodePosition( TechNode (103), -3340, 1264, -3195 )
'/
' Загрузим спрайт кристалла, чтобы выводить их на экран, если игрок их берёт
'''''''''Tech_sprite = wGetTexture( "Assets/Tech.png" )
' -------------------------------------------------------------------------------------

SkyBox = wAddSkyBoxToScene( _
        wGetTexture("Assets/SkyBoxes/interstellar/interstellar_up.tga"),_
        wGetTexture("Assets/SkyBoxes/interstellar/interstellar_dn.tga"),_
        wGetTexture("Assets/SkyBoxes/interstellar/interstellar_rt.tga"),_
        wGetTexture("Assets/SkyBoxes/interstellar/interstellar_lf.tga"),_
        wGetTexture("Assets/SkyBoxes/interstellar/interstellar_ft.tga"),_
        wGetTexture("Assets/SkyBoxes/interstellar/interstellar_bk.tga"))
'/
'' [2.] Аниматоры Нодов, например, wAddFlyCircleAnimator, wAddRotationAnimator и др.

'' [3.] Камеры, Ноды для них и первоначальные настройки камер
Camera = wAddFPSCamera
CameraNode = Camera
wSetNodePosition ( CameraNode, -1000, 250, -1700 )
wSetNodeRotation ( CameraNode, 0, 0, 0 )
wSetCameraClipDistance ( CameraNode, 12000 )
wSetRotateSpeedCameraFPS (Camera, 15.5)
wSetCameraFOV ( Camera, 3.14159 / 2.5 )
wSetSpeedCameraFPS (Camera, 0.0)

'' [4.] Частицы (огонь, взрыв, снег и т.д. )

'' ------------------ УСТАНОВКА ФИЗИКИ: ПРОВЕРКИ СТОЛКНОВЕНИЙ И ДР. -------------------
'' Это может быть как базовая физика, встроенная в WorldSim3D так и сторонних библиотек,
'' например, ODE, Newton и других.
MapCollision = wGetCollisionGroupFromComplexMesh (MapMesh, MapNode)

wAddCollisionAnimator(_
                        MapCollision,_
                        CameraNode,_
                        30.0,30.0,30.0,_
                        0.0,-1.5,0.0,_
                        0.0,15.0,0.0 )
'' ------------------------------------------------------------------------------------
'' ------------------ ОСВЕЩЕНИЕ -------------------------------------------------------
' добавим в проект яркий свет, освещающий всё вокруг
wSetAmbientLight ( 0.5, 0.0, 0.3 )
' также добавим напрвленный свет, чтобы были тени
Light = wAddLight(0, 1660, 2080, -3500, 0.1, 0.0, 0.9, 7000.0 )
'' ------------------ ДРУГИЕ НАСТРОЙКИ или КОД ------------------------------------------------
' Скрываем указатель мыши, если он не нужен
wHideMouse

wAddChildToParent ( BotNode, CameraNode)
wSetNodePosition (BotNode, 0.0, -0.2, 1.0)
'wSetNodePosition (BotNode, XPOS, YPOS, ZPOS+3.0)
Dim BotRotAnimator as wAnimator = wAddRotationAnimator (BotNode, 0, 0.4, 0 )
start = 0


Dim start_info As wTexture = wGetTexture ("Assets/sprites/start_info_3.png")
Dim frame As wTexture = wGetTexture ("Assets/sprites/frame.png")
Dim panel As wTexture = wGetTexture ("Assets/sprites/panel-120.png")
Dim finish_info As wTexture = wGetTexture ("Assets/sprites/finish.png")
Dim lost_info As wTexture = wGetTexture ("Assets/sprites/lost.png")
'' ==================== MENU ===============================================
WHILE wRunning
    ' begin the scene, erasing the canvas to white before rendering
    wBeginScene( 0, 30, 20 )
    wGetNodeRotation ( CameraNode, XPosition, YPosition, ZPosition )
    wSetNodeRotation ( CameraNode, 8.29, 134.7, 0 )
    If wIsSoundPlaying(sound3)=FALSE  Then
			wPlaySound(sound3)
			wSetVolumeSound (sound3, 0.3)
 		EndIf
	while wKeyEventAvailable
            ' читаем события клавиатуры.
            KeyEvent = wReadKeyEvent
    
            ' если нажата какая-либо клавиша, связываем с ней событие, оторое мы хотим
            ' чтобы оно произошло. Это может быть что угодно:
            select case as const KeyEvent->key
            	case KEY_KEY_1     ' клавиша D
                if KeyEvent->direction = wKEY_DOWN then
                   start = 1
                   wStopSound(sound3)
                   Exit While, while
                else
                    
                End If
            end Select
       wend
    ' draw the Graphical User Interface
    wDrawScene
    
    wDrawSpriteAdvanced (start_info, scr_wid/2 - 400, scr_hei/2 - 300, 1.0, 1.0, TRUE,TRUE)
    wDrawSpriteAdvanced (frame, scr_wid/2 - 360, scr_hei/2 - 260, 1.6, 1.6, TRUE,TRUE)
    'w2DFontDraw ( BitmapFont, Str(doublebuffer_mes), 150, 100, 300, 120, 255, 0, 255, 0  )
    'w2DFontDraw ( BitmapFont, Str(bits_per_pix) + bits_per_pix_info, 150, 140, 300, 160, 255, 0, 255, 0 )
    'w2DFontDraw ( BitmapFont, Str(ren_info_mes), 150, 180, 300, 200, 255, 0, 255, 0 )

    ' end drawing the scene and render it
    wEndScene
    ''wSetFPS
    wCloseESC()
Wend
'/
wSetSpeedCameraFPS (Camera, 0.5)
Dim stop_sound As Int32 = 0
' -----------------------------------------------------------------------------
'******************************************************************************
'----------------------- ГЛАВНЫЙ ЦИКЛ ВАШЕГО ПРОЕКТА --------------------------
' здесь главный цикл приложения, поэтому
' мы устанавливаем цикл с условием: пока движок работает (функция wRunning)
' внутри цикла постоянно выполняются определённые команды, в основном для отображения сцены
While wRunning
        ' начинаем отрисовку сцены с цветом фона, например зелёный (который устанавливаем числами 0,55,0)
        wBeginScene( 0, 55, 0 )
        'wGetNodeRotation ( CameraNode, XPOS, YPOS, ZPOS)
        'If XPOS > 30 Then XPOS = 30
        
        
        wGetNodePosition ( CameraNode, XPOS, YPOS, ZPOS )
      
      If YPOS >= 2750 Then
      	'mes_priv = TRUE
      	YPOS = 2749
      	'mes_priv = FALSE
      	wSetNodePosition ( CameraNode, XPOS, YPOS, ZPOS )
      EndIf
      /'
      ElseIf XPOS >= 25950 Then
      	mes_priv = TRUE
      	XPOS = 25949
      	'mes_priv = FALSE
      	wSetNodePosition ( CameraNode, XPOS, YPOS, ZPOS )
      EndIf
      If ZPOS <= 3950 Then
      	mes_priv = TRUE
      	ZPOS = 3951
      	'mes_priv = FALSE
      	wSetNodePosition ( CameraNode, XPOS, YPOS, ZPOS )
      EndIf
      ' РЎРѕ СЃС‚РѕСЂРѕРЅС‹ С„РёРЅРёС€Р°
      If ZPOS >= 13000 Then
      	mes_priv = TRUE
      	ZPOS = 12999
      	'mes_priv = FALSE
      	wSetNodePosition ( CameraNode, XPOS, YPOS, ZPOS )
      EndIf
      '/
        ''wSetCameraTarget ( CameraNode, XPOS, YPOS, ZPOS)
        ''wSetNodePosition (BotNode, XPOS, YPOS, 3.0+ZPOS)
		 	
      ' --------------------------------------------------СДЕЛАЕМ УМЕНЬШЕНИЕ ЭНЕРГИИ -----------------------------
		' Пока уровень здоровья больше нуля, оно уменьшается
		If start = 1 Then
      	If power > 0 And power < 1001 Then
      		' здоровье уменьшается на 0.01 каждую 1/60 секунду (т.е. уменьшается на 0,6 пункта каждую секунду)
      		power = power - 0.01
      	Elseif power <= 0 Then' если здоровье равно нулю, т.е. меньше одного, то установим значение здоровья на ноль
      		power = 0
      	Else 
      	EndIf
		End If
      ' ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
      ' ПРОВЕРКА РАССТОЯНИЯ ДО ТЕХНОЛОГИЙ. Если игрок подходит к одной из т. и берёт её, то
      ' выводим спрайт т. на экран. Сначала, конечно, нужно сделать проверку расстояния от
      ' камеры до т.. Для определения расстояний снова воспользуемся функцией
      ' wGetDistanceBetweenNodes. Здесь учтём сумму радиусов нодов - 20.
      ' Сделаем проверку сближения со всеми т. поочерёдно.
      closest_dist_cryst = 49999 ' установим сначала расстояние до т. на расстояние, намного
      ' большее, чем расстояние до каждого из них. Это нужно для того, чтобы расстояние до каждой т.
      ' можно было сравнивать с каким-либо другим расстоянием, чтобы определить какая т.
      ' ближайшая на определённый момент игры, т.е. в зависимости от того, где находится игрок.
      For c = 1 To tech_num
      	distance_cryst (c) = wGetDistanceBetweenNodes (TechNode (c), CameraNode )-40
      	If distance_cryst (c) < closest_dist_cryst Then
      		closest_dist_cryst = distance_cryst (c)
      		closest_cryst_ID = c
      	EndIf
      Next
      If closest_dist_cryst > 0 And closest_dist_cryst < 10 Then 'если расстояние до ближайшего
      ' кристалла меньше 10, то:
      	cryst_near = 1 ' включаем флаг, что игрок подошёл к кристаллу, чтобы его взять
         	cryst = closest_cryst_ID ' какой кристалл и сколько их уже взято
         	' убираем взятый кристалл на большое расстояние, фактически убирая его со сцены (из игры)
            wSetNodePosition (TechNode (closest_cryst_ID),50000,50000,50000)
            collected_tech = collected_tech + 1 ' отмечаем сколько собрано технологий
            'fbs_Set_SoundVolume (hSound_5, 2.0 )'сделаем звук взятия кристалла на макс. громкость
            wPlaySound(sound2)' проиграем этот звук
      Else
      	cryst_near = 0 'выключаем флаг сближения с кристаллом, если расстояние до него 10 или больше
      End If
		 	'Фоновый звук играет все время      
 		If wIsSoundPlaying(sound1)=FALSE  Then
			wPlaySound(sound1)
 		EndIf
      '-----------------------------------------------------------------------------------------------------------------------------------------------------------------------
      '' ------------------------ СОБЫТИЯ КЛАВИАТУРЫ ----------------------------
        ' если события клавиатуры могут быть обработаны, то:
        while wKeyEventAvailable
            ' читаем события клавиатуры.
            KeyEvent = wReadKeyEvent
    
            ' если нажата какая-либо клавиша, связываем с ней событие, оторое мы хотим
            ' чтобы оно произошло. Это может быть что угодно:
            select case as const KeyEvent->key
            	case KEY_KEY_D     ' клавиша D
                if KeyEvent->direction = wKEY_DOWN then
                   
                else
                    
                End If
    
            	case KEY_KEY_W     ' клавиша W
                if KeyEvent->direction = wKEY_DOWN then
                    
                else
                    
                End If
                    
            	case KEY_KEY_A     ' клавиша A
                if KeyEvent->direction = wKEY_DOWN then
                    
                else
                    
                End If
                    
            	case KEY_KEY_S     ' клавиша S
                if KeyEvent->direction = wKEY_DOWN then
                    
                else
                    
                End If
            ' Добавим функцию для закрытия окна через клавишу ESCAPE.
    			' Если клавиатура не исчпользуется, то для этой цели нужно использовать
    			' другую функцию - wCloseESC(), которую можно поместить в конце главного цикла.
            end Select
        Wend
        
    	'' --------------------------- СОБЫТИЯ МЫШИ -----------------------------------------
        ' 
        While wMouseEventAvailable
            MouseEvent = wReadMouseEvent
    
            if MouseEvent->action = wME_MOUSE_MOVED then
    
            End If
    
        Wend
      '' ----------------------------------------------------------------------------------   
      '' Завершение отрисовки 3D сцены
        wDrawScene
       ' ------------------------------------------------------------------------------------------------------ 
        ' отладочная информация: положение и ориентация камеры
        'w2DFontDraw ( BitmapFont, Str(XPosition)+ "   "+ Str(YPosition) +"   "+ Str(ZPosition), 40, 10, 550, 35 )
        'w2DFontDraw ( BitmapFont, Str(Int(XPOS))+ "   "+ Str(Int(YPOS)) +"   "+ Str(Int(ZPOS)), 400, 30, 450, 45 )
        
  '' ------------------------- ОТОБРАЖЕНИЕ ТЕКСТА НА ЭКРАНЕ ---------------------------------
  '' отображаем на экране загруженный ранее шрифт. Это нужно сделать после функции wDrawScene,
  '' т.е. после отрисовки 3D сцены, чтобы выводимый на экран текст отображался поверх объектов
  '' сцены, иначе объекты сцены будут закрывать текст.
  '' последние 4 числа - координаты текста: X,Y левого верхнего угла и X,Y правого нижнего угла
    	  '''w2DFontDraw ( BitmapFont, "Press W,A,S,D to move around the map", 200, 570, 450, 590 )
    	  wDrawSpriteAdvanced (panel, 10, 10, 0.85, 0.5, TRUE,TRUE)
    	  
        w2DFontDraw ( menu_font, "Собранные технологии:  " + Str (collected_tech) + " / 100" , 45, 40, 200, 60, 255, 0, 255, 0 )
        'w2DFontDraw ( menu_font, "finish:  " + Str (finish), 200, 570, 350, 590 )
        'w2DFontDraw ( BitmapFont, "closest_dist_cryst:  " + Str (closest_dist_cryst), 200, 600, 350, 620 )
        w2DFontDraw ( menu_font, "Энергия:  " + Str (Int(power)), 45, 80, 200, 100, 255, 0, 255, 0 )
        
        If collected_tech = 100 And power > 0 Then finish = 1
        If finish = 1 Then
        	wStopSound(sound1)
        	wDrawSpriteAdvanced (finish_info, scr_wid/2 - 220, scr_hei/2 - 142, 1.0, 1.0, TRUE,TRUE)
        	If wIsSoundPlaying(sound4)=FALSE  Then
			wPlaySound(sound4)
			wSetVolumeSound (sound4, 0.6)
 		EndIf
        EndIf
        
        If power < 1 And stop_sound = 0 Then
        	power = 0
        	
        	wStopSound(sound1)
        	
        	If wIsSoundPlaying(sound5)=FALSE  Then
			wPlaySound(sound5)
			wSetVolumeSound (sound5, 0.8)
        	EndIf
        	wRemoveAnimator ( BotNode, BotRotAnimator )
        	stop_sound = 1
        EndIf
        If stop_sound = 1 Then wDrawSpriteAdvanced (lost_info, scr_wid/2 - 220, scr_hei/2 - 142, 1.0, 1.0, TRUE,TRUE)
        ' заканчиваем отрисовку всего, что на экране и отображаем это
        wEndScene
        wCloseEsc()
        '''wSetFPS   'устанавливаем фреймрейт по умолчанию 60 кадров в секунду
Wend
' -----------------------КОНЕЦ ГЛАВНОГО ЦИКЛА ВАШЕГО ПРОЕКТА ----------------------------------
'**********************************************************************************************

' ---------------------------------------------------------------------------------------------
' Останавливаем работу движка и высвобождаем ресурсы памяти
wStop
