хех)) распробовал игру) сижу гамаю потихоньку... графон только что-то напрягает только.. стрёмный какой-то о______О я ожидал большего((( в перспективе *может быть* будет страйкбольная игра по сталкеру.. если я решусь туда кучу денег вбухать..
нуууу... как это какие правила? банально какие вещи можно, а какие незя с трупов снимать ^_________^, как аномалии будут сделаны, какие фракции учавствуют в игре, какое оружие используется и т.п.)
не, вот сам прикинь... ГРАНАТА - 150 шариков... И кто там смотрит в кого попало, а в кого нет? Я ж почитал правила... ЕСЛИ В ВАС ПОПАЛ ШАРИК - ВЫ УБИТЫ. Кто докажет что в меня попал/не попал шарик??? Лучше уж тогда в квазар поиграть )))
не охота с нуля начинать... вообще смысл игры пока не сильно понимаю)) лажу, глушу бандюг, собираю артефакты, продаю.. денег дофига, а торговцев то только один, и то где то в жопе остался..
да не в том дело... там бага вылезла... не могу переключать указатель на побочные квесты, он постоянно на основном висит.. да и как бы я лично обычно как игру прохожу - сначала первоначальное накопление капитала, а потом вперёд и с песней)) чтобы по 10 раз не грузитсся из-за того что где-то нехватило десятка патронов или пары аптечек))
А ты действуй моим методом - добавляешь Сидоровичу в ассортимент Пустынного Орла, ставишь ему мощность на 10 единиц, нулевую цену, и вперед! Если в файлах сможешь разобраться...
Вот как надо редактировать файл sidr_supl:
________________________
/// Сдесь товары которые должны быть в продаже, их колличество и шанс появления
/// ammo_9x18_fmj = 10, 0.6
/// патроны 9х18 в колличестве 10 пачек и с шансом 60%.
/// Причем шанс расчитывается для КАЖДОЙ пачки, так что кол патронов могет быть разным.
/// Если поставить
/// ammo_9x18_fmj = 10, 1
/// То всегда будет 10 пачек.
/// В этих секциях задается цена и ее разброс
/// ammo_5.45x39_fmj = 1, 3
/// Так торговец продаст патроны и цена может быть от 100% до 300%( рандомно )
/// Если поставить так:
/// ammo_5.45x39_fmj = 10, 10
/// То расброса цен не будет и цена составляет 1000%, т.е в 10 раз больше реальной цены.
Да, и еще одно - увеличим количество предметов в тайниках. Не забудь поставить в АМК-опциях (верхняя строка меню) пункт "случайные тайники".
Потом найди файл treasure_manager.script и отредактируй его так:
________________________________________________________
function parse_spawns(line)
if line == nil then
return {}
end
--' если default-ов больше, чем значений в ini, то забить недостающие последним значением из ini
local t = se_respawn.parse_names(line)
local n = table.getn(t)
local ret_table = {}
local k = 1
while k <= n do
local spawn = {}
spawn.section = t[k]
-- Проверяем что это не последняя запись
if t[k+1] ~= nil then
local p = tonumber(t[k+1])
-- проверяем что вторым числом задана вероятность, а не другая секция спавну
if p then
-- забиваем число
spawn.prob = p
k = k + 2
else
-- забиваем дефолт 1
spawn.prob = 1
k = k + 1
end
else
spawn.prob = 1
k = k + 1
end
table.insert(ret_table, spawn)
end
return ret_table
end
class "CTreasure"
function CTreasure:__init()
--' На конструкторе вычитываем LTX и создаем заготовки квестов.
self.ini = ini_file("misc\\treasure_manager.ltx")
--' Итерируемся по всем настройкам фраз
if not self.ini:section_exist("list") then
abort("There is no section [list] in treasure_manager.ltx")
end
local n = self.ini:line_count("list")
local id, value = "",""
--' начальная установка
self.treasure_info = {}
for i=0,n-1 do
result, id, value = self.ini:r_line("list",i,"","")
local community = parse_names(utils.cfg_get_string(self.ini, id, "community", nil, false, "", "stalker, bandit, dolg, freedom"))
self.treasure_info[id].community = {}
for k,v in pairs(community) do
self.treasure_info[id].community
end
if self.treasure_info[id].items == nil then
abort("cant find 'items' in %s", id)
end
--' Отметим тайник как новый
self.treasure_info[id].active = false
self.treasure_info[id].done = false
--print_table(self.treasure_info)
end
--' Вспомогательные таблицы для облегчения поиска
self.treasure_by_target = {}
for k,v in pairs(self.treasure_info) do
self.treasure_by_target[v.target] = k
end
end
--' Юзание инициатора (возможность выдать тайник)
function CTreasure:use(npc)
printf("TREASURE USE")
local rarets
if npc ~= nil then
n_rank = npc:character_rank()
else
n_rank = 0
end
-- если выбран редкий тип тайников, то снизим овероятность его выпадения
if amk.load_variable("option_treasure", 0) == 2 then
rarets = 90
else
rarets = 65
end
if amk.is_debug then
rarets=0
end
if math.random(100) < rarets then
return
end
--' Нужно рандомно выбрать один из тайников.
local avail = {}
local tr_sum = 0
for k,v in pairs(self.treasure_info) do
if v.done == false and v.active == false and v.community[npc:character_community()] == true then
local treasure_prob = xr_logic.pick_section_from_condlist(db.actor, npc, v.condlist)
if treasure_prob == "" or treasure_prob == nil then
treasure_prob = 0
end
if tonumber(treasure_prob) >= 0 and
v.community[npc:character_community()] == true and
v.active == false
then
if tonumber(treasure_prob) == 100 then
self:give_treasure(k)
else
table.insert(avail, {k = k, prob = treasure_prob})
tr_sum = tr_sum + treasure_prob
end
end
end
end
if tr_sum == 0 or
math.random(100) < 65
then
return
end
local tr_w = math.random(tr_sum)
for k,v in pairs(avail) do
tr_w = tr_w - v.prob
if tr_w <= 0 then
--' Выдать тайник
self:give_treasure(v.k)
break
end
end
end
--' Сохранение
function CTreasure:check()
--' Проверка тайников
for k,v in pairs(self.treasure_info) do
--' Выдать тайник
self:give_treasure(k)
end
end
--' Выдача тайника
function CTreasure:give_treasure(k)
local v = self.treasure_info[k]
local obj = alife():story_object(v.target)
if obj ~= nil then
news_manager.send_treasure(v.name)
--' Пометить на карте
local text = "%c[255,238,155,23]"..game.translate_string(v.name).."\\n".."%c[default]"..game.translate_string(v.description)
-- if not level.map_has_object_spot(obj.id,"treasure") then
level.map_add_object_spot_ser(obj.id, "treasure", text)
-- else
-- amk.mylog("Blocking mapspot for "..obj:name())
-- end
-- проверка, какой тип тайника выбран
-- если тайник не классический и не именной, то заменим содержимое
if amk.load_variable("option_treasure", 0) ~= 0 and self:named_treasure(v) == false then
v.items = self:give_item_list()
end
--' Сгенерить вещи
for kk,vv in pairs(v.items) do
if ammo_section[vv.section] == true then
se_respawn.create_ammo(vv.section,
obj.position,
obj.m_level_vertex_id,
obj.m_game_vertex_id,
obj.id,
vv.prob)
else
for i=1,vv.prob do
alife():create(vv.section,
obj.position,
obj.m_level_vertex_id,
obj.m_game_vertex_id,
obj.id)
end
end
end
--' Пометим тайник как выданный
self.treasure_info[k].active = true
self.treasure_info[k].done = true
-- Отправим тайник в оффлайн
local sim = alife ()
if sim ~= nil and obj.online then
sim:set_switch_online (obj.id, false)
sim:set_switch_offline (obj.id, true)
-- sim:set_switch_online (obj.id, true)
-- sim:set_switch_offline (obj.id, false)
amk.convert_npc[obj.id]=1 -- ставим в очередь на вывод в онлайн
end
else
printf("TREASURE %s, target doesnt exist", k)
end
end
--' Снимаем отметку с тайника
function CTreasure:treasure_empty(box, box_story_id)
printf("!!! treasure empty")
local k = self.treasure_by_target[box_story_id]
if k == nil or self.treasure_info[k] == nil then
return
end
self.treasure_info[k].active = false
-- если тайник не именной, то переведен его в онлайн для следующей выдачи
if self:named_treasure(self.treasure_info[k]) == false then
self.treasure_info[k].done = false
end
level.map_remove_object_spot(box:id(), "treasure")
end
--' Сохранение
function CTreasure:save(p)
--' Сохраняем размер таблицы
local size = 0
for k,v in pairs(self.treasure_info) do
size = size + 1
end
p:w_u16(size)
for k,v in pairs(self.treasure_info) do
p:w_u16(v.target)
p:w_bool(v.active)
p:w_bool(v.done)
end
end
--' Загрузка
function CTreasure:load(p)
local t = p:r_u16()
for i = 1,t do
local k = self.treasure_by_target[p:r_u16()]
self.treasure_info[k].active = p:r_bool()
self.treasure_info[k].done = p:r_bool()
end
end
function CTreasure:my_random(k, rank)
-- генериться случайное число диапазона с учетом ранга выдавшего
-- сколько пердметов попадает в список по рангам
local part = math.floor(k/4)-2
if part < 1 then part = 1 end
-- начало доступного рангу списка
local amin = (rank-1)*part+1
-- внесем немного хаоса
if rank < 4 then
-- если нам очень сильно повезет, то мы получим доступ к самым лучшим вещам
if math.random(100)>80 then
rank = 4
-- а если нам повезет чуть поменьше, то у непися в кладе могут выпасть вещи "не по рангу"
elseif math.random(100)>50 then
rank = rank+1
end
end
-- конец доступного рангу списка
local amax = math.floor((k/4)*rank)
-- не знаю точно, как работает floor, потому подстрахуюсь
if amax >= k-1 then amax = k end
-- совсем уж подстрахуюсь :)
if amin < 1 then amin = 1 end
-- выбор случайного номера из диапазона, доступного рангу
local i = math.random(amin, amax+2)
-- если номер попал в верхнюю часть диапазона, то снизим вероятность выпадения крутых вещей
-- в связи с переходом на систему рангов, может, это и не нужно, надо тестить
if i>(amin+amax)/2 then
i = math.random(amin, amax+2)
end
-- ну и по установившейся привычке подстрахуюсь
if i>amax then i = amax end
if i<1 then i = 1 end
return i
end
function CTreasure:give_item_list()
local rank = 1
local tabla = {}
-- сколько наименований предметов будет в тайнике
local i = math.random(14, 15)
-- считаем настройку пользователя
local opt = amk.load_variable("option_treasure", 0)
--~ -- определим ранг непися
--~ if nepis~= nil then
-- rank = n_rank --nepis.character_rank ()
if n_rank == nil then n_rank = math.random(14, 15)*100 end
if n_rank <= 300 then
rank = 1
elseif n_rank <=600 then
rank = 2
elseif n_rank <= 900 then
rank = 3
else
rank = 4
end
--~ else
--~ rank = 4
--~ end
for j = 1, i, 1 do
local cnt = 0
local spawn = {}
-- определим, из какой секции брать предметы, и какие именно
if opt == 1 then
spawn.section = solid_list[self:my_random(table.getn(solid_list), rank)]
else
spawn.section = rare_list[self:my_random(table.getn(rare_list), rank)]
end
-- установка кол-ва предметов в зависимости от секции
if ammo_section[spawn.section] == true then
local ini = system_ini()
local num_in_box = ini:r_u32(spawn.section, "box_size")
local h = math.random(14, 15)
-- патроны выдаем не штуками, а пачками
cnt = math.random(1, h) * num_in_box
else
local s = tostring(spawn.section)
if string.find(s, "outfit") ~= nil then
cnt = 1
elseif string.find(s, "addon") ~= nil or string.find(s, "af_") ~= nil then
cnt = math.random(1,2)
elseif string.find(s, "wpn") ~= nil then
cnt = 1
else
cnt = math.random(14, 15)
end
end
-- сохраняем инфу о текущем предмете
spawn.prob = cnt
table.insert(tabla, spawn)
end
return tabla
end
function CTreasure:named_treasure(v)
-- проверка, является ли тайник именным. Если да, то его наполнение не меняется
if v.name == "agr_secret_0000_name" --Тайник Серого
or v.name == "bar_secret_0011_name" --Тайник Арни
or v.name == "esc_secret_0013_name" --Тайник Ворпала
or v.name == "gar_secret_0002_name" --Вещи Гризли
or v.name == "gar_secret_0011_name" --Склад группы Стрелка
or v.name == "gar_secret_0021_name" --Рюкзак Дохляка
or v.name == "pri_secret_0003_name" --Хабар Клыка
or v.name == "pri_secret_0004_name" --Запасы лидера Свободы
or v.name == "rad_secret_0000_name" --Клад Угрюмого
or v.name == "rad_secret_0004_name" --Запас группы отчаянных
or v.name == "ros_secret_0015_name" --Тайник Счастливчика
or v.name == "ros_secret_0018_name" --Ящик с медикаментами
or v.name == "val_secret_0028_name" --Тайник Борова
or v.name == "x18_secret_0000_name" --Тайник Копченого
or v.name == "yan_secret_0011_name" --Тайник учёного
then
return true
else
return false
end
end
function get_treasure_manager()
if treasure_manager == nil then
treasure_manager = CTreasure()
end
return treasure_manager
end
function take_item_from_box(box, box_story_id)
printf("!!! take item from box %s", tostring(box:is_inv_box_empty()))
-- if box:is_inv_box_empty() == true then
get_treasure_manager():treasure_empty(box, box_story_id)
-- end
end
function save(p)
get_treasure_manager():save(p)
end
function load(p)
get_treasure_manager():load(p)
end
function clear_treasure_manager()
treasure_manager = nil
end