По мере вопросов и развертывания работ будем выдавать хелпы и проги:rolleyess: .
Копирование материалов данной темы на другие интернет ресурсы постить тока с сылкой на эту тему!
Flint
03.02.2007, 01:16
Итак каждый хочет чуствовать себя мега кодером. Но сразу сделать чтото сложное очень сложно. Надо начинать с маленького, походу понимая механику игры.
№ Урок 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"; - это для описания, на одно описание можно повесить хоть десять сабель:Happy: … Как делать описане читаем дальше.
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 (http://1.filesopc.z8.ru/pictures/sk1.JPG).
Теперь ConvertorTXом снова конвертим в 16 битном качестве..
Алгоритм такой.
следующий ряд пишем как предыдуший.
0(верхний край, правый по х оси), 512(верхний край по оси у), 128(нижний левый край по оси х), 640(нижний край по у оси)
Урок № 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; //цена продукта:Happy:
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 текстура наша. Без ТХ формата указывать.
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]
Все предмет в игре.. Только специфика К3 такова что его вы не увидете:Happy2: . В уроке 4 скажу как можно добавить предмет игроку.
Flint
05.02.2007, 21:07
Урок № 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"; //Звуки. .Можно прикрутить звуки мановара к Люгеру:Happy2:
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; //Время на постройку.. Но походу неиспользуеться..:rolleyess:
refship.Rocking.y = 0.4; //Раскачивание судна по оси У
refship.Rocking.az = 0.02; //Раскачивание судна по оси z
refship.WaterLine = -0.2; //Ватерлиния чем меньше значение тем выше из воды выглядывает судно... Можно сделать подводную локу или воздушный корабль:Happy2:
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;
//Это параметры залпа....
//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) дать герою со старта корабль.
Вот эту строчку и правим ch.Ship.Type = GenerateShip(SHIP_LUGGER, 1);.
В нашем случае ch.Ship.Type = GenerateShip(SHIP_GALEON_H, 1);
Все запускаем игру... И видем свой корабль!!!:blum2:
Но возникают вопросы.. А почему нет картинки судна в интрфейсе? А почему нет описания???
Все по порядку... Так пока в игре.. Находим удачный вид корабля и СКРИНИМ:Happy2: .. Помните потом будете резать картинку до квадрата и масштабить до 256х256 так что выбирайте ракурс!
Скрин есть обрабатываем.. Я юзаю стандартный офис Пиктуре Менеджер.. Там все это делаеться ЕЛЕМЕНТАРНО:blum2: .. В обшем обрезали до квадрата, потом смаштабили до 256х256.. Теперь открываем фотошоп и перегоняем в ТГА, обзывая его как и нашу модель в нашем случае galeon_h.tga! Дальше открываем ConvertorTX и там конвертируем в ТГА.ТХ файл директория конвертации RESOURCE\Textures\INTERFACES\SHIPS конвертим в 16 битном режиме и все выходим отсюда и идем в RESOURCE\INI\interfaces\pictures
Теперь такая весчь как описание?
RESOURCE\INI\texts\russian\common
Там ищем Lugger.
Видим такую строчку
string = Lugger,"Люгер"
Меняем под свой корабль
string = Galeon_h,"Тяж. Галеон"
Добавляем под люгер..
Дальше крутим вниз и видим такое
string = Lugger_descr,"Как один из самых быстрых кораблей 16-го века, люгер пользовался большой популярностью среди берегового братства, контрабандистов и военных, использовавших его в качестве быстрого курьерского или разведывательского судна."
Мы меняем под свое..
string = Galeon_h_descr,"Ля-ля:blum2: "
Теперь нас смущает постоянно меняющаяся иконка в левом верхнем углу.. В принципе добавить можно и свою(аналогия с оружием размер 64х64) но я предпочитаю дефолт.. Уж слишком много возни:huh: .
Идем сюда \program\battle_interface\BattleInterface
Все теперь запускаем игру и наслаждаемся:rolleyess: ..
Хотя нет есть фиха Sailorspoints.
Открываем наш галеон \MODELS\Ships\SAILORSPOINTS\Galeoth_h1
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
Муть да?? И я так думаю:huh: . В обшем мини мануал..
[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
Там ищем такое
[SIZE=2]for (int i = SHIP_LUGGER; i <= SHIP_FRIGATE; i++)
А теперь внимание идем в program\ships\ships.н
Там смотрим порядковый номер фрегата 13. Так вот продвинутые юзеры, все порядковые номера после 13 в верфь не попадут. Более того порядок идет по номерам.. То есть Если под 14 номером будет Лодка то идти она будет после фрегата и доступна будет на крутых левелах. Вот так вот!
Меняем строчку под свои нужды.. Или порядкове номера и наслаждаемся кораблем в Верфи.
Удачи!
Следуюющий урок раскажет как добавить персонажа и диалог ему:rolleyess: .
Flint
25.02.2007, 19:23
Урок № 4
В этом уроке мы научимся создавать персонажей! И писать им диалоги..
Для начала создадим перса в городе.
идем в program\characters\init там видим список городов и еще несколько файлов.. Так вот например в \characters\init\LaVega будут персы которые живут в этом городе.. Что в прочем не мешает вам создать файл Vasya_Pupkin и туда ложить персов.:rolleyess: . Главное что бы они лежали в \characters\init
Теперь открываем там написаны блоки.
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 до ну любой:rolleyess: .. Смотреть локации можно в \program\locations\init в даном случае \program\locations\init\LaVega и прописывать
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);
*/
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 и двиг разумееться ругаеться:Happy2: , делаем так копируем уже готовый файл диалога и обзываем как надо!
Открываем и видим ужос..
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 = "Вот смотрите есть несколько типов ветров.. В обшем мне влом писать:Happy2: ";
link.l1 = "Спасибо за интересную информацию!";
link.l1.go = "exit";
AddCharacterExp(pchar, 1000); //Добавляет опыт
PlayStereoSound("new_level"); //Звук "Новый Уровень"
NextDiag.TempNode = "Second time" //Следующий раз будет диалог "Second time"
break;
Вот такие диалоги можно и нужно делать! По дейсвиям.
AddCharacterExp(pchar, хххх); добавить опыта/отнять опыта тогда надо минус писать.
AddMoneyToCharacter(pchar, хххх); добавить денег персонажу/отобрать деньги у персонажа.
pchar.Experience = makeint(pchar.Experience) - ХХХХ; отобрать у ГГ опыт.
В принципе более сложные действия в диалоге сложно сделать.. Надо делать квестом. Хотя возможно я что то забыл..
Следующий урок будет по прописыванию локаций в игру:rolleyess:
Kopcap
24.03.2007, 11:55
Итак наконец я добрался до написания уроков!
Урок №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 quest_guard там идет продолжение диалога, просматриваем его и видим
case "begin_quest":
NextDiag.CurrentNode = NextDiag.TempNode;
DialogExit();
AddDialogExitQuest("begin_quest"); //// нас интересует вот эта строка в ней происходит запуск кейса begin_quest из файла quest_reaction …
break;
далее идем в файл quest_reaction иищем там case begin_quest
вот он
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;
далее по квесту мы должны поговрить с матеуссом ….. значит смотрим его диалог MatteusDull_dialog.c
итак сейчас нас там интересует кейс 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;
теперь смотрим кейс reload_Matteus
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.cha racter = "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;
это был 1 вариант когда ГГ убивал Матеуса…..
теперь рассмотрим 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;
после диалога запускается кейс Go_to_jungle ( запсукаем его опять де таки из диалога маттеуса)
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 большим
// в этих 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;
Дальше идут кейсы, в которых вам уже должно быть все знакома.. так что их я разбирать не буду…….
Значит чтобы вам было легче вот списочек функций в игре (далеко не всех!, и возможно у какой-то из них неправильное описание =))
У некоторых функций есть перед её именем указан тип..НО для её использования тип писать не надо….
В скобках после имени указаны параметры функции… их нужно заменять на свое……