I WonT To BeLiVe
Домашняя ] Вверх ]
All what you wont, Last update 12.08.07.


Upload

In Da Forum форум сайта смотрим тут


Новости Сайта

12.08.07 Доработан дизайн.


03.07.07 Добавлены разделы.

02.07.07 Новый дизайн.

22.11.06 Обновление.

10.07.06 Форум упал.

20.06.06 Новый форум.

17.06.06 Форум удален.
 

10.06.06 Новый дизайн.


________________
Происшествия
________________
Предложения и пожелания,нашли неработающую ссылку?

Напишите об этом Администратору
Спасибо !!!
 

 
Ресурсы

 

Управление ресурсами в ПОЛе


Написана Сократом для polserver.ru



В статье "Старая легенда о песке" описано, как написать скрипт добывания ресурса (на примере песка) и приведен пример, как определять новый ресурс, чтобы его можно было добывать.



В этой части мы познакомимся с системой управления ресурсами и всем, что имеет отношение к этому.



Управление ресурсами в ПОЛе
Написана Сократом для polserver.ru
В статье «Старая легенда о песке» было показано, как написать скрипт добывания ресурса (на примере песка) и приведен пример, как определять новый ресурс, чтобы его можно было добывать.
В этой статье мы познакомимся с системой управления ресурсами и всем, что имеет отношение к этому.
Система ресурсов (или экосистема) ПОЛа следит за использованием (добычей) ресурсов.
Эта система состоит из двух составляющих. Одна (локальная) отслеживает добычу ресурсов в каждой точке карты, не позволяя, например, бесконечно долго рубить одно и то же дерево или без ограничений добывать песок из одного и того же места на карте. Другая (глобальная) следит за состоянием ресурсов и возможностью добычи ресурсов по регионам.
Состояние ресурсов как в конкретном месте карты, так и в регионах определяется файлами resource . cfg и тип_ресурса. cfg
Чтобы ресурс в принципе было возможно добывать, он должен быть зарегистрирован в экосистеме ПОЛа в файле resource . cfg , например, когда мы вводили в игру песок, мы писали в resource . cfg :
ResourceSystem
{

ResourceType sand

}
Теперь нам следует определить, откуда и сколько можно этот ресурс добывать и как этот ресурс будет восстанавливаться. Это определяется в файле тип_ресурса. cfg , например, для песка мы написали sand . cfg . Конфиг такого типа состоит из нескольких секций. Первая секция с именем Global определяет, из какого типа поверхности карты или каких статических предметов может добываться наш ресурс. В этой секции мы указываем или типы поверхности карты ( Landtile ) или типы статической графики ( Objtype ). Также в этой секции мы определяем, какое общее количество единиц ресурса будет распределено по всему миру в момент старта сервера ( InitialUnits ). Например,
sand . cfg :
Global
{
InitialUnits 10000
Landtile 0x0016
….
Landtile 0x0672
}
Остальные секции этого конфига определяют регионы, в которых можно добывать ресурс, и свойства этих регионов, а именно:
- количство максимально возможного для добычи единиц ресурса в каждой точке региона ( UnitsPerArea );
- интервал в секундах, через который восстанавливается 1 единица ресурса, если в точке ресурс (частично) исчерпан ( SecondsPerRegrow );
- общее максимально возможное число единиц ресурса в регионе ( Capacity );
- координаты северо-западного и юго-восточного (сначала x , потом y ) углов прямоугольника, определяющего регион ( Range ).
Порядок, в каком свойства следуют в секции не важен, но все они должны быть определены.
Мы уже определили регион, соответствующий всей основной карте:
Region The Whole World
{
UnitsPerArea 50
SecondsPerRegrow 30
Capacity 200000
Range 0 0 5119 4095
}
Таким образом, песок можно будет добывать в тех местах карты, у которых координаты
0 <= x <= 5119 и 0 <= y <= 4095 и которые имеют тип поверхности из списка секции Global нашего конфига.
Максимально из одной точки (без учета восстановления) можно будет добыть 50 единиц песка. Восстановление будет происходить со скоростью 1 ед . за 30 сек (т.е. если мы полностью выкопали 50 единиц песка в какой-то точке карты, то полное восстановление ресурса с 0 до 50 произойдет за 25 минут). Общий запас песка в регионе – не более 200 тыс. единиц песка.
Этот конфиг может содержать несколько регионов, с разными свойствами. Если одна и та же точка карты принадлежит нескольким регионам из нашего конфига, то значения берутся из того региона, который встречается в конфиге последним.
Допустим мы хотим организовать «крутую песочницу» на пляже к югу от Британии, в которой из каждой точки можно бет добыть в 2 раза больше песка, восстанавливаться он будет в 2 раза быстрее, а общий запас будет огромен.
Добавим в sand . cfg следующую секцию:
Region Britain Beach
{
UnitsPerArea 100
SecondsPerRegrow 15
Capacity 300000
Range 1460 1850 1530 1900
}
После добавления этого региона в конец файла sand . cfg все точки региона будут иметь свойства ( UnitsPerArea , SecondsPerRegrow ), описанные в секции Britain Beach , а не в секции The Whole World , идущей в sand . cfg раньше.
Теперь рассмотрим функции, которые мы можем использовать в скриптах для работы с ресурсами. Их всего три:
GetRegionString
GetHarvestDifficulty
HarvestResource
Рассмотрим их в логической последовательности.
Прежде, чем добыть ресурс, скрипт должен определить трудность ( difficulty ) добычи ресурса в данной точке, чтобы использовать эту величину при проверке соответствующего (отвечающего за добычу этого ресурса) скилла в CheckSkill .
Мы это делали с помощью функции GetHarvestDifficulty , а именно (см. статью «Старая легенда о песке»):
var tdiff := GetHarvestDifficulty( "sand", use_on.x , use_on.y , info.landtile );
С параметрами функции все понятно. Мы передаем имя ресурса, координаты x , y точки, где добывается ресурс и тип поверхности в данной точке карты.
Прольем свет на то, как экосистема ПОЛа вычисляет возвращаемое значение трудности добычи. Величина difficulty обратно пропорциональна величине истощенности ресурса.
Сначала вычисляется базовая величина трудности, которая принимает значения от 10 при 0% истощенности (количество ресурса в данной точке равно величине UnitsPerArea для данного региона) до 90 при 100% истощенности (количество ресурса в данной точке равно 0).
Замечание. При 100% истощенности ресурса его добыча невозможна, и функция GetHarvestDifficulty возвращает не число, а ошибку с errortext = "Resource is depleted".
Далее, полученная базовая величина трудности умножается на действительное случайное число из диапазона от 0 до 2 (равномерно распределенное на отрезке [0,2]), полученный результат округляется до целого – это и будет difficulty , которую возвращает функция GetHarvestDifficulty . Тем самым, персонаж даже с низким добывающим скиллом имеет (хоть и очень маленький) шанс добыть ресурс из практически истощенного места.
После того как трудность добывания ресурса известна, можно попытаться добыть ресурс.
Сначала мы проверяем добывающий скилл на успешную добычу, используя difficulty . В
В примере из статьи «Старая легенда о песке» это:
if(CheckSkill(who, SKILLID_MINING, tdiff, 10))

endif
Внутри конструкции if … endif в случае успеха применения скилла происходит непосредственно добыча ресурса. Это делается с помощью функции HarvestResource.
var sandamount := HarvestResource( "sand" , use_on.x , use_on.y , 1 , 2 );
Рассмотрим общий формат этой функции:
HarvestResource( resource, x, y, b, n )
resource – название ресурса
x , y – координаты точки, в которой делается попытка добыть ресурс
b , n – параметры, определяющие количество добываемого ресурса, а именно добывается a * b единиц ресурса, где a –из диапазона от 0 до n включительно и выбирается максимально возможным так, чтобы общее число a * b не превосходило запас ресурса в данной точке . В нашем примере будет добываться a *1= a единиц песка (0 <= a <= 2), т.е. 1 или 2 единицы (значение a =0 возможно в данной ситуации только если ресурс истощен полностью, но тогда функция возвращает ошибку с errortext " No resource by that name ". Если бы функция HarvestResource вызывалась с параметром b > 1, то тогда возможна ситуация, когда она возвращает 0, но ресурс в данной точке до конца не истощен – его количество должно быть меньше b (ибо функция может возвращать только значения 0, b , 2 b , … n * b ).
Наконец, последняя функция
GetRegionString
Позволяет считывать дополнительные свойства, определенные в конфиге региона данного ресурса в строковом формате.
Например, мы захотели, чтобы в нашей крутой песочнице майнер не только добывал песок, но и иногда находил деньги, которые там потеряли отдыхающие.
Внесем в свойства региона тип находимого предмета (деньги – 0 x 0 EED ), шанс найти (в процентах), скажем 5% и количество (для интереса случайное). Тогда определим регион так :
Region Britain Beach
{
UnitsPerArea 100
SecondsPerRegrow 15
Capacity 300000
Range 1460 1850 1530 1900
ItemType 0x0EED
Chance 5
Amount 3d3+1 // минимально 4, максимально 10 гп
}
А в добычу ресурса вставим дополнительный код после того как сделаны все проверки и PerformAction :
var item_type := CInt(GetRegionString(“sand”, use_on.x, use_on.y, “ItemType”));
//использование С Int обязательно, так как GetRegionString возвращает строку, а не число
if ( item _ type ) //если в нашем регионе ничего не прописано, то и дальнейшее не нужно
var chance := CInt(GetRegionString(“sand”, use_on.x, use_on.y, “Chance”));
if (RandomInt(100) < chance)
var item_amount := RandomDiceRoll(GetRegionString(“sand”, use_on.x, use_on.y, “Amount”));
if (item_amount > 0 )
if (CreateItemInbackpack(who, item_type, item_amount))
SendSysMessage(who, “You found “ + item_amount+” gold coins”);
endif
endif
endif
endif
Понятное дело, что такое «доходное место» привлечет большое количество пескокопателей — любителей легкой наживы. И может так случиться, кто тогда в одном сравнительно малом регионе за достаточно небольшое время будет добываться большое количество ресурса. За то, чтобы это количество не превысило определенные (в конфиге) размеры, отвечает вторая составляющая экосистемы ПОЛа. Как было сказано выше, она отслеживает глобальную (по регионам, в отличие от локальной – в каждой отдельной точке) добычу ресурсов.
Когда некоторое количество единиц ресурса добывается в конкретной точке, локальная экосистема вычитает это количество из запасов в данной точке, а глобальная – вычитает его из запасов региона, которому данная точка принадлежит. Максимальный запас ресурса в регионе, как мы знаем, определен в конфиге региона свойством Capacity . При интенсивной добыче ресурса в данном регионе уровень общего запаса падает ( и соответственно, возрастает уровень истощенности ресурса в регионе). Если уровень истощенности достаточно ощутим, то глобальная экосистема региона вносит поправку в локальную, которая считает запас ресурса в каждой точке региона с учетом истощенности ресурса в регионе в целом.
Например, предположим, что артель упорных майнеров выкопало на нашем пляже 30 тыс. единиц песка. То есть теперь в регионе осталось не 300 тыс. единиц, а всего 270. Тем самым количество ресурса в целом составляет теперь 90% (от максимального, ) и истощенность соответственно – 10%. Если мы рассмотрим точку, в которой давно никто не копал (и согласно конфигу, там должно быть 100 единиц песка), то локальная экосистема применит общую истощенность региона к конкретной точке и будет считать что там не 100, а 90 единиц ресурса.
И в заключение,
как говорится, в гении только 5% таланта и 95% труда. Так и в ПОЛе – большая часть «интересности» геймплея на шарде составляет тщательная и продуманная настройка конфигов. Надеюсь, что приведенная выше информация позволит вам не только разнообразить скрипты добывающих скиллов, но прежде всего грамотно и осмысленно настроить конфиги, определяющие добычу ресурсов, в соответствии с вашими замыслами.
 

 


 

Новое из разделов:


Юмор:
Комментатор

 


Тюнинг:
Самое мощное авто

 


Web дизайн:
Хитрости

 


Мобильник:
Сервисные коды

 

 


История дня:

Звони по 0,01$


 

 
Hosted by uCoz