Сообщество Империал: Важная информация по моддингу Аттилы - Сообщество Империал

  • Поиск
  • Законы
  • Сообщество
  • Репутация
  • Экономика
  • БольшеБольше
XX
Imperial

papeion Важная информация по моддингу Аттилы
только факты. Без рассуждений
Тема создана: 16 Апрель 2016, 06:52 · Автор: papeionСообщений: 18 · Просмотров: 2 481

  • 2 Страниц X
  • 1
  • 2
  • Важная информация по моддингу Аттилы Вконтакте!
  • Важная информация по моддингу Аттилы в Фейсбуке!
  • Важная информация по моддингу Аттилы в Google+!
Библиотека
papeion
  • Imperial
Imperial
1 900
Imperial
9
Imperial
172
Imperial
1 636
Imperial
0

Дата: 16 Апрель 2016, 06:52

В этой теме - собирать только важную информацию по моддингу, для справки и использования камрадам, обсуждение и вопросы здесь не надо - пишите их в Для просмотра ссылки Зарегистрируйесь !


Заметил одну вАжную вещь на счёт скоупов (областей применения):
Если в одной таблице прописать две строки с одинаковым эффектом (например, для технологии), но выставить разную область применения (скоуп), то эффект будет работать в двух областях применения (скоупах).

У меня есть два доказательства. Первое, это пример из ванили.

Вот он:
В табл. technology_effects_junction_tables (эффекты для технологий)
Для технологии bel_roman_military_defence_in_depth (она используется в ДЛС "Последний римлянин" для Экспедиции)
...прописано две строки, в каждой из которых одинаковый эффект att_effect_force_all_campaign_experience_base_all
...и в каждой строке обозначена разная область применения (для армии, для провинции).
...в итоге эффект действует в двух областях применения (видимо при найме в армии, и при формировании новых юнитов в гарнизоне)

Раньше я пытался добавлять идентичные строки, но с разными скоупами. В итоге в игре отображался текст об одном скоупе. Это меня наводило на мысль, что работает одна строка, а вторая игнорируется, при этом отображается сумма значений из двух строк. Но сейчас думаю, текст это ерунда, скоупы всё-равно действуют оба, и отображение суммы значений ложно, ибо они всё-равно распределяются по отдельности, каждый на свою область применения.

Ибо сейчас увидел пример от разрабов.

И тут же вспомнил ещё одно доказательство, которое я получил в режиме экспериментального моддинга.
В том же "Последнем римлянине" для Экспедиции я правил карьерную лестницу.
И для должности att_minister_rome_5_east_commander_chief выставил +n к сплочённость для подчинённой армии.
Однако у этой должности прописан такой же эффект, но для всех армий.
В результате в игре отображался текст +n для всех армий, однако значение +n перераспределялось так, как это прописано в таблицах - часть для подчинённой армии и часть для всех армий.
Т.е. действовали оба скоупа. Однако я отказался от своей правки из-за того, что текст вводил в заблуждение.

Так что вОт так!
    rawhide
    • Imperial
    Imperial
    9 498
    Imperial
    29
    Imperial
    653
    Imperial
    11 331
    Imperial
    2

    Дата: 01 Май 2016, 17:22

    Для просмотра ссылки Зарегистрируйесь papeion

    А у той, за которую играли, тогда выключить

    да, и еще можно поэкспериментировать с цифрами во второй строке - что будет, если их поменять местами с бывшей игровой и новой фракцией.

    PS: и поменять местами значения в campaign_player_setup_ingame_modifiables (второй уровень после campaign_player_setup)
    например, у моей игровой значилось -2 -2 -2, у АИ-фракции 2 2 2. соответственно перевернуть. вероятно, это гандикапы

    также нужны изменения в блоках campaign_player_setup / players array / campaign_player_setup - тоже поменять записи про политические партии.
    Для просмотра ссылки Зарегистрируйесь
      papeion
      • Imperial
      Imperial
      1 900
      Imperial
      9
      Imperial
      172
      Imperial
      1 636
      Imperial
      0

      Дата: 01 Май 2016, 17:38

      Но, уже больше возможностей появилось. А то до этого у меня половина кликов к вылету приводила.
      Сейчас всё кликабельно, всё открывается )))
      Только на переходе хода вылет... но это понятное дело, так и должно быть.
        rawhide
        • Imperial
        Imperial
        9 498
        Imperial
        29
        Imperial
        653
        Imperial
        11 331
        Imperial
        2

        Дата: 01 Май 2016, 18:23

        Для просмотра ссылки Зарегистрируйесь papeion

        Только на переходе хода вылет... но это понятное дело, так и должно быть.

        может найдутся и еще какие элементы

        - - - Сообщение автоматически склеено - - -

        еще нужно в campaign_model/human_factions проставить номер новой играбельной фракции. как я понимаю, это номер блока players_array+1 или же номер этот находится в первой строке титульной закладки конкретной фракции:
        Для просмотра ссылки Зарегистрируйесь
          papeion
          • Imperial
          Imperial
          1 900
          Imperial
          9
          Imperial
          172
          Imperial
          1 636
          Imperial
          0

          Дата: 31 Май 2016, 16:32

          Сейв не запоминает (или не сохраняет) бонусы\малусы эпидемий. Итого, в сложной компании, когда пересейв используется почти на каждом ходу, да по нескольку раз, эпидемии совсем безобидны.
            papeion
            • Imperial
            Imperial
            1 900
            Imperial
            9
            Imperial
            172
            Imperial
            1 636
            Imperial
            0

            Дата: 25 Июль 2016, 05:55

            Для просмотра ссылки Зарегистрируйесь papeion

            Заметил одну вАжную вещь на счёт скоупов (областей применения):
            Если в одной таблице прописать две строки с одинаковым эффектом (например, для технологии), но выставить разную область применения (скоуп), то эффект будет работать в двух областях применения (скоупах).

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

            Чтобы информация выводилась адекватно, СА сделали несколько идентичных скоупов с разными локализациями или вообще без локализации (скрытые).
            1. general_to_force_own
            2. general_to_force_own_horde
            3. general_to_force_own_unseen
            Например: это три скоупа-клона, у которых одно и то же назначение "персонаж при командовании армией". Разница только в локализации.
            Первый выводит на экран "(подчинённые войска)", второй "(подчинённая орда)", третий без локализации.

            А так же, СА сделали клоны эффектов.
            Например для генеральского скила "Ворон" используются два идентичных эффекта с разными скоупами.
            1. att_effect_building_construction_cost_mod
            2. att_effect_force_building_cost_mod
            "Ворон", это варварский скил, а ведь варварская фракция может быть сейчас ордой, а на следующем ходу стать оседлой. И, чтобы показать, что скил "Ворон" снижает цену строительства в обоих случаях, СА и сделали клон эффекта. И мы, благодаря этому, видим, что "Ворон" снижает цену строительства как при командовании ордой, так и во вверенной провинции.

            В некоторых случаях СА косячит и прописывает не тот скоуп. Например, в случае скила "Охотник" для его эффекта att_effect_food_production_characters_horde с локализацией "Пища: \+%n от персонажей (в состоянии орды)" они указали скоуп general_to_force_own, который имеет локализацию "(подчиненные войска)". Имеем результат: Пища: \+%n от персонажей (в состоянии орды)(подчиненные войска). Хотя было бы логичнее в этом случае дать скрытый скоуп, т.е. без локализации, это general_to_force_own_unseen, ибо вывод "(подчинённые войска)" в данном случае не нужен.

            Или мододелы косячат, когда например, в таком же случае дают скоуп general_to_force_own_horde, у которого локализация "(подчиненная орда)".
            В результате выводится такое Г: Пища: \+%n от персонажей (в состоянии орды)(подчиненная орда).

            Вот такие финты ради того, чтобы адекватно вывести инфу на экран об эффектах и скоупах. И вот такие ошибки, если это не учитывать.
              papeion
              • Imperial
              Imperial
              1 900
              Imperial
              9
              Imperial
              172
              Imperial
              1 636
              Imperial
              0

              Дата: 22 Октябрь 2016, 14:03

              Похоже, что при создании файла старпос в АкиТе учитываются правки, сделанные только в таблицах старпос. Другие таблицы по боку, к сожалению.

              В результате, например, через АкиТ мы не сможем создать новую играбельную фракцию. А придётся вручную копаться в готовом старпос.
              Или другой пример: не сможем изменить группу имён или группу портретов для тех генералов, которые будут в старпос. Это опять придётся делать потом, вручную.

              Акит - сволочь такая )))
                Tryggvi
                • Imperial
                Imperial
                4 044
                Imperial
                15
                Imperial
                324
                Imperial
                4 260
                Imperial
                3

                Дата: 21 Апрель 2017, 00:56

                Как делать трейты

                Работа с трейтами распадается на два блока: работа с таблицами в ПФМе для создания трейта и работа в ПФМе со скриптами для редактирования/создания триггера (это набор условий, при котором происходит проверка на получение трейта).
                Нужна ли нам будет вторая часть, если мы используем ванильный триггер? Толком протестировать я это не
                смог, но думаю, что да - всё равно придётся дописывать кое-что в скриптах.
                Замечу, что также нет смысла приниматься за дело без АКита, поскольку жизненно важная таблица trait_triggers (нужная не для создания трейта как такового, но для получения информации о триггере) в ПФМе просто недоступна.
                Я опишу полный цикл создания трейта, включая создание нового триггера. Думаю, после этого работа со старыми трейтами и триггера станет понятна и так.

                Итак, вот полный перечень задействованных таблиц:
                character_traits
                trait_info
                trait_to_included_agents
                trait_to_antitraits
                character_trait_levels
                trait_level_effects
                trigger_effects

                В character_traits создаётся именно трейт, названия колонок в общем и целом понятны. Обращает на себя внимание no_going_back_level. Видимо, именно это Для просмотра ссылки Зарегистрируйесь rawhide. Я с этим, по крайней мере, не экспериментировал. Остаётся загадкой колонка precedence. Никакого влияния от её параметров я не заметил. Короче говоря, ставьте, как в ванили.

                Далее прописывается техническая оснастка трейта. В trait_info выдаётся общая цель трейта. В игре это только agent. Хотя есть опции region и unit (остаётся только гадать, как это выглядит на практике). В trait_to_included_agents задаётся конкретная цель трейта - генерал, жрец и т.д. Чисто теоретически можно обойтись без этой таблицы, задав жёсткие условия в скрипте, но, как говорится, лучше перебдеть. В системе трейтов вообще много такого, что кажется дублирующим или излишним, но приходится всё это исполнять, как обряд.

                trait_to_antitraits нужна нам, только если мы делаем трейт, противоположный существующему. Или сразу пару противоположных трейтов. Тут всё понятно - указанные в паре трейты будут друг друга заменять, не встречаясь одновременно. Как понимаю, нужно прописывать отдельно и пару трейтА - трейтБ, и пару трейтБ - трейтА, иначе замена будет работать только "в одну сторону".

                Теперь переходим к содержимому трейта. В character_trait_levels мы создаём уровни трейта, создавать уровень нужно даже в том случае, если он у трейта единственный. Тут плюс-минимум всё тоже понятно по названиям колонок. Есть, правда, пустые колонки с манящими названиями вроде epithet_text (уж не кличка ли это?), но они ещё ждут своего исследователя. В этой таблице, однако, задаётся самый загадочный и едва ли не самый главный аспект трейта - threshold (порог). Опытным путём было выявлено, что это количество успешных проверок, которые должен пройти трейт, чтобы получить данный уровень. Т.е., скажем, если у первого уровня threshold = 2, а условие получение трейта, скажем, - выиграть в битве, вероятность же получения = 100%, то персонаж должен получить трейт только после второй выигранной битвы.
                В целом при назначении threshold стоит ориентироваться на ванильные показатели. По крайней мере, поначалу.
                Отмечу, что локализация трейта привязывается именно к его уровням (как название, так и описание - coloured text). Никакого общего названия для трейта не существует.

                Таблицу trait_level_effects нет смысла даже комментировать. Стандартная привязка эффектов, величин и скоупов к уровням трейта.

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

                В trigger_effects мы приписываем трейт к определённому триггеру (придумываем, соответственно, новый). Судя по тестам, колонка value - это тот показатель, который добавляется к threshold после успешного прохождения проверки. Другими словами, если у вас threshold = 3 и value = 1, то трейт появится у персонажа после трёх успешных проверок. А если value = 3, то после первой же успешной проверки. Это проще всего понаблюдать, создав трейт, выдаваемый каждый ход всем персонажам с вероятностью 100, и запустив новую кампанию. В первом случае трейт будет получен на третий ход (каждый ход срабатывала успешная проверка), во втором – на первом же ходу, как только мы запустили кампанию.
                Ну а вероятность, как нетрудно догадаться прописывается здесь же, в колонке chance.

                На этом с таблицами мы покончили, можно приступать к скриптам, но сперва нам надо поучиться.
                Идём в АКите в trait_triggers - это, своего рода, скриптовый файл, разложенный в табличном виде. Настольный учебник по созданию трейтов. Разобравшись в том, что и как там написано, мы усвоим азы синтаксиса скриптов.
                Итак, тут у нас есть триггер, список ивентов, при которых триггер срабатывает (там выпадающий список, интуитивно понятный - наступление нового хода, рождение персонажа, взросление персонажа и т.п.). И самое главное - conditions, условия. Это условия, при которых происходит на получение трейта.
                Тут задаётся контекст - какие персонажи, каких фракций, религий, культур, субкультур, на какой территории и при каких других условиях будут проходить проверки на получение данного трейта.

                В этой колонке настоящее нагромождение текста, но разобраться в нём довольно легко, если учесть, что каждой команде (уж извините, в терминологии не силён) предшествует технический текст и его можно пропускать (хотя я предполагаю, что можно манипулировать и им, но это надо уже совсем в деле разбираться).
                Например, такое условие:
                (char_is_general_with_army(context:character()) and context:character():faction():name() == "bel_fact_byzantine_expedition" and context:character():faction():has_technology("bel_roman_civil_gloria_romanorium"
                ) and not context:character():model():campaign_name("pro_attila")) and not context:character():model():campaign_name("cha_attila")
                

                Переводится это так:
                Персонаж - генерал с армией И имя фракции - "Римская экспедиция" И фракция персонажа открыла технологию gloria_romanorium И НЕ кампания-пролог И НЕ гранд-кампания
                Т.е. трейт выдаётся генералам и губернаторам Римской экспедиции в кампании Велизария после открытия определённой техи. Всё просто.
                Команды типа context:character():faction():name() – это тот самый технический текст. Мы можем присваивать им ключи, взятые из таблиц – названия фракций, религий и прочего (в данном случае - bel_fact_byzantine_expedition).
                Есть и самостоятельные функции, например, char_is_general_with_army. На самом деле, под этой функцией уже закодирован определённый контекст, который нам не нужно прописывать (контекст, в общем-то, ясен из названия).
                NB. Если открыть пак data через ПФМ, то по адресу lua_scripts / lib_export_triggers.lua можно найти своеобразный сборник этих самых функций. Не могу сказать, что я нашёл там что-то экстраординарное, но для человека, который уже разобрался в trait_triggers, может быть полезно.

                Копируем в свой пак из той же ветки lua_scripts файл export_triggers.lua. Я бы рекомендовал скопировать его содержимое в Notepad++, потому что он куда более удобен для скриптописания, подсвечивает команды и переменные, а тут каждый лишний пробел может стать фатальным.
                Просто копируем последний скрипт и начинаем его править. Вот, например, как выглядит один из трейтовых скриптов Шарлеманя:
                --[[ cha_trig_character_becomes_faction_leader ]]--
                
                function cha_trig_character_becomes_faction_leader_impl (context)
                		return context:character():is_faction_leader() and context:character():faction():is_human() and context:character():model():campaign_name("cha_attila")
                end 
                
                events.CharacterBecomesFactionLeader[#events.CharacterBecomesFactionLeader+1]
                 =
                function (context)
                	if cha_trig_character_becomes_faction_leader_impl(context) then
                		effect.trait("cha_trait_leader_influence", "agent", 1, 100, context)
                		return true
                	end
                	return false
                end
                

                Схематически это будет выглядеть так (извиняюсь, табуляция пропадает, но её тоже надо блюсти):

                --[[ <Название скрипта, думаю, чисто для красоты> ]]--

                function <Название триггера>_impl (context)
                return <набор контекстов>
                end

                events.<название ивента - из trait_triggers>[#events.<то же самое название ивента>+1] =
                function (context)
                if <название триггера>_impl(context) then
                effect.trait("<название трейта>", "<категория из trait_info>", <показатель value из trigger_effects>, <показатель chance из trigger_effects>, context)
                return true
                end
                return false
                end

                Нетрудно догадаться, что всё, что не вошло в скобки <>, трогать не стоит.

                Но самое сердце (и источник всех глюков) трейтового скрипта - это набор условий, или контекстов.
                Синтаксис его довольно прост - его мы уже наблюдали в trait_triggers. Ровно те же самые команды и функции мы из него и берём.
                У нас есть несколько логических операторов (капсом - для наглядности):
                - AND - "и"
                - OR - "или"
                - NOT - оператор отрицания для функций (у которых нет значка присвоения ==). Обычно идёт в комбинации с AND или OR. Т.е. если мы хотим задать условие "все, кроме генералов, командующих армией", то мы пишем not char_is_general_with_army(context:character())
                - ~= - оператор отрицания для команд со значком присвоения ==. Собственно, этот значок он и заменяет. Т.е., если мы хотим задать условие "любая фракция, кроме фракции гаутов", то мы пишем context:character():faction():name() ~= "att_fact_gauti". Ни в коем случае не используйте NOT в данном случае. Весь скрипт просто перестанет работать.
                - и наконец, обычные скобки (). Как в формулах Экселя. С помощью них можно задавать довольно сложные условия, группируя контексты. Скажем, условие вида

                Цитата

                (context:character():is_faction_leader() and context:character():faction():name() == "att_fact_mauri") or context:character():faction():name() == "att_fact_gaetuli"

                - позволяет нам воздействовать конкретно на лидера фракции мавров ИЛИ на всех персонажей фракции гетулов. Но не на рядовых персонажей фракции мавров.
                Тут логика - наше всё. Короче говоря, если вы не понимаете, каковы будут последствия у условия ЕСЛИ (А И Б), а какие - у условия ЕСЛИ (А ИЛИ Б), то лучше вообще не подходите к трейтам.

                На закуску ряд полезных условий для создания трейта (из тех, что я лично проверял или использовал):
                - context:character():is_faction_leader() - персонаж - лидер фракции
                - char_is_general(context:character()) - персонаж - генерал (любой не женский персонаж и не агент)
                - char_is_governor(context:character()) - персонаж - губернатор
                - context:character():faction():name() == "ВАШ ТЕКСТ" - фракция персонажа
                - context:character():model():campaign_name("ВАШ ТЕКСТ") - определить кампанию (пролог, основная, Велизарий, Карл)
                - context:character():faction():state_religion() == "ВАШ ТЕКСТ" - гос. религия персонажа
                - context:character():has_trait("ВАШ ТЕКСТ") - персонаж имеет определённый трейт
                - context:character():faction():culture() == "ВАШ ТЕКСТ" - культура фракции персонажа
                - context:character():faction():subculture() == "ВАШ ТЕКСТ" - субкультура фракции персонажа
                - context:character():age() > ВАШ ТЕКСТ - возраст персонажа больше заданного числа (ну или меньше, если знак перевернуть)
                А есть ещё контексты, связанные с битвами... :0182:

                И последнее. Если вы просто добавляете триггеры, то нет смысла засовывать в свой пак весь ванильный export_triggers.lua.
                Можно переименовать его как-нибудь, удалить содержимое и писать всё с нуля.
                Но, чтобы этот файл заработал, его надо прописывать в той же ветке в файле all_scripted.lua по образцу:
                local triggers = require "data.lua_scripts.ИМЯ_СКРИПТОВОГО_ФАЙЛА"
                  Grantdiece
                  • Imperial
                  Imperial
                  1
                  Imperial
                  0
                  Imperial
                  0
                  Imperial
                  0
                  Imperial
                  0

                  Дата: 22 Июнь 2017, 12:09

                  На сегодяшний день очень мало врачей, которые могли бы повлиять на ход болезней сахорного диабета!
                  Но роман лыков инвиком смог победить болезнь, для этого необходимы физические упражнения!
                  а так же эффективен зеленый чай с лимоном и медом, утром на тощак! Роман Лыков Инвиком заслуженный Врач!
                    стратег2
                    • Imperial
                    Imperial
                    307
                    Imperial
                    11
                    Imperial
                    25
                    Imperial
                    171
                    Imperial
                    0

                    Дата: 14 Июль 2017, 13:18

                    Как добавить сюжетные миссии для минорных фракций.

                    Сначала вам нужен мод с новой игровой фракцией или возьмите свой собственный, мой пример - Suebi для кампании bel_, вы можете сделать то же самое для основного att_. Большая часть работы проста «копировать и вставлять».
                    Вам нужно следовать таблицам:

                    дБ /
                    advice_levels_tables
                    advice_threads_tables
                    missions_tables


                    campaigns/bel_attila/factions
                    bel_fact_suebi.lua
                    bel_fact_suebi_intro.lua


                    campaigns/bel_attila
                    missions.text

                    text
                    localisation.loc


                    advice_levels_tables клонирует одну строку, подобную этой «bel_advice_intro_flyby_suebi», и меняет ее в имени вашей фракции. Как в следующем случае вы должны изменить ID в том, что хотите, не делайте двойной там!

                    advice_threads_tables то же, что и таблица bevor, клонировать строку, изменяя имя фракции.

                    missions_tables здесь вы должны клонировать 5 строк, подобных этому, и изменить его на свою фракцию

                    att_objective_bel_suebi_primary_1_seal_2
                    att_objective_bel_suebi_primary_2_seal_3
                    att_objective_bel_suebi_primary_3_seal_4
                    att_objective_bel_suebi_primary_4_seal_5
                    att_objective_bel_suebi_primary_5_seal_6



                    Bel_fact_suebi.lua скопируйте любую запись из другой фракции и измените имя фракции. В последних строках вы найдете такую ​​запись, сделайте то же самое и измените имя фракции!

                    - запуск миссий
                    Cm: trigger_custom_mission ("bel_fact_suebi", "att_objective_bel_suebi_primary_1_seal_2");
                    конец;

                    Это триггер, который запускает миссии вашей главы!


                    Bel_fact_suebi_intro.lua только сделать копию из другой фракции, вы должны для первых шагов ничего. Позже вы можете изменить его на свою фракцию - вы можете пропустить введение!

                    Mission.text здесь вы можете редактировать свои собственные миссии, скопировать полную 5-ю главу и изменить здесь название фракции. ПОЖАЛУЙСТА, не редактируйте миссии миссий главы, которые вы видели, что она работает. Что я имею в виду, начать игру, вы должны увидеть видео и взглянуть на миссию главы. У вас есть успех ... чем редактировать миссии в свои собственные идеи.


                    Localisation.loc здесь вы можете написать свой собственный текст для своих пользовательских миссий - например, вам это нужно
                    mission_text_text_att_objective_faction_bel_suebi_1_1_heading

                    Это может помочь вам изменить ваши задачи!

                    Удачи и получайте удовольствие, я надеюсь, что я ничего не потерял!

                    Для просмотра ссылки Зарегистрируйесь
                      • 2 Страниц X
                      • 1
                      • 2
                      • Важная информация по моддингу Аттилы Вконтакте!
                      • Важная информация по моддингу Аттилы Фейсбуке!
                      • Важная информация по моддингу Аттилы Google+!
                      Лента Новостей

                      Введите ваши имя форумчанина и пароль:

                      Введите Ваше имя  
                      [Регистрация нового аккаунта]
                      Введите Ваш пароль 
                      [Восстановить пароль]

                      Воспользуйтесь одной из социальных сетей для входа на форум:


                      Внимание: Реклама отключена для зарегистрированных посетителей

                      Стиль
                         22 Окт 2017, 08:11
                      © 2017 «Империал». Условия предоставления. Ответственность сторон. Декларация о Сотрудничестве. Лицензия зарегистрирована на: «Империал». Счётчики