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

[SoC] Ковыряемся в файлах


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

@dsh

Насчет цифровых параметров я и сам хотел-бы услышать от более знающих. Пробовал потестить, выяснил следующее:

actor_stats.add_points("quests", "Вернуть флешку Сидоровичу", 1, 5) - в ПДА на вкладке "Данные"

Выполненные кветы - 5

Всего - 5

и в большом окне Выполненные задания

Вернуть флешку Сидоровичу    х1    5

Если изменяю

actor_stats.add_points("quests", "Вернуть флешку Сидоровичу", 5, 1) - то получается

Выполненные кветы - 25

Всего - 25

и в большом окне Выполненные задания

Вернуть флешку Сидоровичу    х5    5

 

Пока для меня это бредятина... Может кто из знающих просветит?

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

HellRatz, Хороший вопрос, это просто объект, такой же как и обычная дверь, стена и т.п.

Это как при подходе к мертвому оленю на 1.28 минуте.

ba9599747b.png  36914dd0ee.png

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

@PlayMod, ну статика, ясно. Ну делай как сказал. Сначала создаешь звук через СДК, настраивая его слышимость (От 1 метра, хоть через всю локацию, но вообще надо будет подбирать слышимость до идеала, постоянно перебирая параметры дальности, пока не добьешься нужного результата). Статья по настройке звука в СДК. Затем создаешь звуковую зону на месте нужного объекта, туда вписываешь свой звук. Делаешь make game, полученный файл (level.snd_static, вроде) кладешь в папку с уровнем, ну и звук в ogg.

  • Спасибо 1
Ссылка на комментарий

@dsh, @UnLoaded, статистика учитывается криво. Логику отследить вполне возможно, она там есть, но вот работает да - неверно (хотя опять же что у разрабов на уме было нам не понять). Вполне себе можно поправить. Да и в оригинале все функции (ну кроме одной вроде) вполне себе используются - советую посмотреть.

 

Ну а ваша функция вот она - вся как на ладони:

void CActorStatisticMgr::AddPoints(const shared_str& key, const shared_str& detail_key, s32 cnt, s32 pts)
{
    SStatSectionData& sect        = GetSection        (key);
    SStatDetailBData& d            = sect.GetData        (detail_key);
    d.int_count                    += cnt;
    d.int_points                += cnt*pts;
}

Как видно создается субтаблица и туда вписываются ваши данные. Тут и кроется вселенский косяк, который нетрудно устраняется :).

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

 

 

который нетрудно устраняется

Правкой скриптов или правкой движка ? Судя по приведенному фрагменту кода - это С++.

Ну и в общем - что эти два числовых параметра должны были означать по задумке ? Зачем умножать один на другой ?

Судя по коду, d.int_count это инкрементный счетчик, как я понимаю для регулярных заданий, типа принес копыта пять раз - будет запись навроде "Принести копыта" - х5. А вот последний параметр ?

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

@UnLoaded, последнее число - поинты, которые и пишутся в ПДА. Впрочем количество тоже пишется, я не пойму что тебе нужно. Вот куски кода:

            s32 _totl = Actor()->StatisticMgr().GetSectionPoints(key_name);
            
            if(_totl==-1)
            {
                itm->m_text2->SetTextST                ("");
            }else
            {
                sprintf_s                            (buff,"%d", _totl);
                itm->m_text2->SetTextST                (buff);
            }
        if( 0==(*it).str_value.size() )
        {
            sprintf_s                            (buff,"x%d", (*it).int_count);
            itm->m_text2->SetTextST                (buff);

            sprintf_s                            (buff,"%d", (*it).int_points);
            itm->m_text3->SetTextST                (buff);
        }else
        {
            itm->m_text2->SetTextST                ((*it).str_value.c_str());
            itm->m_text3->SetTextST                ("");
        }
Ссылка на комментарий

А что это вообще такое - поинты ? Типа очки за выполнение заданий ? Тогда получается, что в строке
Выполненные квесты - 25, число - это общее кол-во очков за выполнение разных квестов ?

Это типа для школоты, пиписками меряться ?


Типа да. Типа для мультиплеера. Со счетчиком они намудрили... Вообще система, очевидно, как с убивствами должна быть: сложность * на пойнты за действие. dc

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

@UnLoaded, ну а чего тебе от них еще то надо? Методы управления выведены, привязывай к чему хочешь, в оригинале если не ошибаюсь они ни к чему не привязаны. Помимо них в этом массиве еще есть ranking, вот он да, задействован, но тоже сомнительно :). Можешь и сам посмотреть, там в целом все очевидно, если бы не привязка к ПДА, то можно было-бы этим вообще только из скриптов и управлять (поинты/кол-во без скриптов даже не создадутся по факту), в принципе можно все это в скрипты и вынести при желании.

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

Вопрос по заданиям.

имеется задание:

<game_task id="tutorial_find_artefact">
<title>esc_tutorial_find_artefact</title>
<objective>
<article>article_find_artefact</article>
<icon>ui_iconsTotal_tutorial_find_artefact</icon>
<infoportion_complete>tutorial_artefact_done</infoportion_complete>
</objective>
........
.......
.....
...
и еще задание:
<game_task id="agr_help_krot_stalkers">
<title>agr_help_stalkers</title>
<objective>
<article>article_agr_krot_sos</article>
<icon>ui_iconsTotal_defend_lager</icon>
<infoportion_complete>agr_help_stalkers_assault_dead</infoportion_complete>
</objective>
........
.......
.....
...
Иконки для отображения в описаниях заданий прописаны однообразно. Но при выдаче этих заданий стандартным образом(через и-п например) для первого задания в сообщении выводится назначенная в нем иконка с артефактом, а для второго задания в сообщении выводится иконка компаса. В чем проблема ?
 
P.S. Смотрел в news_manager.script ф-цию send_task, но вот тут
--' Берем координаты из текстуры таска
local task_texture, task_rect = get_texture_info("ui_iconsTotal_"..task:get_id(), "ui_iconsTotal_locations")
вообще ничего не понял...
Ссылка на комментарий

 

 

Но при выдаче этих заданий стандартным образом(через и-п например) для первого задания в сообщении выводится назначенная в нем иконка с артефактом, а для второго задания в сообщении выводится иконка компаса.

Я тут проблемы не вижу. Ты так и указал, в первом задании ищем артефакт - иконка артефакта, во втором убиваем людей - иконка компаса, все верно :). Проблемы, собственно, нет.

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

Очевидно, в ошибке в news_manager.script.

task:get_id() в данном случае получается вполне рэндомным.

 

2 Карлан: именно. В очередной раз предполагается, что конфиги прибиты гвоздями.

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

@Dennis_Chikin, он никак не может быть рандомным, эта функция вполне явно получает айди таска из game_tasks.xml, в функции это просто подставляется в айди текстуры, и она успешно считывается из файла-описателя текстуры с иконками, рандома впринципе быть не может. Иконки типовые для каждого типа задания, вот вручную рандомизировать вполне можно.

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

Все, разобрался в чем проблема:

первое задание из моих примеров имеет id "tutorial_find_artefact", следовательно "ui_iconsTotal_"..task:get_id() дает ui_iconsTotal_+ tutorial_find_artefact = ui_iconsTotal_tutorial_find_artefact - прописана в ui_iconstotal.xml.

А второе задание  даст ui_iconsTotal_+ agr_help_krot_stalkers = ui_iconsTotal_agr_help_krot_stalkers - такого в  ui_iconstotal.xml нет.

я наверное не прав, но на мой взгляд, более дурного способа получить иконку для сообщения не придумать...

 

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

@Карлан, я тестирую add_points() на движке из OGSE 0.6.9.3. Возможно, там что-то изменили на эту тему, но работает оно явно не так, как в приведенном коде. Вот такой вызов:

actor_stats.add_points( "stalkerkills", "bandit_expirenced", 1, 1 )

не всегда приводит к увеличению счетчиков. Так, пора определиться с терминами. В ПДА, раздел статистика разделен на две части. В левой - общая статистика. В правой - список сталкеров с рангами и соотв. им счетчики. Притом, на каждого приходится два счетчика. Превый отображается, как xN, а второй - просто число. Так вот, при выполнении вышеуказанной функции, напомню, что я это делаю на движке из OGSE 0.6.9.3, число xN всегда увеличивается на 1, сколько бы раз я не выполнил это. А вот со вторым числом все хуже. Покажу лучше по другому. В начале имеем

Бандит, опытный x0 0

Вызываю функцию, как указано. В ПДА вижу

Бандит, опытный x1 1

Вызываю еще раз. В ПДА вижу

Бандит, опытный x2 1

 В дальнейшем, последнее число увеличиваться не будет. А изменится оно только в том случае, если я выполню add_points() с последним аргументом отличным от того, что показывается в ПДА, в последней колонке. И величина в ПДА изменится на разницу, а не просто прибавится. Вот такие вот чудеса.

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

@dsh, я не знаю что там в огсе, я говорю об оригинальной игре. И как это все работает я описал выше, я сам на практике конечно ассемблерные заплатки ставил еще на 4 патч, но давайте попробую рассказать. Есть инкермент и есть очки связанные с инкрементом через умножение. Допустим берем абстрактного сталкера за убийство которого инкремент увеличивается на единицу, и за этого сталкера дают 2 очка. В итоге мы имеем арифметическую прогрессию очков с разностью два. Т.е. убили одного, нам пишет в ПДА х1 2, убили двух - х2 4, убили трех - х3 6, и никак иначе. В общем количестве очков этого пункта статистики высвечивается число инкремент*очки, иными словами функция получает субтаблицу сформированную нами, и умножает два числа из нее. А все эти сталкеркилс, монстеркилс и т.д. - метки.

 

Другой вопрос, что в этом алгоритме есть мелкие косячки которые и поганят всю общую картину, они видны прямо сразу, я даже не знаю что вам по этому вопросу еще рассказать, все коды показал, да что там - сами смотрите если интересует :).

 

@UnLoaded, выше же я это описал. Вполне удобный способ, если привыкнуть :).

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

Вопрос по файлу game_maps_single.ltx.

У каждой локации там есть параметр

bound_rect        = -512.000, -512.030, 0.000, 512.001         ;512.000x1024.031

Я так понимаю, это координаты в системе отсчета локации, соответствующие противоположным углам ее террейна. первые две - левый верхний угол, последние две - нижний правый, и даны они по осям x и z (в сталкере ведь, y - это вертикаль).

Снимок террейна (собственно скрин карты) получаем при необходимости через demo_record on -> F11. И я так понимаю, это именно углы этого самого скрина, выдаваемого движком.

И вот предположим, если я думаю что значения координат прописанные в bound_rect у какой то локации не верны, я могу их как то проверить, и выяснить точные правильные значения? Как их вообще можно узнать, если не из файла.

Мод, где не бывает одинаковых путей - Судьба Зоны. (Лучшее, что у меня получилось на X-Ray) На базе модифицированного движка OGSR Engine.

Бывший мододел на X-Ray / Начинающий игродел на Unreal Engine. Программист.

AMD Ryzen 9 7950X (16 ядер, 32 потока, 5.75 ГГц); RTX 3080; 128 ГБ DDR5; Arctic Liquid Freezer II-420; 3 ТБ SSD PCIe 4.0; 4ТБ HDD.

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

@Zander_driver, пробежать в крайний угол локации, получить координаты актора, пробежать в другой угол, сделать тоже самое, как вариант.

Ссылка на комментарий
@Elz, прошу прощения, не могу удержаться от вопроса. А что делать, если локация круглая?
  • Нравится 2
 

Плагины Total Commander для работы с игровыми архивами:

Архиваторный плагин (для работы с одиночным архивом): link1 link2

Системный плагин (для распаковки установленной игры): link1 link2

 

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

Снимок террейна (собственно скрин карты) получаем при необходимости через demo_record on -> F11. И я так понимаю, это именно углы этого самого скрина, выдаваемого движком.

Да, и только с этим скрином карты эти координаты имеют смысл.

 

И вот предположим, если я думаю что значения координат прописанные в bound_rect у какой то локации не верны, я могу их как то проверить, и выяснить точные правильные значения? Как их вообще можно узнать, если не из файла.

На ТЧ нормально никак не проверить. Только сделать новый скрин карты.
Ссылка на комментарий

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

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

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

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

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

Войти

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

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

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