diff --git a/.gitignore b/.gitignore
index 7c58b1ecc4fe0788bbe39a5c7d9d1a2841b5fb9e..e878a70af49f3f24b5e969102fe136b24c297ecd 100644
--- a/.gitignore
+++ b/.gitignore
@@ -203,4 +203,6 @@ build/gamesource/*
 !shaders/
 docs/html/*
 !docs/html/material_editor/
-!docs/html/particles_editor/
\ No newline at end of file
+!docs/html/particles_editor/
+
+/source/game/ents_doc.h
diff --git a/build/gamesource/entities/classes.ent b/build/gamesource/config/entities/classes.ent
similarity index 100%
rename from build/gamesource/entities/classes.ent
rename to build/gamesource/config/entities/classes.ent
diff --git a/build/gamesource/entities/defaults.ent b/build/gamesource/config/entities/defaults.ent
similarity index 100%
rename from build/gamesource/entities/defaults.ent
rename to build/gamesource/config/entities/defaults.ent
diff --git a/build/sysconfig.cfg b/build/sysconfig.cfg
index 2e4ed61a7cd885a7533073455d7282d9381e317b..79acc33ec1cea36efb471c73ffb585d8de5eacc3 100644
--- a/build/sysconfig.cfg
+++ b/build/sysconfig.cfg
@@ -53,6 +53,8 @@ r_s_max_miplevel 0
 main_rain_density 1
 main_thunderbolt true
 
+r_default_fov 90
+
 spawn
 
 //cl_grab_cursor 0
diff --git a/docs/settings_doxygen/Doxyfile b/docs/settings_doxygen/Doxyfile
index 4f540082694cd17504d392c2a608ad7ec4c7c937..344dcda14c107e984ab6bd8eee372a1a43202360 100644
--- a/docs/settings_doxygen/Doxyfile
+++ b/docs/settings_doxygen/Doxyfile
@@ -811,7 +811,8 @@ INPUT                  = ../../source/gdefines.h \
                          ../../source/SkyXEngine.h \
                          ../../source/sxmaterialeditor/sxmaterialeditor.cpp \
                          ../../source/sxparticleseditor/sxparticleseditor.cpp \
-                         ../../source/sxleveleditor/sxleveleditor.cpp
+                         ../../source/sxleveleditor/sxleveleditor.cpp \
+                         ../../source/game/
 
 # This tag can be used to specify the character encoding of the source files
 # that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses
diff --git a/docs/settings_doxygen/doxygen/doxygen.exe b/docs/settings_doxygen/doxygen/doxygen.exe
new file mode 100644
index 0000000000000000000000000000000000000000..031fd552d9ae235ac51e847f169286d7000d59e3
Binary files /dev/null and b/docs/settings_doxygen/doxygen/doxygen.exe differ
diff --git a/docs/settings_doxygen/doxygen/doxyindexer.exe b/docs/settings_doxygen/doxygen/doxyindexer.exe
new file mode 100644
index 0000000000000000000000000000000000000000..64b3eb8f08c65f42534b5f57f0803df734fc1cd0
Binary files /dev/null and b/docs/settings_doxygen/doxygen/doxyindexer.exe differ
diff --git a/docs/settings_doxygen/doxygen/doxysearch.cgi.exe b/docs/settings_doxygen/doxygen/doxysearch.cgi.exe
new file mode 100644
index 0000000000000000000000000000000000000000..9363ee5c79ff032d4a656256dd69d5eb0049094f
Binary files /dev/null and b/docs/settings_doxygen/doxygen/doxysearch.cgi.exe differ
diff --git a/docs/settings_doxygen/doxygen/gen.bat b/docs/settings_doxygen/doxygen/gen.bat
new file mode 100644
index 0000000000000000000000000000000000000000..02b90a44c0a9093ea6d3d2fa1ee6b49e932def5f
--- /dev/null
+++ b/docs/settings_doxygen/doxygen/gen.bat
@@ -0,0 +1,4 @@
+cd ..
+doxygen\skydoc_preprocessor.exe ..\..\source\game\ents_doc.h ..\..\source\game\
+doxygen\doxygen.exe Doxyfile
+pause
\ No newline at end of file
diff --git a/docs/settings_doxygen/doxygen/libclang.dll b/docs/settings_doxygen/doxygen/libclang.dll
new file mode 100644
index 0000000000000000000000000000000000000000..dbfe101a2a9de49737d89777bb3d1e83edd8d11c
Binary files /dev/null and b/docs/settings_doxygen/doxygen/libclang.dll differ
diff --git a/docs/settings_doxygen/doxygen/skydoc_preprocessor.exe b/docs/settings_doxygen/doxygen/skydoc_preprocessor.exe
new file mode 100644
index 0000000000000000000000000000000000000000..939e37cadb84da3f1c7c4d0b2a01e19f142b15ab
Binary files /dev/null and b/docs/settings_doxygen/doxygen/skydoc_preprocessor.exe differ
diff --git a/proj/sxgame/vs2013/sxgame.vcxproj.filters b/proj/sxgame/vs2013/sxgame.vcxproj.filters
index 15de8504191bbfd435d231e29e0d956a54d04de0..55022f88ce2ef8af728f3e0df1b75771cfcf09cd 100644
--- a/proj/sxgame/vs2013/sxgame.vcxproj.filters
+++ b/proj/sxgame/vs2013/sxgame.vcxproj.filters
@@ -129,9 +129,6 @@
     <ClCompile Include="..\..\..\source\game\CrosshairManager.cpp">
       <Filter>Source Files</Filter>
     </ClCompile>
-    <ClCompile Include="..\..\..\source\game\SXbaseSupply.cpp">
-      <Filter>Source Files</Filter>
-    </ClCompile>
     <ClCompile Include="..\..\..\source\game\BaseWeaponAddon.cpp">
       <Filter>Source Files\ents\items\tools\weapons\addons</Filter>
     </ClCompile>
@@ -153,6 +150,9 @@
     <ClCompile Include="..\..\..\source\game\BaseTrigger.cpp">
       <Filter>Source Files\ents\triggers</Filter>
     </ClCompile>
+    <ClCompile Include="..\..\..\source\game\SXbaseSupply.cpp">
+      <Filter>Source Files\ents\items</Filter>
+    </ClCompile>
   </ItemGroup>
   <ItemGroup>
     <ClInclude Include="..\..\..\source\game\sxgame.h">
@@ -239,9 +239,6 @@
     <ClInclude Include="..\..\..\source\game\CrosshairManager.h">
       <Filter>Header Files</Filter>
     </ClInclude>
-    <ClInclude Include="..\..\..\source\game\SXbaseSupply.h">
-      <Filter>Header Files</Filter>
-    </ClInclude>
     <ClInclude Include="..\..\..\source\game\BaseWeaponAddon.h">
       <Filter>Header Files\ents\items\tools\weapons\addons</Filter>
     </ClInclude>
@@ -263,5 +260,8 @@
     <ClInclude Include="..\..\..\source\game\BaseTrigger.h">
       <Filter>Header Files\ents\triggers</Filter>
     </ClInclude>
+    <ClInclude Include="..\..\..\source\game\SXbaseSupply.h">
+      <Filter>Header Files\ents\items</Filter>
+    </ClInclude>
   </ItemGroup>
 </Project>
\ No newline at end of file
diff --git a/source/game/BaseHandle.cpp b/source/game/BaseHandle.cpp
index 90895a526f12763a74c116ea963f61b233af6c90..00623afd5ce8d7d59f4d17d814ac4b420c2cafa1 100644
--- a/source/game/BaseHandle.cpp
+++ b/source/game/BaseHandle.cpp
@@ -1,5 +1,9 @@
 #include "BaseHandle.h"
 
+/*! \skydocent base_handle
+Базовый класс ручки
+*/
+
 BEGIN_PROPTABLE(CBaseHandle)
 //empty
 END_PROPTABLE()
diff --git a/source/game/BaseHandle.h b/source/game/BaseHandle.h
index 9a755b8c8311006ef9fb0478891bcad5b3620695..c9a074a568c6f391130246a161ea4f2a38495ac6 100644
--- a/source/game/BaseHandle.h
+++ b/source/game/BaseHandle.h
@@ -1,8 +1,21 @@
+/******************************************************
+Copyright © Vitaliy Buturlin, Evgeny Danilovich, 2017
+See the license in LICENSE
+******************************************************/
+
+/*!
+\file
+Ручки
+*/
+
 #ifndef _BaseHandle_H_
 #define _BaseHandle_H_
 
 #include "BaseWeaponAddon.h"
 
+/*! Ручки
+\ingroup cbaseitem
+*/
 class CBaseHandle: public CBaseWeaponAddon
 {
 	DECLARE_CLASS(CBaseHandle, CBaseWeaponAddon);
@@ -10,8 +23,8 @@ class CBaseHandle: public CBaseWeaponAddon
 public:
 	DECLARE_CONSTRUCTOR();
 
-	//���������� ��������
-	//���������� ��������
+	//уменьшение раскачки
+	//уменьшение разброса
 };
 
 #endif
diff --git a/source/game/BaseMag.cpp b/source/game/BaseMag.cpp
index f2d716236940900a5fb93c5ce1643dbc6f851fa9..530ada6bdd0b57493a3877d12438512051d22010 100644
--- a/source/game/BaseMag.cpp
+++ b/source/game/BaseMag.cpp
@@ -1,7 +1,13 @@
 #include "BaseMag.h"
 
+/*! \skydocent base_mag
+Базовый класс магазина
+*/
+
 BEGIN_PROPTABLE(CBaseMag)
+	//! Вместимость
 	DEFINE_FIELD_INT(m_iCapacity, PDFF_NOEDIT | PDFF_NOEXPORT, "capacity", "", EDITOR_NONE)
+	//! Текущая загрузка
 	DEFINE_FIELD_INT(m_iCurrentLoad, PDFF_NOEDIT, "current_load", "", EDITOR_NONE)
 END_PROPTABLE()
 
diff --git a/source/game/BaseMag.h b/source/game/BaseMag.h
index 3f5b93f99e8391c0fb1d14341a402d8a6f6a6ae0..b252f743db9fe82c6f6528ee265451a3c66633f3 100644
--- a/source/game/BaseMag.h
+++ b/source/game/BaseMag.h
@@ -1,8 +1,21 @@
+/******************************************************
+Copyright © Vitaliy Buturlin, Evgeny Danilovich, 2017
+See the license in LICENSE
+******************************************************/
+
+/*!
+\file
+Магазины
+*/
+
 #ifndef _BaseMag_H_
 #define _BaseMag_H_
 
 #include "BaseWeaponAddon.h"
 
+/*! Магазины
+\ingroup cbaseitem
+*/
 class CBaseMag: public CBaseWeaponAddon
 {
 	DECLARE_CLASS(CBaseMag, CBaseWeaponAddon);
diff --git a/source/game/BaseScope.cpp b/source/game/BaseScope.cpp
index 95bec717acb76c3a8bac8faa8e9f8d27e08f6143..dc77ba76b18fb0455761834f36564e6fa5531d7e 100644
--- a/source/game/BaseScope.cpp
+++ b/source/game/BaseScope.cpp
@@ -1,5 +1,9 @@
 #include "BaseScope.h"
 
+/*! \skydocent base_scope
+Базовый класс прицела
+*/
+
 BEGIN_PROPTABLE(CBaseScope)
 	//empty
 END_PROPTABLE()
diff --git a/source/game/BaseScope.h b/source/game/BaseScope.h
index 40e91035d870a1d713e7e8274a537149ccc35c7b..f581e5da953629a51f1bdd572d390a06aa0371a8 100644
--- a/source/game/BaseScope.h
+++ b/source/game/BaseScope.h
@@ -1,16 +1,29 @@
+/******************************************************
+Copyright © Vitaliy Buturlin, Evgeny Danilovich, 2017
+See the license in LICENSE
+******************************************************/
+
+/*!
+\file
+Прицелы
+*/
+
 #ifndef _BaseScope_H_
 #define _BaseScope_H_
 
 #include "BaseWeaponAddon.h"
 
+/*! Прицелы
+\ingroup cbaseitem
+*/
 class CBaseScope: public CBaseWeaponAddon
 {
 	DECLARE_CLASS(CBaseScope, CBaseWeaponAddon);
 	DECLARE_PROPTABLE();
 public:
 	DECLARE_CONSTRUCTOR();
-	// ���������� ��������
-	// ����� ��������
+	// уменьшение разброса
+	// время сведения
 };
 
 #endif
diff --git a/source/game/BaseSilencer.cpp b/source/game/BaseSilencer.cpp
index 264ea81dc4acbe9e83aa48797661f36c32e9d00f..8854dc3661881b1454f0587748f8867aa128285d 100644
--- a/source/game/BaseSilencer.cpp
+++ b/source/game/BaseSilencer.cpp
@@ -1,5 +1,9 @@
 #include "BaseSilencer.h"
 
+/*! \skydocent base_silencer
+Базовый класс глушителя
+*/
+
 BEGIN_PROPTABLE(CBaseSilencer)
 //empty
 END_PROPTABLE()
diff --git a/source/game/BaseSilencer.h b/source/game/BaseSilencer.h
index 633a2848c761313af558dbf974984bb81c9524e2..3eeb73e447d13daf341ec53b125c6f15ff1d6387 100644
--- a/source/game/BaseSilencer.h
+++ b/source/game/BaseSilencer.h
@@ -1,19 +1,32 @@
+/******************************************************
+Copyright © Vitaliy Buturlin, Evgeny Danilovich, 2017
+See the license in LICENSE
+******************************************************/
+
+/*!
+\file
+Глушители
+*/
+
 #ifndef _BaseSilencer_H_
 #define _BaseSilencer_H_
 
 #include "BaseWeaponAddon.h"
 
+/*! Глушители
+\ingroup cbaseitem
+*/
 class CBaseSilencer: public CBaseWeaponAddon
 {
 	DECLARE_CLASS(CBaseSilencer, CBaseWeaponAddon);
 	DECLARE_PROPTABLE();
 public:
 	DECLARE_CONSTRUCTOR();
-	// ���������� ��������
-	// ������ ����� ��������
-	// ���������� �����
-	// ���������� �������������
-	// ������ ������� ��������
+	// уменьшение разброса
+	// замена звука выстрела
+	// уменьшение урона
+	// уменьшение бронебойности
+	// замена эффекта выстрела
 };
 
 #endif
diff --git a/source/game/BaseTrigger.cpp b/source/game/BaseTrigger.cpp
index 13e32fdcbc633b8bdb80fb8812ce24de5497b3d9..31e083829f10c2838ed39f5355fe557f654b9137 100644
--- a/source/game/BaseTrigger.cpp
+++ b/source/game/BaseTrigger.cpp
@@ -2,14 +2,23 @@
 
 #include "BaseTrigger.h"
 
+/*! \skydocent trigger
+Базовый класс триггера. Триггер - область, задаваемая моделью, при входе/выходе из которой игрока или объектов, вызывает заданные события
+*/
 
 BEGIN_PROPTABLE(CBaseTrigger)
+	//! Срабатывает при начале контакта
 	DEFINE_OUTPUT(m_onTouchStart, "OnTouchStart", "On touch start")
+	//! Срабатывает при прекращении контакта
 	DEFINE_OUTPUT(m_onTouchEnd, "OnTouchEnd", "On touch end")
+	//! Срабатывает, когда не осталось контактирующих объектов
 	DEFINE_OUTPUT(m_onTouchEndAll, "OnTouchEndAll", "On touch end all")
 
+	//! Включает триггер
 	DEFINE_INPUT(inEnable, "enable", "Enable", PDF_NONE)
+	//! Выключает триггер
 	DEFINE_INPUT(inDisable, "disable", "Disable", PDF_NONE)
+	//! Переключает состояние триггера
 	DEFINE_INPUT(inToggle, "toggle", "Toggle", PDF_NONE)
 END_PROPTABLE()
 
@@ -26,6 +35,7 @@ CBaseTrigger::CBaseTrigger(EntityManager * pMgr):
 
 CBaseTrigger::~CBaseTrigger()
 {
+	RemovePhysBody();
 	CLEAR_INTERVAL(m_idUpdateInterval);
 }
 
diff --git a/source/game/BaseTrigger.h b/source/game/BaseTrigger.h
index 503e690fb5bbc8eb4dd0af91f9fceff8aa2e8923..672b1d9fb36df0b218c4555e771a2aea35284ecc 100644
--- a/source/game/BaseTrigger.h
+++ b/source/game/BaseTrigger.h
@@ -1,8 +1,25 @@
+
+/******************************************************
+Copyright © Vitaliy Buturlin, Evgeny Danilovich, 2017
+See the license in LICENSE
+******************************************************/
+
+/*!
+\file
+Триггеры
+*/
+
+/*! \defgroup cbasetrigger Триггеры
+\ingroup cbaseanimating
+@{
+*/
+
 #ifndef _BaseTrigger_H_
 #define _BaseTrigger_H_
 
 #include "SXbaseAnimating.h"
 
+//! Базовый класс триггера
 class CBaseTrigger: public SXbaseAnimating
 {
 	DECLARE_CLASS(CBaseTrigger, SXbaseAnimating);
@@ -48,3 +65,5 @@ protected:
 };
 
 #endif
+
+/*! @} cbasetrigger */
diff --git a/source/game/BaseWeaponAddon.cpp b/source/game/BaseWeaponAddon.cpp
index be3885adb5810c550f2d4e5c9db1aeb7c3b2fb64..d1dd2dc5e376c25bb39366bc044f6ad6d68c1750 100644
--- a/source/game/BaseWeaponAddon.cpp
+++ b/source/game/BaseWeaponAddon.cpp
@@ -1,5 +1,9 @@
 #include "BaseWeaponAddon.h"
 
+/*! \skydocent base_wpn_addon
+Базовый класс навеса
+*/
+
 BEGIN_PROPTABLE(CBaseWeaponAddon)
 	//empty
 END_PROPTABLE()
diff --git a/source/game/BaseWeaponAddon.h b/source/game/BaseWeaponAddon.h
index c9c5a11a50b39bbb938e76bfa5b10b1d5ad8c5a2..3b466f61cacbbd975713a30447e703a4f39670fa 100644
--- a/source/game/BaseWeaponAddon.h
+++ b/source/game/BaseWeaponAddon.h
@@ -1,17 +1,33 @@
+/******************************************************
+Copyright © Vitaliy Buturlin, Evgeny Danilovich, 2017
+See the license in LICENSE
+******************************************************/
+
+/*!
+\file
+Навесы
+*/
+
 #ifndef _BaseWeaponAddon_H_
 #define _BaseWeaponAddon_H_
 
 #include "SXbaseItem.h"
 
+/*! Тип навеса
+\ingroup cbaseitem
+*/
 enum WPN_ADDON
 {
-	WPN_ADDON_NONE,
-	WPN_ADDON_SCOPE,
-	WPN_ADDON_SILENCER,
-	WPN_ADDON_HANDLE,
-	WPN_ADDON_MAG
+	WPN_ADDON_NONE, //!< Нет
+	WPN_ADDON_SCOPE, //!< Прицел
+	WPN_ADDON_SILENCER, //!< Глушитель
+	WPN_ADDON_HANDLE, //!< Ручка
+	WPN_ADDON_MAG //!< Магазин
 };
 
+/*! Навесы на оружие
+\ingroup cbaseitem
+*/
 class CBaseWeaponAddon: public SXbaseItem
 {
 	DECLARE_CLASS(CBaseWeaponAddon, SXbaseItem);
@@ -19,9 +35,11 @@ class CBaseWeaponAddon: public SXbaseItem
 public:
 	DECLARE_CONSTRUCTOR();
 
+	//! Получить тип навеса
 	WPN_ADDON getType() const;
 
 protected:
+	//! Тип навеса
 	WPN_ADDON m_addonType;
 };
 
diff --git a/source/game/EntityManager.cpp b/source/game/EntityManager.cpp
index 13057fa6f722e5ae9d64743be018d04047604cc3..0ec7bc50803f166b36b0fca1697bf68f308f7ac4 100644
--- a/source/game/EntityManager.cpp
+++ b/source/game/EntityManager.cpp
@@ -453,7 +453,7 @@ SXbaseEntity * EntityManager::FindEntityByClass(const char * name, SXbaseEntity
 void EntityManager::LoadDefaults()
 {
 	m_pDefaultsConf = Core_CrConfig();
-	if(m_pDefaultsConf->open("entities/defaults.ent") < 0)
+	if(m_pDefaultsConf->open("config/entities/defaults.ent") < 0)
 	{
 		mem_release(m_pDefaultsConf);
 		return;
@@ -480,7 +480,7 @@ void EntityManager::LoadDefaults()
 void EntityManager::LoadDynClasses()
 {
 	m_pDynClassConf = Core_CrConfig();
-	if(m_pDynClassConf->open("entities/classes.ent") < 0)
+	if(m_pDynClassConf->open("config/entities/classes.ent") < 0)
 	{
 		mem_release(m_pDynClassConf);
 		return;
diff --git a/source/game/EntityManager.h b/source/game/EntityManager.h
index 70d5be27c661f2fbc4b7494b2b93cd2cd447dd4c..f2c7eb17ab078525bda52318d8aeae49e4b2c091 100644
--- a/source/game/EntityManager.h
+++ b/source/game/EntityManager.h
@@ -1,6 +1,8 @@
 #ifndef _ENTITY_MANAGER_H_
 #define _ENTITY_MANAGER_H_
 
+/*! \file */
+
 #include <gdefines.h>
 #include <common/array.h>
 #include <chrono>
@@ -12,8 +14,20 @@ typedef std::chrono::system_clock::time_point time_point;
 class SXbaseEntity;
 struct ISXConfig;
 
+/*! Однократно запустить функцию fn через время time
+	\note Должно вызываться изнутри класса объекта
+*/
 #define SET_TIMEOUT(fn, time) m_pMgr->SetTimeout((void(SXbaseEntity::*)(float))&ThisClass::fn, this, time)
+
+/*! Запускать функцию fn через каждые time секунд
+Возвращает идентификатор таймера
+\note Должно вызываться изнутри класса объекта
+*/
 #define SET_INTERVAL(fn, time) m_pMgr->SetInterval((void(SXbaseEntity::*)(float))&ThisClass::fn, this, time)
+
+/*! Отменить интервал по идентификатору
+\note Должно вызываться изнутри класса объекта
+*/
 #define CLEAR_INTERVAL(id) m_pMgr->ClearInterval(id)
 
 enum TIMEOUT_STATUS
@@ -92,7 +106,7 @@ protected:
 
 	int m_iThreadNum;
 
-	//! @warning ��� ����� ������� � ������� ������ �����, �.�. ������� �������� ��������� �������� �� ���� ������
+	//! @warning это нужно хранить в течение работы проги, т.к. таблицы дефолтов ссылаются напрямую на этот объект
 	ISXConfig * m_pDefaultsConf;
 	ISXConfig * m_pDynClassConf;
 };
diff --git a/source/game/FuncTrain.cpp b/source/game/FuncTrain.cpp
index e68386274dc24bd63fed5ac5666c113d4d53d8a9..819e9d77468464a6ce51af777b06b0816c04950a 100644
--- a/source/game/FuncTrain.cpp
+++ b/source/game/FuncTrain.cpp
@@ -1,9 +1,15 @@
 #include "FuncTrain.h"
 #include "PathCorner.h"
 
+/*! \skydocent func_train
+Поезд, движется по траектории, построенной из path_corner
+*/
 
 BEGIN_PROPTABLE(FuncTrain)
+	//! Скорость движения
 	DEFINE_FIELD_FLOAT(m_fSpeed, 0, "speed", "Move speed", EDITOR_TEXTFIELD)
+
+	//! path_corner, с которого начнется движение
 	DEFINE_FIELD_ENTITY(m_pStartStop, 0, "start", "Start point", EDITOR_TEXTFIELD)
 END_PROPTABLE()
 
diff --git a/source/game/FuncTrain.h b/source/game/FuncTrain.h
index 483dd23d695c99d4e5c45f5086fe3b8a4c884baf..ae7a8aca90ab87178145bee427840180be9eb00f 100644
--- a/source/game/FuncTrain.h
+++ b/source/game/FuncTrain.h
@@ -1,3 +1,12 @@
+/******************************************************
+Copyright © Vitaliy Buturlin, Evgeny Danilovich, 2017
+See the license in LICENSE
+******************************************************/
+
+/*!
+\file
+Поезда класс
+*/
 #ifndef _FuncTrain_H_
 #define _FuncTrain_H_
 
@@ -5,6 +14,9 @@
 
 class PathCorner;
 
+/*! Поезда класс
+\ingroup cpointentity
+*/
 class FuncTrain: public SXpointEntity
 {
 	DECLARE_CLASS(FuncTrain, SXpointEntity);
@@ -12,21 +24,29 @@ class FuncTrain: public SXpointEntity
 public:
 	FuncTrain(EntityManager * pMgr);
 
+	//! Остановить
 	void Stop();
+	//! Запустить
 	void Start();
 
 protected:
 	void OnPostLoad();
 	void MoveFunc(float dt);
 
+	//! Начальная точка движения
 	PathCorner * m_pStartStop;
+	//! Текущая точка
 	PathCorner * m_pCurStop;
 
+	//! Скорость
 	float m_fSpeed;
+	//! Текущая дистанция от начала пути
 	float m_fCurDist;
 
+	//! Запущен ли
 	bool m_bRunning;
 
+	//! ID таймера
 	ID m_iPostIval;
 };
 
diff --git a/source/game/LightDirectional.cpp b/source/game/LightDirectional.cpp
index 11955eb73c2cfa15e65b0a52ddfd766d50946576..0fbdb850bcc553fa9ff202b5aef9df9c829e752b 100644
--- a/source/game/LightDirectional.cpp
+++ b/source/game/LightDirectional.cpp
@@ -3,18 +3,28 @@
 
 #include <mtllight/sxmtllight.h>
 
+/*! \skydocent light_directional
+Направленный источник света
+*/
+
 BEGIN_PROPTABLE(CLightDirectional)
+	//! Цвет
 	DEFINE_FIELD_VECTOR(m_vColor, 0, "color", "Color", EDITOR_TEXTFIELD)
+	//! Дальность
 	DEFINE_FIELD_FLOAT(m_fDist, 0, "dist", "Distance", EDITOR_TEXTFIELD)
+	//! Дальность дальняя
 	DEFINE_FIELD_FLOAT(m_fShadowDist, 0, "shadow_dist", "Shadow distance", EDITOR_TEXTFIELD)
 
+	//! Тип тени
 	DEFINE_FIELD_INT(m_iShadowType, 0, "shadow_type", "Shadow type", EDITOR_COMBOBOX)
-		COMBO_OPTION("None", "-1")
-		COMBO_OPTION("Static", "0")
-		COMBO_OPTION("Dynamic", "1")
+		COMBO_OPTION("None", "-1")   //!< Нет
+		COMBO_OPTION("Static", "0")  //!< Статическая тень
+		COMBO_OPTION("Dynamic", "1") //!< Динамическая тень
 	EDITOR_COMBO_END()
 
+	//! Угол
 	DEFINE_FIELD_FLOAT(m_fAngle, 0, "angle", "Angle", EDITOR_TEXTFIELD)
+	//! Верхний радиус
 	DEFINE_FIELD_FLOAT(m_fRadiusTop, 0, "radius_top", "Radius top", EDITOR_TEXTFIELD)
 
 END_PROPTABLE()
diff --git a/source/game/LightDirectional.h b/source/game/LightDirectional.h
index e3f794715cb5ed7f8d731e3d5a74459ed1bc147e..362831664b652d0f17daa896011b9aa8129310bd 100644
--- a/source/game/LightDirectional.h
+++ b/source/game/LightDirectional.h
@@ -1,9 +1,22 @@
 
+/******************************************************
+Copyright © Vitaliy Buturlin, Evgeny Danilovich, 2017
+See the license in LICENSE
+******************************************************/
+
+/*!
+\file
+Направленный свет
+*/
+
 #ifndef __LIGHTDIRECTIONAL_H
 #define __LIGHTDIRECTIONAL_H
 
 #include "SXpointEntity.h"
 
+/*! Направленный свет
+\ingroup clight
+*/
 class CLightDirectional: public SXpointEntity
 {
 	DECLARE_CLASS(CLightDirectional, SXpointEntity);
diff --git a/source/game/LightPoint.cpp b/source/game/LightPoint.cpp
index f2899ff265727fb877ce112806f6f87672fda32d..a5ca368ed6a870c738989e26246d6d878f5c4aa8 100644
--- a/source/game/LightPoint.cpp
+++ b/source/game/LightPoint.cpp
@@ -3,23 +3,36 @@
 
 #include <mtllight/sxmtllight.h>
 
+/*! \skydocent light_point
+Точечный источник света
+*/
+
 BEGIN_PROPTABLE(CLightPoint)
+	//! Цвет
 	DEFINE_FIELD_VECTOR(m_vColor, 0, "color", "Color", EDITOR_TEXTFIELD)
+	//! Дальность
 	DEFINE_FIELD_FLOAT(m_fDist, 0, "dist", "Distance", EDITOR_TEXTFIELD)
+	//! Дальность дальняя
 	DEFINE_FIELD_FLOAT(m_fShadowDist, 0, "light_far", "Light far", EDITOR_TEXTFIELD)
 
+	//! Тип тени
 	DEFINE_FIELD_INT(m_iShadowType, 0, "type_shadow", "Type shadow", EDITOR_COMBOBOX)
-		COMBO_OPTION("None", "-1")
-		COMBO_OPTION("Static", "0")
-		COMBO_OPTION("Dynamic", "1")
+		COMBO_OPTION("None", "-1")   //!< Нет
+		COMBO_OPTION("Static", "0")  //!< Статическая тень
+		COMBO_OPTION("Dynamic", "1") //!< Динамическая тень
 	EDITOR_COMBO_END()
 
+	//! Включить
 	DEFINE_INPUT(turnOn, "turnOn", "Turn On", PDF_NONE)
+	//! Выключить
 	DEFINE_INPUT(turnOff, "turnOff", "Turn Off", PDF_NONE)
 
+	//! При включении
 	DEFINE_OUTPUT(m_onTurnOn, "OnTurnOn", "On Turn On")
+	//! При выключении
 	DEFINE_OUTPUT(m_onTurnOff, "OnTurnOff", "On Turn Off")
 
+	//! Изначально выключена
 	DEFINE_FLAG(LIGHT_INITIALLY_DARK, "Initially dark")
 END_PROPTABLE()
 
diff --git a/source/game/LightPoint.h b/source/game/LightPoint.h
index 726bf9114e756cf6d32bdab74ee76d92b785be09..ed0a04c962fb7f108f8828d033c21f867e443702 100644
--- a/source/game/LightPoint.h
+++ b/source/game/LightPoint.h
@@ -1,4 +1,14 @@
 
+/******************************************************
+Copyright © Vitaliy Buturlin, Evgeny Danilovich, 2017
+See the license in LICENSE
+******************************************************/
+
+/*!
+\file
+Точечный свет
+*/
+
 #ifndef __LIGHTPOINT_H
 #define __LIGHTPOINT_H
 
@@ -6,6 +16,9 @@
 
 #define LIGHT_INITIALLY_DARK 0x00010000
 
+/*! Точечный источник света
+\ingroup clight
+*/
 class CLightPoint : public SXpointEntity
 {
 	DECLARE_CLASS(CLightPoint, SXpointEntity);
diff --git a/source/game/NPCBase.cpp b/source/game/NPCBase.cpp
index 0c57ccfbe26c1581622d2dbdadc984d333f6f5a7..518dffa7e0b30dccea16186139647993a5b430dd 100644
--- a/source/game/NPCBase.cpp
+++ b/source/game/NPCBase.cpp
@@ -1,6 +1,10 @@
 
 #include "NPCBase.h"
 
+/*! \skydocent npc_base
+Базовый класс для NPC
+*/
+
 BEGIN_PROPTABLE(CNPCBase)
 // empty
 	
@@ -150,58 +154,58 @@ void CNPCBase::OnSync()
 	if (m_fHealth <= 0.f)
 		return;
 
-	//���������� ������� id ����� �� �����
+	//определяем текущий id квада аи сетки
 	m_idCurrAiQuad = SAIG_QuadGet(&(float3)m_vPosition, true);
 
-	//���� ���� ����� �� ������� � ��������� ���� �� ����� �������/��������� ����� �� �������
+	//если квад найти не удалось и состояние пути не равно немного/полностью вышел за пределы
 	if (m_idCurrAiQuad < 0 && (m_statePath != NPC_STATE_PATH_BITBEYOND || m_statePath != NPC_STATE_PATH_BEYOND))
 	{
-		//���� �� �� �������� �� ����
+		//если мы не движемся по пути
 		if (m_idCurrQuaidInPath < 0 || m_idCurrQuaidInPath >= m_aPathQuads.size())
 		{
 			gridCheckBeyond();
 		}
-		//����� �� �������� �� ����, ��������� ��� ������ ����� ���������� � ��������� �����
+		//иначе мы движемся по пути, проверяем как далеко лежат предыдущий и следующий квады
 		else
 		{
-			//���� ��� �� ������ ���� �� ����, � ��������� ����� ������� ����������� ����� � �������� ��� ����� � �������� �����������
+			//если это не первый квад на пути, и дистанция между центром предыдущего квада и позицией нпс лежит в пределах допустимого
 			if (m_idCurrQuaidInPath > 0 && SMVector3Distance(m_vPosition, m_vPosQuadInPathLast) <= NPC_QUAD_DIST_NOTBEYOND)
 				m_idCurrAiQuad = m_aPathQuads[m_idCurrQuaidInPath-1];
-			//����� ���� ��������� ����� ������� ���������� ����� � �������� ��� ����� � �������� �����������
+			//иначе если дистанция между центром следующего квада и позицией нпс лежит в пределах допустимого
 			else if (SMVector3Distance(m_vPosition, m_vPosQuadInPathNext) <= NPC_QUAD_DIST_NOTBEYOND)
 				m_idCurrAiQuad = m_aPathQuads[m_idCurrQuaidInPath];
-			else //����� ���-�� �� ���
+			else //иначе что-то не так
 			{
 				gridCheckBeyond();
 			}
 		}
 	}
 
-	//���� ��������� ���� ������� ����� �� ������� � ����������� ������ ����� ��� ������� �� �����
+	//если состояние пути немного вышел за пределы и установлено нужное время для прихода на сетку
 	if (m_statePath == NPC_STATE_PATH_BITBEYOND && m_ulTimeReturnInGrid > 0)
 	{
 		int iTimeDelta = Core_RIntGet(G_RI_INT_TIME_DELTA);
 		m_ulTimeAllReturnInGrid += iTimeDelta;
 
-		//���� ����� ����� �������� � ����� ��������� ������
+		//если общее время движения к сетке превысело предел
 		if (m_ulTimeAllReturnInGrid >= m_ulTimeReturnInGrid)
 		{
-			//������ ������ ����� ��� ��� �� ��������, ������������� ��������� ����� �� �������
+			//значит скорее всего нпс уже не вернется, устанавливаем состояние вышел за пределы
 			m_statePath = NPC_STATE_PATH_BEYOND;
 			m_ulTimeReturnInGrid = m_ulTimeAllReturnInGrid = 0;
 			m_pCharacter->setWalkDirection(F3_BTVEC(float3(0, 0, 0)));
-			//���� ��� ���������� ����
+			//если был предыдущий путь
 			if (m_aPathQuads.size() > 0)
 				SAIG_GridSetColorArr(&(m_aPathQuads[0]), 0, m_aPathQuads.size());
 		}
 	}
 
-	//���� ����������� �� ����� �� ���������
+	//если возвращение на сетку не допустимо
 	if (m_statePath == NPC_STATE_PATH_BEYOND)
 	{
 		if (m_fHealth > 0.f)
 		{
-			//�������� �������� ���, ������ -1 ����� ������ ������ ��� ������ ��� ���� ���
+			//минусуем здоровье нпс, делаем -1 чтобы предки поняли что только что умер нпс
 			m_fHealth = -1.f;
 			return;
 		}
@@ -212,30 +216,30 @@ void CNPCBase::OnSync()
 
 void CNPCBase::gridCheckBeyond()
 {
-	//������� ��������� ���� � ������� ������� ���
+	//находим ближайший квад к текущей позиции нпс
 	ID idq = SAIG_QuadGetNear(&(float3)m_vPosition);
 	if (idq >= 0)
 	{
 		float3 tpos;
 		SAIG_QuadGetPos(idq, &tpos);
 		float dist = SMVector3Distance(m_vPosition, tpos);
-		//���� ��������� ����� ������� �������� ��� � �������� ���������� ����� ����� � ���������� �������� ����������� �� �����
+		//если дистанция между текущей позицией нпс и позицией ближайшего квада лежит в допустимых пределах возвращения на сетку
 		if (dist <= NPC_QUAD_DIST_BEYOND)
 		{
-			//������ �������� ��� ����� �� �������
+			//просто сообщаем что вышли за пределы
 			m_statePath = NPC_STATE_PATH_BITBEYOND;
 
-			//���� ��� ���������� ����
+			//если был предыдущий путь
 			if (m_aPathQuads.size() > 0)
 				SAIG_GridSetColorArr(&(m_aPathQuads[0]), 0, m_aPathQuads.size());
 
-			//� ������������� ���� �����������
+			//и устанавливаем путь возвращения
 			m_aPathQuads.resize(1);
 			m_aPathQuads[0] = idq;
 			m_idCurrQuaidInPath = 0;
 			SAIG_GridSetColorArr(&(m_aPathQuads[0]), m_ulColor, m_aPathQuads.size());
 
-			//������������ ����� �������� �� ���� �� �����
+			//просчитываем время хождения по пути до сетки
 			m_ulTimeReturnInGrid = (dist * m_fSpeedWalk) * 1000.f * 20.f;
 			m_ulTimeAllReturnInGrid = 0;
 		}
@@ -248,7 +252,7 @@ void CNPCBase::gridCheckBeyond()
 
 void CNPCBase::pathWalk()
 {
-	//���� ������� ���� ����� ���� �� ��������
+	//если текущий ключ квада пути не известен
 	if (m_idCurrQuaidInPath >= m_aPathQuads.size() || m_idCurrQuaidInPath < 0)
 	{
 		m_idCurrQuaidInPath = -1;
@@ -258,43 +262,43 @@ void CNPCBase::pathWalk()
 
 	m_stateMove = NPC_STATE_MOVE_RUN;
 
-	//���� ������� ���� ������ ���� � ������� ���� ��� �� ������� ���������� ������ ���� ���� ��������� ������ ����, ������ ������ ����� ��� ������ � ����
+	//если текущий квад больше нуля и текущий квад нпс не явлется предыдущим квадом пути либо следующим квадом пути, значит скорее всего нпс сбился с пути
 	if (m_idCurrQuaidInPath > 0 && (m_idCurrAiQuad != m_aPathQuads[m_idCurrQuaidInPath] && m_idCurrAiQuad != m_aPathQuads[m_idCurrQuaidInPath - 1]))
 	{
-		//���� ������� ���� ��� �� ������� ������� ����������� � ���������� ������ ����, ������ ��� ����� �� ���������� �������, � ������ ������ � ����
+		//если текущий квад нпс не явлется соседом предыдущему и следующему квадам пути, значит нпс вышел за допустимые пределы, а значит сбился с пути
 		if (!SAIG_QuadIs2Neighbors(m_idCurrAiQuad, m_aPathQuads[m_idCurrQuaidInPath], m_aPathQuads[m_idCurrQuaidInPath - 1]))
 		{
 			m_statePath = NPC_STATE_PATH_LOST;
 			m_pCharacter->setWalkDirection(F3_BTVEC(float3(0,0,0)));
 			return;
 		}
-		else //����� ��� ����� ���������� �� ��������, ����������
+		else //иначе нпс чуток отклонился от маршрута, поправляем
 			orientAtPoint(&m_vPosQuadInPathNext, NPC_TIME_ORIENT_IN_PATH);
 	}
 
-	//���� ��������� ���� �� ����� ���������� � ����� �� ������� ���
+	//если следующий квад аи сетки несвободен и занят не текущим нпс
 	if (SAIG_QuadGetState(m_aPathQuads[m_idCurrQuaidInPath]) != AIQUAD_STATE_FREE && SAIG_QuadGetStateWho(m_aPathQuads[m_idCurrQuaidInPath]) != GetId())
 	{
-		//������ �� ��������� ���� � ������� ��� ������ � ����
+		//значит он преградил путь и текущий нпс сбился с пути
 		m_statePath = NPC_STATE_PATH_LOST;
 		m_pCharacter->setWalkDirection(F3_BTVEC(float3(0, 0, 0)));
 		return;
 	}
 
-	//�������� ��������� ���� �� ����� �� ������� ���
+	//занимаем следующий квад аи сетки за текущим нпс
 	SAIG_QuadSetState(m_aPathQuads[m_idCurrQuaidInPath], AIQUAD_STATE_TEMPBUSY);
 	SAIG_QuadSetStateWho(m_aPathQuads[m_idCurrQuaidInPath], GetId());
 
 	SAIG_QuadGetPos(m_aPathQuads[m_idCurrQuaidInPath], &m_vPosQuadInPathNext);
 
-	//���� ������� ������� ��� ���� ��� ������� ����� � �������� �� ���������, � �� ������� ������ ���� ����� ����������
+	//если текущая позиция нпс ниже чем позиция квада к которому он стремится, и их разница больше либо равна допустимой
 	if (m_vPosQuadInPathNext.y > m_vPosition.y && abs(m_vPosQuadInPathNext.y - m_vPosition.y) >= m_fStepHeight - NPC_STEP_HEIGHT_EPSILON)
 	{
-		//������� ��� ���� ��������
+		//говорим что надо прыгнуть
 		m_canJump = true;
 	}
 
-	//���� �������� ������
+	//если разрешен прыжок
 	if (m_canJump)
 	{
 		if (m_pCharacter->canJump())
@@ -317,10 +321,10 @@ void CNPCBase::pathWalk()
 
 		++m_idCurrQuaidInPath;
 
-		//���� ���� ��������� ���� ������� ����� �� �������
+		//если было состояние пути немного вышел за пределы
 		if (m_statePath == NPC_STATE_PATH_BITBEYOND)
 		{
-			//������������� ��������� �� ��������� ����
+			//устанавилваем состояние не найденный путь
 			m_statePath = NPC_STATE_PATH_NOTFOUND;
 			m_ulTimeReturnInGrid = m_ulTimeAllReturnInGrid = 0;
 		}
@@ -351,7 +355,7 @@ void CNPCBase::orientAtPoint(const float3 * pos, DWORD ttime)
 	float angle = (acosf(SMVector3Dot(NPC_BASE_DIR, dircam)) * sign2(SMVector3Cross(NPC_BASE_DIR, dircam).y));
 	angle = (-angle);
 	
-	//������������ ����������� �������� � ��������
+	//просчитываем направление движения и скорость
 	float3 dir = SMVector3Normalize(SMQuaternion(angle, 'y') * NPC_BASE_DIR);
 	float speed = 0;
 	if (m_stateMove == NPC_STATE_MOVE_WALK)
diff --git a/source/game/NPCBase.h b/source/game/NPCBase.h
index b878f814814450607d28afed77187cc932b2f1bd..20196b0bb30d3cbe46f5e02539f4b5de5b79f298 100644
--- a/source/game/NPCBase.h
+++ b/source/game/NPCBase.h
@@ -1,3 +1,16 @@
+/******************************************************
+Copyright © Vitaliy Buturlin, Evgeny Danilovich, 2017
+See the license in LICENSE
+******************************************************/
+
+/*!
+\file
+Базовый класс npc
+*/
+
+/*! \ingroup cbaseanimating
+@{
+*/
 
 #ifndef __NPCBASE_H_
 #define __NPCBASE_H_
@@ -5,10 +18,10 @@
 #include "SXbaseAnimating.h"
 #include <aigrid/sxaigrid.h>
 
-//! ������� ����������� ��� ���
+//! базовое направление для нпс
 #define NPC_BASE_DIR float3(0,0,-1)
 
-//����� � ����� ��� ������� ���������� �� ���������� ����
+//время в млсек для плавной ориентации на проходящий путь
 #define NPC_TIME_ORIENT_IN_PATH 250
 
 #define NPC_STEP_HEIGHT_EPSILON	0.05f
@@ -16,34 +29,35 @@
 #define NPC_QUAD_DIST_NOTBEYOND	AIGRID_QUAD_SIZE
 #define NPC_QUAD_DIST_BEYOND	AIGRID_QUAD_SIZE*2.f
 
-//! �������� ��������
+//! состяния движения
 enum NPC_STATE_MOVE
 {
-	NPC_STATE_MOVE_IDLE_START = 0,	//!< �����������
-	NPC_STATE_MOVE_IDLE = 1,		//!< �����
-	NPC_STATE_MOVE_WALK = 2,		//!< ����
-	NPC_STATE_MOVE_RUN = 4,			//!< �����
+	NPC_STATE_MOVE_IDLE_START = 0,	//!< остановился
+	NPC_STATE_MOVE_IDLE = 1,		//!< стоит
+	NPC_STATE_MOVE_WALK = 2,		//!< идет
+	NPC_STATE_MOVE_RUN = 4,			//!< бежит
 };
 
-//! ��������� ���������
+//! состояния опасности
 enum NPC_STATE_DANGER
 {
-	NPC_STATE_DANGER_CALM		= 0,	//!< �������
-	NPC_STATE_DANGER_UNVISIBLE	= 1,	//!< ���������, �� �� ����� ��� ���������
-	NPC_STATE_DANGER_VISIBLE	= 2,	//!< ��������� � ����� ��� ���������
+	NPC_STATE_DANGER_CALM		= 0,	//!< спокоен
+	NPC_STATE_DANGER_UNVISIBLE	= 1,	//!< беспокоен, но не знает где опасность
+	NPC_STATE_DANGER_VISIBLE	= 2,	//!< беспокоен и знает где опасность
 };
 
-//! ��������� ����
+//! состояния пути
 enum NPC_STATE_PATH
 {
-	NPC_STATE_PATH_NOTFOUND		= 0,	//!< �� ������ ����
-	NPC_STATE_PATH_BITBEYOND	= 1,	//!< �� ��������� (����������� ���������)
-	NPC_STATE_PATH_BEYOND		= 2,	//!< �� ��������� (����������� �� ���������)
-	NPC_STATE_PATH_LOST			= 3,	//!< ������ � ����
-	NPC_STATE_PATH_FOUND		= 4,	//!< ������
+	NPC_STATE_PATH_NOTFOUND		= 0,	//!< не найден путь
+	NPC_STATE_PATH_BITBEYOND	= 1,	//!< за пределами (возвращение допустимо)
+	NPC_STATE_PATH_BEYOND		= 2,	//!< за пределами (возвращение не допустимо)
+	NPC_STATE_PATH_LOST			= 3,	//!< сбился с пути
+	NPC_STATE_PATH_FOUND		= 4,	//!< найден
 };
 
-class CNPCBase : public SXbaseAnimating
+//! Базовый класс npc
+class CNPCBase: public SXbaseAnimating
 {
 	DECLARE_CLASS(CNPCBase, SXbaseAnimating);
 	DECLARE_PROPTABLE();
@@ -55,9 +69,9 @@ public:
 	CNPCBase(EntityManager * pMgr);
 	~CNPCBase();
 
-	ID getAIQuad();	//id ����� �� ����� �� ������� ����� ���
+	ID getAIQuad();	//!< id квада аи сетки на котором стоит нпс
 
-	//��������� ������� �������������� ����������� �� �� �����
+	//! установка позиции сопровождается ориентацией на аи сетке
 	void SetPos(const float3 &pos);
 	bool SetKV(const char *name, const char *value);
 	void OnSync();
@@ -69,41 +83,43 @@ protected:
 	btPairCachingGhostObject * m_pGhostObject;
 	btKinematicCharacterController * m_pCharacter;
 
-	bool pathFind(ID endq);	//!< ����� ���� �� �������� (�� ������� ����� ���) �� endq
-	void pathWalk();		//!< �������� �� ����
-	void gridCheckBeyond();	//!< �������� �� ����� �� ������� �����, � ���� ��� �� ��������� ��������������� ���������
+	bool pathFind(ID endq);	//!< поиск пути от текущего (на котором стоит нпс) до endq
+	void pathWalk();		//!< хождение по пути
+	void gridCheckBeyond();	//!< проверка на выход за пределы сетки, и если так то установка соответсвующего состояния
 
-	//! ��������� ��� �� ����� pos, ttime ����� � ����� �� ������� ��� ����� �������� �/�� �����
+	//! ориентаци нпс на точку pos, ttime время в млсек за которое нпс будет повернут в/на точку
 	void orientAtPoint(const float3 *pos, DWORD ttime);	
-	void updateOrientLerp();//!< ������� ������������ ���������
+	void updateOrientLerp();//!< плавная интерполяция поворотов
 
-	float m_fHealth;	//�������� [0,1]
+	float m_fHealth;	//!< здоровье [0,1]
 
-	float m_fSpeedWalk;	//�������� �������� ��� ������
-	float m_fSpeedRun;	//�������� �������� ��� ����
+	float m_fSpeedWalk;	//!< скорость движения при ходьбе
+	float m_fSpeedRun;	//!< скорость движения при беге
 
-	ID m_idCurrAiQuad;			//������� id ����� �� ������� ��������� ���
+	ID m_idCurrAiQuad;			//!< текущий id квада на котором находится нпс
 
-	Array<ID> m_aPathQuads;		//������ � ���������������� ������ ���� �� �� �����
-	ID m_idCurrQuaidInPath;		//����� �������� ����� �� m_arr_path
+	Array<ID> m_aPathQuads;		//!< массив с идентификаторами квадов пути на аи сетке
+	ID m_idCurrQuaidInPath;		//!< номер текущего квада из m_arr_path
 	
-	float3 m_vLastPathPos;		//��������� ������� ��� �� ����
+	float3 m_vLastPathPos;		//!< последняя позиция нпс на пути
 
-	float3 m_vPosQuadInPathLast;	//������� ���������� ����� �� ������� ��� ���
-	float3 m_vPosQuadInPathNext;	//��������� ������ ����� �� ������� ��������� ���
+	float3 m_vPosQuadInPathLast;	//!< позиция последнего квада на котором был нпс
+	float3 m_vPosQuadInPathNext;	//!< следующая позици квада на которую стремится нпс
 	
-	float m_fAngleYLast;		//���������� ���� ��������
-	float m_fAngleYNext;		//��������� ���� ��������
-	DWORD m_ulTimeAllRot;		//����� ����� ������� ����������
-	DWORD m_ulTimeRot;			//����� �� ������� ������ ���� ������������ 
-
-	float m_fStepHeight;		//������ ����
-	bool m_canJump;				//������� �� ������
-	NPC_STATE_MOVE m_stateMove;	//��������� ��������
-	NPC_STATE_PATH m_statePath;	//��������� ����
-	DWORD m_ulColor;				//��������� (������ ����� ����������) ���� ��� ��� ����� ������ �����
-	DWORD m_ulTimeReturnInGrid;		//�� ������� ����� ��� ������ ��������� �� �� �����
-	DWORD m_ulTimeAllReturnInGrid;	//����� ����� ����������� ��� �� �� �����
+	float m_fAngleYLast;		//!< предыдущий угол поворота
+	float m_fAngleYNext;		//!< следующий угол поворота
+	DWORD m_ulTimeAllRot;		//!< общее время текущей ориентации
+	DWORD m_ulTimeRot;			//!< время за которое должен быть ориентирован 
+
+	float m_fStepHeight;		//!< высота шага
+	bool m_canJump;				//!< прыгать ли сейчас
+	NPC_STATE_MOVE m_stateMove;	//!< состояние движения
+	NPC_STATE_PATH m_statePath;	//!< состояние пути
+	DWORD m_ulColor;				//!< случайный (скорее всего уникальный) цвет нпс для метки квадов сетки
+	DWORD m_ulTimeReturnInGrid;		//!< за сколько млсек нпс должен вернуться на аи сетку
+	DWORD m_ulTimeAllReturnInGrid;	//!< общее время возвращения нпс на аи сетку
 };
 
-#endif
\ No newline at end of file
+#endif
+
+//! @}
diff --git a/source/game/NPCZombie.cpp b/source/game/NPCZombie.cpp
index fda64994cda0ade467f667475c586881ff8d4dfa..f87dfa18ec8bdb45012508c88e0e6b280ddfc935 100644
--- a/source/game/NPCZombie.cpp
+++ b/source/game/NPCZombie.cpp
@@ -2,6 +2,10 @@
 #include "NPCZombie.h"
 #include "score/sxscore.h"
 
+/*! \skydocent npc_zombie
+NPC зомби
+*/
+
 BEGIN_PROPTABLE(CNPCZombie)
 // empty
 	
@@ -33,27 +37,27 @@ void CNPCZombie::OnSync()
 	SSCore_SndPosWSet(m_idSndIdle2, &GetPos());
 	SSCore_SndPosWSet(m_idSndDeath, &GetPos());
 
-	//���� �������� ������ ����
+	//если здоровье меньше нуля
 	if (m_fHealth < 0.0f)
 	{
-		//�� ������������� �������� ������
+		//то воспроизводим анимацию смерти
 		this->PlayAnimation("fake_death0");
 		SSCore_SndPlay(m_idSndDeath);
-		m_fHealth = 0.f;	//�������� �������� ������ ��� ������ ����������� �������� �� ����
+		m_fHealth = 0.f;	//обнуляем здоровье говоря что больше проигрывать анимацию не надо
 		return;
 	}
 
 	if (m_fHealth <= 0.f)
 		return;
 
-	//���� ������ � ����, �������� ����
+	//если сбился с пути, обнуляем путь
 	if (m_statePath == NPC_STATE_PATH_LOST)
 	{
-		//!!!���� ������ ������� ����� ����
+		//!!!надо искать позицию конца пути
 		m_stateMove = NPC_STATE_MOVE_IDLE_START;
 		m_idCurrQuaidInPath = -1;
 	}
-	//����� ���� ��������� ���� == ������� ����� �� ������� (����������)
+	//иначе если состояние пути == немного вышел за пределы (допустимые)
 	else if (m_statePath == NPC_STATE_PATH_BITBEYOND)
 	{
 		m_stateMove = NPC_STATE_MOVE_RUN;
diff --git a/source/game/NPCZombie.h b/source/game/NPCZombie.h
index 0959e97eb5adf351372a2b5b608b8d82d71be632..3b29039b917fdd4a6cdb8eabbfa000d49ec44bb3 100644
--- a/source/game/NPCZombie.h
+++ b/source/game/NPCZombie.h
@@ -1,10 +1,23 @@
+/******************************************************
+Copyright © Vitaliy Buturlin, Evgeny Danilovich, 2017
+See the license in LICENSE
+******************************************************/
+
+/*!
+\file
+Базовый класс npc
+*/
+
+/*! \ingroup cbaseanimating
+@{
+*/
 
 #ifndef _NPCZombie_H_
 #define _NPCZombie_H_
 
 #include "NPCBase.h"
 
-
+//! Класс NPC зомби
 class CNPCZombie : public CNPCBase
 {
 	DECLARE_CLASS(CNPCZombie, CNPCBase);
@@ -26,4 +39,6 @@ protected:
 	ID m_idSndDeath;
 };
 
-#endif
\ No newline at end of file
+#endif
+
+//! @}
diff --git a/source/game/PathCorner.cpp b/source/game/PathCorner.cpp
index 2f96300eb101a3e8d642a8f505b5c3cac4e303a7..f0a7a742616d1d542efb6e446bfeb98c594693cc 100644
--- a/source/game/PathCorner.cpp
+++ b/source/game/PathCorner.cpp
@@ -1,13 +1,20 @@
 #include "PathCorner.h"
 
+/*! \skydocent path_corner
+Точка для формирования пути для #func_train
+*/
 
 BEGIN_PROPTABLE(PathCorner)
+	//! Тип сглаживания пути
 	DEFINE_FIELD_INT(m_type, 0, "type", "Type", EDITOR_COMBOBOX)
-		COMBO_OPTION("Corner", "0")
-		COMBO_OPTION("Spline", "1")
+		COMBO_OPTION("Corner", "0") //!< Нет сглаживания
+		COMBO_OPTION("Spline", "1") //!< Сплайном
 	EDITOR_COMBO_END()
 
+	//! Новая скорость для поезда
 	DEFINE_FIELD_FLOAT(m_fNewSpeed, 0, "speed", "New speed", EDITOR_TEXTFIELD)
+
+	//! Следующая точка пути
 	DEFINE_FIELD_ENTITY(m_pNextStop, 0, "next", "Next stop", EDITOR_TEXTFIELD)
 
 END_PROPTABLE()
diff --git a/source/game/PathCorner.h b/source/game/PathCorner.h
index d43bf26b8f589dec04f4ffaa52be6195c14ead13..b32a5ef8ca9a63856b124f714efa615829386793 100644
--- a/source/game/PathCorner.h
+++ b/source/game/PathCorner.h
@@ -1,14 +1,31 @@
+
+/******************************************************
+Copyright © Vitaliy Buturlin, Evgeny Danilovich, 2017
+See the license in LICENSE
+******************************************************/
+
+/*!
+\file
+Точка пути
+*/
+
+/*! \ingroup cpointentity
+@{
+*/
+
 #ifndef _PathCorner_H_
 #define _PathCorner_H_
 
 #include "SXpointEntity.h"
 
+//! тип сглаживания пути
 enum PATH_CORNER_TYPE
 {
-	PCT_CORNER = 0,
-	PCT_SPLINE = 1
+	PCT_CORNER = 0, //!< без сглаживания
+	PCT_SPLINE = 1 //!< сплайном
 };
 
+//! Точка пути для #FuncTrain
 class PathCorner: public SXpointEntity
 {
 	DECLARE_CLASS(PathCorner, SXpointEntity);
@@ -16,23 +33,32 @@ class PathCorner: public SXpointEntity
 public:
 	PathCorner(EntityManager * pMgr);
 
-
+	//! получает координаты точки на пути на расстоянии dist от начала
 	float3 GetPoint(float dist);
+	//! получает вращение точки на пути на расстоянии dist от начала
 	SMQuaternion GetRot(float dist);
+	//! получает длину пути
 	float GetLength();
 
+	//! Получает следующую точку на пути
 	PathCorner * GetNext();
+	//! Получает предыдущую точку на пути
 	PathCorner * GetPrev();
 
 protected:
+	//! Пересчитывает путь
 	void RecalcPath(float t);
 	void OnPostLoad();
 
+	//! Тип сглаживания
 	int m_type;
+	//! Новая скорость поезда
 	float m_fNewSpeed;
 
+	//! Длина сегмента пути
 	float m_fLength;
 
+	//! Для расчета сплайна @{
 	float3_t m_fH;
 
 	float3_t m_fCoeffsA;
@@ -42,9 +68,14 @@ protected:
 
 	float3_t m_fDelta;
 	float3_t m_fLambda;
+	//! @}
 
+	//! Следующая точка
 	PathCorner * m_pNextStop;
+	//! Предыдущая точка
 	PathCorner * m_pPrevStop;
 };
 
 #endif
+
+//! @}
diff --git a/source/game/SXbaseAmmo.cpp b/source/game/SXbaseAmmo.cpp
index f081c6676d554f0b70739d5c1dc98517916ecbe0..cc588a00071943f254dcad7100c169c8d3edd79c 100644
--- a/source/game/SXbaseAmmo.cpp
+++ b/source/game/SXbaseAmmo.cpp
@@ -1,9 +1,15 @@
 #include "SXbaseAmmo.h"
 
+/*! \skydocent base_ammo
+Базовый класс для патронов
+*/
 
 BEGIN_PROPTABLE(SXbaseAmmo)
+	//! Начальная скорость пули
 	DEFINE_FIELD_FLOAT(m_fStartSpeed, PDFF_NOEDIT | PDFF_NOEXPORT, "start_speed", "", EDITOR_NONE)
+	//! Масса пули, кг
 	DEFINE_FIELD_FLOAT(m_fBulletMass, PDFF_NOEDIT | PDFF_NOEXPORT, "bullet_mass", "", EDITOR_NONE)
+	//! Бронебойность
 	DEFINE_FIELD_FLOAT(m_fArmorPiercing, PDFF_NOEDIT | PDFF_NOEXPORT, "armor_piercing", "", EDITOR_NONE)
 END_PROPTABLE()
 
diff --git a/source/game/SXbaseAmmo.h b/source/game/SXbaseAmmo.h
index 232cfe805856d457706236c07161c8c3d0b33ce5..a289b1e683f2b6a71fe4a6996ddb3eee4e0c2b36 100644
--- a/source/game/SXbaseAmmo.h
+++ b/source/game/SXbaseAmmo.h
@@ -1,8 +1,21 @@
+/******************************************************
+Copyright © Vitaliy Buturlin, Evgeny Danilovich, 2017
+See the license in LICENSE
+******************************************************/
+
+/*!
+\file
+Патроны
+*/
+
 #ifndef _SXbaseAmmo_H_
 #define _SXbaseAmmo_H_
 
 #include "SXbaseSupply.h"
 
+/*! Базовый класс патронов
+\ingroup cbaseitem
+*/
 class SXbaseAmmo: public SXbaseSupply
 {
 	DECLARE_CLASS(SXbaseAmmo, SXbaseSupply);
@@ -10,12 +23,16 @@ class SXbaseAmmo: public SXbaseSupply
 public:
 	DECLARE_CONSTRUCTOR();
 
+	//! Стреляет пулю
 	void fire(const float3 &vStart, const float3 &vEnd);
 
 protected:
 
+	//! Начальная скорость
 	float m_fStartSpeed;
+	//! Масса пули
 	float m_fBulletMass;
+	//! Бронебойность
 	float m_fArmorPiercing;
 };
 
diff --git a/source/game/SXbaseAmmoBox.cpp b/source/game/SXbaseAmmoBox.cpp
index ae47aea582eb88daf1f24deb290083cf884bb06f..c2da6149e1dc25a4c7e7b9b643610f7c582e8ac2 100644
--- a/source/game/SXbaseAmmoBox.cpp
+++ b/source/game/SXbaseAmmoBox.cpp
@@ -1,10 +1,17 @@
 #include "SXbaseAmmoBox.h"
 
+/*! \skydocent base_ammobox
+Базовый класс коробки с припасами. При использовании, выдает игроку items_per_use объектов item_class, если внутри содержится достаточно
+*/
 
 BEGIN_PROPTABLE(SXbaseAmmoBox)
+	//! Объем коробки в итемах
 	DEFINE_FIELD_INT(m_iMaxItems, PDFF_NOEDIT | PDFF_NOEXPORT, "max_items", "", EDITOR_NONE)
+	//! Текущее количество итемов внутри
 	DEFINE_FIELD_INT(m_iCurItems, PDFF_NOEDIT | PDFF_NOEXPORT, "cur_items", "", EDITOR_NONE)
+	//! Сколько выдать за одно использование
 	DEFINE_FIELD_INT(m_iItemsPerUse, PDFF_NOEDIT | PDFF_NOEXPORT, "items_per_use", "", EDITOR_NONE)
+	//! Класс выдаваемого объекта
 	DEFINE_FIELD_STRING(m_szAmmoType, PDFF_NOEDIT | PDFF_NOEXPORT, "item_class", "", EDITOR_NONE)
 END_PROPTABLE()
 
diff --git a/source/game/SXbaseAmmoBox.h b/source/game/SXbaseAmmoBox.h
index c8cd62e871083d530ed4446d4d0fa245b36b3ca7..f9cc7a682eca76e980437d79e5d4e745217ee903 100644
--- a/source/game/SXbaseAmmoBox.h
+++ b/source/game/SXbaseAmmoBox.h
@@ -1,8 +1,21 @@
+/******************************************************
+Copyright © Vitaliy Buturlin, Evgeny Danilovich, 2017
+See the license in LICENSE
+******************************************************/
+
+/*!
+\file
+Аммобокс
+*/
+
 #ifndef _SXbaseAmmoBox_H_
 #define _SXbaseAmmoBox_H_
 
 #include "SXbaseItem.h"
 
+/*! Аммобокс
+\ingroup cbaseitem
+*/
 class SXbaseAmmoBox: public SXbaseItem
 {
 	DECLARE_CLASS(SXbaseAmmoBox, SXbaseItem);
@@ -10,11 +23,11 @@ class SXbaseAmmoBox: public SXbaseItem
 public:
 	ThisClass(EntityManager * pMgr);
 
-	int m_iMaxItems; //!< ������������ ���������� ���������, ������� ���� ����� ������
-	int m_iCurItems; //!< ������� ��������
-	int m_iItemsPerUse; //!< ������� �������� �� ���
+	int m_iMaxItems; //!< Максимальное количество предметов, которые бокс может выдать
+	int m_iCurItems; //!< Сколько осталось
+	int m_iItemsPerUse; //!< Сколько выдавать за раз
 
-	const char * m_szAmmoType; //!< ��� ��������� ��� ������
+	const char * m_szAmmoType; //!< Тип предметов для выдачи
 };
 
 #endif
diff --git a/source/game/SXbaseAnimating.cpp b/source/game/SXbaseAnimating.cpp
index eb1c63d639d64af9612b73b6e33a2c778f04fefd..af7af8fb3ae7d42d722a78542ff853e467e9b0f1 100644
--- a/source/game/SXbaseAnimating.cpp
+++ b/source/game/SXbaseAnimating.cpp
@@ -1,12 +1,17 @@
 #include "SXbaseAnimating.h"
 #include "gcore/sxgcore.h"
 
+/*! \skydocent base_animating
+Базовый класс для объектов, имеющих объем в игровом мире
+*/
+
 BEGIN_PROPTABLE(SXbaseAnimating)
-// empty
+	//! Файл модели. Поддерживаются статические и анимированные модели
 	DEFINE_FIELD_STRING(m_szModelFile, 0, "model", "Model file", EDITOR_FILEFIELD)
 		FILE_OPTION("Model file (*.dse)", "*.dse")
 	EDITOR_FILE_END()
 
+	//! Масштаб модели
 	DEFINE_FIELD_FLOAT(m_fBaseScale, 0, "scale", "Scale", EDITOR_TEXTFIELD)
 END_PROPTABLE()
 
@@ -23,6 +28,7 @@ SXbaseAnimating::SXbaseAnimating(EntityManager * pMgr):
 
 SXbaseAnimating::~SXbaseAnimating()
 {
+	ReleasePhysics();
 	mem_release(m_pAnimPlayer);
 }
 
diff --git a/source/game/SXbaseAnimating.h b/source/game/SXbaseAnimating.h
index 36b600feedfab727cbd7670349db9ddb40310398..ed12d730c1090ae1c450dbd45b2c31c5c18c4574 100644
--- a/source/game/SXbaseAnimating.h
+++ b/source/game/SXbaseAnimating.h
@@ -1,9 +1,26 @@
+
+/******************************************************
+Copyright © Vitaliy Buturlin, Evgeny Danilovich, 2017
+See the license in LICENSE
+******************************************************/
+
+/*!
+\file
+Анимированный игровой объект
+*/
+
+/*! \defgroup cbaseanimating Моделированные объекты
+\ingroup cbaseentity
+@{
+*/
+
 #ifndef _SXbaseAnimating_H_
 #define _SXbaseAnimating_H_
 
 #include "SXbaseEntity.h"
 #include <anim/sxanim.h>
 
+//! Анимированный игровой объект
 class SXbaseAnimating: public SXbaseEntity
 {
 	DECLARE_CLASS(SXbaseAnimating, SXbaseEntity);
@@ -47,3 +64,5 @@ protected:
 };
 
 #endif
+
+/*! @} cbaseanimating */
diff --git a/source/game/SXbaseEntity.cpp b/source/game/SXbaseEntity.cpp
index a70265c186421be292a6dc2f918d3d745e3eb39d..4cff430e8faf6eab1f6faa11edd46e1690c0cb11 100644
--- a/source/game/SXbaseEntity.cpp
+++ b/source/game/SXbaseEntity.cpp
@@ -4,12 +4,22 @@
 
 #include "EntityManager.h"
 
+/*! \skydocent base_entity
+Базовый объект. От него наследуются все остальные объекты
+*/
+
 BEGIN_PROPTABLE_NOBASE(SXbaseEntity)
+	//! Имя объекта
 	DEFINE_FIELD_STRING(m_szName, 0, "name", "Name", EDITOR_TEXTFIELD)
+	//! Позиция в мире
 	DEFINE_FIELD_VECTOR(m_vPosition, 0, "origin", "Origin", EDITOR_TEXTFIELD)
+	//! Ориентация в мире, углы эйлера или кватернион
 	DEFINE_FIELD_ANGLES(m_vOrientation, 0, "rotation", "Rotation", EDITOR_TEXTFIELD)
+	//! Родительский объект в иерархии движения
 	DEFINE_FIELD_PARENT(m_pParent, 0, "parent", "Parent entity", EDITOR_TEXTFIELD)
+	//! Флаги объекта
 	DEFINE_FIELD_FLAGS(m_iFlags, 0, "flags", "Flags", EDITOR_FLAGS)
+	//! Объект-владелец
 	DEFINE_FIELD_ENTITY(m_pOwner, PDFF_NOEXPORT | PDFF_NOEDIT, "owner", "", EDITOR_NONE)
 
 	//DEFINE_FIELD_STRING(m_szName, 0, "some opt", "Option", EDITOR_COMBOBOX)
diff --git a/source/game/SXbaseEntity.h b/source/game/SXbaseEntity.h
index c8b7c836776af8fc05b61ad6054a8e3651a7e06f..765de460e966f5f884df5016cd5137591659d444 100644
--- a/source/game/SXbaseEntity.h
+++ b/source/game/SXbaseEntity.h
@@ -1,3 +1,20 @@
+
+/******************************************************
+Copyright © Vitaliy Buturlin, Evgeny Danilovich, 2017
+See the license in LICENSE
+******************************************************/
+
+/*!
+\file
+Базовый игровой объект
+*/
+
+/*! \defgroup cbaseentity Объекты. Базовый объект
+\ingroup sxgame
+Базовый объект, от которого наследуются все остальные классы объектов.
+@{
+*/
+
 #ifndef _SXbaseEntity_H_
 #define _SXbaseEntity_H_
 
@@ -15,6 +32,7 @@
 #pragma warning(push)
 #pragma warning(disable:4251)
 
+//! Базовый объект, от которого наследуются все остальные классы объектов.
 class SXGAME_EXPORT SXbaseEntity
 {
 	DECLARE_CLASS_NOBASE(SXbaseEntity);
@@ -23,37 +41,59 @@ class SXGAME_EXPORT SXbaseEntity
 	friend class EntityManager;
 
 public:
+	//! Конструктор
 	SXbaseEntity(EntityManager * pMgr);
 	virtual ~SXbaseEntity();
 
+	//! Возвращает имя движкового класса объекта
 	const char * GetClassName();
+	
+	//! Возвращает имя объекта
 	const char * GetName();
+	
+	//! Возвращает баунд объекта
 	virtual void GetMinMax(float3 * min, float3 * max);
+	
+	//! Возвращает баунд сферу объекта
 	virtual void GetSphere(float3 * center, float * radius);
 
+	//! Устанавливает мировую позицию объекта
 	virtual void SetPos(const float3 & pos);
+	//! Получает мировую позицию объекта
 	float3 GetPos();
 
+	//! Получает ID объекта в системе
 	ID GetId();
 
+	//! Получает флаги объекта
 	UINT GetFlags();
+	//! Устанавливает флаги объекта
 	void SetFlags(UINT f);
 
+	//! Получает мировую матрицу трансформации для объекта
 	SMMATRIX GetWorldTM();
 
+	//! Устанавливает вращение объекта
 	virtual void SetOrient(const SMQuaternion & q);
+	//! Возвращает вращение объекта
 	SMQuaternion GetOrient();
 
+	//! Устанавливает свойство объекта
 	virtual bool SetKV(const char * name, const char * value);
+	//! Получает свойство объекта
 	virtual bool GetKV(const char * name, char * out, int bufsize);
 
-
+	//! Устанавливает родительский объект для объекта
 	void SetParent(SXbaseEntity * pEnt, int attachment = -1);
+	//! Возвращает родительский объект объекта
 	SXbaseEntity * GetParent();
 
+	//! Устанавливает владельца
 	void SetOwner(SXbaseEntity * pEnt);
+	//! Возвращает владельца объекта
 	SXbaseEntity * GetOwner();
 
+	//! Получает объект менеджера
 	EntityManager * getManager();
 
 	//void updateDiscreteLinearVelocity(int step, float dt);
@@ -68,38 +108,64 @@ private:
 protected:
 	EntityManager * m_pMgr;
 
+	//! Позиция объекта
 	float3_t m_vPosition;
+	
+	/*! Скорость
+	\note вероятно, не используется
+	*/
 	float3_t m_vSpeed;
+	
+	//! вращение
 	SMQuaternion m_vOrientation;
 	//float3_t m_vDiscreteLinearVelocity;
 	//float3_t m_vOldPosition;
 
-
+	//! Позиция смещения (для иерархической структуры)
 	float3_t m_vOffsetPos;
+	//! Вращение смещения (для иерархической структуры)
 	SMQuaternion m_vOffsetOrient;
 
+	//! Идентификатор в системе
 	ID m_iId;
 
+	//! Флаги
 	UINT m_iFlags;
 
+	//! Имя объекта
 	const char * m_szName;
 
+	//! Родитель
 	SXbaseEntity * m_pParent;
+	//! Индекс кости родителя
 	int m_iParentAttachment;
 
+	//! Владелец
 	SXbaseEntity * m_pOwner;
 
+	//! Вызывается на стадии синхронизации
 	virtual void OnSync();
+	//! Вызывается при создании после установки всех свойств
 	virtual void OnPostLoad();
 
+	//! Получает смещение для кости
 	virtual float3 GetAttachmentPos(int id);
+	//! Получает вращение для кости
 	virtual SMQuaternion GetAttachmentRot(int id);
 
+	/*! Устанавливает значение строкового свойства
+	\note только для внутреннего использования
+	*/
 	void _SetStrVal(const char ** to, const char * value);
 
+	/*! Обновляет выходы
+	\note только для внутреннего использования
+	*/
 	void updateOutputs();
 };
 
 #pragma warning(pop)
 
 #endif
+
+/*! @} cbaseentity*/
diff --git a/source/game/SXbaseItem.cpp b/source/game/SXbaseItem.cpp
index 6472cb428575a169e50ffdd63ec6481999ee4665..2374bca2d7dd859eef66ba7fdb245bc10cb46969 100644
--- a/source/game/SXbaseItem.cpp
+++ b/source/game/SXbaseItem.cpp
@@ -1,12 +1,21 @@
 #include "SXbaseItem.h"
 
+/*! \skydocent base_item
+Базовый объект элемента инвентаря игрока
+*/
 
 BEGIN_PROPTABLE(SXbaseItem)
+	//! Имя в инвентаре
 	DEFINE_FIELD_STRING(m_szInvName, PDFF_NOEDIT | PDFF_NOEXPORT, "inv_name", "", EDITOR_NONE)
+	//! Может ли стакаться
 	DEFINE_FIELD_BOOL(m_bInvStackable, PDFF_NOEDIT | PDFF_NOEXPORT, "inv_stackable", "", EDITOR_NONE)
+	//! Текущий размер стака
 	DEFINE_FIELD_INT(m_iInvStackCurSize, PDFF_NOEDIT, "inv_stack_cur", "", EDITOR_NONE)
+	//! Максимальное число объектов в стаке
 	DEFINE_FIELD_INT(m_iInvStackMaxSize, PDFF_NOEDIT | PDFF_NOEXPORT, "inv_stack_max", "", EDITOR_NONE)
+	//! Масса одного объекта, кг
 	DEFINE_FIELD_FLOAT(m_iInvWeight, PDFF_NOEDIT | PDFF_NOEXPORT, "inv_weight", "", EDITOR_NONE)
+	//! Можно ли поднимать объект
 	DEFINE_FIELD_BOOL(m_bPickable, PDFF_NOEDIT | PDFF_NOEXPORT, "inv_pickable", "", EDITOR_NONE)
 END_PROPTABLE()
 
diff --git a/source/game/SXbaseItem.h b/source/game/SXbaseItem.h
index 990800eb0815899d83f51376b2315b6ee4c129b4..c0ce2ecd9700ff308ced164761e939461de8b8ce 100644
--- a/source/game/SXbaseItem.h
+++ b/source/game/SXbaseItem.h
@@ -1,8 +1,24 @@
+/******************************************************
+Copyright © Vitaliy Buturlin, Evgeny Danilovich, 2017
+See the license in LICENSE
+******************************************************/
+
+/*!
+\file
+Предметы инвентаря
+*/
+
+/*! \defgroup cbaseitem Предметы инвентаря
+\ingroup cbaseanimating
+@{
+*/
+
 #ifndef _SXbaseItem_H_
 #define _SXbaseItem_H_
 
 #include "SXbaseAnimating.h"
 
+//! Базовый класс предмета инвентаря
 class SXbaseItem: public SXbaseAnimating
 {
 	DECLARE_CLASS(SXbaseItem, SXbaseAnimating);
@@ -10,12 +26,14 @@ class SXbaseItem: public SXbaseAnimating
 public:
 	DECLARE_CONSTRUCTOR();
 
-	const char * m_szInvName; //!< ���, ������������ � ���������
-	bool m_bInvStackable; //!< ����� �� ������� ��������� ������ � ����� ������
-	int m_iInvStackCurSize; //!< ���������� ������ � �����
-	int m_iInvStackMaxSize; //!< ������������ ���������� ������ � �����
-	float m_iInvWeight; //!< ����� �������
-	bool m_bPickable; //!< ����� �� ������� ������
+	const char * m_szInvName; //!< Имя, отображаемое в инвентаре
+	bool m_bInvStackable; //!< Можно ли хранить несколько итемов в одной ячейке
+	int m_iInvStackCurSize; //!< Количество итемов в стеке
+	int m_iInvStackMaxSize; //!< Максимальное количество итемов в стеке
+	float m_iInvWeight; //!< Масса объекта
+	bool m_bPickable; //!< Можно ли поднять объект
 };
 
 #endif
+
+//! @}
diff --git a/source/game/SXbasePistol.h b/source/game/SXbasePistol.h
index b5bf6b2e839954db0f02eeb8d5efa1534dbce3db..7f657933c7d5f50f0c57658e2106e634f7dc8af4 100644
--- a/source/game/SXbasePistol.h
+++ b/source/game/SXbasePistol.h
@@ -1,6 +1,19 @@
+/******************************************************
+Copyright © Vitaliy Buturlin, Evgeny Danilovich, 2017
+See the license in LICENSE
+******************************************************/
+
+/*!
+\file
+Пистолеты
+*/
+
 #ifndef _SXbasePistol_H_
 #define _SXbasePistol_H_
 
+/*! Пистолеты
+\ingroup cbaseitem
+*/
 #include "SXbaseWeapon.h"
 
 class SXbasePistol: public SXbaseWeapon
diff --git a/source/game/SXbaseRiffle.cpp b/source/game/SXbaseRiffle.cpp
index 2b5e4a944d304c68fc8c925151ccbda83f7223d7..1b3c1fc2fc2c82abd066786b347938d7f8b31b03 100644
--- a/source/game/SXbaseRiffle.cpp
+++ b/source/game/SXbaseRiffle.cpp
@@ -1,5 +1,8 @@
 #include "SXbaseRiffle.h"
 
+/*! \skydocent base_riffle
+Базовый класс винтовки
+*/
 
 BEGIN_PROPTABLE(SXbaseRiffle)
 // empty
diff --git a/source/game/SXbaseRiffle.h b/source/game/SXbaseRiffle.h
index ad8eb606a8e0b39a8fdbd3200b9e529aa9ac5c2d..5282cca659a7b5f3cd075f1b15edc0885c5255db 100644
--- a/source/game/SXbaseRiffle.h
+++ b/source/game/SXbaseRiffle.h
@@ -1,8 +1,21 @@
+/******************************************************
+Copyright © Vitaliy Buturlin, Evgeny Danilovich, 2017
+See the license in LICENSE
+******************************************************/
+
+/*!
+\file
+Винтовки
+*/
+
 #ifndef _SXbaseRiffle_H_
 #define _SXbaseRiffle_H_
 
 #include "SXbaseWeapon.h"
 
+/*! Винтовки
+\ingroup cbaseitem
+*/
 class SXbaseRiffle: public SXbaseWeapon
 {
 	DECLARE_CLASS(SXbaseRiffle, SXbaseWeapon);
diff --git a/source/game/SXbaseSnipe.h b/source/game/SXbaseSnipe.h
index 25c37e2a41d6c178a6ca8a871ef1939ee0d99d06..5345d453fc1a43674434db8f43926f825c232982 100644
--- a/source/game/SXbaseSnipe.h
+++ b/source/game/SXbaseSnipe.h
@@ -1,8 +1,21 @@
+/******************************************************
+Copyright © Vitaliy Buturlin, Evgeny Danilovich, 2017
+See the license in LICENSE
+******************************************************/
+
+/*!
+\file
+Снайперские
+*/
+
 #ifndef _SXbaseSnipe_H_
 #define _SXbaseSnipe_H_
 
 #include "SXbaseWeapon.h"
 
+/*! Снайперские
+\ingroup cbaseitem
+*/
 class SXbaseSnipe: public SXbaseWeapon
 {
 	DECLARE_CLASS(SXbaseSnipe, SXbaseWeapon);
diff --git a/source/game/SXbaseSupply.cpp b/source/game/SXbaseSupply.cpp
index a5be0064ad75cc6fcea7b8dc229e87b9f1cfd062..0a5429fec37ccd6bf3c100dbc519cd9264359e8d 100644
--- a/source/game/SXbaseSupply.cpp
+++ b/source/game/SXbaseSupply.cpp
@@ -1,5 +1,8 @@
 #include "SXbaseSupply.h"
 
+/*! \skydocent base_supply
+Базовый класс припаса (патроны, батарейки, т.д)
+*/
 
 BEGIN_PROPTABLE(SXbaseSupply)
 //empty
diff --git a/source/game/SXbaseSupply.h b/source/game/SXbaseSupply.h
index 669bdba947bc083d0dcb97b2c98ecae49189751c..5a2f0e19d23b8271973f0ebe316c4064679a53a3 100644
--- a/source/game/SXbaseSupply.h
+++ b/source/game/SXbaseSupply.h
@@ -1,8 +1,21 @@
+/******************************************************
+Copyright © Vitaliy Buturlin, Evgeny Danilovich, 2017
+See the license in LICENSE
+******************************************************/
+
+/*!
+\file
+Базовый класс припаса
+*/
+
 #ifndef _SXbaseSupply_H_
 #define _SXbaseSupply_H_
 
 #include "SXbaseItem.h"
 
+/*! Базовый класс припаса (патроны, батарейки, прочие расходники)
+\ingroup cbaseitem
+*/
 class SXbaseSupply: public SXbaseItem
 {
 	DECLARE_CLASS(SXbaseSupply, SXbaseItem);
diff --git a/source/game/SXbaseTool.cpp b/source/game/SXbaseTool.cpp
index a3d8282909e7d182ba999a78c7cdd30217f04ad7..9b7ce26c3b5cb59a6fb5c68a97f1630d928c089b 100644
--- a/source/game/SXbaseTool.cpp
+++ b/source/game/SXbaseTool.cpp
@@ -4,23 +4,41 @@
 #include <decals/sxdecals.h>
 #include "SXplayer.h"
 
+/*! \skydocent base_tool
+Базовый класс для инструмента (в т.ч оружие). То, что игрок может взять в руки и использовать
+*/
+
+
 BEGIN_PROPTABLE(SXbaseTool)
+	//! Время перезарядки, с
 	DEFINE_FIELD_FLOAT(m_fReloadTime, PDFF_NOEDIT | PDFF_NOEXPORT, "reload_time", "", EDITOR_NONE)
+	//! Время прицеливания, с
 	DEFINE_FIELD_FLOAT(m_fZoomTime, PDFF_NOEDIT | PDFF_NOEXPORT, "zoom_time", "", EDITOR_NONE)
 
+	//! Смещение визуальной модели
 	DEFINE_FIELD_VECTOR(m_vSlotPos, PDFF_NOEDIT | PDFF_NOEXPORT, "slot_offset", "", EDITOR_NONE)
+	//! Вращение визуальной модели
 	DEFINE_FIELD_ANGLES(m_qSlotRot, PDFF_NOEDIT | PDFF_NOEXPORT, "slot_rotation", "", EDITOR_NONE)
+	//! Смещение визуальной модели в прицеливании
 	DEFINE_FIELD_VECTOR(m_vSlotPosAim, PDFF_NOEDIT | PDFF_NOEXPORT, "slot_offset_aim", "", EDITOR_NONE)
+	//! Вращение визуальной модели в прицеливании
 	DEFINE_FIELD_ANGLES(m_qSlotRotAim, PDFF_NOEDIT | PDFF_NOEXPORT, "slot_rotation_aim", "", EDITOR_NONE)
 	
+	//! Разрешить прицеливание
 	DEFINE_FIELD_INT(m_iZoomable, PDFF_NOEDIT | PDFF_NOEXPORT, "zoomable", "", EDITOR_NONE)
 
+	//! Звук первичного действия
 	DEFINE_FIELD_STRING(m_szPrimaryActionSound, PDFF_NOEDIT | PDFF_NOEXPORT, "action1_sound", "", EDITOR_NONE)
+	//! Звук вторичного действия
 	DEFINE_FIELD_STRING(m_szSecondaryActionSound, PDFF_NOEDIT | PDFF_NOEXPORT, "action2_sound", "", EDITOR_NONE)
+	//! Эффект первичного действия
 	DEFINE_FIELD_STRING(m_szPrimaryActionMuzzleflash, PDFF_NOEDIT | PDFF_NOEXPORT, "action1_muzzle", "", EDITOR_NONE)
+	//! Эффект вторичного действия
 	DEFINE_FIELD_STRING(m_szSecondaryActionMuzzleflash, PDFF_NOEDIT | PDFF_NOEXPORT, "action2_muzzle", "", EDITOR_NONE)
 	
+	//! Максимальная дальность
 	DEFINE_FIELD_FLOAT(m_fMaxDistance, PDFF_NOEDIT | PDFF_NOEXPORT, "max_distance", "", EDITOR_NONE)
+	//! Подходящие типы припасов, классы, через запятую
 	DEFINE_FIELD_STRING(m_szUsableAmmos, PDFF_NOEDIT | PDFF_NOEXPORT, "ammos", "", EDITOR_NONE)
 
 END_PROPTABLE()
diff --git a/source/game/SXbaseTool.h b/source/game/SXbaseTool.h
index b69fa9e368bd6d589ceb846d2185410f3fa3f2a5..4a34d6f65b651506cd1bbcdb60ea80433e7a1d10 100644
--- a/source/game/SXbaseTool.h
+++ b/source/game/SXbaseTool.h
@@ -1,3 +1,13 @@
+/******************************************************
+Copyright © Vitaliy Buturlin, Evgeny Danilovich, 2017
+See the license in LICENSE
+******************************************************/
+
+/*!
+\file
+Базовый класс инструмента
+*/
+
 #ifndef _SXbaseTool_H_
 #define _SXbaseTool_H_
 
@@ -16,6 +26,9 @@ enum
 	DSM_PRINT
 };
 
+/*! Инструмент
+\ingroup cbaseitem
+*/
 class SXbaseTool: public SXbaseItem
 {
 	DECLARE_CLASS(SXbaseTool, SXbaseItem);
diff --git a/source/game/SXbaseWeapon.cpp b/source/game/SXbaseWeapon.cpp
index bfdbdd349519c9f3e9f51f28eec6af67db126193..f68fc039f0bca3aeb6e1c2240d5b9686c66cc79d 100644
--- a/source/game/SXbaseWeapon.cpp
+++ b/source/game/SXbaseWeapon.cpp
@@ -3,30 +3,53 @@
 #include "SXbaseWeapon.h"
 #include "SXplayer.h"
 
+/*! \skydocent base_weapon
+Базовый класс для оружия
+*/
+
 
 BEGIN_PROPTABLE(SXbaseWeapon)
+	//! Совместимые прицелы, классы через запятую
 	DEFINE_FIELD_STRING(m_szAddonScopes, PDFF_NOEDIT | PDFF_NOEXPORT, "addon_scopes", "", EDITOR_NONE)
+	//! Совместимые глушители
 	DEFINE_FIELD_STRING(m_szAddonSilencers, PDFF_NOEDIT | PDFF_NOEXPORT, "addon_silencers", "", EDITOR_NONE)
+	//! Совместимые магазины
 	DEFINE_FIELD_STRING(m_szAddonMags, PDFF_NOEDIT | PDFF_NOEXPORT, "addon_mags", "", EDITOR_NONE)
+	//! Совместимые ручки
 	DEFINE_FIELD_STRING(m_szAddonHandlers, PDFF_NOEDIT | PDFF_NOEXPORT, "addon_handlers", "", EDITOR_NONE)
 
+	//! Доступные режимы стрельбы
 	DEFINE_FIELD_STRING(m_szFireModes, PDFF_NOEDIT | PDFF_NOEXPORT, "fire_modes", "", EDITOR_NONE)
+	//! Скорострельность одиночными
 	DEFINE_FIELD_INT(m_iSingleSpeed, PDFF_NOEDIT | PDFF_NOEXPORT, "single_speed", "", EDITOR_NONE)
+	//! Скорострельность в автоматическом режиме
 	DEFINE_FIELD_INT(m_iBurstSpeed, PDFF_NOEDIT | PDFF_NOEXPORT, "burst_speed", "", EDITOR_NONE)
+	//! Скорострельность отсечками
 	DEFINE_FIELD_INT(m_iCutoffSpeed, PDFF_NOEDIT | PDFF_NOEXPORT, "cutoff_speed", "", EDITOR_NONE)
+	//! Патронов в отсечке
 	DEFINE_FIELD_INT(m_iCutoffSize, PDFF_NOEDIT | PDFF_NOEXPORT, "cutoff_size", "", EDITOR_NONE)
+	//! Текущий режим стрельбы
 	DEFINE_FIELD_INT(m_fireMode, PDFF_NOEDIT, "fire_mode", "", EDITOR_NONE)
 
+	//! Звук извлечения
 	DEFINE_FIELD_STRING(m_szSndDraw, PDFF_NOEDIT | PDFF_NOEXPORT, "snd_draw", "", EDITOR_NONE)
+	//! Звук убирания
 	DEFINE_FIELD_STRING(m_szSndHolster, PDFF_NOEDIT | PDFF_NOEXPORT, "snd_holster", "", EDITOR_NONE)
+	//! Звук выстрела
 	DEFINE_FIELD_STRING(m_szSndShoot, PDFF_NOEDIT | PDFF_NOEXPORT, "snd_shoot", "", EDITOR_NONE)
+	//! Звук попытки выстрела без патрона
 	DEFINE_FIELD_STRING(m_szSndEmpty, PDFF_NOEDIT | PDFF_NOEXPORT, "snd_empty", "", EDITOR_NONE)
+	//! Звук перезарядки
 	DEFINE_FIELD_STRING(m_szSndReload, PDFF_NOEDIT | PDFF_NOEXPORT, "snd_reload", "", EDITOR_NONE)
+	//! Звук переключения
 	DEFINE_FIELD_STRING(m_szSndSwitch, PDFF_NOEDIT | PDFF_NOEXPORT, "snd_switch", "", EDITOR_NONE)
 
+	//! Эффективная дистанция, км
 	DEFINE_FIELD_FLOAT(m_fEffectiveDistance, PDFF_NOEDIT | PDFF_NOEXPORT, "effective_distance", "", EDITOR_NONE)
 
+	//! Вместимость патронов без магазина
 	DEFINE_FIELD_INT(m_iCapacity, PDFF_NOEDIT | PDFF_NOEXPORT, "capacity", "", EDITOR_NONE)
+	//! Текущая загрузка без учета магазина
 	DEFINE_FIELD_INT(m_iCurrentLoad, PDFF_NOEDIT, "current_load", "", EDITOR_NONE)
 END_PROPTABLE()
 
diff --git a/source/game/SXbaseWeapon.h b/source/game/SXbaseWeapon.h
index 4b997cdb38af0af7db135f2001922b7f0016d3dd..7f46533db667e5cc88240bc179587c995b09183d 100644
--- a/source/game/SXbaseWeapon.h
+++ b/source/game/SXbaseWeapon.h
@@ -1,3 +1,13 @@
+/******************************************************
+Copyright © Vitaliy Buturlin, Evgeny Danilovich, 2017
+See the license in LICENSE
+******************************************************/
+
+/*!
+\file
+Базовый класс оружия
+*/
+
 #ifndef _SXbaseWeapon_H_
 #define _SXbaseWeapon_H_
 
@@ -18,7 +28,9 @@ enum FIRE_MODE
 };
 #define FIRE_MODE_COUNT 3
 
-
+/*! Оружие
+\ingroup cbaseitem
+*/
 class SXbaseWeapon: public SXbaseTool
 {
 	DECLARE_CLASS(SXbaseWeapon, SXbaseTool);
diff --git a/source/game/SXplayer.cpp b/source/game/SXplayer.cpp
index 91360b0789c2954dd364880fa8098107df759a6a..40a8d7bc9c480829c41e6c45814b38223a342252 100644
--- a/source/game/SXplayer.cpp
+++ b/source/game/SXplayer.cpp
@@ -7,6 +7,10 @@
 
 #include "GameData.h"
 
+/*! \skydocent player
+Объект игрока в мире
+*/
+
 BEGIN_PROPTABLE(SXplayer)
 // empty
 END_PROPTABLE()
@@ -380,21 +384,21 @@ void SXplayer::OnSync()
 	
 	m_vPosition = (float3)(float3(trans.getOrigin().x(), trans.getOrigin().y() + 0.75f + m_fViewbobY, trans.getOrigin().z()) + m_fViewbobStrafe);
 
-	//������� ������� ���� �� ����� �� ������� ��������� �����
+	//находим текущий квад аи сетки на котором находится игрок
 	ID idq = SAIG_QuadGet(&float3(m_vPosition.x, m_vPosition.y - (0.75f + m_fViewbobY), m_vPosition.z), true);
 	
-	//���� �����
+	//если нашли
 	if (idq >= 0)
 	{
-		//�������� ���� ����
+		//занимаем этот квад
 		SAIG_QuadSetState(idq, AIQUAD_STATE_TEMPBUSY);
 		SAIG_QuadSetStateWho(idq, GetId());
 	}
 
-	//���� ���������� � ������� ����� �� ���������
+	//если предыдущий и текущие квады не идентичны
 	if (m_idQuadCurr != idq)
 	{
-		//���� ��������� ��� ��������������, ������� ���������
+		//если предыдщий был действительным, убираем занятость
 		if (m_idQuadCurr >= 0)
 			SAIG_QuadSetState(m_idQuadCurr, AIQUAD_STATE_FREE);
 
diff --git a/source/game/SXplayer.h b/source/game/SXplayer.h
index 701943c04d646db4ae603dfe08cce4b1e5cc4dc0..1abb17615b552b993a3380c520fbe3cb3aa8438f 100644
--- a/source/game/SXplayer.h
+++ b/source/game/SXplayer.h
@@ -1,3 +1,18 @@
+
+/******************************************************
+Copyright © Vitaliy Buturlin, Evgeny Danilovich, 2017
+See the license in LICENSE
+******************************************************/
+
+/*!
+\file
+Класс игрока
+*/
+
+/*! \ingroup cbaseanimating
+@{
+*/
+
 #ifndef _SXplayer_H_
 #define _SXplayer_H_
 
@@ -6,24 +21,26 @@
 #include "LightDirectional.h"
 #include "crosshair.h"
 
-enum
+//! Типы движения игрока
+enum PLAYER_MOVE
 {
 	PM_NONE = 0,
-	PM_FORWARD = 0x01,   // ������
-	PM_BACKWARD = 0x02,  // �����
-	PM_LEFT = 0x04,      // �����
-	PM_RIGHT = 0x08,     // ������
-	PM_CROUCH = 0x10,    // ��������
-	PM_JUMP = 0x20,      // ��������
-	PM_RUN = 0x40,       // ������
-	PM_CRAWL = 0x80,     // ������
-	PM_OBSERVER = 0x100, // �����������
-
-	PM_STOP = 0xFFFF,
+	PM_FORWARD = 0x01,   //!< вперед
+	PM_BACKWARD = 0x02,  //!< назад
+	PM_LEFT = 0x04,      //!< влево
+	PM_RIGHT = 0x08,     //!< вправо
+	PM_CROUCH = 0x10,    //!< присесть
+	PM_JUMP = 0x20,      //!< прыгнуть
+	PM_RUN = 0x40,       //!< бежать
+	PM_CRAWL = 0x80,     //!< лежать
+	PM_OBSERVER = 0x100, //!< наблюдатель
+
+	PM_STOP = 0xFFFF
 };
 
 class SXbaseTool;
 
+//! Класс игрока  \ingroup cbaseanimating
 class SXplayer: public SXbaseAnimating
 {
 	DECLARE_CLASS(SXplayer, SXbaseAnimating);
@@ -32,71 +49,105 @@ public:
 	SXplayer(EntityManager * pMgr);
 	~SXplayer();
 	
+	//! Возвращает камеру игрока
 	SXpointCamera * GetCamera();
 
+	//! Переключает в режим наблюдателя
 	void Observe()
 	{
 		m_uMoveDir |= PM_OBSERVER;
 		m_pCrosshair->Enable(false);
 	}
+	//! Помещает игрока в мир
 	void Spawn();
 
+	/*! Запускает/останавливает движение в заданном направлении
+		@param [in] dir направление движения из #PLAYER_MOVE
+	*/
 	void Move(UINT dir, bool start);
 
+	//! Обновляет инпут от игрока
 	virtual void UpdateInput(float dt);
 
 	void OnSync();
 
+	//! Устанавливает положение в мире
 	void SetPos(const float3 & pos);
 
+	//! Запускает/останавливает первичную атаку
 	void Attack(BOOL state);
+	//! Запускает/останавливает вторичную атаку
 	void Attack2(BOOL state);
+	//! Запускает перезарядку активного оружия
 	void Reload();
+	//! Включает/выключает фонарь
 	void ToggleFlashlight();
+	//! Переключает режим стрельбы активного оружия
 	void nextFireMode();
 
+	/*! Возаращает мировую позицию для модели оружия
+		\note Устарело?
+	*/
 	float3 GetWeaponOrigin();
+	//! Получает смещения для задержки движения модели оружия при вращении игрока
 	float3_t & GetWeaponDeltaAngles();
 
+	//! Команды для подбора положения визуальной модели оружия на экране
 	void _ccmd_slot_on(int argc, const char ** argv);
 	void _ccmd_slot_off();
 
+	//! Получает объект перекрестия
 	Crosshair * GetCrosshair();
 
+	//! Находится ли игрок на земле
 	bool onGround();
 
+	//! Воспроизводит звук шагов с учетом материала на котором стоит игрок
 	void playFootstepsSound();
 
 protected:
-
+	//! Фонарик
 	CLightDirectional* m_flashlight;
+	//! Камера
 	SXpointCamera * m_pCamera;
 
+	//! Текущее движение
 	UINT m_uMoveDir;
 
+	//! ID интервала обновления
 	ID m_iUpdIval;
 
+	//! Углы вращения игрока
 	float3_t m_vPitchYawRoll;
 
+	//! Для физики @{
 	btCollisionShape * m_pCollideShape;
 	btRigidBody * m_pRigidBody;
 	btPairCachingGhostObject * m_pGhostObject;
 	btKinematicCharacterController * m_pCharacter;
+	//! @}
 
+	//! Текущий инструмент в руках
 	SXbaseTool * m_pActiveTool;
 
+	//! Может ли прыгать
 	bool m_canJump;
 
+	//! Для качания камеры @{
 	float m_fViewbobStep;
 	float m_fViewbobY;
 	float3_t m_fViewbobStrafe;
 	float3_t m_vWpnShakeAngles;
+	//! @}
 
 	int m_iDSM;
 
+	//! Перекрестие
 	Crosshair * m_pCrosshair;
 
-	ID m_idQuadCurr;	//������� ���� �� ����� �� ������� ����� �����
+	ID m_idQuadCurr;	//!< текущий квад аи сетки на котором стоит игрок
 };
 
 #endif
+
+//! @}
diff --git a/source/game/SXplayerSpawn.cpp b/source/game/SXplayerSpawn.cpp
index 031a453307dc5eb2753c6667014dc574c527702a..19cf04d906a1789efd125d2981c711850f289a94 100644
--- a/source/game/SXplayerSpawn.cpp
+++ b/source/game/SXplayerSpawn.cpp
@@ -1,7 +1,13 @@
 #include "SXplayerSpawn.h"
 
+/*! \skydocent info_player_spawn
+Камера
+*/
 
 BEGIN_PROPTABLE(SXplayerSpawn)
+	/*! Команда игроков, для которой работает спавн. 
+	\note Только для многопользовательского режима
+	*/
 	DEFINE_FIELD_INT(m_iTeam, 0, "team", "Team", EDITOR_COMBOBOX)
 		COMBO_OPTION("Team 1", "1")
 		COMBO_OPTION("Team 2", "2")
diff --git a/source/game/SXplayerSpawn.h b/source/game/SXplayerSpawn.h
index 6845820bb951990beb64e28e1ce1edfbc5cbefec..54754dc82944bcd84f94559e5e1956302e6f0d2c 100644
--- a/source/game/SXplayerSpawn.h
+++ b/source/game/SXplayerSpawn.h
@@ -1,8 +1,24 @@
+
+/******************************************************
+Copyright © Vitaliy Buturlin, Evgeny Danilovich, 2017
+See the license in LICENSE
+******************************************************/
+
+/*!
+\file
+Точка респауна игрока
+*/
+
+/*! \ingroup cpointentity
+@{
+*/
+
 #ifndef _SXplayerSpawn_H_
 #define _SXplayerSpawn_H_
 
 #include "SXpointEntity.h"
 
+//! Точка респауна игрока
 class SXplayerSpawn: public SXpointEntity
 {
 	DECLARE_CLASS(SXplayerSpawn, SXpointEntity);
@@ -14,3 +30,5 @@ public:
 };
 
 #endif
+
+//! @}
diff --git a/source/game/SXpointCamera.cpp b/source/game/SXpointCamera.cpp
index ae32dd8453082c2c45fe73f20447decea4a402c6..09456528ed3f0d9249fe636c22f217eb411e2e12 100644
--- a/source/game/SXpointCamera.cpp
+++ b/source/game/SXpointCamera.cpp
@@ -1,5 +1,8 @@
 #include "SXpointCamera.h"
 
+/*! \skydocent point_camera
+Камера
+*/
 
 BEGIN_PROPTABLE(SXpointCamera)
 // empty
diff --git a/source/game/SXpointCamera.h b/source/game/SXpointCamera.h
index bfb0056882e56ba0183b6ce06edb76c42ad5aea9..e6419c7c48b1d3b8623db0044c815c8301f221d2 100644
--- a/source/game/SXpointCamera.h
+++ b/source/game/SXpointCamera.h
@@ -1,3 +1,18 @@
+
+/******************************************************
+Copyright © Vitaliy Buturlin, Evgeny Danilovich, 2017
+See the license in LICENSE
+******************************************************/
+
+/*!
+\file
+Камера игровая
+*/
+
+/*! \ingroup cpointentity
+@{
+*/
+
 #ifndef _SXpointCamera_H_
 #define _SXpointCamera_H_
 
@@ -5,6 +20,7 @@
 
 #include "SXpointEntity.h"
 
+//! Класс камеры
 class SXpointCamera: public SXpointEntity
 {
 	DECLARE_CLASS(SXpointCamera, SXpointEntity);
@@ -13,6 +29,7 @@ public:
 	SXpointCamera(EntityManager * pMgr);
 	~SXpointCamera();
 
+	//! Возвращает объект камеры из графической либы
 	ISXCamera * GetCamera();
 
 protected:
@@ -22,3 +39,5 @@ protected:
 };
 
 #endif
+
+/*! @} */
diff --git a/source/game/SXpointEntity.cpp b/source/game/SXpointEntity.cpp
index 13fb3cfc57538947ed7a9ac00cdaef8c21a6e42c..426563818654bf666bdef6aa4c82dce23348235d 100644
--- a/source/game/SXpointEntity.cpp
+++ b/source/game/SXpointEntity.cpp
@@ -1,5 +1,8 @@
 #include "SXpointEntity.h"
 
+/*! \skydocent base_point
+Базовый точечный объект
+*/
 
 BEGIN_PROPTABLE(SXpointEntity)
  // empty
diff --git a/source/game/SXpointEntity.h b/source/game/SXpointEntity.h
index 30e557e981773f3b37d8089762b121574c91c2e2..cd8ddccbd9de524047e622cd8efa215a851276de 100644
--- a/source/game/SXpointEntity.h
+++ b/source/game/SXpointEntity.h
@@ -1,8 +1,27 @@
+
+/******************************************************
+Copyright © Vitaliy Buturlin, Evgeny Danilovich, 2017
+See the license in LICENSE
+******************************************************/
+
+/*!
+\file
+Точечные объекты
+*/
+
+/*! \defgroup cpointentity Точечные объекты
+\ingroup cbaseentity
+@{
+*/
+
+//! \defgroup clight Свет
+
 #ifndef _SXpointEntity_H_
 #define _SXpointEntity_H_
 
 #include "SXbaseEntity.h"
 
+//! Класс точечного объекта
 class SXpointEntity: public SXbaseEntity
 {
 	DECLARE_CLASS(SXpointEntity, SXbaseEntity);
@@ -12,3 +31,6 @@ public:
 };
 
 #endif
+
+/*! @} cpointentity */
+
diff --git a/source/game/sxgame.h b/source/game/sxgame.h
index 41f37d56a92d3cf8aa0d4e5d48a38456e34c63a9..bda10081e47b16a5a79a416ad307a045efdc404e 100644
--- a/source/game/sxgame.h
+++ b/source/game/sxgame.h
@@ -1,18 +1,153 @@
 
 /******************************************************
-Copyright � Vitaliy Buturlin, Evgeny Danilovich, 2017
+Copyright © Vitaliy Buturlin, Evgeny Danilovich, 2017
 See the license in LICENSE
 ******************************************************/
 
 /*!
 \file
-������������ ���� sxgame - ���������� ������� ��������
+Заголовочный файл sxgame - библиотека игровых объектов
 */
 
-/*! \defgroup sxgame sxgame - ���������� ������� ��������
-@{
+
+/*!
+	\page game_doc Игровая библиотека
+	В основе игровой библиотеки лежит понятие "объект". Каждый объект обладает набором свойств, которые можно настраивать. Для взаимодействия объектов между собой используются связи.
+	
+	\subpage game_connections
+	
+	\par Подкатегории
+	- \subpage ent_doc
 */
 
+/*!
+\page game_connections Соединения
+Соединения используются для осуществления связи между различными объектами. Каждое соединение состоит из двух частей: выхода и входа. Выход - некий сигнал, генерируемый объектом. Вход - функция другого объекта, которая меняет его состояние. Любой выход может быть связан с любым входом с помощью редактора соединений в редакторе уровня.\n
+Для создания соединения нужно выбрать выход, имя целевого объекта, его вход, задержку и параметр.\n
+Любой выход может быть связан с любым количеством входов любых обхектов.\n
+Задержка - определяет, через какое время выбранный вход будет активирован.\n
+*/
+
+/*! \page ent_doc Игровые объекты
+	
+	\subpage base_entity
+	
+	\par Подкатегории
+	- \subpage entcat_point
+	- \subpage entcat_prop
+*/
+
+/*! \page entcat_point Точечные объекты
+
+	\subpage base_point
+	
+	\par Объекты
+	- \subpage func_train
+	- \subpage info_player_spawn
+	- \subpage point_camera
+	- \subpage path_corner
+	
+	\par Подкатегории
+	- \subpage entcat_light
+*/
+
+/*! \page entcat_prop С моделью
+	
+	\subpage base_animating
+	
+	\par Объекты
+	- \subpage player
+	- \ref npc_base
+	- \ref base_item
+	
+	\par Подкатегории
+	- \subpage entcat_trigger
+	- \subpage entcat_npc
+	- \subpage entcat_items
+*/
+
+/*! \page entcat_items Для инвентаря
+	
+	\subpage base_item
+	
+	\par Объекты
+	- \subpage base_ammobox
+	- \ref base_supply
+	- \ref base_tool
+	- \ref base_wpn_addon
+	
+	\par Подкатегории
+	- \subpage entcat_supply
+	- \subpage entcat_tools
+	- \subpage entcat_wpn_addons
+*/
+
+/*! \page entcat_tools Инструменты
+	
+	\subpage base_tool
+	
+	\par Объекты
+	- \ref base_weapon
+	
+	\par Подкатегории
+	- \subpage entcat_weapon
+	
+*/
+
+/*! \page entcat_weapon Оружие
+	
+	\subpage base_weapon
+	
+	\par Объекты
+	- \subpage base_riffle	
+*/
+
+/*! \page entcat_wpn_addons Навесы к оружию
+	
+	\subpage base_wpn_addon
+	
+	\par Объекты
+	- \subpage base_silencer
+	- \subpage base_scope
+	- \subpage base_mag
+	- \subpage base_handle
+	
+*/
+
+/*! \page entcat_supply Припасы
+	
+	\subpage base_supply
+	
+	\par Объекты
+	- \subpage base_ammo
+	
+*/
+
+/*! \page entcat_npc NPC
+	
+	\subpage npc_base
+	
+	\par Объекты
+	- \subpage npc_zombie
+	
+*/
+
+/*! \page entcat_light Свет
+	
+	\par Объекты
+	- \subpage light_directional
+	- \subpage light_point
+*/
+
+/*! \page entcat_trigger Триггеры
+	
+	\par Объекты
+	- \subpage trigger
+*/
+
+/*! \defgroup sxgame sxgame - библиотека игровых объектов
+@{
+*/
 
 #ifndef _SXGAME_H_
 #define _SXGAME_H_
@@ -35,43 +170,43 @@ See the license in LICENSE
 #include "SXbaseEntity.h"
 
 
-/*! �������������� ����������
+/*! Инициализирует библиотеку
 */
 SX_LIB_API void SXGame_0Create();
 
-/*! ���������������� ����������
+/*! Деинициализирует библиотеку
 */
 SX_LIB_API void SXGame_AKill();
 
-/*! ������������� ������� ���������
+/*! Устанавливает функцию сообщений
 */
 SX_LIB_API void SXGame_Dbg_Set(report_func rf);
 
-/*! ������������� ���������� ������� ����������
+/*! Устанавливает количество потоков обновления
 */
 SX_LIB_API void SXGame_UpdateSetThreadNum(int num);
 
-/*! ��������� ����������
-@param[in] thread ����� ������, ������������ ����������
+/*! Выполняет обновление
+@param[in] thread Номер потока, выполняющего обновление
 */
 SX_LIB_API void SXGame_Update(int thread = 0);
 
-/*! ��������� �������������. ��� �������������� ����������
+/*! Выполняет синхронизацию. Для многопоточного обновления
 */
 SX_LIB_API void SXGame_Sync();
 
-/*! ��������� ������ entity �� �����
+/*! Загружает список entity из файла
 */
 SX_LIB_API void SXGame_LoadEnts(const char * file);
 
-/*! �������� ������� ������� ������ */
+/*! Выгрузка игровых объеков уровня */
 SX_LIB_API void SXGame_UnloadObjLevel();
 
-/*! ��������� ������� � ����
+/*! Сохраняет объекты в файл
 */
 SX_LIB_API void SXGame_SaveEnts(const char * file);
 
-/*! �������� ������ � ���
+/*! Помещает игрока в мир
 */
 SX_LIB_API void SXGame_PlayerSpawn();
 
@@ -82,42 +217,45 @@ SX_LIB_API void SXGame_EditorRender(ID id, ID id_sel_tex);
 
 SX_LIB_API ISXCamera * SXGame_GetActiveCamera();
 
-/*! �������� ���������� ������������������ ������� entity
+/*! Получает количество зарегистрированных классов entity
 */
 SX_LIB_API int SXGame_EntGetClassListCount();
 
-/*! �������� ������ ������������������ ������� entity.
-	������ ��� ������ const char * ������ ���� �������� �������
+/*! Получает список зарегистрированных классов entity.
+	Память под массив const char * должна быть выделена заранее
 */
 SX_LIB_API void SXGame_EntGetClassList(const char ** pszClassList, int count);
 
-/*! ������� entity ��������� ������
+/*! Создает entity заданного класса
 */
 SX_LIB_API SXbaseEntity * SXGame_CreateEntity(const char * classname);
 
-/*! ���������� entity
+/*! Уничтожает entity
 */
 SX_LIB_API void SXGame_RemoveEntity(SXbaseEntity * pEnt);
 
-/*! �������� ������� ������� ��� ��������� ������
+/*! Получает таблицу свойств для заданного класса
 */
 SX_LIB_API proptable_t * SXGame_EntGetProptable(const char * classname);
 
-/*! �������� �������� �������� �� ��������� ��� ��������� ������
+/*! Получает значение свойства по умолчанию для заданного класса
 */
 SX_LIB_API const char * SXGame_EntGetDefault(const char * classname, const char * key);
 
-/*! ���������� ���� entity
+/*! Количество всех entity
 */
 SX_LIB_API int SXGame_EntGetCount();
 
-/*! ���������� entity �� ��� id
+/*! Возвращает entity по его id
 */
 SX_LIB_API SXbaseEntity *SXGame_EntGet(ID id);
 
 SX_LIB_API SXbaseEntity *SXGame_EntGetByName(const char *szName, ID idStart = 0);
 
+
+
 #endif
 
 /*! @} sxgame*/
 
+
diff --git a/source/physics/PhyWorld.cpp b/source/physics/PhyWorld.cpp
index 22d380828822d292b0015aa3a5ccb8a1cc0dd276..19b342a7366ab3b62e3175200190255214891f35 100644
--- a/source/physics/PhyWorld.cpp
+++ b/source/physics/PhyWorld.cpp
@@ -394,6 +394,7 @@ void PhyWorld::UnloadGeom()
 		}
 		mem_delete(cshape);
 	}
+	m_iGreenShapes = 0;
 	mem_delete_a(m_piGreenTotal);
 	mem_delete_a(m_pppGreenStaticRigidBody);
 	mem_delete_a(m_ppGreenStaticCollideShape);
diff --git a/source/skyxengine.cpp b/source/skyxengine.cpp
index 5f9f40ccb6b0a4ba17222704ef0258862a461861..d47e21fced25fe981c7547a62e666f26421f20e6 100644
--- a/source/skyxengine.cpp
+++ b/source/skyxengine.cpp
@@ -122,7 +122,7 @@ void SkyXEngine_Init(HWND hWnd3D, HWND hWndParent3D)
 	else
 	{
 		hWnd3DCurr = hWnd3D;
-		
+
 		RECT rect;
 		GetClientRect(hWnd3DCurr, &rect);
 
@@ -377,7 +377,7 @@ void SkyXEngine_CreateLoadCVar()
 	
 	Core_0RegisterCVarBool("g_time_run", true, "Запущено ли игрвоое время?");
 	Core_0RegisterCVarFloat("g_time_speed", 1.f, "Скорость/соотношение течения игрового времени");
-	
+
 	Core_0RegisterCVarFloat("env_default_rain_density", 1.f, "Коэфициент плотности дождя (0,1]");
 	Core_0RegisterCVarBool("env_default_thunderbolt", true, "Могут ли воспроизводится эффекты молнии?");
 
diff --git a/source/sxconsole/sxconsole.cpp b/source/sxconsole/sxconsole.cpp
index c057409a78035e4fa8f55166c8a6e0881838fc7a..7f49561984126196da7636cf4f9ba333e30c130e 100644
--- a/source/sxconsole/sxconsole.cpp
+++ b/source/sxconsole/sxconsole.cpp
@@ -700,9 +700,9 @@ BOOL WINAPI HandlerRoutine(
 
 int main(int argc, char ** argv)
 {
+	SetConsoleOutputCP(CP_UTF8);
 	g_pColor = new ColorPrint();
 	g_hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);
-	SetConsoleOutputCP(CP_UTF8);
 	CONSOLE_SCREEN_BUFFER_INFO csbi;
 	GetConsoleScreenBufferInfo(g_hStdOut, &csbi);
 
diff --git a/source/sxleveleditor/SXLevelEditor.rc b/source/sxleveleditor/SXLevelEditor.rc
index e306a9ed31163b85ae3229b022e644b7cc5be060..2ed336701a8f94dc4f4a05639c3a8e19d0c58dfd 100644
Binary files a/source/sxleveleditor/SXLevelEditor.rc and b/source/sxleveleditor/SXLevelEditor.rc differ