Работа с
.cfg (Квесты)
/*Доброго времени суток дамы и господа, леди и
джентэльмены, сэры и срихи, мальчики и девочки.
Сегодня мы с вами посмотрим как работать с cfg файлами
на примере создания простейших квестов.
Хочется сразу обратить ваше внимание, что данный скрипт
не будет полноценнвм, в енм будет только основная мысль,
а всяческого рода проверок, гампов, развитлений и т.д.
не будет.
И так, создадим квест типа: подай принеси.
Приамбула:
Жили были славные мершанты и торговали они велеколепными
товарами, но вот беда между собой они редко встречались,
т.к. боялись ходить по земля британии т.к. неродивые
игроки часто любили шутить над ними, так бывало в иной
раз как выскочат в самый неподходящий момент из -за
кустов, как начнут орать, а еще паче насрут перед
походным вогончиком. Вот так тяжело жилось имершентами,
пока один из них не придумал, что можно просить тех же
игроков перетаскивать товары между мершантами. И
началась в селе совсем дургая жизнь. Игроки за небольшую
мзду шныряли между мершантами достовляя радость себе и
оружающим.
ЗЫ. Данные события небыли в реальны, поэтому совпадение
всех имен, итемов и координат случайны.
Смысл вобщем квеста ясен, темперь займемся важным делом,
а именно планированием нашего cfg файла.
Т.к. все у нас будет случайно, то мы сделаем с вами
несколько групп в cfg файле и будет все выглядеть именно
так:
ЗЫ Конечно данный код работы с кфг можно было написать
более красиво, но разложив все на простые
составляющиемне кажется это будет более доходчиво.
quest Items
{
item Gorshok
item Poroshok
item Zapashok
}
quest Names
{
name Asmodey
name Velzevul
name Moloh
}
quest Narod
{
npc barber
npc cannonsmith
npc beggar
}
quest Place
{
xy 5510 775
xy 5123 796
xy 5536 1822
}
Items - это список вещей из которыйх будет выбрана вешь
которую нужно будет доставит.
Name - список имен из которого будет выбрано имя
апонента которому нужно будет доставить вешь.
Place - список координат (ну дальше вы уже знаете)
Так cfg фаил написали, теперь перейдем непосредственно к
программе. */
use uo;
use os;
use util;
use cfgfile; // <------ Важная фишка, не забудте ее
program rabcfg(who)
var cfg := ReadConfigFile("::primer"); // тута мы
напишем путь к нашему файлу, в данном случае он будет
искаться в паке config
if (!cfg)
Syslog ("Can't open cfg file!");
return;
endif
// Сделали проверку, ведь если мы не считали кфг фаил.
как мы с ним будем работать?
var items_entry := FindConfigElem(cfg, "items");
// Сия строка значит, что в нашем файле мы будем искать
слово Items, Items - у нас ключевое слово.
var possible_items := GetConfigStringArray(items_entry,
"Item");
// Далее получаем массив всех элементов начинающихся со
слов item, причем получать все это мы будем из Items.
Тоесть как бы из портфеля (Items), мы берем кучу бумаг
(item)
var theitem :=
possible_items[RandomInt(len(possible_items))+1];
// Выбираем из всех элементов только один, да и тот
случайным образом. Как мы это сделали: применив Len к
массиву, мы получаем количество элементво в массиве,
Функцией Random получаем случайное число и говорим, что
мы берем в массиве элемент равный полученному нами
номеру(possible_items[n])
if(CInt(theitem))
theitem :=CInt(theitem);
else
theitem := Cint(GetObjtypeByName(theitem));
endif
// далее мы смотрим вот что, ведь вешь у нас можеть быть
задана не тлько именем, но и числов в виде 0х. Поэтому
делаем проверку.
if(!theitem)
Syslog("Error item.");
return;
endif
// Ну малоли по каким причинам не вышло, но все должно
быть запротоколированно
// Такимже образом получаем имена и что то под названием
ХУ, но с ху не та то все и просто, мы должны провести с
ним еще одну операцию, а именно:
// var coord := SplitWords(xy);
//теперь мы всегда сможем получить Х и У просто написав
coord[1] и coord[2]
var names_entry := FindConfigElem(cfg, "Names");
var possible_names := GetConfigStringArray(names_entry,
"name");
var name :=
possible_names[RandomInt(len(possible_names))+1];
sendsysmessage(who, "name"+name);
var place_entry := FindConfigElem(cfg, "Place");
var possible_place := GetConfigStringArray(place_entry,
"xy");
var place :=
possible_place[RandomInt(len(possible_place))+1];
var coords := SplitWords(place);
var npc_entry := FindConfigElem(cfg, "Narod");
var npc_all := GetConfigStringArray(npc_entry, "npc");
var template := npc_all[RandomInt(len(npc_all))+1];
sendsysmessage(who, "npc"+template);
var npc := CreateNpcFromTemplate( template,
Cint(coords[1]), CInt(coords[2]), coords[3]);
SetName( npc, "name");
var needitem := CreateItemInContainer(who.backpack,
theitem12, 1);
endprogram
//ну тут и так все понятно
// Вот собственно и все, вам осталось зделать проверуи,
вставить это куда нить и все должно работать по идее.
/*
Бывают варианты, когда вам нужно делать статические
квесты, где заранее известен данжен, монстр и т.д.тоесть
Cfg выглядит так:
quest1
{
mesto regionOne
monster blah blah
ietem blah
group blah blah
}
mesto regionOne
{
rectangle x1 y1 x2 y2
rectangle x1 y1 x2 y2
.....
}
group blah blah
{
npc blah
npc blah
......
}
Тут надо будет немного по другому для выбора рандомом
квеста будем использывать GetConfigMaxIntKey(
config_file );
Потом из нее рандом берем число и пешем
var num_cose := cfg[num]; так мы доступимся к элементу с
нужным нам номером
var elem := CSTR(FetConfigString(num_cose, "mesto");
получаем название списка с координатами
var regions := FindConfigElem(cfg, CStr(elem)); находим
в конфиге нужный элемент
далее идем уже по знакомой нам программе
var reg_array := GetConfigStringArray(regions,
"rectangle");
var chose_reg := RandomInt(len(reg_array))+1;
var chose := reg_array[chose_reg];
var info := SplitWords(chose);
Вот вобщем то и все
*/ |