Правила · Регистрация · Справка · Пользователи · Календарь · Поиск · Сообщения за день |
|
![]() |
|
Опции темы | Поиск в этой теме | Опции просмотра |
![]() |
#1 |
Экс Администратор
|
![]() Сдесь спрашиваем по скриптам К3-ТДМ.
Постораемся помочь. По мере вопросов и развертывания работ будем выдавать хелпы и проги ![]() Копирование материалов данной темы на другие интернет ресурсы постить тока с сылкой на эту тему! Последний раз редактировалось Flint, 03.02.2007 в 01:51. |
__________________
Чрезмерное злоупотребление компьютерными играми сносит башню. ![]() Доказано минздравом.
|
![]() |
#2 |
Экс Администратор
|
![]() Итак каждый хочет чуствовать себя мега кодером. Но сразу сделать чтото сложное очень сложно. Надо начинать с маленького, походу понимая механику игры.
№ Урок 1 Начнем с добавления в игру оружия. Например хотите добавить свое оружие(необязательно делать модель!). Идем в папку RESOURCE\MODELS\Ammo там лежит все оружие. Для просмотра моделей используем gm view. Теперь записываем название модельки меча. И идем PROGRAM\Items\initItems.с там ищем раздел //WEAPONS Там будет такой блок. makeref(itm,Items[n]); - это нетрогать itm.id = "blade1"; - ID сабли, я пишу Blade*, где * номер сабли, т.е, если из 25 то писать 26 itm.groupID = BLADE_ITEM_TYPE; - ID, т.е. что это, сабля, труба, пистолет itm.name = "itmname_blade1";- Имя сабли, обычно пишут itmname_blade* где * следующий номер за последним itm.describe = "itmdescr_blade1"; - это для описания, на одно описание можно повесить хоть десять сабель ![]() itm.model = "blade9"; - модель, вернее её имя, помните мы выписали приглянувшуюся модель, вот пишем ее сюда без разрешения. blade22.gm, а мы пишем blade22 itm.folder = "items"; - папка с моделькой так и оставляем itm.picIndex = 8; - номер квадрата в котором рисунок сабли можно повесить на любой, как делать рисунок разберу дальше. itm.picTexture = "WEAPONS"; - имя текстуры рисунка в описании так и оставляем. itm.price = 500; - Цена меча +/-рандом и навыки. itm.dmg_min = 1.0; - минимальное повреждение наносимое саблей itm.dmg_max = 6.0; - максимальное повреждение наносимое саблей itm.miss = 16.0; Шанс промаха itm.piercing = 6; - защита itm.block = 2; - блокировка itm.minlevel = 1; - минимальный уровень чтобы ГГ взял ее в руки itm.rare = 32; - редкость появления itm.uniq = 0; - уникальная ли весчь? 0 нет, 1 да. itm.param.time = 0.05; - нетрогаем itm.param.colorstart = argb(64, 64, 64, 64); - нетрогаем itm.param.colorend = argb(0, 32, 32, 32); - нетрогаем n++; Для удобства лутче вставлять перед блоком свой ник. //Flint makeref(itm,Items[n]); itm.id = "blade1"; Так дальше идем в PROGRAM\Items\items.h и ищем строку #define ITEMS_QUANTITY, добавляем, т.е если было 180 то будет 181 Теперь делаем описание. Идём открываем: RESOURCE\INI\TEXTS\RUSSIAN\ItemsDescribe.txt В нём описание сабли: itmname_blade1 {Дешевая сабля} - название сабли itmdescr_blade1 - номер описания которое ставим в itm.describe = "itmdescr_blade1"; { Обычная сабля, каких полно на островах. Немногим лучше железного лома, но она хотя бы притворяется острой. } Все сохраняем и выходим. Теперь самое сложное.. Вставляем иконку.. БеремConvertorTXи ищем файлик RESOURCE\Textures\INTERFACES\LIST_WEAPON_HIGHLIGHT .tga.tx Смотрим его в ConvertorTX и жмем конвертировать. Теперь он у нас в ТГА формате. Дальше запускаем фотошоп создаем новое окошко 128х128 точек и ваяем свой меч, фон можно украсть с файла LIST_WEAPON_HIGHLIGHT.tga.tx. Переписывать книги по фотошопу не буду, а лутче выкладу сылы на литературу в другой теме. В обшем сделали мы файлик 128х128 теперь его переносим в ячейку следуюющую за картинкой. Как на срине 1. Теперь ConvertorTXом снова конвертим в 16 битном качестве.. Идем в RESOURCE\INI\interfaces\pictures Там ищем WEAPONS Такой блок. [WEAPONS] sTextureName = LIST_WEAPON_HIGHLIGHT.tga текстура наша. Без ТХ формата указывать. wTextureWidth = 1024 - Ширина текстуры wTextureHeight = 1024 - Высота текстур picture = blade1,0,0,128,128 Координаты... picture = blade2,128,0,256,128 picture = blade3,256,0,384,128 picture = blade4,384,0,512,128 picture = blade5,512,0,640,128 picture = blade6,0,128,128,256 picture = blade7,128,128,256,256 picture = blade8,256,128,384,256 picture = blade9,384,128,512,256 picture = blade10,512,128,640,256 picture = blade11,0,256,128,384 picture = blade12,128,256,256,384 picture = blade13,256,256,384,384 picture = blade14,384,256,512,384 picture = blade15,512,256,640,384 picture = blade16,0,384,128,512 picture = blade17,128,384,256,512 picture = blade18,256,384,384,512 picture = blade19,384,384,512,512 picture = blade20,512,384,640,512 picture = gun1,640,0,768,128 picture = gun2,768,0,896,128 picture = gun3,640,128,768,256 picture = gun4,768,128,896,256 picture = gun5,640,256,768,384 picture = gun6,768,256,896,384 picture = gun7,640,384,768,512 picture = spyglass1,896,0,1024,128 picture = spyglass2,896,128,1024,256 picture = spyglass3,896,256,1024,384 picture = spyglass4,896,384,1024,512 Алгоритм такой. следующий ряд пишем как предыдуший. 0(верхний край, правый по х оси), 512(верхний край по оси у), 128(нижний левый край по оси х), 640(нижний край по у оси) Для примера вот ряд. Picture = gun8, 0, 512, 128, 640 picture = blade24, 128, 512, 256, 640 picture = blade21, 256, 512, 384, 640 picture = blade29, 384, 512, 512, 640 picture = blade30, 512, 512, 640, 640 picture = blade28, 640, 512, 768, 640 picture = blade27, 768, 512, 896, 640 picture = gun10, 896, 512, 1024, 640 blade30 это привязка уазываеться в itm.picIndex = 8 в данном случае будет itm.picIndex = 30. Все картинка отображаться!! Меч в игре. Чтобы раздать его фантомам дописываем в \program\loc_ai\LAi_equip ВНИМАНИЕ ЭТО РЕАЛЬНО ТОКА В ТДМ. В К3 другой метод и у фантомов там было 7 мечей ![]() Ищем string LAi_NPC_EquipBladeSelection(int rank) Дальше смотрим блоки. if (1 <= rank <= 3) - с какого по какой ранг фантома юзаеться { irand = rand(4) - скока вероятностей выпадения.. Тут если скажем 6 мечей то ставим 5. if (irand == 0) {sel = 1} - первая веротность сел 1 if (irand == 1) {sel = 2} if (irand == 2) {sel = 3} if (irand == 3) {sel = 15} if (irand == 4) {sel = 4} } switch(sel) { case 1: blade = "blade1"; - это и есть сел один. break; Например добавим меч 30 фантомам. if (1 <= rank <= 3) - с какого по какой ранг фантома юзаеться { irand = rand(4) - скока вероятностей выпадения.. Тут если скажем 6 мечей то ставим 5. if (irand == 0) {sel = 1} - первая веротность сел 1 if (irand == 1) {sel = 2} if (irand == 2) {sel = 3} if (irand == 3) {sel = 15} if (irand == 4) {sel = 4} if (1 <= rank <= 3) - с какого по какой ранг фантома юзаеться { irand = rand(4) - скока вероятностей выпадения.. Тут если скажем 6 мечей то ставим 5. if (irand == 0) {sel = 1} - первая веротность сел 1 if (irand == 1) {sel = 2} if (irand == 2) {sel = 3} if (irand == 3) {sel = 15} if (irand == 4) {sel = 4} if (irand == 5) {sel = 23} - сел это кайсе +1. Если последний касе 22 то ставим 23 } case 23: blade = "blade30"; break; Все есть вероятность около 20% что фантому дадут ЭТОТ МЕЧ. По пистолям точно так же только разница в итеме. makeref(itm,Items[n]); itm.id = "gun1"; itm.groupID = GUN_ITEM_TYPE; itm.name = "itmname_gun1"; itm.describe = "itmdescr_gun1"; itm.folder = "items"; itm.model = "pistol1"; itm.picIndex = 5; itm.picTexture = "WEAPONS"; itm.price = 1500; itm.chargeQ = 1; - количество зарядов itm.chargespeed = 8; - скорость вскидывания itm.dmg_min = 8.0; - минимальный урон itm.dmg_max = 18.0; - максимальный урон itm.accuracy = 40; - точность itm.minlevel = 1; itm.rare = 28; itm.uniq = 0; n++; Первый урок окончен. Последний раз редактировалось КиллерМЕН, 17.02.2013 в 14:15. |
__________________
Чрезмерное злоупотребление компьютерными играми сносит башню. ![]() Доказано минздравом.
|
![]() |
#3 |
Экс Администратор
|
![]() Урок № 2 Рассмотрим, как добавлять предметы и подзорные трубы Или Лабока, как говорит барышня в телерекламе.. Но мы .. Хотим свой телескоп построить? Запросто.. Идем в \program\items\initItems и в файлике ищем //SPYGLASSES makeref(itm,Items[n]); itm.id = "spyglass5"; //ID трубы, тут надо делать следующей после последней... itm.groupID = SPYGLASS_ITEM_TYPE; //ID группы так и оставляем! itm.name = "itmname_spyglass5"; - название внутренее itm.describe = "itmdescr_spyglass5"; - описание которое мы правим как и мечи, но я расмотрю и этот аспект ниже. itm.picIndex = 14; //№ картинки тут тоже как в мечах, можно прикрутить к трубе новую иконку. itm.picTexture = "ITEMS_1"; //текстура нетрогаем. itm.folder = "items"; //папка с текстурами нетрогаем itm.model = "spyglass4"; //модель по которой она проходит в пиктурес.ини. itm.price = 8000; //цена продукта ![]() itm.scope.texture = "eye_BestTub.tga";//текстура во время просмотра из трубы. itm.scope.zoom = 12.0; //зум itm.scope.time_activate = 500; //лутче не трогать itm.scope.time_update = 150; //аналогично itm.scope.show.nation = 1; //показатель нации //1-да,0-нет itm.scope.show.cannons = 1; //показатель орудий itm.scope.show.ship_name = 1; //показатель имя корабля itm.scope.show.ship_type = 1; //показатель типа корабля itm.scope.show.hull = 1; //показатель жизни корпуса itm.scope.show.sail = 1; //показатель жизни парусов itm.scope.show.crew = 1; //показатель команды itm.scope.show.speed = 1; //показатель скорости itm.scope.show.charge = 1; //показатель типа заряда itm.minlevel = 0; - минимальный уровень. itm.rare = 4; - шанс находки. itm.uniq = 1; - весчь уникальная 1 да, 0 нет. n++; далее в RESOURSE/INI/TEXTS/RUSSIAN/ItemsDescribe.txt ищем описания труб и делаем описание своей. itmname_spyglass5 {Труба Галилео Галилея} - итем наме. трубы которую описываем itmdescr_spyglass5 - ИД описание по которому труба обращаеться в файл itm.describe = "itmdescr_spyglass5"; { Телескоп великого Галилея. До сих пор неизвестно, каким ветром его занесло в Новый Свет. Превосходная работа, но сила увеличения, увы, такова, что ничего кроме Луны и нескольких планет расмотреть в него не представляется возможным. } Дальше идем в \RESOURCE\Textures\INTERFACES\LIST_WEAPON_HIGHLIGH T.tga.tx ПО уже знакомому принцыпу добавляем нашу трубу и конвертируем обратно... Идем в RESOURCE\INI\interfaces\pictures Там ищем WEAPONS Такой блок. [WEAPONS] sTextureName = LIST_WEAPON_HIGHLIGHT.tga текстура наша. Без ТХ формата указывать. Для примера вот ряд. Picture = gun8, 0, 512, 128, 640 picture = blade24, 128, 512, 256, 640 picture = blade21, 256, 512, 384, 640 picture = blade29, 384, 512, 512, 640 picture = spyglass5, 512, 512, 640, 640 //тут наша труба picture = blade28, 640, 512, 768, 640 picture = blade27, 768, 512, 896, 640 picture = gun10, 896, 512, 1024, 640 Все она в игре! Теперь предмет.. makeref(itm,Items[n]); itm.id = "Patent_Pirate"; - Ид предмета itm.name = "itmname_Patent_Pirate"; - внутренее имя itm.describe = "itmdescr_Patent_Pirate"; - описание. itm.model = ""; - модель ее нет. itm.type = "quest"; - тип предмета пока учим как делать quest. В следуюших уроках раскажем как сделать другой полезный тип предмета. itm.picIndex = 39; - индекс на картинке все знакомо только картинка другая=) itm.picTexture = "ITEMS_1"; - нетрогаем itm.price = 0; - стоимость.. n++; \RESOURCE\INI\texts\russian\ItemsDescribe itmname_Patent_Pirate {Пиратский знак} - название предмета и внутренее имя. itmdescr_Patent_Pirate - ИД описания { Золотая монета, доказывающая, что вы являетесь членом берегового братства. } Добавляем, меняем. теперь идем RESOURCE\Textures\INTERFACES\items1.tga.tx Конвертируем, добавляем иконку как написано в первом уроке. НО ПОМНИМ ТУТ РАЗМЕРЫ 64х64. Все сделали сконвертили.... Теперь идем в знакомый файл RESOURCE\INI\interfaces\pictures и ищум блок [ITEMS_1] sTextureName = items1.tga - название текстуры wTextureWidth = 512 - высота wTextureHeight = 512 - ширина picture = itm1,0,0,64,64 - тут tm1 указываем в itm.picIndex = 39; picture = itm2,64,0,128,64 picture = itm3,128,0,192,64 picture = itm4,192,0,256,64 picture = itm5,256,0,320,64 picture = itm6,320,0,384,64 picture = itm7,384,0,448,64 picture = itm8,448,0,512,64 picture = itm9,0,64,64,128 picture = itm10,64,64,128,128 picture = itm11,128,64,192,128 picture = itm12,192,64,256,128 picture = itm13,256,64,320,128 picture = itm14,320,64,384,128 picture = itm15,384,64,448,128 picture = itm16,448,64,512,128 picture = itm17,0,128,64,192 picture = itm18,64,128,128,192 picture = itm19,128,128,192,192 picture = itm20,192,128,256,192 picture = itm21,256,128,320,192 picture = itm22,320,128,384,192 picture = itm23,384,128,448,192 picture = itm24,448,128,512,192 picture = itm25,0,192,64,256 picture = itm26,64,192,128,256 picture = itm27,128,192,192,256 picture = itm28,192,192,256,256 picture = itm29,256,192,320,256 picture = itm30,320,192,384,256 picture = itm31,384,192,448,256 picture = itm32,448,192,512,256 picture = itm33,0,256,64,320 picture = itm34,64,256,128,320 picture = itm35,128,256,192,320 picture = itm36,192,256,256,320 picture = itm37,256,256,320,320 picture = itm38,320,256,384,320 picture = itm39,384,256,448,320 picture = itm40,448,256,512,320 Дальше бдописываем.. Из учета одна клетка 64х64 и все поле 512х512.. Алгоритм указан в уроке первом... picture = itm41,0,320,64,384 picture = itm42,64,320,128,384 picture = itm43,128,320,192,384 picture = itm44,192,320,256,384 Все предмет в игре.. Только специфика К3 такова что его вы не увидете ![]() Последний раз редактировалось dima12, 17.05.2008 в 18:06. |
__________________
Чрезмерное злоупотребление компьютерными играми сносит башню. ![]() Доказано минздравом.
|
![]() |
#4 |
Экс Администратор
|
![]() Урок № 3 Сегодня я вас научу добавлять корабли \resource\models\ships тут мы наблюдаем корабли.. Например добавляем папку с нашим судном. Обязательно должен кончаться на 1!! Galeoth_h1 к примеру.. Открываем ее и смотрим что бы все файлы имели такое же название.. galeoth_h1_mast1.gm galeoth_h1_mast3.gm Сделали? Хорошо! Теперь идем resource\models\ships\Sailorspoints тут копируем сайлор поинты с наиболее похожего судна и обзываем как наш корабль.. Galeoth_h1 в данном случае.... Теперь идем в текстуры... \resource\textures\Ships Создаем папку которая называеться так же как и наш корабль.. Galeoth_h1 с такой структурой. Galeoth_h1 - Hull1 - Hull2 - Hull3 Внутри каждой папки должа быть текстура.. В принципе в Hull1 чистое дно, Hull2 первый апгрейт днища, Hull3 второй апгрейт днища.. Пока это все что мы тут можем делать... Туперь идем в \program\ships\Ships_init /////////////////////////////////////////////////////////////////////////// /// Galeon HEAVY Название для ориентации /////////////////////////////////////////////////////////////////////////// makeref(refShip,ShipsTypes[SHIP_GALEON_H]); //Название судна refShip.Name = "Galeon_h"; //Название судна refship.Soundtype = "frigate"; //Звуки. .Можно прикрутить звуки мановара к Люгеру ![]() refShip.Class = 3; //Клас судна refShip.Cannon = CANNON_TYPE_CANNON_LBS16; //Калибр орудий установленый по дефолту. refShip.MaxCaliber = 24; //Макс калибр пушек refShip.Weight = Tonnes2CWT(1100); //Масса корабля refShip.Capacity = 3000; //грузоподъемность refShip.CannonsQuantity = 36; //колво орудий refShip.rcannon = 15; //Орудия правого борта refShip.lcannon = 15; //Орудия леаого борта refShip.fcannon = 2; //Носовые орудия refShip.bcannon = 4; //Кормовые орудия refShip.MaxCrew = 400; //Макс команда refShip.MinCrew = 64; //Мин команда refShip.BoardingCrew = 200; //Абордажники refShip.GunnerCrew = 36; //Стрелки refShip.CannonerCrew = 72; //Канониры refShip.SailorCrew = 400; //Моряки refShip.SpeedRate = 12.0; //Скорость refShip.TurnRate = 25.0; //Маневр refShip.Price = 105000; //Стоимость refShip.HP = 4000; //Жизнь корабля refShip.SP = 100; //Паруса refShip.AbordageLocation = "Boarding Deck_01"; //Локация абордажа refship.Type.Merchant = false; //Возможность использования компютером как Торгового судна refship.Type.War = true; //Возможность использования компютером как Военного судна refShip.fWindAgainstSpeed = 2.0; //Скорости по отношению к ветеру.. refShip.sea_enchantment = 1.2; //Это что то связано с встречами.. refShip.lowpolycrew = 20; //Колво матросиков на палубе refShip.buildtime = 80; //Время на постройку.. Но походу неиспользуеться.. ![]() refship.Rocking.y = 0.4; //Раскачивание судна по оси У refship.Rocking.az = 0.02; //Раскачивание судна по оси z refship.WaterLine = -0.2; //Ватерлиния чем меньше значение тем выше из воды выглядывает судно... Можно сделать подводную локу или воздушный корабль ![]() refship.SpeedDependWeight = 0.5; //тут скорость к масе refship.SubSeaDependWeight = 0.3; //тут тоже что то. В игре не заметно... refship.TurnDependWeight = 0.5; //ПОгружение от веса.. refShip.Height.Bombs.Y = 2.5; refShip.Height.Bombs.DY = 2.0; refShip.Height.Grapes.Y = 4.0; refShip.Height.Grapes.DY = 1.0; refShip.Height.Knippels.Y = 26.0; refShip.Height.Knippels.DY = 20.0; refShip.Height.Balls.Y = 2.5; refShip.Height.Balls.DY = 2.0; //Это параметры залпа.... refship.InertiaAccelerationX = 4.5; refship.InertiaBrakingX = 4.5; //Ускорения-хамедления. refship.InertiaAccelerationY = 3; refship.InertiaBrakingY = 3; //Ускорения-хамедления. refship.InertiaAccelerationZ = 4.5; refship.InertiaBrakingZ = 4.5; //Ускорения-хамедления. refShip.GeraldSails.rey_b2 = 1; refShip.GeraldSails.rey_b3 = 1; refShip.GeraldSails.rey_b2.vscale = 0.98; refShip.GeraldSails.rey_b3.vscale = 0.8; refship.Track.Enable = true; refship.Track1.ZStart = 0.0; refship.Track1.LifeTime = 14.5; refship.Track1.Width = "5.2, 7.3"; refship.Track1.Speed = "5.5, 6.5"; refship.Track2.ZStart = -0.15; refship.Track2.LifeTime = 8.5; refship.Track2.Width = "6.0, 8.0"; refship.Track2.Speed = "0.15, 0.25"; //Тоже не совсем понятные параметры.. Я их не трогаюю. Но походу они на чтото влияют ![]() Так у нас есть корабль!! Но теперь идем в program\ships\ships.н там строчка #define SHIP_TYPES_QUANTITY 23 //сюда добавляем +1 То есть #define SHIP_TYPES_QUANTITY 24 Дальше видим такие строчки //6 это наш клас нам надо //3 #define SHIP_CORVETTE 10 #define SHIP_PINNACE 12 Дописываем Галеон //3 #define SHIP_CORVETTE 10 #define SHIP_GALEON_H 23 //Тут надо не забывать что #define SHIP_TYPES_QUANTITY 24 это значит последний номер судна 23! #define SHIP_PINNACE 12 Все тут закончено... В принципе судно плавает по морям океанам и вы его захватить можете! Но лутче сделать так для теста(ВНИМАНИЕ В ВЕРИСЯХ ТДМ начиная от 0.1.0201 НЕРАБОТАЕТ!!!! И спользуйте ТДМ 0.01 или К3) дать герою со старта корабль. Идем в program\characters\characters_init находим там в персонаже ch.shotgun = "0"; ch.Ship.Type = GenerateShip(SHIP_LUGGER, 1); SetBaseShipData(ch); Вот эту строчку и правим ch.Ship.Type = GenerateShip(SHIP_LUGGER, 1);. В нашем случае ch.Ship.Type = GenerateShip(SHIP_GALEON_H, 1); Все запускаем игру... И видем свой корабль!!! ![]() Но возникают вопросы.. А почему нет картинки судна в интрфейсе? А почему нет описания??? Все по порядку... Так пока в игре.. Находим удачный вид корабля и СКРИНИМ ![]() Скрин есть обрабатываем.. Я юзаю стандартный офис Пиктуре Менеджер.. Там все это делаеться ЕЛЕМЕНТАРНО ![]() Ищем тут такое [SHIPS_lugger] Видим такой блок [SHIPS_lugger] sTextureName = ships\lugger.tga wTextureWidth = 128 wTextureHeight = 128 picture = ship,0,0,128,128 Меняем под свой корабль.. [SHIPS_galeon_h] sTextureName = ships\galeon_h.tga wTextureWidth = 128 wTextureHeight = 128 picture = ship,0,0,128,128 Все картинка у нас ![]() Теперь такая весчь как описание? RESOURCE\INI\texts\russian\common Там ищем Lugger. Видим такую строчку string = Lugger,"Люгер" Меняем под свой корабль string = Galeon_h,"Тяж. Галеон" Добавляем под люгер.. Дальше крутим вниз и видим такое string = Lugger_descr,"Как один из самых быстрых кораблей 16-го века, люгер пользовался большой популярностью среди берегового братства, контрабандистов и военных, использовавших его в качестве быстрого курьерского или разведывательского судна." Мы меняем под свое.. string = Galeon_h_descr,"Ля-ля ![]() Теперь нас смущает постоянно меняющаяся иконка в левом верхнем углу.. В принципе добавить можно и свою(аналогия с оружием размер 64х64) но я предпочитаю дефолт.. Уж слишком много возни ![]() Идем сюда \program\battle_interface\BattleInterface И тут ищем знакомое lugger ![]() Такой вот кейс. case "lugger": BI_intNRetValue[0] = 0+0*8; BI_intNRetValue[1] = 0+0*8 + 1; BI_intNRetValue[2] = BI_ICONS_TEXTURE_SHIP1; break; В приницпе алгоритм такой ищем наиболее похожий корабль и на базе его делаем наш.. case "galeon_h": BI_intNRetValue[0] = 2+3*8; BI_intNRetValue[1] = 2+3*8 + 1; BI_intNRetValue[2] = BI_ICONS_TEXTURE_SHIP1; break; Все теперь запускаем игру и наслаждаемся ![]() Хотя нет есть фиха Sailorspoints. Открываем наш галеон \MODELS\Ships\SAILORSPOINTS\Galeoth_h1 [SIZE] points = 28 links = 30 [POINT_DATA] point 0 = -1.053810,1.572414,5.501140,0 point 1 = 1.015286,1.554920,5.494949,0 point 2 = 1.021910,1.332422,2.101484,0 point 3 = -1.003741,1.324923,2.151694,0 point 4 = -1.028343,1.334921,-1.200451,0 point 5 = 1.053739,1.382422,-1.307331,0 point 6 = -0.932265,1.537422,6.736780,0 point 7 = 0.928816,1.519911,6.657925,0 point 8 = -0.867764,1.547411,-4.546486,0 point 9 = 0.718989,1.492410,-4.582409,0 point 10 = 0.966041,1.454911,-8.690816,4 point 11 = -1.064782,1.452408,-8.631719,4 point 12 = 3.249074,1.434911,-0.637954,10 point 13 = 3.228406,1.469920,-0.248444,10 point 14 = 0.840388,1.427552,7.692973,3 point 15 = 1.031660,1.347551,5.505277,2 point 16 = 1.005709,1.337549,2.096193,2 point 17 = -1.058242,1.335025,-1.223066,1 point 18 = 1.007782,1.347523,-1.275707,2 point 19 = -1.057008,1.465025,-4.540694,1 point 20 = 1.077551,1.432525,-4.599940,2 point 21 = -3.285402,1.322526,-0.675767,10 point 22 = -3.284778,1.342523,-0.364964,10 point 23 = -1.026730,1.330025,2.165932,1 point 24 = -1.020359,1.357526,5.523181,1 point 25 = -0.760462,1.825028,7.740371,3 point 26 = 1.011494,1.410026,-7.762551,10 point 27 = -1.012654,1.475022,-7.877825,10 [LINK_DATA] link 0 = 0,3 link 1 = 3,4 link 2 = 8,4 link 3 = 11,8 link 4 = 1,2 link 5 = 5,2 link 6 = 7,1 link 7 = 10,9 link 8 = 5,9 link 9 = 6,0 link 10 = 9,8 link 11 = 18,12 link 12 = 12,13 link 13 = 14,13 link 14 = 0,24 link 15 = 3,23 link 16 = 4,17 link 17 = 1,15 link 18 = 16,2 link 19 = 18,5 link 20 = 20,9 link 21 = 19,8 link 22 = 21,17 link 23 = 22,21 link 24 = 22,25 link 25 = 7,26 link 26 = 6,26 link 27 = 26,21 link 28 = 6,27 link 29 = 6,24 link 30 = 7,14 link 25 = 7,26 link 26 = 25,27 link 27 = 6,27 link 28 = 6,23 link 29 = 7,14 Муть да?? И я так думаю ![]() [SIZE] points = 28 //колво поинтов с нулем считаем. links = 30 //колво линков с нулем. [POINT_DATA] point 0 = -1.053810,1.572414,5.501140,0 //координаты поинта 0. Координаты -1.053810 - Х, 1.572414 - Z, 5.501140-Y. Берем маю/макс и начинаем смотреть координаты там и водить сюда.. Метод тыка тут... И только ОН! point 1 = 1.015286,1.554920,5.494949,0 [LINK_DATA] link 0 = 0,3 //показывает куда итди! Например с Поинта 0 на поинт 3. link 1 = 3,4 link 2 = 8,4 Все это напряжно? Да.. Тут есть две новости плохая и хорошая. Плохая нет тулов которые пишут сейлор поинты в интерфесе(может быть ты напишешь его?). Тока тыком.. Хотя есть тулы которые его пишут но очень косячно.. Хорошая это то что Сайлор поинты ты можешь править прямо в игре. Как? Расказываю... Загружай свой Галеон, море смотрим как матросики бегают.. Дальше два пути, выбирай сам как лутче тебе. 1. Сохранить игру, дальше правишь сейлор поинты, сохранить документ и загружаешь игру.. Вуаля новые сейлор поинты работают. 2. Правишь сейлор поинты, сохранить документ, выходишь на глобальную карту, снова в море вуаля новые сейлор поинты! Все это хорошо но как пустить в продажу? А просто. Идем в \program\scripts\utils Там ищем такое for (int i = SHIP_LUGGER; i <= SHIP_FRIGATE; i++) А теперь внимание идем в program\ships\ships.н Там смотрим порядковый номер фрегата 13. Так вот продвинутые юзеры, все порядковые номера после 13 в верфь не попадут. Более того порядок идет по номерам.. То есть Если под 14 номером будет Лодка то идти она будет после фрегата и доступна будет на крутых левелах. Вот так вот! Меняем строчку под свои нужды.. Или порядкове номера и наслаждаемся кораблем в Верфи. Удачи! Следуюющий урок раскажет как добавить персонажа и диалог ему ![]() Последний раз редактировалось КиллерМЕН, 17.02.2013 в 14:27. |
__________________
Чрезмерное злоупотребление компьютерными играми сносит башню. ![]() Доказано минздравом.
|
![]() |
#5 |
Экс Администратор
|
![]() Урок № 4 В этом уроке мы научимся создавать персонажей! И писать им диалоги.. Для начала создадим перса в городе. идем в program\characters\init там видим список городов и еще несколько файлов.. Так вот например в \characters\init\LaVega будут персы которые живут в этом городе.. Что в прочем не мешает вам создать файл Vasya_Pupkin и туда ложить персов. ![]() Теперь открываем там написаны блоки. makeref(ch,Characters[n]); //Трактирщик - эта функция создаёт перса, и для удобства пишетсья кто это. ch.id = "LaVega_tavernkeeper"; //id перса, по нему движок общаеться с персом ch.model = "barmen_7"; // модель перса. Смотреть в RESOURCE\MODELS\Characters ch.greeting = "Barmen_3"; // приветсвие может и не быть.. Это стандартный привет. ch.sex = "man"; // анимация. man, woman. ch.location = "LaVega_Tavern"; //локация. Может быть любой локацией от LaVega_town до ну любой ![]() ch.location.group = "barmen"; //група локаторов. Смотреть как я говорил можно в игре идем в program\locations\locations_loader там ищем /* VisibleLocatorsGroup("reload", 1.0, 15.0, 55, 0, 255, 0); VisibleLocatorsGroup("characters", 1.0, 15.0, 55, 255, 0, 0); VisibleLocatorsGroup("goto", 1.0, 15.0, 55, 255, 0, 0); VisibleLocatorsGroup("sit", 1.0, 15.0, 55, 255, 0, 0); VisibleLocatorsGroup("item", 1.0, 15.0, 55, 255, 0, 255); */ И убираем /* и */. Тоесть делаем так VisibleLocatorsGroup("reload", 1.0, 15.0, 55, 0, 255, 0); VisibleLocatorsGroup("characters", 1.0, 15.0, 55, 255, 0, 0); VisibleLocatorsGroup("goto", 1.0, 15.0, 55, 255, 0, 0); VisibleLocatorsGroup("sit", 1.0, 15.0, 55, 255, 0, 0); VisibleLocatorsGroup("item", 1.0, 15.0, 55, 255, 0, 255); ch.location.locator = "stay"; //Локатор название его. ch.Dialog.Filename = "TavernOwner_dialog.c"; //Диалог прописываеться в program\dialogs\russian ch.nation = SPAIN; //национальность LAi_SetBarmanType(ch); //анимация бармена. LAi_RemoveLoginTime(ch); //обновление анимации LAi_group_MoveCharacter(ch, "SPAIN_CITIZENS"); //Група. LAi_SetImmortal(ch, true); //Неуязвимый. n = n + 1; Но это простой смертный... Можно ему добавить конкретное оружие, параметры. GiveItem2Character(ch, BLADE_SABER); //сабля в инветарие. ch.equip.blade = BLADE_SABER; //сабля в руках ch.rank = 1; //Ранг НПС ch.reputation = "None"; //Репутация ch.experience = "0"; //Опыт ch.skill.Leadership = "1"; //Авторитет ch.skill.Fencing = "4"; //Фехтование ch.skill.Sailing = "1"; //Навигация ch.skill.Accuracy = "1"; //Точность ch.skill.Cannons = "1"; //Орудия ch.skill.Grappling = "1"; //Абордаж ch.skill.Repair = "1"; //Починка ch.skill.Defence = "1"; //Защита ch.skill.Commerce = "1"; //Комерция ch.skill.Sneak = "1"; //Удача ch.money = "10"; //Деньги Можно добавить судно ch.Ship.Name = "Arabella";//имя корабля ch.Ship.Type = SHIP_Frigate; //Тип корабля. Подробнее смотрим в ch.Ship.Cannons.Type = CANNON_TYPE_CANNON_LBS16;//Тип установленных орудий. В принципе перса прописали.. Заходим в игру. Новая игра и смотрим появился ли он? Если да то радуемся.. Но смотреть сообшение.. "Ошибка открытия файла диалога." не все нравиться пишем диалог? Создаем файл. ХХХ_dialog.с (под ХХХ я имел виду такое жде название как и в строчке ch.Dialog.Filename = "TavernOwner_dialog.c";). И еще виндовс создает файл ХХХ_dialog.с.txt и двиг разумееться ругаеться ![]() Открываем и видим ужос.. void ProcessDialogEvent() //Лутче не трогать это { ref NPChar; //Лутче не трогать это aref Link, NextDiag; //Лутче не трогать это DeleteAttribute(&Dialog,"Links"); //Лутче не трогать это makeref(NPChar,CharacterRef); //Лутче не трогать это makearef(Link, Dialog.Links); //Лутче не трогать это makearef(NextDiag, NPChar.Dialog); //Лутче не трогать это switch(Dialog.CurrentNode) //Лутче не трогать это { case "First time": //Название первого Кейса.. Он активируеться при разговоре первом.. dialog.text = ""; //Тут пишем что нам НПС говорит link.l1 = ""; //Ответ наш link.l1.go = ""; //Переход на Кайс link.l2 = ""; //Ответ наш link.l2.go = ""; //Переход на Кайс link.l3 = ""; //Ответ наш link.l3.go = ""; //Переход на Кайс link.l4 = ""; //Ответ наш link.l4.go = ""; //Переход на Кайс break; case "Exit": //Это кайс выхода.. ЕГо не трогаем... NextDiag.CurrentNode = NextDiag.TempNode; DialogExit(); break; } } Дальше практикуем.. case "First time": dialog.text = "Сеньор капитан!"; link.l1 = "Черт, откуда ты знаешь что я капитан?"; link.l1.go = "next"; //перенаправление на Кайс break; //Это обязательно должно быть! case "next": //Вот он! Кайс dialog.text = "Я видел как с корабля " + PChar.Ship.Name + ", спустили шлюпку и вы на ней приплыли в этот великолепный город"; //" + PChar.Ship.Name + " это функция вписать название судна ГГ link.l1 = "Да ты прав, я капитан " + PChar.Name + ", что тебе от меня надо?"; link.l1.go = "1"; link.l2 = "У меня нет времени с тобой разговаривать!"; link.l2.go = "exit"; NextDiag.TempNode = "Second Time"; //Это если заговорим снова! То активируеться диалог не с "First time", а с "Second Time" break; case "1": dialog.text = "Понимаете капитан, у меня есть информация для вас."; link.l1 = "Что ты предлогаешь?"; link.l1.go = "11"; case "11": dialog.text = "Я могу вам предложить детальную иформацию о судоходстве."; link.l1 = "Я сам знаю как управлять судном!"; link.l1.go = "exit"; link.l2 = "Я слушаю."; link.l2.go = "111"; break; case "111": dialog.text = "Не так быстро, за информацию я прошу 400 монет"; if (sti(pchar.money) >= 400) //Проверка что у ГГ есть 400 монет { link.l1 = "Платить, ну уж нет, и без тебя разберемся!"; link.l1.go = "exit"; link.l2 = "Вот деньги."; link.l2.go = "1111"; } else //если нет денег то активируеться это { Link.l1 = "Проклятие у меня нет денег!"; Link.l1.go = "exit"; } NextDiag.TempNode = "First Time"; break; case "1111": AddMoneyToCharacter(pchar, -400); //Отбирает у ГГ 400 монет dialog.text = "Вот смотрите есть несколько типов ветров.. В обшем мне влом писать ![]() link.l1 = "Спасибо за интересную информацию!"; link.l1.go = "exit"; AddCharacterExp(pchar, 1000); //Добавляет опыт PlayStereoSound("new_level"); //Звук "Новый Уровень" NextDiag.TempNode = "Second time" //Следующий раз будет диалог "Second time" break; case "Second time": dialog.text = "Капитан, надеюсь вам помогла моя информация?"; link.l1 = "Да спасибо тебе!"; link.l1.go = "exit"; break; case "exit": //Кайсе Ексит. NextDiag.CurrentNode = NextDiag.TempNode; DialogExit(); break; } } //это закрываем скобки обязательно.. Вот такие диалоги можно и нужно делать! По дейсвиям. AddCharacterExp(pchar, хххх); добавить опыта/отнять опыта тогда надо минус писать. AddMoneyToCharacter(pchar, хххх); добавить денег персонажу/отобрать деньги у персонажа. pchar.Experience = makeint(pchar.Experience) - ХХХХ; отобрать у ГГ опыт. В принципе более сложные действия в диалоге сложно сделать.. Надо делать квестом. Хотя возможно я что то забыл.. Следующий урок будет по прописыванию локаций в игру ![]() Последний раз редактировалось dima12, 17.05.2008 в 18:08. |
__________________
Чрезмерное злоупотребление компьютерными играми сносит башню. ![]() Доказано минздравом.
|
![]() |
#6 |
BGTeam
|
![]() Итак наконец я добрался до написания уроков!
Урок №5 «Кодинг квестов» Итак значит все квесты в К3 могут кодяться в разных местах. Можно это делать чисто через диалоги, но у этого способа очень много минусов, поэтому мы его рассматривать не будем. Мы рассмотрим вариант кодинга квестов в файле Quest/quest_reaction.c(можно ещё это делать в story_line.c, но в этом файле делается основная сюжетная линия, и поэтому не будет перемешивать код) Значит открываем файл quest_reaction.cи идем в самый низ… там сначала делаем комментарий: //////////////////////////////////////////////////////////////// ///////////////Квест такой-то делал тот-то////////////////////// //////////////////////////////////////////////////////////////// А дальше пишем уже знакомое всем Код:
Case“имя кейса”: Собственно тело кейса…… Break; Теперь разберем какой-нибудь уже сделанный квест. Рассмотрим квест «Конвоир» (2 квест сюжетки) Квест начинается у губернатора Ла-вега, значит смотрим его файл диалога… LaVega_Hovernor_dialog.c Среди прочего кода там находим строчки… Код:
link.l3 ="Нет, ли у вас какого-нибудь поручения для молодого капитана?"; link.l3.go ="quest_guard"; Код:
case "begin_quest": NextDiag.CurrentNode = NextDiag.TempNode; DialogExit(); AddDialogExitQuest("begin_quest"); //// нас интересует вот эта строка в ней происходит запуск кейса begin_quest из файла quest_reaction … break; вот он Код:
case "begin_quest": AddQuestRecord("quest_guard", "1"); // здесь происходит запись в судовой журнал.. (все записи судового журнала находятся в resource\ini\texts\russian\questbook\quests_texts.txt) ChangeCharacterAddressGroup(characterFromID("MatteusDull"), "LaVega_town", "Goto", "Goto21")); // здесь идет помещение персонажа с ИД MatteusDull в город ЛА-вега в локатор goto 21 Characters[GetCharacterIndex("LaVega_Hovernor")].Dialog.CurrentNode = "SecondTime"; // прописываем какой-диалог будет с нами говорить губернатор при следующей с ним встреей (этим мы убрали возможность взять квест много раз…) break; итак сейчас нас там интересует кейс exit….. Код:
case "Exit": AddDialogExitQuest("go_to_ship_Matteus"); // запусккейсаизквест_реактиона AddQuestRecord("quest_guard","ship"); // запись в судовой журнал NextDiag.CurrentNode = NextDiag.TempNode; DialogExit(); break; Код:
case "go_to_ship_Matteus": LAi_SetActorType(characterFromID("MatteusDull")); // прописываем тип актера Матеусу LAi_ActorRunToLocator(characterFromID("MatteusDull"), "reload", "reload1_back", "reload_Matteus", -1); // заставляем его бежать на пристань.. после чего запускается сразу кейс reload_Matteus AddPassenger(pchar, characterFromID("MatteusDull"), false); // добавляем его в пассажиры // я слегка укоротил это кейс потому что нашел там один косяк…=) ну ладно об этом пока не будем break; Код:
case "reload_Matteus": ChangeCharacterAddressGroup(characterFromID("MatteusDull"), "Matteus_deck", "Goto", "goto6")); // перемещаем Матеуса в локацию Matteus_deck pchar.quest.reloadPITER.win_condition.l1 = "location"; pchar.quest.reloadPITER.win_condition.l1.location = "Montserrat"; pchar.quest.reloadPITER.win_condition = "reload_PiterBlake_to_Matteus_deck"; // а вот в этих 3 строчках написано, что когда ГГ окажется около острова Монтсерат запустить кейс reload_PiterBlake_to_Matteus_deck break; Код:
case "reload_PiterBlake_to_Matteus_deck": DoReloadFromSeaToLocation("Matteus_deck", "goto", "goto9"); // здесь происходит релаод ГГ с моря в локацию LAi_SetActorType(characterFromID("MatteusDull")); //делаем Матеуса актером LAi_ActorDialog(characterFromID("MatteusDull"), Pchar, "", 1, 1); // заставляем его начать диалог с ГГ Characters[GetCharacterIndex("MatteusDull")].Dialog.CurrentNode = "ship"; // прописываем какой именно дилаог должен начать маттеус Break; Вот они….(это уже опять вернулись в квест_реактион) Это в случае если с Матеусом не договорились и с ним начинается бой Код:
case "kill_Matteus0": LAi_SetWarriorType(CharacterFromID("MatteusDull")); // тип воина для Матеуса LAi_group_MoveCharacter(CharacterFromID("MatteusDull"), "enemy"); //помещаем его в группу враги LAi_group_FightGroups("enemy", LAI_GROUP_PLAYER, true); // начинаем бой между группой враги и группой ГГ (то есть между Матеусом и ГГ) LAi_SetFightMode(pchar, true); // боевой режим для ГГ RemovePassenger(Pchar,CharacterFromID("MatteusDull")); // удаляем Матеуса из пассажиров LAi_QuestDelay("kill_Matteus1", 1.0); // запускаем следующий кейс через 1 секунду break; Код:
case "kill_Matteus1": Pchar.quest.kill_Matteus_next.win_condition.l1 = "NPC_Death"; Pchar.quest.kill_Matteus_next.win_condition.l1.character = "MatteusDull"; PChar.quest.kill_Matteus_next.win_condition = "kill_Matteus2"; // Здесь описано, что после убийства матеуса запутситься кейс kill_Matteus2 break; Код:
case "kill_Matteus2": AddQuestRecord("quest_guard","kill_Matteus0"); // опятьзапись всудовойжурнал… QuestToSeaLogin_PrepareLoc("Montserrat", "reload", "reload_3", false); QuestToSeaLogin_Launch(); // а эти 2 строчки нужны для того, чтобы ГГ вернулся назад в море //доделать!!!! вариант квеста после убийства чувака ( а этот комментарий я оставлю без комментариев=))) break; теперь рассмотрим 2 продолжение квеста.. это кейс shore_dialog_Montserrat, который запускается опять же таки из диалога с матеусом… Код:
case "shore_dialog_Montserrat": ChangeCharacterAddressGroup(characterFromID("MatteusDull"), "Montserrat_shore", "Goto", "goto2")); // перемещаем матеуса в бухту DoReloadCharacterToLocation("Montserrat_shore","goto","goto1"); // перемещаем ГГ в бухту LAi_QuestDelay("shore_dialog_Montserrat_next", 1.0); // запускаем следующий кейс LAi_SetActorType(characterFromID("MatteusDull")); // типа актера для Матеуса Characters[GetCharacterIndex("MatteusDull")].Dialog.CurrentNode = "shore_dialog"; // диалог для Матеуса break; Код:
case "shore_dialog_Montserrat_next": LAi_ActorDialog(characterFromID("MatteusDull"),characterFromID("Blaze"),"",0,1); break; Код:
case "Go_to_jungle": RemovePassenger(Pchar,CharacterFromID("MatteusDull")); // удаляем Матеуса из пассажиров ChangeCharacterAddressGroup(characterFromID("guardM1"), "Montserrat_town_exit", "Goto", "guard1")); // прописываем охрану у города ChangeCharacterAddressGroup(characterFromID("guardM2"), "Montserrat_town_exit", "Goto", "guard2")); //прописываем охрану у города // Для этого персонажи с такими ИД должны быть прописаны!!! Locations[FindLocation("Montserrat_town_exit")].locators_radius.goto.goto_quest = 3.0; // делаем радиус локатора goto_quest большим pchar.quest.dialog_with_guard.win_condition.l1 = "locator"; pchar.quest.dialog_with_guard.win_condition.l1.location = "Montserrat_town_exit"; pchar.quest.dialog_with_guard.win_condition.l1.locator_group = "goto"; pchar.quest.dialog_with_guard.win_condition.l1.locator = "goto_quest"; pchar.quest.dialog_with_guard.win_condition = "dialog_with_guard"; // в этих 5 строчках описано, что когда ГГ окажется в локаторе goto_questто запуститься кейс dialog_with_guard break; Код:
case "dialog_with_guard": ChangeCharacterAddressGroup(characterFromID("MatteusDull"), "Lavega_townhall", "Goto", "goto1")); // здесь переноситсья к Губернатору Ла-Вега (так надо!) LAi_SetActorType(characterFromID("guardM1")); // тип актера одному из стражников LAi_ActorDialog(characterFromID("guardM1"),Pchar , "", 0, 0.1);// начинаем диалог с ГГ Break; Значит чтобы вам было легче вот списочек функций в игре (далеко не всех!, и возможно у какой-то из них неправильное описание =)) У некоторых функций есть перед её именем указан тип..НО для её использования тип писать не надо…. В скобках после имени указаны параметры функции… их нужно заменять на свое…… Ну что ж пока что все….Продолжение следует….. Последний раз редактировалось dima12, 17.05.2008 в 18:11. |
__________________
Нужный человек не в том месте может перевернуть мир! |
![]() |
Здесь присутствуют: 1 (пользователей - 0 , гостей - 1) | |
Опции темы | Поиск в этой теме |
Опции просмотра | |
|
|
Часовой пояс GMT +4, время: 16:01 |
Архив |
![]() |