Перейти к контенту

Рекомендуемые сообщения

terror, Если актуально. Нужно подрезать вызов _sdata.

 

под спойлерами правленые скрипты

 

_g.script -- Отучил от dll.

if (jit == nil) then
    profiler.setup_hook    ()
end


function empty    (container)
    if (type(container) == "function") then
        for i in container do
            return    (false)
        end
        return        (true)
    end
    assert            (type(container) == "table")
    if (container[1] ~= nil) then
        return        (false)
    end
    for i,j in pairs(container) do
        return        (false)
    end
    return            (true)
end


schemes = {} -- соответствие схем модулям
stypes = {} -- типv схем

-- іагружает схему из файла на диске и активирует в мотиваторе.
-- ідесь:
--     filename - имя файла, в котором реализована схема, без расширения
--     scheme - имя схем
function load_scheme(filename, scheme, stype)
    schemes[scheme] = filename
    stypes[scheme] = stype
end

----------------------------------------------------------------------
dev_debug = false
sim_debug = false
mus_vol = 0
amb_vol = 0
b_discard_settings_shown = false
----------------------------------------------------------------------
local scripts_to_print =    {
                            ["stalker_generic"] = true,
                            ["xr_smartcover"] = true,
                            ["xr_logic"] = true,
                            ["xr_conditions"] = true,
                            ["xr_cover"] = true,
                            ["xr_motivator"] = true,
                            ["xr_walker"] = true,
                            ["xr_camper"] = true,
                            ["xr_kamp"] = true,
                            ["restrictor_manager"] = true,
                            ["sim_board"] = true,
                            ["sim_faction"] = true,
                            ["post_combat_idle"] = true,
                            ["xr_death"] = true,
                            ["xr_sound"] = true,
                            ["utils"] = true,
                            ["treasure_manager"] = true,
                            ["object_collection"] = true,
                            ["se_actor"] = true,
                            ["smart_terrain"] = true,
                            ["bind_physic_object"] = true,
                            ["bind_heli"] = true,
                            ["bind_anomaly_zone"] = true,
                            ["bind_stalker"] = true,
                            ["state_mgr_animation"] = true,
                            ["se_stalker"] = true,
                            ["db"] = true,
                            ["sim_squad_generic"] = true,
                            ["sim_squad_scripted"] = true,
                            ["se_smart_cover"] = true,
                            ["se_monster"] = true,
                            ["dialog_manager"] = true,
                            ["xr_combat_ignore"] = true,
                            ["xr_remark"] = true,
                            ["cover_manager"] = true,
                            ["xr_danger"]     = true,
                            ["task_manager"] = true,
                            ["task_objects"]     = true
                            }
function printf(fmt,...)

    local is_g = 0
    local result = fmt
    if debug == nil then
        log(string.format(fmt,...))
        return
    end
    local info_table = debug.getinfo(2)
    local script_name = string.gsub(info_table.short_src, "%.script", "")
    script_name = string.gsub(script_name, "gamedata\\scripts\\", "")

    if scripts_to_print[script_name] == false then return end

    script_name,is_g = string.gsub(script_name, "_g", "")
    if is_g == 0 then
        result = script_name..":("..info_table.currentline.."):"..fmt
    else
        result = fmt
    end
    log(string.format(result,...))

end

----------------------------------------------------------------------
if nil == time_global then
    time_global = function () return device():time_global() end
end

function wait_game(time_to_wait)
    verify_if_thread_is_running()
    if (time_to_wait == nil) then
        coroutine.yield()
    else
        local time_to_stop = game.time() + time_to_wait
        while game.time() <= time_to_stop do
            coroutine.yield()
        end
    end
end

function wait(time_to_wait)
    verify_if_thread_is_running()
    if (time_to_wait == nil) then
        coroutine.yield()
    else
        local time_to_stop = time_global() + time_to_wait
        while time_global() <= time_to_stop do
            coroutine.yield()
        end
    end
end

function action(obj,...)
    local arg = {...}
    local act = entity_action()
    local i = 1
    while true do
        if (arg[i] ~= nil) then
            act:set_action(arg[i])
        else
            break
        end
        i = i + 1
    end
    if (obj ~= nil) then
        obj:command(act,false)
    end
    return  entity_action(act)
end

function action_first(obj,...)
    local arg = {...}
    local act = entity_action()
    local i = 1
    while true do
        if (arg[i] ~= nil) then
            act:set_action(arg[i])
        else
            break
        end
        i = i + 1
    end
    if (obj ~= nil) then
        obj:command(act,true)
    end
    return  entity_action(act)
end

function round (value)
    local min = math.floor (value)
    local max = min + 1
    if value - min > max - value then return max end
    return min
end


function distance_between(obj1, obj2)
    return obj1:position():distance_to(obj2:position())
end

-- +сли один объект nil, например нет актера, то считаем, что он далеко
function distance_between_safe(obj1, obj2)
    if(obj1 == nil or obj2 == nil) then return 100000 end
    return obj1:position():distance_to(obj2:position())
end

local aa = nil
--' іроверка на инфопоршнv, даже если игрока не су    ествует
function has_alife_info(info_id)
    if aa == nil then
        return false
    end
    return aa:has_info(0, info_id)
end



function reset_action (npc, script_name)
    if npc:get_script () then
         npc:script (false, script_name)
    end
    npc:script (true, script_name)
end

--------------------------------------------------
-- Functions and variables added by Zmey
--------------------------------------------------

-- іонстанта, которуі использовать в местах, где нужно задать неограниченное время действия
time_infinite = 100000000

-- +сли в даннvй момент вvполняется какое-то действие, прерvвает его и отклічает скриптовvй режим
function interrupt_action(who, script_name)
    if who:get_script() then
        who:script(false, script_name)
    end
end

function random_choice(...)
    local arg = {...}
    local r = math.random(1, #arg)
    return arg[r]
end

function if_then_else(cond, if_true, if_false)
    if cond then
        return if_true
    end
    return if_false
end


function set_current_time (hour, min, sec)
    local current_time_factor = level.get_time_factor ()
    printf ("Need time : %d:%d:%d", hour, min, sec)
    local current_time = game.time ()
    local c_day = math.floor (current_time / 86400000)
    local c_time = current_time - c_day * 86400000
    local n_time = (sec + min * 60 + hour * 3600) * 1000

    if c_time > n_time then c_day = c_day + 1 end
    n_time = n_time + c_day * 86400000
    level.set_time_factor (10000)
    while game.time () < n_time do wait () end
    level.set_time_factor (current_time_factor)
end

function random_number (min_value, max_value)
    math.randomseed (device ():time_global ())
    if min_value == nil and max_value == nil then
        return math.random ()
    else
        return math.random (min_value, max_value)
    end
end


function parse_names( s )
    local t = {}
    for name in string.gfind( s, "([%w_\\]+)%p*" ) do
        --for name in string.gfind( s, "%s*([^%,]+)%s*" ) do
        table.insert( t, name )
    end
    return t
end

function parse_key_value( s )
    local t = {}
    if s == nil then
        return nil
    end
    local key, nam = nil, nil
    for name in string.gfind( s, "([%w_\\]+)%p*" ) do
        if key == nil then
            key = name
        else
            t[key] = name
            key = nil
        end
    end
    return t
end

function parse_nums( s )
    local t = {}
    for entry in string.gfind( s, "([%-%d%.]+)%,*" ) do
        table.insert( t, tonumber( entry ) )
    end
    return t
end

-- Находится ли обьект в онлайне.
function is_object_online(obj_id)
    return level.object_by_id(obj_id) ~= nil
end

function get_clsid(npc)
    if npc == nil then return nil end
    return npc:clsid()
end

--Tvчисляет yaw в радианах
function yaw( v1, v2 )
    return  math.acos( ( (v1.x*v2.x) + (v1.z*v2.z ) ) / ( math.sqrt(v1.x*v1.x + v1.z*v1.z ) * math.sqrt(v2.x*v2.x + v2.z*v2.z ) ) )
end
function yaw_degree( v1, v2 )
    return  (math.acos( ( (v1.x*v2.x) + (v1.z*v2.z ) ) / ( math.sqrt(v1.x*v1.x + v1.z*v1.z ) * math.sqrt(v2.x*v2.x + v2.z*v2.z ) ) ) * 57.2957)
end
function yaw_degree3d( v1, v2 )
    return  (math.acos((v1.x*v2.x + v1.y*v2.y + v1.z*v2.z)/(math.sqrt(v1.x*v1.x + v1.y*v1.y + v1.z*v1.z )*math.sqrt(v2.x*v2.x + v2.y*v2.y + v2.z*v2.z)))*57.2957)
end
function vector_cross(v1, v2)
    return vector():set(v1.y  * v2.z  - v1.z  * v2.y, v1.z  * v2.x  - v1.x  * v2.z, v1.x  * v2.y  - v1.y  * v2.x)
end

--Поворачивает вектор вокруг оси y против часовой стрелки.
function vector_rotate_y(v, angle)
    angle = angle * 0.017453292519943295769236907684886
    local c = math.cos (angle)
    local s = math.sin (angle)
    return vector ():set (v.x * c - v.z * s, v.y, v.x * s + v.z * c)
end

-- очистка таблицы.
function clear_table (t)
    while #t > 0 do
        table.remove (t, #t)
    end
end

function stop_play_sound(obj)
    if obj:alive() == true then
        obj:set_sound_mask(-1)
        obj:set_sound_mask(0)
    end
end

-- Печатает таблицу как дерево.
function print_table(table, subs)
    local sub
    if subs ~= nil then
        sub = subs
    else
        sub = ""
    end
    for k,v in pairs(table) do
        if type(v) == "table" then
            printf(sub.."%s:", tostring(k))
            print_table(v, sub.."    ")
        elseif type(v) == "function" then
            printf(sub.."%s:function", tostring(k))
        elseif type(v) == "userdata" then
            printf(sub.."%s:userdata", tostring(k))
        elseif type(v) == "boolean" then
                    if v == true then
                            if(type(k)~="userdata") then
                                    printf(sub.."%s:true", tostring(k))
                            else
                                    printf(sub.."userdata:true")
                            end
                    else
                            if(type(k)~="userdata") then
                                    printf(sub.."%s:false", tostring(k))
                            else
                                    printf(sub.."userdata:false")
                            end
                    end
        else
            if v ~= nil then
                printf(sub.."%s:%s", tostring(k),v)
            else
                printf(sub.."%s:nil", tostring(k),v)
            end
        end
    end
end
function store_table(table, subs)
    local sub
    if subs ~= nil then
        sub = subs
    else
        sub = ""
    end
    printf(sub.."{")
    for k,v in pairs(table) do
        if type(v) == "table" then
            printf(sub.."%s = ", tostring(k))
            store_table(v, sub.."    ")
        elseif type(v) == "function" then
            printf(sub.."%s = \"func\",", tostring(k))
            elseif type(v) == "userdata" then
                    printf(sub.."%s = \"userdata\",", tostring(k))
        elseif type(v) == "string" then
            printf(sub.."%s = \"%s\",", tostring(k), tostring(v))
        else
            printf(sub.."%s = %s,", tostring(k), tostring(v))
        end
    end
    printf(sub.."},")
end

-------------------------------------------------------------------------------------------
local monster_classes = {}
local stalker_classes = {}
local weapon_classes = {}
local artefact_classes = {}

function IsMonster (object, class_id)
        local id = class_id or get_clsid(object)
        return monster_classes[id] == true
end
function IsStalker (object, class_id)
        local id = class_id or get_clsid(object)
        return stalker_classes[id] == true
end

function isWeapon(object, class_id)
    local id = class_id or get_clsid(object)
    return weapon_classes[id] == true
end

function isArtefact(object, class_id)
        local id = class_id or get_clsid(object)
    return artefact_classes[id] == true
end


-------------------------------------------------------------------------------------------
function get_object_community(obj)
    if type(obj.id) == "function" then
        return character_community(obj)
    else
        return alife_character_community(obj)
    end
end

function character_community (obj)
    if IsStalker(obj) then
        return obj:character_community()
    end
    return "monster"
end

function alife_character_community (obj)
    if IsStalker(obj, obj:clsid()) then
        return obj:community()
    end
    return "monster"
end

-- получить геймобжект по стори_айди.
function level_object_by_sid( sid )
    local sim = alife()
    if sim then
        local se_obj = sim:story_object( sid )
        if se_obj then
            return level.object_by_id( se_obj.id )
        end
    end
    return nil
end
-- Получить айдишник обьекта по стори айди.
function id_by_sid( sid )
    local sim = alife()
    if sim then
        local se_obj = sim:story_object( sid )
        if se_obj then
            return se_obj.id
        end
    end
    return nil
end

-- Крешнуть игру (после вывода сообщения об ошибке в лог)
function abort(fmt, ...)
    amk_dbg.log2("ABORT!!!") 
    amk_dbg.log2(fmt)
    local reason = string.format(fmt, ...)
    --error_log(reason)
    amk_dbg.log2(reason)
    string.format("%s")
    local oops
    local t = 1/oops
end

function set_inactivate_input_time(delta)
    db.storage[db.actor:id()].disable_input_time = game.get_game_time()
    db.storage[db.actor:id()].disable_input_idle = delta
    level.disable_input()
end

-- іринимает: позициі положения, позициі куда смотреть, время сна в минутах.
--[[
function set_sleep_relocate(point, look, timeout)
    db.storage[db.actor:id()].sleep_relocate_time = game.get_game_time()
    db.storage[db.actor:id()].sleep_relocate_idle = timeout*60
    db.storage[db.actor:id()].sleep_relocate_point = point
    db.storage[db.actor:id()].sleep_relocate_look = look
end
]]--

-- проверяет целую часть числа на нечетность
function odd( x )
    return math.floor( x * 0.5 ) * 2 == math.floor( x )
end

--' находится ли NPC во фруструме игрока
function npc_in_actor_frustrum(npc)
    local actor_dir = device().cam_dir
    --local actor_dir = db.actor:direction()
    local npc_dir = npc:position():sub(db.actor:position())
    local yaw = yaw_degree3d(actor_dir, npc_dir)
    --printf("YAW %s", tostring(yaw))
    return yaw < 35
end

function start_game_callback()
    aa = alife()

    squad_community_by_behaviour = {
        ["stalker"]                            = "stalker",
        ["bandit"]                            = "bandit",
        ["dolg"]                            = "dolg",
        ["freedom"]                            = "freedom",
        ["army"]                            = "army",
        ["ecolog"]                            = "ecolog",
        ["killer"]                            = "killer",
        ["trader"]                            = "trader",
        ["zombied"]                            = "zombied",
        ["monolith"]                        = "monolith",
        ["monster"]                            = "monster",
        ["monster_predatory_day"]            = "monster",
        ["monster_predatory_night"]            = "monster",
        ["monster_vegetarian"]                = "monster",
        ["monster_zombied_day"]                = "monster",
        ["monster_zombied_night"]            = "monster",
        ["monster_special"]                    = "monster"
    }




    monster_classes = {
        [clsid.bloodsucker_s]             = true,
        [clsid.boar_s]                     = true,
        [clsid.dog_s]                     = true,
        [clsid.flesh_s]                 = true,
        [clsid.pseudodog_s]             = true,
        [clsid.burer_s]                 = true,
--        [clsid.cat_s]                     = true,
        [clsid.chimera_s]                 = true,
        [clsid.controller_s]             = true,
--        [clsid.fracture_s]                 = true,
        [clsid.poltergeist_s]             = true,
        [clsid.gigant_s]                 = true,
--        [clsid.zombie_s]                 = true,
        [clsid.snork_s]                 = true,
        [clsid.tushkano_s]                 = true,
        [clsid.psy_dog_s]                 = true,
        [clsid.psy_dog_phantom_s]         = true}

    stalker_classes = {
        [clsid.script_actor]             = true,
        [clsid.script_stalker]             = true,
        [clsid.script_trader]            = true}

    weapon_classes = {
        [clsid.wpn_vintorez_s]             = true,
        [clsid.wpn_ak74_s]                 = true,
        [clsid.wpn_lr300_s]             = true,
        [clsid.wpn_hpsa_s]                 = true,
        [clsid.wpn_pm_s]                 = true,
        [clsid.wpn_shotgun_s]             = true,
        [clsid.wpn_auto_shotgun_s]        = true,
        [clsid.wpn_bm16_s]                 = true,
        [clsid.wpn_svd_s]                 = true,
        [clsid.wpn_svu_s]                 = true,
        [clsid.wpn_rg6_s]                 = true,
        [clsid.wpn_rpg7_s]                 = true,
        [clsid.wpn_val_s]                 = true,
        [clsid.wpn_walther_s]             = true,
        [clsid.wpn_usp45_s]             = true,
        [clsid.wpn_groza_s]             = true,
        [clsid.wpn_knife_s]             = true,
        [clsid.wpn_grenade_f1_s]         = true,
        [clsid.wpn_grenade_rgd5_s]         = true,
        [clsid.wpn_grenade_launcher]     = true,
        [clsid.wpn_grenade_fake]         = true}

    artefact_classes = {
        [clsid.art_bast_artefact]         = true,
        [clsid.art_black_drops]         = true,
        [clsid.art_dummy]                 = true,
        [clsid.art_electric_ball]         = true,
        [clsid.art_faded_ball]             = true,
        [clsid.art_galantine]             = true,
        [clsid.art_gravi]                 = true,
        [clsid.art_gravi_black]         = true,
        [clsid.art_mercury_ball]         = true,
        [clsid.art_needles]             = true,
        [clsid.art_rusty_hair]             = true,
        [clsid.art_thorn]                 = true,
        [clsid.art_zuda]                 = true,
        [clsid.artefact]                 = true,
        [clsid.artefact_s]                 = true}

    printf    ("start_game_callback called")
    smart_names.init_smart_names_table()
    task_manager.clear_task_manager()
    sound_theme.load_sound()
    xr_sound.start_game_callback()
    dialog_manager.fill_phrase_table()
    xr_s.init()
    sim_objects.clear()
    sim_board.clear()
    sr_light.clean_up ()
    pda.add_quick_slot_items_on_game_start()
    -- Tестирование оптимизации
    --local test_object = test_object.test_object_class()
    --test_object:test()
    
  --AMK UTILS--
--  amk.on_game_start(obj)
--  amk_utils.start_game()
  --AMK UTILS--
end

--' Lсталость
function on_actor_critical_power()

end

function on_actor_critical_max_power()
end

--' іровотечение
function on_actor_bleeding()

end

function on_actor_satiety()
end

--' іадиация
function on_actor_radiation()

end

--' іаклинило оружие
function on_actor_weapon_jammed()

end

--' не может ходить изза веса
function on_actor_cant_walk_weight()

end

--' пси воздействие
function on_actor_psy()
end

function give_info (info)
    db.actor:give_info_portion(info)
end
function disable_info (info)
    if has_alife_info(info) then
        printf("*INFO*: disabled npc='single_player' id='%s'", info)
        db.actor:disable_info_portion(info)
    end
end

function create_ammo(section, position, lvi, gvi, pid, num)
    local ini = system_ini()

    local num_in_box = ini:r_u32(section, "box_size")
    local t = {}
    while num > num_in_box do
        local obj = alife():create_ammo(section, position, lvi,    gvi, pid, num_in_box)
        table.insert(t, obj)
        num = num - num_in_box
    end
    local obj = alife():create_ammo(section, position, lvi,    gvi, pid, num)
    table.insert(t, obj)
    return t
end

ammo_section = {}
ammo_section["ammo_9x18_fmj"]        = true
ammo_section["ammo_9x18_pmm"]        = true
ammo_section["ammo_9x19_fmj"]        = true
ammo_section["ammo_9x19_pbp"]        = true
ammo_section["ammo_5.45x39_fmj"]    = true
ammo_section["ammo_5.45x39_ap"]        = true
ammo_section["ammo_5.56x45_ss190"]    = true
ammo_section["ammo_5.56x45_ap"]        = true
ammo_section["ammo_5.7x28_fmj"]        = true
ammo_section["ammo_5.7x28_ap"]        = true
ammo_section["ammo_7.62x54_7h1"]    = true
ammo_section["ammo_9x39_pab9"]        = true
ammo_section["ammo_gauss"]            = true
ammo_section["ammo_9x39_ap"]        = true
ammo_section["ammo_11.43x23_fmj"]    = true
ammo_section["ammo_11.43x23_hydro"]    = true
ammo_section["ammo_12x70_buck"]        = true
ammo_section["ammo_12x76_zhekan"]    = true
ammo_section["ammo_pkm_100"]        = true

quest_section = {}
-- преобразует строку в соответствии со значением
function get_param_string(src_string , obj)
    --printf("src_string is [%s] obj name is [%s]", tostring(src_string), obj:name())
    local script_ids = db.script_ids[obj:id()]
    local out_string, num = string.gsub(src_string, "%$script_id%$", tostring(script_ids))
    if num > 0 then
        return out_string , true
    else
        return src_string , false
    end
end

local save_markers = {}

-- Функции для проверки корректности сейв лоад
function set_save_marker(p, mode, check, prefix)

    -- определяем ключ маркера.
    local result = ""
--    if debug ~= nil then
--        local info_table = debug.getinfo(2)
--        local script_name = string.gsub(info_table.short_src, "%.script", "")
--        script_name = string.gsub(script_name, "gamedata\\scripts\\", "")
--        result = script_name
--    end

--    if prefix ~= nil then
        result = result .. "_" .. prefix
--    end

    if check == true then
        if save_markers[result] == nil then
            abort("Trying to check without marker %s", result)
        end

        if mode == "save" then
            local dif = p:w_tell() - save_markers[result]
            printf(result..": SAVE DIF: %s", dif)
            if dif >= 8000 then
                printf("WARNING! may be this is problem save point")
            end
            if dif >= 10240 then
--                abort("You are saving too much")
            end
            p:w_u16(dif)
        else
            local c_dif = p:r_tell() - save_markers[result]
            local dif = p:r_u16()
             if dif ~= c_dif then
                 abort("INCORRECT LOAD [%s].[%s][%s]", result, dif, c_dif)
             else
                 printf(result..": LOAD DIF: %s", dif)
             end
        end
        return
    end

    if mode == "save" then
        printf(result..": set save marker: %s", p:w_tell())
        save_markers[result] = p:w_tell()
        if p:w_tell() > 16000 then
            abort("You are saving too much")
        end
    else
        printf(result..": set load marker: %s", p:r_tell())
        save_markers[result] = p:r_tell()
    end

end
-- переводит вектор в строку.
function vec_to_str (vector)
    if vector == nil then return "nil" end
    return string.format("[%s:%s:%s]", vector.x, vector.y, vector.z)
end
-- выводит в лог стэк вызова функций.
function callstack()
    if debug ~= nil then
        log(debug.traceback(2))
    end
end
-- меняет team:squad:group обьекта.
function change_team_squad_group(se_obj, team, squad, group)
    local cl_obj = db.storage[se_obj.id] and db.storage[se_obj.id].object
    if cl_obj ~= nil then
        cl_obj:change_team(team, squad, group)
    else
        se_obj.team = team
        se_obj.squad = squad
        se_obj.group = group
    end
    --printf("_G:TSG: [%s][%s][%s]", tostring(se_obj.team), tostring(se_obj.squad), tostring(se_obj.group))
end
--     Story_ID -------------------------------------------------------------
function add_story_object(obj_id , story_obj_id)
    story_objects.get_story_objects_registry():register(obj_id , story_obj_id)
end

function get_squad_by_sid(sid)
    local obj_id = story_objects.get_story_objects_registry():get(sid)
    if obj_id == nil then abort("_g.get_squad_by_sid obj_id=nil sid=[%s]",sid) end
    return alife():object(obj_id)
end

function get_story_object(story_obj_id)
    local obj_id = story_objects.get_story_objects_registry():get(story_obj_id)
    if obj_id == nil then return nil end
    return (db.storage[obj_id] and db.storage[obj_id].object) or (level ~= nil and level.object_by_id(obj_id))
end

function get_object_story_id(obj_id)
    return story_objects.get_story_objects_registry():get_story_id(obj_id)
end

function get_story_object_id(story_obj_id)
    return story_objects.get_story_objects_registry().id_by_story_id[story_obj_id]
end

function unregister_story_object_by_id(obj_id)
    story_objects.get_story_objects_registry():unregister_by_id(obj_id)
end

function unregister_story_id(story_id)
    story_objects.get_story_objects_registry():unregister_by_story_id(story_id)
end

-----------------------------------------------------------------------------------------------
-- Получить сквад обьекта!!!!!
function get_object_squad(object)
    if object == nil then abort("You are trying to get squad_object from NIL object!!!") end
    local obj_id = nil
    if type(object.id) == "function" then
        obj_id = object:id()
    else
        obj_id = object.id
    end
    local se_obj = alife():object(obj_id)
    if se_obj and se_obj.group_id ~= 65535 then
        return alife():object(se_obj.group_id)
    end
    return nil
end

function get_story_squad(story_id)
    local squad_id = get_story_object_id(story_id)
    return squad_id and alife():object(squad_id)
end

--Проверка по временному интервалу.
function in_time_interval(val1, val2)
    local game_hours = level.get_time_hours()
    if val1 >= val2 then
        return game_hours < val2 or game_hours >= val1
    else
        return game_hours < val2 and game_hours >= val1
    end
end

function show_all_ui(show)
        local hud = get_hud()
    if(show) then
            level.show_indicators()
--        db.actor:restore_weapon()
            db.actor:disable_hit_marks(false)
            hud:show_messages()
    else
            if db.actor:is_talking() then
                    db.actor:stop_talk()
            end
            level.hide_indicators_safe()
            hud:HideActorMenu()
            hud:HidePdaMenu()
            hud:hide_messages()
--        db.actor:hide_weapon()
            db.actor:disable_hit_marks(true)
    end
end

 

 

Нужно убрать вызов log1(...) из этой функции и привести к ст.значению.

 

function printf(fmt,...)

    local is_g = 0
    local result = fmt
    if debug == nil then
        log(string.format(fmt,...))
        return
    end
    local info_table = debug.getinfo(2)
    local script_name = string.gsub(info_table.short_src, "%.script", "")
    script_name = string.gsub(script_name, "gamedata\\scripts\\", "")

    if scripts_to_print[script_name] == false then return end

    script_name,is_g = string.gsub(script_name, "_g", "")
    if is_g == 0 then
        result = script_name..":("..info_table.currentline.."):"..fmt
    else
        result = fmt
    end
    log(string.format(result,...))

end

 

 

bind_stalker.script -- отключаем вызовы _sdata.script

 

function init    (obj)
                xr_motivator.AddToMotivator(obj)
end

function actor_init    (npc)
                npc:bind_object(actor_binder(npc))
end

local game_difficulty_by_num = {
                [0] = "gd_novice",
                [1] = "gd_stalker",
                [2] = "gd_veteran",
                [3] = "gd_master"
                }

local weapon_hide = {}
local primary_objects_filled = false
----------------------------------------------------------------------------------------------------------------------
class "actor_binder" (object_binder)
----------------------------------------------------------------------------------------------------------------------
function actor_binder:__init (obj) super(obj)
    printf("Prizrak111__init")
    self.bCheckStart = false
    self.weather_manager = level_weathers.get_weather_manager()
    self.surge_manager = surge_manager.get_surge_manager()
    --self.actor_detector = xr_detector.actor_detector()
    self.last_level_name = nil
    self.deimos_intensity = nil
--    self.actor_weapon_on_start = true
    self.loaded_active_slot = 3
    self.loaded_slot_applied = false
    self.last_detective_achievement_spawn_time     = nil
    self.last_mutant_hunter_achievement_spawn_time    = nil
end
----------------------------------------------------------------------------------------------------------------------
function actor_binder:net_spawn(data)
    printf("Prizrak111__net_spawn")
--    printf("actor net spawn")
    level.show_indicators()
    self.bCheckStart = true
    self.weapon_hide = false -- спрятано или нет оружие при разговоре.
    self.weapon_hide_in_dialog = false
    weapon_hide = {} -- устанавливаем глобальный дефолтовый флаг.
    if object_binder.net_spawn(self,data) == false then
        return false
    end
    db.add_actor(self.object)
    db.actor.deimos_intensity = self.deimos_intensity
    self.deimos_intensity = nil
    if self.st.disable_input_time == nil then
        level.enable_input()
    end
    xr_s.on_game_load()                                    --' Distemper 03.2008 --
    self.weather_manager:reset()
    --' Загружаем настройки дропа
    death_manager.init_drop_settings()
    --'Устанавливаем ссылку на таскменеджер
    self.task_manager = task_manager.get_task_manager()
    self.spawn_frame = device().frame
    self.already_jumped = false
    self.loaded = false
    benchmark.main()                                      --' Distemper 06.2008 --
    return true
end
----------------------------------------------------------------------------------------------------------------------
function actor_binder:net_destroy()
    xr_sound.stop_sounds_by_id(self.object:id())
    local board_factions = sim_board.get_sim_board().players
    if(board_factions) then
            for k,v in pairs (board_factions) do
                    xr_sound.stop_sounds_by_id(v.id)
            end
    end
    if(actor_stats.remove_from_ranking~=nil)then
        actor_stats.remove_from_ranking(self.object:id())
    end
    level.show_weapon(true)
    db.del_actor(self.object)

    self.object:set_callback(callback.inventory_info, nil)
    self.object:set_callback(callback.article_info, nil)
    self.object:set_callback(callback.on_item_take, nil)
    self.object:set_callback(callback.on_item_drop, nil)
    self.object:set_callback(callback.task_state, nil)
    self.object:set_callback(callback.level_border_enter, nil)
    self.object:set_callback(callback.level_border_exit, nil)
    self.object:set_callback(callback.take_item_from_box, nil)
    self.object:set_callback(callback.use_object, nil)

    log("--------->"..tostring(_G.amb_vol))
    log("--------->"..tostring(_G.mus_vol))
    if(_G.amb_vol~=0) then
        get_console():execute("snd_volume_eff "..tostring(_G.amb_vol))
        _G.amb_vol = 0
    end
    if(_G.mus_vol~=0) then
        get_console():execute("snd_volume_music "..tostring(_G.mus_vol))
        _G.mus_vol = 0
    end
    if sr_psy_antenna.psy_antenna then
        sr_psy_antenna.psy_antenna:destroy()
        sr_psy_antenna.psy_antenna = false
    end
    xrs_dyn_music.finish_theme()
    xr_s.on_actor_destroy()
    object_binder.net_destroy(self)
end
----------------------------------------------------------------------------------------------------------------------
function actor_binder:reinit()
    object_binder.reinit(self)
    local npc_id = self.object:id()
    db.storage[npc_id] = { }
    self.st = db.storage[npc_id]
    self.st.pstor = nil

    self.object:set_callback(callback.inventory_info, self.info_callback, self)
    self.object:set_callback(callback.on_item_take, self.on_item_take, self)
    self.object:set_callback(callback.on_item_drop, self.on_item_drop, self)
    self.object:set_callback(callback.trade_sell_buy_item, self.on_trade, self) -- for game stats
    self.object:set_callback(callback.task_state, self.task_callback, self)
    self.object:set_callback(callback.take_item_from_box, self.take_item_from_box, self)
    self.object:set_callback(callback.use_object, self.use_inventory_item, self)
end
----------------------------------------------------------------------------------------------------------------------
function actor_binder:take_item_from_box(box, item)
    local box_name = box:name()
end

----------------------------------------------------------------------------------------------------------------------
function actor_binder:info_callback(npc, info_id)
    printf("*INFO*: npc='%s' id='%s'", npc:name(), info_id)
    printf("GIGATEST")
    --' Сюжет
    -- Отметки на карте
end
----------------------------------------------------------------------------------------------------------------------
function actor_binder:on_trade (item, sell_bye, money)
    if sell_bye == true then
         game_stats.money_trade_update (money)
    else
         game_stats.money_trade_update (-money)
    end
end
----------------------------------------------------------------------------------------------------------------------
function actor_binder:article_callback(npc, group, name)
end
----------------------------------------------------------------------------------------------------------------------
function actor_binder:on_item_take (obj)
    printf("on_item_take [%s]", obj:name())
    if isArtefact(obj) then
        local anomal_zone = bind_anomaly_zone.parent_zones_by_artefact_id[obj:id()]
        if anomal_zone ~= nil then
            anomal_zone:on_artefact_take(obj)
        else
            bind_anomaly_zone.artefact_ways_by_id[obj:id()] = nil
        end
        local artefact = obj:get_artefact()
        artefact:FollowByPath("NULL",0,vector():set(500,500,500))
        xr_statistic.inc_founded_artefacts_counter(obj:id())
--[[
        local s_art = alife():object(obj:id())
        if(s_art) then
            xr_statistic.inc_founded_artefacts_counter(s_art:section_name())
        else
            xr_statistic.inc_founded_artefacts_counter()
        end
]]
    end
    treasure_manager.get_treasure_manager():on_item_take(obj:id())
end
----------------------------------------------------------------------------------------------------------------------
function actor_binder:on_item_drop (obj)
end

function actor_binder:use_inventory_item(obj)
    if(obj) then
        local s_obj = alife():object(obj:id())
        if(s_obj) and (s_obj:section_name()=="drug_anabiotic") then
            xr_effects.disable_ui_only(db.actor, nil)
            level.add_cam_effector("camera_effects\\surge_02.anm", 10, false, "bind_stalker.anabiotic_callback")
            level.add_pp_effector("surge_fade.ppe", 11, false)
            give_info("anabiotic_in_process")
            _G.mus_vol = get_console():get_float("snd_volume_music")
            _G.amb_vol = get_console():get_float("snd_volume_eff")
            get_console():execute("snd_volume_music 0")
            get_console():execute("snd_volume_eff 0")
        end
    end
end

function anabiotic_callback()
    level.add_cam_effector("camera_effects\\surge_01.anm", 10, false, "bind_stalker.anabiotic_callback2")
    local rnd = math.random(35,45)
    local m = surge_manager.get_surge_manager()
    if(m.started) then
        local tf = level.get_time_factor()
        local diff_sec = math.ceil(game.get_game_time():diffSec(m.inited_time)/tf)
            if(rnd>(m.surge_time-diff_sec)*tf/60) then
            m.time_forwarded = true
            m.ui_disabled = true
            m:kill_all_unhided()
            m:end_surge()
        end
    end
    level.change_game_time(0,0,rnd)
    level_weathers.get_weather_manager():forced_weather_change()
    printf("anabiotic_callback: time forwarded on [%d]", rnd)
end

function anabiotic_callback2()
    xr_effects.enable_ui(db.actor, nil)
    get_console():execute("snd_volume_music "..tostring(_G.mus_vol))
    get_console():execute("snd_volume_eff "..tostring(_G.amb_vol))
    _G.amb_vol = 0
    _G.mus_vol = 0
    disable_info("anabiotic_in_process")
end
----------------------------------------------------------------------------------------------------------------------

function actor_binder:task_callback(_task, _state)
    if _state ~= task.fail then
        if _state == task.completed then
            news_manager.send_task(db.actor, "complete", _task)
        else
            news_manager.send_task(db.actor, "new", _task)
        end
    end
    task_manager.task_callback(_task, _state)
end

----------------------------------------------------------------------------------------------------------------------

function actor_binder:update(delta)
    object_binder.update(self, delta)

    if string.find(command_line(), "-designer") then
        return
    end

    if self.already_jumped==false and jump_level.need_jump==true and (device().frame > self.spawn_frame+2000) then
        jump_level.try_to_jump()
        self.already_jumped = true
        return
    end

    -- Вызов апдейта переноса игрока проводником
    if travel_func ~= nil then
        travel_func()
    end

    -- DEBUG slowdown
    --slowdown.update()
    local time = time_global()
    game_stats.update (delta, self.object)
    -- апдейт погоды
    self.weather_manager:update()

    self:check_detective_achievement()
    self:check_mutant_hunter_achievement()

    --' Апдейт саундменеджера
    xr_sound.update(self.object:id())

    -- Обновление отключения ввода с клавиатуры.
    if self.st.disable_input_time ~= nil and
        game.get_game_time():diffSec(self.st.disable_input_time) >= self.st.disable_input_idle
        then
        level.enable_input()
        self.st.disable_input_time = nil
    end

    -- Апдейт прятание оружия игрока во время диалога
    if self.object:is_talking() then
        if self.weapon_hide_in_dialog == false then
            self.object:hide_weapon()
            printf("hiding weapon!!!")
            self.weapon_hide_in_dialog = true
        end
    else
        if self.weapon_hide_in_dialog == true then
            printf("restoring weapon!!!")
            self.object:restore_weapon()
            self.weapon_hide_in_dialog = false
        end
    end
    -- Апдейт прятание оружия игрока в зоне sr_no_weapon
    if check_for_weapon_hide_by_zones() == true then
        if self.weapon_hide == false then
            printf("hiding weapon!!!")
            self.object:hide_weapon()
            self.weapon_hide = true
        end
    else
        if self.weapon_hide == true then
            printf("restoring weapon!!!")
            self.object:restore_weapon()
            self.weapon_hide = false
        end
    end

    -- обновление пси-антенны
    if sr_psy_antenna.psy_antenna then
        sr_psy_antenna.psy_antenna:update(delta)
    end
--[[
    --' Вывод сообщения о большой радиации
    if self.object.radiation >= 0.7 then
        local hud = get_hud()
        local custom_static = hud:GetCustomStatic("cs_radiation_danger")
        if custom_static == nil then
            hud:AddCustomStatic("cs_radiation_danger", true)
            hud:GetCustomStatic("cs_radiation_danger"):wnd():TextControl():SetTextST("st_radiation_danger")
        end
    else
        local hud = get_hud()
        local custom_static = hud:GetCustomStatic("cs_radiation_danger")
        if custom_static ~= nil then
            hud:RemoveCustomStatic("cs_radiation_danger")
        end
    end
]]--

    if self.bCheckStart then
        printf("SET DEFAULT INFOS")
        if not has_alife_info("global_dialogs") then
            self.object:give_info_portion("global_dialogs")
        end
        if not has_alife_info("level_changer_icons") then
            self.object:give_info_portion("level_changer_icons")
        end
        self.bCheckStart = false

--        if self.actor_weapon_on_start == true then
--            db.actor:activate_slot(3)
--            self.actor_weapon_on_start = false
--        end
    end
--    device().precache_frame  == 0 and
    if not self.loaded_slot_applied then
        self.object:activate_slot(self.loaded_active_slot)
        self.loaded_slot_applied = true
    end
    
    xr_s.on_actor_update(delta)

    if(self.surge_manager) then
        if(self.f_surge_manager_loaded ~= true) then
            self.surge_manager:initialize()
            self.f_surge_manager_loaded = true
        end
        if(self.surge_manager.levels_respawn[level.name()]) then
            self.surge_manager:respawn_artefacts_and_replace_anomaly_zone()
        end
        self.surge_manager:update()
    end
    -- Апдейт доступности для симуляции.
    simulation_objects.get_sim_obj_registry():update_avaliability(alife():actor())

    if not self.loaded then
        get_console():execute("dump_infos")
        self.loaded = true
    end
    treasure_manager.get_treasure_manager():update()

    if not(primary_objects_filled) then
        pda.fill_primary_objects()
        primary_objects_filled = true
    end
    pda.fill_sleep_zones()
end

----------------------------------------------------------------------------------------------------------------------
function actor_binder:save(packet)
    set_save_marker(packet, "save", false, "actor_binder")
    object_binder.save(self, packet)
    --' Сохраняем уровень сложности
    packet:w_u8(level.get_game_difficulty())
    --' Сохраняем данные об отключенном вводе
    if self.st.disable_input_time == nil then
        packet:w_bool(false)
    else
        packet:w_bool(true)
        utils.w_CTime(packet, self.st.disable_input_time)
    end
    xr_logic.pstor_save_all(self.object, packet)
    self.weather_manager:save(packet)
    release_body_manager.get_release_body_manager():save(packet)
    self.surge_manager:save(packet)
    sr_psy_antenna.save( packet )
    packet:w_bool(sim_board.get_sim_board().simulation_started)

    xr_sound.actor_save(packet)
    packet:w_stringZ(tostring(self.last_level_name))
    xr_statistic.save(packet)
    treasure_manager.get_treasure_manager():save(packet)

    local n = 0
    for k,v in pairs(db.script_ids) do
        n = n + 1
    end
    packet:w_u8(n)
    for k,v in pairs (db.script_ids) do
        packet:w_u16(k)
        packet:w_stringZ(v)
    end
    task_manager.get_task_manager():save(packet)

--    packet:w_bool(self.actor_weapon_on_start)
    
    packet:w_u8(self.object:active_slot())


    local deimos_exist = false
    for k,v in pairs(db.zone_by_name) do
        if(db.storage[v:id()] and db.storage[v:id()].active_scheme=="sr_deimos") then
            deimos_exist = true
            packet:w_bool(true)
            packet:w_float(db.storage[v:id()].sr_deimos.intensity)
        end
    end
    if not deimos_exist then
        packet:w_bool(false)
    end

    if self.last_detective_achievement_spawn_time == nil then
        packet:w_bool(false)
    else
        packet:w_bool(true)
        utils.w_CTime(packet, self.last_detective_achievement_spawn_time)
    end
    if self.last_mutant_hunter_achievement_spawn_time == nil then
        packet:w_bool(false)
    else
        packet:w_bool(true)
        utils.w_CTime(packet, self.last_mutant_hunter_achievement_spawn_time)
    end
    set_save_marker(packet, "save", true, "actor_binder")
end
----------------------------------------------------------------------------------------------------------------------
function actor_binder:load(reader)
    printf("Prizrak111__load")
    set_save_marker(reader, "load", false, "actor_binder")
    object_binder.load(self, reader)
    --' Загружаем уровень сложности
    local game_difficulty = reader:r_u8()
    printf("load game_difficulty %s", tostring(game_difficulty))
    get_console():execute("g_game_difficulty "..game_difficulty_by_num[game_difficulty])
    local stored_input_time = reader:r_u8()
    if stored_input_time == true then
        self.st.disable_input_time = utils.r_CTime(reader)
    end
    xr_logic.pstor_load_all(self.object, reader)
    self.weather_manager:load(reader)
    release_body_manager.get_release_body_manager():load(reader)
--    self.surge_manager:initialize()
    self.surge_manager:load(reader)
    self.f_surge_manager_loaded = true
    sr_psy_antenna.load(reader)
    sim_board.get_sim_board().simulation_started = reader:r_bool()

    xr_sound.actor_load(reader)
    local n = reader:r_stringZ()
    if(n~="nil") then
        self.last_level_name = n
    end
    xr_statistic.load(reader)
    treasure_manager.get_treasure_manager():load(reader)
    n = reader:r_u8()
    for i = 1,n do
        db.script_ids[reader:r_u16()] = reader:r_stringZ()
    end

    task_manager.get_task_manager():load(reader)

--    self.actor_weapon_on_start = reader:r_bool()
    
    self.loaded_active_slot = reader:r_u8()
    
    self.loaded_slot_applied = false

    local b = reader:r_bool()
    if(b) then
        self.deimos_intensity = reader:r_float()
    end

    local stored_achievement_time = reader:r_bool()
    if stored_achievement_time == true then
        self.last_detective_achievement_spawn_time = utils.r_CTime(reader)
    end
    stored_achievement_time = reader:r_bool()
    if stored_achievement_time == true then
        self.last_mutant_hunter_achievement_spawn_time = utils.r_CTime(reader)
    end
    set_save_marker(reader, "load", true, "actor_binder")
end

--*************************************************************
--*                    Подспаун вещей в ящики                      *
--*************************************************************
local detective_achievement_items         = {    "medkit",
                                            "antirad",
                                            "bandage"}

local mutant_hunter_achievement_items    = {    "ammo_5.45x39_ap",
                                            "ammo_5.56x45_ap",
                                            "ammo_9x39_ap",
                                            "ammo_5.56x45_ap",
                                            "ammo_12x76_zhekan"}

local function spawn_achivement_items(items_table, count, inv_box_story_id)
    local inv_box = alife():object(get_story_object_id(inv_box_story_id))
    for i = 1,count do
        alife():create(items_table[math.random(#items_table)],
                        inv_box.position,
                        inv_box.m_level_vertex_id,
                        inv_box.m_game_vertex_id,
                        inv_box.id)
    end
end

function actor_binder:check_detective_achievement()
    if not has_alife_info("detective_achievement_gained") then
        return
    end
    if self.last_detective_achievement_spawn_time == nil then
        self.last_detective_achievement_spawn_time = game.get_game_time()
    end
    if game.get_game_time():diffSec(self.last_detective_achievement_spawn_time) > 43200 then
        spawn_achivement_items(detective_achievement_items, 4, "zat_a2_actor_treasure")
        xr_effects.send_tip(db.actor, nil, {"st_detective_news","got_medicine"})
        self.last_detective_achievement_spawn_time = game.get_game_time()
    end
end

function actor_binder:check_mutant_hunter_achievement()
    if not has_alife_info("mutant_hunter_achievement_gained") then
        return
    end
    if self.last_mutant_hunter_achievement_spawn_time == nil then
        self.last_mutant_hunter_achievement_spawn_time = game.get_game_time()
    end
    if game.get_game_time():diffSec(self.last_mutant_hunter_achievement_spawn_time) > 43200 then
        spawn_achivement_items(mutant_hunter_achievement_items, 5, "jup_b202_actor_treasure")
        xr_effects.send_tip(db.actor, nil, {"st_mutant_hunter_news","got_ammo"})
        self.last_mutant_hunter_achievement_spawn_time = game.get_game_time()
    end

end

----------------------------------------------------------------------------------------------------------------------

function check_for_weapon_hide_by_zones()
    for k,v in pairs(weapon_hide) do
        if v == true then
            return true
        end
    end
    return false
end

-- Weapon functions
function hide_weapon(zone_id)
    printf("[WEAPON_CONTROL]:hiding weapon from zone [%s] in section [%s]!!!", zone_id, db.storage[zone_id].active_section)
    weapon_hide[zone_id] = true
end

function restore_weapon(zone_id)
    printf("[WEAPON_CONTROL]:restoring weapon from zone [%s] in section [%s]!!!", zone_id, db.storage[zone_id].active_section)
    weapon_hide[zone_id] = false
end

 

 

Вроде так ... было давно и не правда...

Изменено пользователем Vano_Santuri

Что-то кончается, что-то начинается...

Ссылка на комментарий

Я в шоке,фиг с тем балансом,моделями,звуками и второстепенными квестами - это всё со временем...Неужели не найдутся те кто допилят основной сюжет?!

Ссылка на комментарий

Артём Карпенко, это большой пласт нудной работы, которая не сильно кому нужна в итоге. Нужны квестовики, скриптеры - это для начала. Пойди найди хотя бы пару нормальных скриптеров, которые бы за это взялись. Если очень хочется - займись сам, в чем проблема?

Ссылка на комментарий

Что то не распаковываются у меня файлы.Все делал по инструкции.Пишет "не удалось открыть файл ...... как архив". В чем может быть проблема?

Patogens.gif
Ссылка на комментарий

Имеет ли смысл дорабатывать мне наработки из этой модификации? Просто, я затеял ремейк ТЧ на ЗП и оговорюсь, что часть фич придётся мне убирать, если они вызывают баги и не нужны. Ну, и нацелен несущественно изменить локации, добавив на них некоторые элементы. Просто, я прочёл, что при возможности, можно ожидать поддержку от автора и возможно его товарищей. Также я нацелен указать авторство всех, кто мне помогает, ибо не хочется слыть неким вроде Москвина. =-)

Ну, и по сути, мне не имеет смысла самому подобное осуществлять заново, ибо я могу улучшить то, что не доделали.

Для начала, я попытаюсь улучшить мод в пределах локации Кордон, ибо он имеет некоторые ошибки (одно слегка парящее под наклоном дерево у моста и несколько неприятных вещей). Ну, и попытаюсь настроить и вплести в геймплей игры пару фич, которые я нашёл методом тыка с помощью конфигов. Возможно, договорюсь с авторами ARS мода, т.к. там часть наработок (такие как жажда) сделаны на уровне Fallout: New Vegas и других современных RPG-FPS.

Изменено пользователем lambdist
Ссылка на комментарий

Я надеюсь ты реально представляешь объём работ по переносу ТЧ на ЗП даже без фич? И если уж всерьёз решил взять на себя такую ношу, то я бы тебе посоветовал все фичи оставить на потом, когда основной сюжет будет работать без глюков и багов, ибо при возникновении последних отлаживать будет проще. ИМХО.

Ссылка на комментарий

Я надеюсь ты реально представляешь объём работ по переносу ТЧ на ЗП даже без фич? И если уж всерьёз решил взять на себя такую ношу, то я бы тебе посоветовал все фичи оставить на потом, когда основной сюжет будет работать без глюков и багов, ибо при возникновении последних отлаживать будет проще. ИМХО.

У меня только пара фич юзабельных через конфиги. Остальные есть желание добавить впоследствии отладки мода и расширения модифификации эпизодически за счёт отключения неотлаженных и подключения отлаженных локаций: эдакий путь от рабочей альфы к отлаженной бете.

 

Не обратил значит... Ну что ж...

ColR_iT

Изменено пользователем ColR_iT
Ссылка на комментарий

До сих пор не уходят мысли о Тенях Чернобыля на X-Ray 1.6.

 

Интересно, были ли подвижки какие-нибудь за это время?

 

Вот Call of Chernobyl, можно назвать ремейком ТЧ? Вроде бы там нет квестов оригинальной игры.

 

А по факту, если разобраться, ЗП ведь проще ТЧ в плане моддинга. Чего стоит воссоздать сюжетную часть ТЧ на движке ЗП?

 

На первый взгляд ничего сверхъестественного делать не нужно, если понимаешь все эти скрипты, логику.

 

История моддинга серии знавала более хитроумные квесты.

Изменено пользователем aka_sektor

Discord-сервер modfaq.ru: https://discord.gg/9j42BXwB

Ссылка на комментарий

@lafugix, ну давай размышлять.

 

Первый этап: локационный пак.

С этим какие сложности в SDK 0.7 ? Никаких. Разве что, если брать из пака исходников, то придется исправить у моделей инвалид фэйсы, и ошибки сглаживания.

 

Второй этап: ключевые персонажи.

Расставить неписей, Сидорович, Волк, Петруха, Шустрый, Лис, Серый, Крот, Бармен, Сахаров, О-сознание.

 

Третий этап: основной сюжет.

Добавить диалоги, от Сидора к Волку. От Волка к Петрухе. От Шустрого к Сидору. От Сидора к Лису. От Лиса к Серому. От Серого к Кроту.

Документы закинуть на Агро, квест занести Бармену. От Бармена квест в X-18, добавить доки. Квест занести доки Бармену (Сидору). Диалог от Бармена к Сахарову. От Сахарова в X-16, добавить доки. От них к Бармену.

От Бармена, отключать Выжигатель. Дальше, пробежка Припять -> ЧАЭС-1 -> Монолит -> ЧАЭС-2. Финальный портал. Игра пройдена.

 

Дальше продолжать? Или смысл ясен...

  • Смешно 1

Discord-сервер modfaq.ru: https://discord.gg/9j42BXwB

Ссылка на комментарий

Вот видишь, у тебя даже план какой-никакой есть. Делай же. Или ты поднял тему 2011 года только ради пустопорожних рассуждений, в надежде на то, что кто-то заинтересуется тем, что игнорируется уже шесть лет? :)

Убедитесь, что вы имеете право убедиться

Ссылка на комментарий

@lafugix, я тему поднял, чтобы обсудить, что мешало другим это сделать за 8 лет с выпуска X-Ray SDK 0.7 в народ?

 

Может неправильный подход? Трудно сказать, как именно @_Призрак_ пытался воссоздать ТЧ, если я правильно понял, он взял пак локаций, и начал переносить куски кода из ТЧ на ЗП, причем всё это на скриптах только, без использования SDK. Иначе, на кой ему координаты на экран выводить? Наверное ему было так проще, мы же знаем все эти скриптовые сюжетные моды.

Изменено пользователем aka_sektor

Discord-сервер modfaq.ru: https://discord.gg/9j42BXwB

Ссылка на комментарий

@aka_sektor, амбициозный прожект, но будет ли к нему интерес со стороны конечных юзеров/модеров/ковыряторов? Тут должна быть изюминка которая бы выделила его на фоне прогрессивно развивающегося движка ТЧ:big_boss:

Изменено пользователем UriZzz

 Моя нычкаНычка в арендованном у Опричника холодильнике  

Мы хорошие ребята, жаль патронов маловато:):ukostra:

UriZzz.gif

Ссылка на комментарий
только что, UriZzz сказал:

будет ли к нему интерес

Ну тут типа мышление такое, Тот Самый ТЧ, но на движке Зова Припяти.

 

Зачем думаешь переносят Обливион на движок Скайрима (см. Skyblivion) ? Думаю, для тех кто это делает - мечта что ли... желание подарить любимой игре вторую жизнь.

 

3 минуты назад, UriZzz сказал:

конечных юзеров/модемов/ковыряторов

Ну тут, точно сказать нельзя, пока не зарелизишь. Сарафанное радио сработает, если что-то годное получится. Тех же стримеров, на постоянке спрашивают, посоветуйте ТОП модов на ЗП.

Заинтересовать дело нехитрое. Удержать уже сложнее. Пройдут, подведут итоги, хорошо или забагованное Г. Если хорошо, останутся, начнут сами пилить моды. Хе-хе... или с ТЧ переносить.

  • Спасибо 1

Discord-сервер modfaq.ru: https://discord.gg/9j42BXwB

Ссылка на комментарий

Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий

Комментарии могут оставлять только зарегистрированные пользователи

Создать аккаунт

Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!

Зарегистрировать новый аккаунт

Войти

Есть аккаунт? Войти.

Войти
  • Недавно просматривали   0 пользователей

    • Ни один зарегистрированный пользователь не просматривает эту страницу.
×
×
  • Создать...