Игровые Форумы - Показать сообщение отдельно - Уроки по коддингу.
Показать сообщение отдельно
Старый 25.02.2007, 19:23   #5
Экс Администратор
 
 Аватар для Flint
 
Отсутствует :(

Регистрация: 12.11.2006
Адрес: Киев
Сообщения: 2,101

Репутация: 2060   Добавить отзыв для Flint

Отправить сообщение для  Flint с помощью ICQ
По умолчанию

Урок № 4
В этом уроке мы научимся создавать персонажей! И писать им диалоги..


Для начала создадим перса в городе.

идем в program\characters\init там видим список городов и еще несколько файлов.. Так вот например в \characters\init\LaVega будут персы которые живут в этом городе.. Что в прочем не мешает вам создать файл Vasya_Pupkin и туда ложить персов. . Главное что бы они лежали в \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 до ну любой .. Смотреть локации можно в \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);
*/

И убираем /* и */. Тоесть делаем так

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.
   
__________________
Чрезмерное злоупотребление компьютерными играми сносит башню.
Доказано минздравом.