
//XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
//XXXXXXXXXXXXXXXXXX	SystemPack MDB - ITEM SHIELD Manual (ver.1.0)
//XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
//	Created by SystemPack-Team (с) 2014
//=========================================================================================
//-----------------------------------------------------------------------------------------
"Класс ITEM SHIELD":
• Поддерживаемые платформы игры: "Готика 2: Ночь Ворона" и "Готика 1", требуемые файлы для
активации и использования щитов: Gothic2.exe и GothicMod.exe;
• Полностью восстановленая возможность использования щитов в бою, в виде полноценного оверлея
щита второго уровня, (требуемый уровень владения оружием 1Н = 60%);
• Активированы ранее неактивные слоты:
  - ZS_SHIELD (для ношения щита на спине);
  - ZS_LEFTARM (для удержания щита в кулаке).
• Реализовано полное взаимодействие с оружием 1Н: при поражении, щит как и оружие выпадает из
рук, при нырянии в воду убирается за спину.


"Исходные файлы модели и анимаций":
Hum_SH_INIT.max — анимации;
SHIELD_example.max — модель щита.

"Исходные файлы моделей для мануала по созданию щита":
Orig_model.max
Raw_model.max
Shifted_model.max
Zero_pivot_model.max


//-----------------------------------------------------------------------------------------
"Пример реализации скрипта щита для инстанции NPC/Hero":
instance PC_Hero(Npc_Default)
{
	name[0] = "Я";
	guild = GIL_NONE;
	id = 0;
	voice = 15;
	level = 0;
	npcType = npctype_main;
	bodyStateInterruptableOverride = TRUE;
	exp = 0;
	exp_next = 500;
	lp = 0;
	attribute[ATR_STRENGTH] = 100;
	attribute[ATR_DEXTERITY] = 100;
	attribute[ATR_MANA_MAX] = 100;
	attribute[ATR_MANA] = 100;
	attribute[ATR_HITPOINTS_MAX] = 400;
	attribute[ATR_HITPOINTS] = 400;
	Mdl_SetVisual(self,"HUMANS.MDS");
	Mdl_SetVisualBody(self,"hum_body_Naked0",9,0,"Hum_Head_Pony",Face_N_Player,0,NO_ARMOR);
	//... Строка Npc_SetTalentSkill служит для проверки режима SNEAK и используется только для тестов,
	// в релизе модификации ее следует удалить. Навык воровства(SNEAK) доступен при прокачке навыка в игре/моде.
	Npc_SetTalentSkill(self,NPC_TALENT_SNEAK,100);
	// ... Нельзя прописывать в явном виде функцию Npc_SetTalentSkill для одноручного боя (!) лучше, просто задать процент владения 60%:
	HitChance[NPC_TALENT_1H] = 60;
	// Подобная запись исключает возможные глюки с перекрытием оверлеев при сохранении/загрузке игры.
	// В модах-же, данную строку следует удалить, перенеся ее в функцию прокачки.
	// Запись B_SetFightSkills(self,60) лучше вообще не применять в инстанциях, иначе при сохранении/загрузке
	// оверлей одноручника второго уровня затрет оверлей щита.
	// Также не рекомендуется задавать здесь напрямую строки вида: MdlApplyOverlayMDS для щита.
	// Оверлей применяется в функции On_Equip инстанции щита.
	CreateInvItem(self,ItMw_1h_Mil_Sword);
	CreateInvItem(self,Shield);
};


//-----------------------------------------------------------------------------------------
// "Пример реализации скрипта щита для инстанции NPC/Npc":
instance SH_7204(Npc_Default)
{
	name[0] = "Боец";
	guild = GIL_OUT;
	id = 7204;
	voice = 8;
	flags = 0;
	attribute[ATR_STRENGTH] = 100;
	attribute[ATR_DEXTERITY] = 100;
	attribute[ATR_HITPOINTS_MAX] = 400;
	attribute[ATR_HITPOINTS] = 400;
	attribute[ATR_MANA_MAX] = 0;
	attribute[ATR_MANA] = 0;
	fight_tactic = FAI_HUMAN_STRONG;
	CreateInvItem(self,ItMw_1h_Mil_Sword);
	CreateInvItem(self,Shield);
	B_SetNpcVisual(self,MALE,"Hum_Head_Bald",Face_N_Normal_Sly,BodyTex_N,ITAR_Bau_M);
	HitChance[NPC_TALENT_1H] = 60;
};


//-----------------------------------------------------------------------------------------
// "Пример реализации скрипта щита для инстанции предмета класса C_Item":
instance Shield(C_Item)
{
	name = "Щит";
	mainflag = ITEM_KAT_NF;
	flags = ITEM_SHIELD;
	value = 10;
	protection[PROT_EDGE] = 25;
	protection[PROT_BLUNT] = 25;
	protection[PROT_POINT] = 25;
	protection[PROT_FIRE] = 10;
	protection[PROT_MAGIC] = 0;
	visual = "shield.3ds";
	material = MAT_WOOD;
	on_equip = Equip_Shield;
	on_unequip = UnEquip_Shield;
	description = name;
	text[1] = NAME_Prot_Edge;
	count[1] = protection[PROT_EDGE];
	text[2] = NAME_Prot_Point;
	count[2] = protection[PROT_POINT];
	text[3] = NAME_Prot_Fire;
	count[3] = protection[PROT_FIRE];
	text[4] = NAME_Prot_Magic;
	count[4] = protection[PROT_MAGIC];
	text[5] = NAME_Value;
	count[5] = value;
};


func void Equip_Shield()
// ... При желании можно ввести основную проверку того, что персонаж главный герой,
// а для NPC ввести свой набор более простых условий.
{
	// Если персонаж эксперт боя 1H...
	if(self.HitChance[NPC_TALENT_1H] >= 60)
	// Может быть полезно завести флаг, который высталять в "1" при одевании щита, и в "0" при его снятии.
	// Это будет флаг наличия экипированного щита (только для главного героя!).
	{
		// ... Применяем визуализацию экспертного боя со щитом:
		Mdl_ApplyOverlayMds(self,"SHIELD.MDS");
		// тестовое сообщение выводимое на экран, при релизе мода следует закомментировать/удалить.
		PrintScreen("Вы вооружены щитом",-1,YPOS_LevelUp,FONT_Screen,2);
	}
	// ... иначе:
	else
	{
		// ... Применяем визуализацию обычного боя со щитом c любыми условиями (если они есть):
		// Mdl_ApplyOverlayMds(self,"SHIELD_LEVEL_X.MDS");
		// PrintScreen("Применяется оверлей более низкого уровня владения",-1,YPOS_LevelUp,FONT_Screen,2);
		// и т.д.
		// Но в нашем обычном случае, просто снимается экипировка (нет навыка):
		PrintScreen("Нет навыка!",-1,YPOS_LevelUp,FONT_Screen,2);
		AI_UnequipWeapons(self);
	};
};


func void UnEquip_Shield()
{
	// Снимаем все возможные оверлеи щита!
	Mdl_RemoveOverlayMds(self,"SHIELD.MDS");
	// Mdl_RemoveOverlayMds(self,"SHIELD_LEVEL_X.MDS");
	// и т.д...
};


Примечание: Надо понимать, что если делать несколько оверлеев для разных уровней владения щитом,
то стоит учитывать оверлеи обычного оружия 1Н во избежание возможных взаимных перекрытий.

Простой пример: На герое ОДЕТ щит первого уровня уладения навыком (он же, мастер меча первого
уровня), и тут вы прокачиваете обычный одноручник до второго уровня владения. При одетом щите
оверлей меча второго уровня затрет оверлей щита. Поэтому целесообразно при одетом щите снимать
его в момент прокачки одноручника. Или запретить прокачивать оружие 1Н при одетом щите. Или
принудительно в функции прокачки применять оверлей щита следующего уровня (что не подойдет, если
прокачка щита отделена от прокачки меча в логике мода). Вариантов здесь масса.
В любом случае все зависит от конктретной реализации, в конкретном моде. Иными словами, скриптеру
следует хорошо продумать все условия своей функции прокачки в моде, а также простестировать ее
схему работы на предмет сохранения/загрузки и переход на следующий уровень навыка владения.
Всякие бонусы к оружию здесь тоже вносят свою путаницу, так что внимательно с этим!
Самый простой и надежный вариант, на наш взгляд, это один уровень владения навыка щит, при
условии полной прокачки оружия 1Н (щит будет доступен только мастеру меча).


//-----------------------------------------------------------------------------------------
"Создание модели щита":
За основу взята 3д-модель оригинального щита из мода "Темная Сага", которая была основательно
переделана и изменена:
— Щит сделан меньше в размерах, поправлена геометрия элементов для новых условий.
В частности, почти сведён на нет чрезмерный изгиб его поверхности, ибо так делать не надо (!) не правильно.

Пример реализации:
1. Моделируем щит в нулевой координате, так, как это сделано в файле Raw_model.max
2. Смещаем модель по осям Z и Y на указанный шаг, наклоняем на -25 градусов по оси Х, см., файл Shifted_model.max
3. Обнуляем pivot (его смещение и наклон), см., файл Zero_pivot_model.max
4. Сохраняем созданную модель щита в формате *.max, и/или экспортируем ее в формат игры.

Готовую модель щита можно сравнить с нашей оригинальной моделью: Orig_model.max, на предмет соответствия.

Примечание: в оригинальной пираньевской модели слот щита смещен на левый бок и наклонен.
Из-за того, что у нас нет возможности, взять и разом переделать весь Humans.MDS, чтобы
выравнять слот, приходится сдвигать сам предмет в слоте.
Слот же ZS_LEFTARM в нашей версии уже анимирован под это смещение в оверлее.


"Использование модели и анимаций щита в игре":
Скопируйте файлы в проект мода или каталог игры:
- анимации: "..\Anims\_compiled";
- модель щита: "..\Meshes\_compiled";
- скрипты инстанций персонажей и предметов используемых щит, добавить к вашему проекту скриптов (по желанию);
- перекомпилировать скрипты;
- собрать мод-файл и/или запустить изменения напямую в игре;
- активировать тестовый режим "MARVIN", и в консоли набрать: apply overlaymds shield.mds

Все, остается только протестировать работу щита в игре.
