<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/css" href="http://doomdev.idkfa.ru/wiki/skins/common/feed.css?164"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
		<id>http://doomdev.idkfa.ru/wiki/index.php?action=history&amp;feed=atom&amp;title=%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5_%D1%81%D0%BB%D0%BE%D0%B6%D0%BD%D1%8B%D1%85_%D0%BF%D1%80%D0%B5%D0%B4%D0%BC%D0%B5%D1%82%D0%BE%D0%B2_%D0%BD%D0%B0_%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D0%B5_%D0%B8%D1%81%D1%85%D0%BE%D0%B4%D0%BD%D0%B8%D0%BA%D0%B0</id>
		<title>Создание сложных предметов на основе исходника - История изменений</title>
		<link rel="self" type="application/atom+xml" href="http://doomdev.idkfa.ru/wiki/index.php?action=history&amp;feed=atom&amp;title=%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5_%D1%81%D0%BB%D0%BE%D0%B6%D0%BD%D1%8B%D1%85_%D0%BF%D1%80%D0%B5%D0%B4%D0%BC%D0%B5%D1%82%D0%BE%D0%B2_%D0%BD%D0%B0_%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D0%B5_%D0%B8%D1%81%D1%85%D0%BE%D0%B4%D0%BD%D0%B8%D0%BA%D0%B0"/>
		<link rel="alternate" type="text/html" href="http://doomdev.idkfa.ru/wiki/index.php?title=%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5_%D1%81%D0%BB%D0%BE%D0%B6%D0%BD%D1%8B%D1%85_%D0%BF%D1%80%D0%B5%D0%B4%D0%BC%D0%B5%D1%82%D0%BE%D0%B2_%D0%BD%D0%B0_%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D0%B5_%D0%B8%D1%81%D1%85%D0%BE%D0%B4%D0%BD%D0%B8%D0%BA%D0%B0&amp;action=history"/>
		<updated>2026-04-08T10:43:27Z</updated>
		<subtitle>История изменений этой страницы в вики</subtitle>
		<generator>MediaWiki 1.13.3</generator>

	<entry>
		<id>http://doomdev.idkfa.ru/wiki/index.php?title=%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5_%D1%81%D0%BB%D0%BE%D0%B6%D0%BD%D1%8B%D1%85_%D0%BF%D1%80%D0%B5%D0%B4%D0%BC%D0%B5%D1%82%D0%BE%D0%B2_%D0%BD%D0%B0_%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D0%B5_%D0%B8%D1%81%D1%85%D0%BE%D0%B4%D0%BD%D0%B8%D0%BA%D0%B0&amp;diff=2256&amp;oldid=prev</id>
		<title>Costja в 15:53, 18 января 2007</title>
		<link rel="alternate" type="text/html" href="http://doomdev.idkfa.ru/wiki/index.php?title=%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5_%D1%81%D0%BB%D0%BE%D0%B6%D0%BD%D1%8B%D1%85_%D0%BF%D1%80%D0%B5%D0%B4%D0%BC%D0%B5%D1%82%D0%BE%D0%B2_%D0%BD%D0%B0_%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D0%B5_%D0%B8%D1%81%D1%85%D0%BE%D0%B4%D0%BD%D0%B8%D0%BA%D0%B0&amp;diff=2256&amp;oldid=prev"/>
				<updated>2007-01-18T15:53:10Z</updated>
		
		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая страница&lt;/b&gt;&lt;/p&gt;&lt;div&gt;Запись предметов в исходнике довольно близка к синтаксису DECORATE, поэтому будет достаточно лишь знаний основ DECORATE. Тем не менее рекомендую сначала посмотреть на странице [[Classes|описаний классов]]&lt;br /&gt;
&lt;br /&gt;
Последнюю версию исходника ZDoom всегда можно найти на [http://zdoom.org/download.html]. Здесь я распишу перевод предмета Pig (Hexen).&lt;br /&gt;
&lt;br /&gt;
Для начала нам надо найти код монстра в исходнике. Можно воспользоваться поиском APig (в коде к имени класса в начале всегда добавляется A). Но можно попробовать и другой способ, монстр из Hexen, поэтому смотрим содержимое g_hexen. В данном случае нам повезло и есть файл a_pig.cpp, но бывает что несколько подобных по назначению классов записаны в файл с более общим названием (например, некоторые предметы инвентаря и оружие). Дальше все равно придется искать APig, но текстовым поиском внутри файла может воспользоваться каждый.&lt;br /&gt;
 class APig : public AMorphedMonster&lt;br /&gt;
 {&lt;br /&gt;
 	DECLARE_ACTOR (APig, AMorphedMonster)&lt;br /&gt;
 };&lt;br /&gt;
 &lt;br /&gt;
 FState APig::States[] =&lt;br /&gt;
 {&lt;br /&gt;
 #define S_PIG_LOOK1 0&lt;br /&gt;
 	S_NORMAL (PIGY, 'B',   10, A_Look				    , &amp;amp;States[S_PIG_LOOK1]),&lt;br /&gt;
 &lt;br /&gt;
 #define S_PIG_WALK1 (S_PIG_LOOK1+1)&lt;br /&gt;
 	S_NORMAL (PIGY, 'A',	3, A_Chase				    , &amp;amp;States[S_PIG_WALK1+1]),&lt;br /&gt;
 	S_NORMAL (PIGY, 'B',	3, A_Chase				    , &amp;amp;States[S_PIG_WALK1+2]),&lt;br /&gt;
 	S_NORMAL (PIGY, 'C',	3, A_Chase				    , &amp;amp;States[S_PIG_WALK1+3]),&lt;br /&gt;
 	S_NORMAL (PIGY, 'D',	3, A_Chase				    , &amp;amp;States[S_PIG_WALK1]),&lt;br /&gt;
 &lt;br /&gt;
 #define S_PIG_PAIN (S_PIG_WALK1+4)&lt;br /&gt;
 	S_NORMAL (PIGY, 'D',	4, A_PigPain			    , &amp;amp;States[S_PIG_WALK1]),&lt;br /&gt;
 &lt;br /&gt;
 #define S_PIG_ATK1 (S_PIG_PAIN+1)&lt;br /&gt;
 	S_NORMAL (PIGY, 'A',	5, A_FaceTarget			    , &amp;amp;States[S_PIG_ATK1+1]),&lt;br /&gt;
 	S_NORMAL (PIGY, 'A',   10, A_PigAttack			    , &amp;amp;States[S_PIG_WALK1]),&lt;br /&gt;
 &lt;br /&gt;
 #define S_PIG_DIE1 (S_PIG_ATK1+2)&lt;br /&gt;
 	S_NORMAL (PIGY, 'E',	4, A_Scream				    , &amp;amp;States[S_PIG_DIE1+1]),&lt;br /&gt;
 	S_NORMAL (PIGY, 'F',	3, A_NoBlocking			    , &amp;amp;States[S_PIG_DIE1+2]),&lt;br /&gt;
 	S_NORMAL (PIGY, 'G',	4, A_QueueCorpse		    , &amp;amp;States[S_PIG_DIE1+3]),&lt;br /&gt;
 	S_NORMAL (PIGY, 'H',	3, NULL					    , &amp;amp;States[S_PIG_DIE1+4]),&lt;br /&gt;
 	S_NORMAL (PIGY, 'I',	4, NULL					    , &amp;amp;States[S_PIG_DIE1+5]),&lt;br /&gt;
 	S_NORMAL (PIGY, 'J',	4, NULL					    , &amp;amp;States[S_PIG_DIE1+6]),&lt;br /&gt;
 	S_NORMAL (PIGY, 'K',	4, NULL					    , &amp;amp;States[S_PIG_DIE1+7]),&lt;br /&gt;
 	S_NORMAL (PIGY, 'L',   -1, NULL					    , NULL),&lt;br /&gt;
 &lt;br /&gt;
 #define S_PIG_ICE (S_PIG_DIE1+8)&lt;br /&gt;
 	S_NORMAL (PIGY, 'M',	5, A_FreezeDeath		    , &amp;amp;States[S_PIG_ICE+1]),&lt;br /&gt;
 	S_NORMAL (PIGY, 'M',	1, A_FreezeDeathChunks	    , &amp;amp;States[S_PIG_ICE+1]),&lt;br /&gt;
 &lt;br /&gt;
 };&lt;br /&gt;
 &lt;br /&gt;
 IMPLEMENT_ACTOR (APig, Hexen, -1, 0)&lt;br /&gt;
 	PROP_SpawnHealth (25)&lt;br /&gt;
 	PROP_PainChance (128)&lt;br /&gt;
 	PROP_SpeedFixed (10)&lt;br /&gt;
 	PROP_RadiusFixed (12)&lt;br /&gt;
 	PROP_HeightFixed (22)&lt;br /&gt;
 	PROP_Mass (60)&lt;br /&gt;
 	PROP_Flags (MF_SOLID|MF_SHOOTABLE)&lt;br /&gt;
 	PROP_Flags2 (MF2_WINDTHRUST|MF2_FLOORCLIP|MF2_PASSMOBJ|MF2_TELESTOMP|MF2_PUSHWALL)&lt;br /&gt;
 	PROP_Flags3 (MF3_DONTMORPH|MF3_ISMONSTER)&lt;br /&gt;
 &lt;br /&gt;
 	PROP_SpawnState (S_PIG_LOOK1)&lt;br /&gt;
 	PROP_SeeState (S_PIG_WALK1)&lt;br /&gt;
 	PROP_PainState (S_PIG_PAIN)&lt;br /&gt;
 	PROP_MeleeState (S_PIG_ATK1)&lt;br /&gt;
 	PROP_DeathState (S_PIG_DIE1)&lt;br /&gt;
 	PROP_IDeathState (S_PIG_ICE)&lt;br /&gt;
 &lt;br /&gt;
 	PROP_SeeSound (&amp;quot;PigActive1&amp;quot;)&lt;br /&gt;
 	PROP_PainSound (&amp;quot;PigPain&amp;quot;)&lt;br /&gt;
 	PROP_DeathSound (&amp;quot;PigDeath&amp;quot;)&lt;br /&gt;
 	PROP_ActiveSound (&amp;quot;PigActive1&amp;quot;)&lt;br /&gt;
 END_DEFAULTS&lt;br /&gt;
Собственно приступаем к переводу:&lt;br /&gt;
 //APig наследуется от AMorphedMonster, что и пишем (префикс A у классов используется только &lt;br /&gt;
 //внутри движка)&lt;br /&gt;
 //DoomEdNum здесь не используется, если бы он был, он бы был записан в строке IMPLEMENT_ACTOR, &lt;br /&gt;
 //кажется третий параметр.&lt;br /&gt;
 actor Pig : MorphedMonster {&lt;br /&gt;
 //здесь просто переписываем внутренности IMPLEMENT_ACTOR, убирая PROP_, ну и некоторые &lt;br /&gt;
 //дополнительные небольшие правки. В крайнем случае можно сверяться с викой&lt;br /&gt;
 	Health 25&lt;br /&gt;
 	PainChance 128&lt;br /&gt;
 	Speed 10&lt;br /&gt;
 	Radius 12&lt;br /&gt;
 	Height 22&lt;br /&gt;
 	Mass 60&lt;br /&gt;
 //Анимации (они же States) запишем позже. Я предпочитаю записывать их в самом конце. Точно так же &lt;br /&gt;
 //пока пропущу флаги и допишу остальные свойства&lt;br /&gt;
 	SeeSound &amp;quot;PigActive1&amp;quot;&lt;br /&gt;
 	PainSound &amp;quot;PigPain&amp;quot;&lt;br /&gt;
 	DeathSound &amp;quot;PigDeath&amp;quot;&lt;br /&gt;
 	ActiveSound &amp;quot;PigActive1&amp;quot;&lt;br /&gt;
 //Теперь флаги. Записываем содежимое PROP_Flags, убирая само PROP_Flags, MF#_ и вертикальные &lt;br /&gt;
 //черты (на самом деле это побитовый ИЛИ). При сомнениях лучше свериться со справочником, &lt;br /&gt;
 //некоторые флаги в исходнике названы по-другому&lt;br /&gt;
 	+SOLID&lt;br /&gt;
 	+SHOOTABLE&lt;br /&gt;
 	+WINDTHRUST&lt;br /&gt;
 	+FLOORCLIP&lt;br /&gt;
 	+CANPASS	//в исходнике называется PASSMOBJ&lt;br /&gt;
 	+TELESTOMP&lt;br /&gt;
 	+CANPUSHWALLS	//было PUSHWALL&lt;br /&gt;
 	+DONTMORPH&lt;br /&gt;
 	+ISMONSTER&lt;br /&gt;
 //Теперь самая &amp;quot;веселая&amp;quot; часть, анимации. Как видим из записанных свойств, названия &lt;br /&gt;
 //последовательностей довольно удобные и с этой частью кода сверяться уже не понадобится. &lt;br /&gt;
 //Переходим к части FState&lt;br /&gt;
 States {&lt;br /&gt;
 //#define здесь заменяют метки. S_NORMAL/S_BRIGHT соответственно определяют является ли кадр &lt;br /&gt;
 //BRIGHT. Все остальное в принципе достаточно соответствует DECORATE с одним исключением, &lt;br /&gt;
 //последний параметр кадра - следующий кадр.&lt;br /&gt;
 Spawn:&lt;br /&gt;
 	PIGY B 10 A_Look&lt;br /&gt;
 	Loop	//следующий кадр - начало той же анимации, поэтому пишем просто цикл&lt;br /&gt;
 See:&lt;br /&gt;
 	PIGY ABCD 3 A_Chase	//здесь кадры отличаются только субспрайтом, поэтому используем &lt;br /&gt;
 	//короткую запись. К тому же вручную рассчитывать сдвиги Goto нам точно не понадобится  &lt;br /&gt;
 	//(даже если бы пришлось использовать Goto со смещением)&lt;br /&gt;
 	Loop	//та же причина&lt;br /&gt;
 Pain:&lt;br /&gt;
 	PIGY D 4 A_PigPain&lt;br /&gt;
 	Goto See	//переход в другую анимацию, то есть Goto&lt;br /&gt;
 Melee:	//все-таки пришлось возвращаться к IMPLEMENT_ACTOR, ATK могло означать как ближнюю, так и &lt;br /&gt;
  	//дальнюю атаку&lt;br /&gt;
 	PIGY A 5 A_FaceTarget&lt;br /&gt;
 	PIGY A 10 A_PigAttack&lt;br /&gt;
 	Goto See	//то же&lt;br /&gt;
 Death:&lt;br /&gt;
 	PIGY E 4 A_Scream&lt;br /&gt;
 	PIGY F 3 A_NoBlocking&lt;br /&gt;
 	PIGY G 4 A_QueueCorpse&lt;br /&gt;
 	PIGY H 3&lt;br /&gt;
 	PIGY IJK 4&lt;br /&gt;
 	PIGY L -1	//на самом деле это бесконечное ожидание, но все-таки добавим нормальное &lt;br /&gt;
  	//завершение анимации&lt;br /&gt;
 	Stop	//если следующий кадр NULL, значит мы в конце анимации&lt;br /&gt;
 Ice:&lt;br /&gt;
 	PIGY M 5 A_FreezeDeath&lt;br /&gt;
 	PIGY M 1 A_FreezeDeathChunks&lt;br /&gt;
 	Wait	//не спешим использовать Goto ) . В DECORATE есть более наглядные команды. Wait = &lt;br /&gt;
  	//повторять последний кадр&lt;br /&gt;
 }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Я не гарантирую правильность этого кода, я пытался именно продемонстрировать принцип перевода. К примеру Pig уже определен в ZDoom, поэтому перед использованием этого кода в ваде точно придется переименовывать класс. Кроме того, для практического применения возможно вообще хватит &amp;quot;actor DoomPig : Pig {}&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
{{ZDoom}}&lt;/div&gt;</summary>
		<author><name>Costja</name></author>	</entry>

	</feed>