Queer Опубликовано 1 июня, 2020 Жалоба Поделиться Опубликовано 1 июня, 2020 (изменено) Здравствуйте. Вот часть скрипта из задачи по захвату стратегических позиций. function ControlArea() -- wait 0.5 secs before adding this rule. this is so it is not executed -- on the same frame as the other win conditions Rule_AddOneShot( ControlArea_AddMainRule, 0.50) if _CASettingsTable.g_numPoints > 0 then -- create a new objective local obj_table_P3 = { title_id = 60008, short_desc_id = 60308, help_tip_id = 60308 } Objective_Add( obj_table_P3, 1 ) -- put all players into a global team table _CATeamTable = WCUtil_InitTeamTable() -- add rules Rule_AddOneShot( CARule_EnableControlAreaUI, 0 ) -- execute on first sim frame end end function ControlArea() - это, как я понял, функция и ее "имя". _CASettingsTable.g_numPoints - как это расшифровать? Objective_Add( obj_table_P3, 1 ) - начало, это указание на функцию не указанную в данном коде? { title_id = 60008, - это получается внутренния команда движка? Хотелось бы узнать весь список. Изменено 28 апреля, 2021 пользователем jONES 0 Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
jONES Опубликовано 1 июня, 2020 Жалоба Поделиться Опубликовано 1 июня, 2020 (изменено) i Уведомление: Предлагаю в этой теме, раз уж она открылась, придерживаться только обсуждения использования LUA в контексте ДОВ1 Напоминаю, что для вопросов-ответов общего характера существует отдельная тема в закрепеМОДТУЛЗЫ СО СКАРДОКОМ ПО ЭТОЙ ССЫЛКЕ Для начала, надо установить DC mod tools http://www.mediafire.com/file/edh1hcb7okbc...ools12.zip/file в нем будет ScarDoc - описание всех [документированных] функций, обычно по такому пути DarkCrusade\ModTools\ScarDoc\ Все функции из скардока - так или иначе доступны в дове и используются в скриптах, условиях победы и коде ИИ --- по теме: _CASettingsTable.g_numPoints - как это расшифровать?_CASettingsTable это таблица (структура), она описана где-то в другом месте в этом же скрипте, g_numPoints - значение в ней. Названия произвольные, так захотелось автору скрипта, но из названий примерно понятно что для чего. На остальные вопросы не вижу смысла отвечать, т.к. это базовый синтаксис языка. Изменено 2 июня, 2020 пользователем jONES 0 Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
SF_elamaunt Опубликовано 1 июня, 2020 Жалоба Поделиться Опубликовано 1 июня, 2020 Не знаю LUA, но как программист догадываюсь, что: function ControlArea() Ключевое слово function объявляет новую функцию с названием ControlArea без параметров. Далее до end идет код этой функции. _CASettingsTable.g_numPoints Название начинается с подчеркивания. Так обычно называют локальные приватные переменные. Значит это объект, у которого есть поле g_numPoints. По логике можно догадаться, что это количество стратегических точек. А сам объект это некая таблица настроек. local obj_table_P3 = { title_id = 60008, short_desc_id = 60308, help_tip_id = 60308 } Создается локальный объект obj_table_P3, у которого будут внутри указанные поля. title_id будет содержать значение 60008. Локальный значит, что переменная видна по названию только внутри кода этой функции. В другой функции такая же переменная может означать другое. Objective_Add( obj_table_P3, 1 ) Вызывается функция Objective_Add, которая объявлена в другом месте. Туда передается созданный объект. Названия полей прописаны так, чтобы эта функция потом воспользовалась значениями (title_id, short_desc_id, help_tip_id) Если поменять названия полей, что-то может не сработать. Надо читать документацию или код функции Objective_Add, чтобы знать, зачем ей эти значения. 0 Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
Queer Опубликовано 1 июня, 2020 Автор Жалоба Поделиться Опубликовано 1 июня, 2020 Значит мне для получения информации по интересующему вопросу, нужно обращатся в "вопрос-ответ" ? Окей, я не знал. Ну да, я вообще в этом новичок. Понимаю, у вас горит от "таких" мододелов, но у меня хорошая цель и постараюсь ее достичь. Спасибо за наводку по командам, я так и думал что есть внутренние команды. Спасибо, SF_elamaunt, за разъяснения также. :) П.с.: Ожидал негатива со стороны олдов. Видимо уже все сгорели от новичков. =) Спасибо. 0 Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
jONES Опубликовано 2 июня, 2020 Жалоба Поделиться Опубликовано 2 июня, 2020 (изменено) Значит мне для получения информации по интересующему вопросу, нужно обращатся в "вопрос-ответ" ? Окей, я не знал. Спасибо. Вообще - да. Но по lua - пиши здесь. Изменено 2 июня, 2020 пользователем jONES 0 Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
GrOrc Опубликовано 2 июня, 2020 Жалоба Поделиться Опубликовано 2 июня, 2020 Вообще - да. Но по lua - пиши здесь. Раз Джонс фактически открыл тут тему по скриптингу DoW, то тогда прямо в стартер этой темы надо разместить архивчик с общеизвестными доками по scar- и AI-коду. Без них эта тема смысла вообще не имеет. Для начала все сюда пишущие должны ознакомиться с официальной документацией. Без неё разговоры тут беспредметны. И прямо в стартере надо указать эту рекомендацию -- прочтите сначала доку, прежде чем писать сюда. А дока по scar-коду, между прочим, очень хорошая. По AI-коду хуже, но разобраться в ней тоже труда особого не составляет... для тех, кому программирование не тёмный лес конечно... Другим людям сюда писать смысла просто нет. Тема ну ОЧ-ЧЕНЬ специфическая и не самая простая. Но я только за буду, если найдутся люди, которые в этой теме захотят просветиться и будут иметь реальный неподдельный интерес. Сейчас таких людей в Природе очень мало... Общее замечание. Разобраться в скриптовых языках DoW-движка не сложнее, чем разобраться в таком например языке программирования, как Паскаль. Если вы знаете Паскаль или Си, то вы фактически готовый спец, чтобы до кучи разобраться в скриптовом языке для DoW. Флаг вам в руки, товарищи. :) ...А бронепоезд навстречу к вам сам прибежит... ;) 0 Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
SF_elamaunt Опубликовано 2 июня, 2020 Жалоба Поделиться Опубликовано 2 июня, 2020 А где AI доки лежат? 0 Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
GrOrc Опубликовано 2 июня, 2020 Жалоба Поделиться Опубликовано 2 июня, 2020 А где AI доки лежат? Там же, где и scar-док. ;) 0 Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
Queer Опубликовано 2 июня, 2020 Автор Жалоба Поделиться Опубликовано 2 июня, 2020 (изменено) Если честно, я не понял о каких документациях говорите. Покопался в папках ModTools (не Corsix) и нашел ScarDoc. "Introduction to SCAR" и т.д. Нажимаю Scripting. Там: Rules A Rule is simply a user-defined function that, once "added", is then evaluated by the game every interval. The Rule is added by using the Rule_Add( "name of Rule" ) function, and passing in the name of the Rule that you wish to add. The interval that the Rule is evaluated at can either be the default (every frame) or can be set (every x seconds), using the Rule_AddInterval function in place of the Rule_Add. The interval can be defined on a per-Rule basis, allowing you to specify a different interval for every Rule that you have. For example, if we wanted a Rule that printed out "Hello world!" to the console every frame, we would have something along the lines of: -- add the Rule_HelloWorld to the queue of Rules being evaluated -- here the Rule_HelloWorld function is defined, in the LUA standard Rule_Add( Rule_HelloWorld ) function Rule_HelloWorld() print( "Hello world!" ) end This will then print the words "Hello world!" to the console every frame. Я скопировал код в свой objective.scar и исполняю его через задачи. (Файл работает (инициируется), т. к. уже копировал туда пример с задачей и она отобразилась в игре, но криво) Если правильно понимаю, то каждый интервал в консоль будет отправляться сообщение "Hello World!". Этого не происходит. Почему? Забыл что-то добавить? ...Кажется это не исполняется через "задачи"?.. Изменено 2 июня, 2020 пользователем Yahlo 0 Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
GrOrc Опубликовано 2 июня, 2020 Жалоба Поделиться Опубликовано 2 июня, 2020 Если честно, я не понял о каких документациях говорите. Вот смотри тут после установки DoW-мод-тулзов: Два самых интересных файла там это те, что отмечены на скрине выше: "function_list.htm" и "function_list_ai.htm". Первое -- дока по scar-коду, второе -- дока по AI-коду. Я скопировал код в свой objective.scar и исполняю его через задачи. (Файл работает (инициируется), т. к. уже копировал туда пример с задачей и она отобразилась в игре, но криво) Если правильно понимаю, то каждый интервал в консоль будет отправляться сообщение "Hello World!". Этого не происходит. Почему? Забыл что-то добавить? Вопрос лишь в том, через какой механизм ты этот код запускаешь. Есть разные способы запустить код в игре. Ты нам тут так толком и не раскрыл "великую тайну", как именно ты пытался запустить этот код. ;) Какие ещё такие "задачи" ты имел ввиду? Можно scar-код запускать через специальный винкондишен например, а можно прямым импортом в один из стандартных скар-файлов ДоВ. Так каким именно методом ты воспользовался? ;) Код твой должен работать нормально, если ты его правильно запустишь. 0 Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
GrandMoffTarkin Опубликовано 14 ноября, 2020 Жалоба Поделиться Опубликовано 14 ноября, 2020 Приветствую всех любителей DOW и просто людей читающих данный пост! Я хочу обратиться за помощью к знающим людям, надеюсь, что здесь я найду ответы на свои вопросы. Заранее приношу прошу прощения, если я ошибся темой для поста или допустил любую другую ошибку в оформлении поста! Вступление: В DOW я играю уже довольно давно, полностью прошел оригинал и аддоны к нему. И последнее время, я всячески пытаюсь улучшить кампанию Soulstorm, хочу сделать ее такой, какой я ее вижу своим взглядом. Но одна вещь не дает мне покоя.. Сам вопрос: Я хочу в кампанию для игрока на обычные провинции добавить союзного бота. Если скажете, что уже существует такая модификация, то я соглашусь, но там реализация немного хромает как мне кажется. В том моде союзный бот добавляется при условии, что: если игрок нападает на провинцию бота и если военная мощь провинции больше 4 то добавляется союзный бот и игроку и боту(итого получается режим 2х2). Но я хочу сделать подобное и для игрока, то есть: если бот нападает на провинцию игрока и если военная мощь провинции игрока больше 4 то на сторону игрока добавляется союзный бот. Если отредактировать файл settings*.ai то это не решит проблему. Союзный бот у игрока будет добавляться только на вражеской провинции. Поэтому я подумал, что можно это реализовать скриптово, и поэтому пишу в данную тему. Друзья, прошу вашей помощи, подскажите или хотя бы направьте в нужное русло. Буду бесконечно благодарен вам! Спасибо! 0 Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
jONES Опубликовано 5 апреля, 2021 Жалоба Поделиться Опубликовано 5 апреля, 2021 (изменено) Можно как то заставить отряды мгновенно получать оружие/пополнение не редактируя баланс? Думал сделать через setsimrate( float ), но она крашит игру если вызывать из скрипта карты. Выглядит норм! По вопросу: Есть модификаторы на скорость реинфорса, и другие разные полезные. Через скрипт карты (или условие победы) их надо применить на всех игроков. Я хочу пофиксить невидимый Монолит. Так как он есть юнит, сквад и здание, хочу попробовать на 2 тире некронов, вместо призыва 3-его тира здания, призвать его как юнит, а здание заставить самоуничтожиться или сделать призрачным. Уничтожив здание - проиграешь по условию победы "Destroy HQ". То есть это условие надо будет переписать под твои изменения. Я хочу пофиксить невидимый Монолит.Опиши, в чем эта проблема? Изменено 5 апреля, 2021 пользователем jONES 0 Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
VenerateTheImmortalLenin Опубликовано 6 апреля, 2021 Жалоба Поделиться Опубликовано 6 апреля, 2021 (изменено) По вопросу: Есть модификаторы на скорость реинфорса, и другие разные полезные. Через скрипт карты (или условие победы) их надо применить на всех игроков. Спустя 3 часа возни получилось сделать реинфорс :D , мб кому пригодится: "Код"local player = World_GetPlayerAt(0) reinforceModifier = Modifier_Create( MAT_Player, "reinforce_time2_player_modifier", MUT_Multiplication, false, 0.01, "" ) mod1 = Modifier_ApplyToPlayer( reinforceModifier, player ) --применяем экземпляр модификатора на игрока Modifier_Remove( mod1 )- а так его удаляем Есть еще 3 проблемы которые я не могу решить( 1) Мне нужно сохранить состояние отряда, чтобы в будущем я мог его восстановить Например так я сохраняю кол-во лидеров и солдат в отряде Integer Squad_CountLeaders( SquadID squad ) Integer Squad_Count( SquadID squad ) Мне так же нужно получить кол-во их оружия, для этого есть такая ф-ия Squad_WeaponCount( SquadID squad, String weaponname ) Но тут требуется имя оружия которое я не могу нигде взять, ведь нету функции ДатьСписокВозможногоОружияОтряда(). Можно было бы хранить массив из имен всего возможного оружия в игре, и циклом проходить имеет ли отряд его. Но там аж 900 возможного оружия, не хотелось бы иметь такой огромный цикл. 2)Нужно удалить требования оружия к зданиям, пока в голову приходит создать все типы зданий и сделать их невидимыми, но как я не знаю 3)Мгновенная выдача оружия, сержанта отрядам Изменено 6 апреля, 2021 пользователем jONES 0 Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
jONES Опубликовано 6 апреля, 2021 Жалоба Поделиться Опубликовано 6 апреля, 2021 (изменено) Есть еще 3 проблемы которые я не могу решить( 1)Мне нужно сохранить состояние отряда, чтобы в будущем я мог его восстановить 2)Нужно удалить требования оружия к зданиям, пока в голову приходит создать все типы зданий и сделать их невидимыми, но как я не знаю 3)Мгновенная выдача оружия, сержанта отрядам Теперь ты расскажи, чего вообще хочешь добиться? ) Возможно тебе и не надо ничего хранить, удалять, воссоздавать? Возможно тебе просто надо отряду сделать _despawn, а потом обратно _spawn ? Изменено 6 апреля, 2021 пользователем jONES 0 Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
VenerateTheImmortalLenin Опубликовано 6 апреля, 2021 Жалоба Поделиться Опубликовано 6 апреля, 2021 (изменено) Делаю аналог карты Там перед стартом сохраняется состояние арены и в конце восстанавливается. Возможно тебе просто надо отряду сделать _despawn, а потом обратно _spawn ? Если отряд можно было бы дублировать, то один можно деспавнить на момент когда придется восстановить а второй отправить в бой Изменено 6 апреля, 2021 пользователем VenerateTheImmortalLenin 0 Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
jONES Опубликовано 6 апреля, 2021 Жалоба Поделиться Опубликовано 6 апреля, 2021 (изменено) 2)Нужно удалить требования оружия к зданиям, пока в голову приходит создать все типы зданий и сделать их невидимыми, но как я не знаю 3)Мгновенная выдача оружия, сержанта отрядам ответ Use Squad_ForceUpgradeWeapons to force all troops in a squad to upgrade their weapons regardless of requirments. --------- Но тут требуется имя оружия которое я не могу нигде взять, ведь нету функции ДатьСписокВозможногоОружияОтряда(). Можно было бы хранить массив из имен всего возможного оружия в игре, и циклом проходить имеет ли отряд его. Но там аж 900 возможного оружия, не хотелось бы иметь такой огромный цикл. Чтобы не делать цикл по 900 позициям, надо "всего лишь" создать двухуровневые таблицы, на первом уровне - список всех сквадов, на втором - всего доступного оружия для этих сквадов. Корсикс Мод Студия - поддерживает выполнение lua скриптов, так что надо программно пройтись по списку сквадов, получить список составляющих юнитов, из него - список доступных оружий. Потом сформировать LUA файл с таблицами из полученных данных, эти таблицы использовать в сценарии карты Делаю аналог карты Идея интересная, было бы круто, если бы в дов-варианте отряды не только перестреливались, но ещё и абилки использовали Тогда потребуется и табличка с абилками! Изменено 6 апреля, 2021 пользователем jONES 0 Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
VenerateTheImmortalLenin Опубликовано 6 апреля, 2021 Жалоба Поделиться Опубликовано 6 апреля, 2021 Чтобы не делать цикл по 900 позициям, надо "всего лишь" создать двухуровневые таблицы, на первом уровне - список всех сквадов, на втором - всего доступного Это то что я не хотел делать, но выбора видимо нет. Идея интересная, было бы круто, если бы в дов-варианте отряды не только перестреливались, но ещё и абилки использовали. А если включить Cpu он начнет сам абилки применять? 0 Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
jONES Опубликовано 6 апреля, 2021 Жалоба Поделиться Опубликовано 6 апреля, 2021 (изменено) А если включить Cpu он начнет сам абилки применять? Всё конечно возможно... Но не факт. Возможно захочет отойти к позиции HQ и перегруппироваться. Изменено 6 апреля, 2021 пользователем jONES 0 Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
VenerateTheImmortalLenin Опубликовано 7 апреля, 2021 Жалоба Поделиться Опубликовано 7 апреля, 2021 Можно как-то вызвать setsimrate(float) из скрипта карты? Если посмотреть в консоль то видно что скрипт карты не знает о этой функции. Может какой файл нужно подключить? 0 Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
jONES Опубликовано 7 апреля, 2021 Жалоба Поделиться Опубликовано 7 апреля, 2021 Можно как-то вызвать setsimrate(float) из скрипта карты? Если посмотреть в консоль то видно что скрипт карты не знает о этой функции. Может какой файл нужно подключить? Подобные функции работают только в -dev режиме, когда игра пишет дополнительные логи на диск. -dev - это параметр запуска игры, добавляется в батник или в ярлык 0 Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
PolTorta Опубликовано 10 апреля, 2021 Жалоба Поделиться Опубликовано 10 апреля, 2021 (изменено) План такой: 1) Узнать расу игрока 2) Если некрон, то узнать выполнен ли апгрейд монолита до hq3 3) Если да, то проверить заспавнился ли вознесенный монолит 4) Если нет, то заспавнить. 5) Брек import("WXPScarUtil.scar") import("WXPScarUtil.scar") import("WCUtil.scar") function necron_OnInit() Dsp_fix = {playerID, vars_list = { "necron_restored_monolith_squad", "monolith", "addon_necron_hq_3",}} Rule_AddInterval(check_Dsp,1) end Scar_AddInit(necron_OnInit) function check_Dsp() local playerCount = World_GetPlayerCount() for i = 1, playerCount do Dsp_fix.playerID[i] = World_GetPlayerAt(i-1) if Player_GetRaceName(Dsp_fix.playerID[i]) = "necron_race" then if Entity_ContainsAddOn("monolith", "addon_necron_hq3") = true then[/codebox] Я сломался на 3 и 4 пунктах. Я нашел функцию возврата количества деспавнутых сквадов и в теории можно через нее сделать и через группы. Но может есть способ через название? Подскажите как лучше сделать :- Изменено 10 апреля, 2021 пользователем PolTorta 0 Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
VenerateTheImmortalLenin Опубликовано 19 апреля, 2021 Жалоба Поделиться Опубликовано 19 апреля, 2021 Я сломался на 3 и 4 пунктах. Я нашел функцию возврата количества деспавнутых сквадов и в теории можно через нее сделать и через группы. Но может есть способ через название? Подскажите как лучше сделать :- Оно? local playerID = World_GetPlayerAt(0) local playerSGroup = Player_GetSquads( playerID ) local lambda = function( sgroupid, itemindex, squadID ) if Squad_GetBlueprintName( squadID ) == "necron_restored_monolith_squad" then Squad_Spawn( squadID, Squad_GetPositionDeSpawned( squadID ) ) end end EGroup_ForEachAllOrAnyEx( playerSGroup, false, lambda, false, true ) 0 Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
VenerateTheImmortalLenin Опубликовано 19 апреля, 2021 Жалоба Поделиться Опубликовано 19 апреля, 2021 Возможно как то получить доход ресурсов игрока? 0 Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
Mister LicoO Опубликовано 16 июня, 2021 Жалоба Поделиться Опубликовано 16 июня, 2021 Можно через lua прописать(добавить), например цвет крови и ее количество у определенного юнита, когда он умрет и упадет на землю? или там только те параметры что есть, и ничего нового нельзя самому добавлять? Вот обычный стандартный lua файл юнита simvis_attributes = { selection_volume = 1, selection_ground = 1, vis_scale_min = 1.25, vis_scale_max = 1.25, -- Shadow Types: -- 0 = None -- 1 = blob (rotated by light dir) -- 2 = blob (rotated by object dir) -- 3 = shadow map -- 4 = stencil shadow volume shadow_type = 3, shadow_scale = 0.0475, occludee = 1, } simvis_attributes_strings = { shadow_texture = "Shadows/shadow_dir_blob-dot.tga" } 0 Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
VenerateTheImmortalLenin Опубликовано 25 июля, 2021 Жалоба Поделиться Опубликовано 25 июля, 2021 (изменено) Возможно ли в скриптах corsix получить данные файла по имени? Я иду по данным юнита и собираю список оружия которое у него есть, после я хочу пройтись по данным этого оружия. Примерно что я хочу function each_file(rgd) unit_weapon = rgd.GameData["combat_ext"]["hardpoints"]["hardpoint_01"]["weapon_table"]["weapon_01"]["weapon"] --беру название оружия rgd_weapon = ПолучитьДанныеИзФайла(unit_weapon) if( rgd_weapon.GameData["can_attack_air_units"] == true ) then print("Он может стрелять в самолёты!") end end Изменено 25 июля, 2021 пользователем VenerateTheImmortalLenin 0 Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.