Перейти к содержанию
⚠️ Обновление форума - Feedback ⚠️ ×

LUA-скриптинг. Помогите разобратьса.


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

Здравствуйте.

Вот часть скрипта из задачи по захвату стратегических позиций.

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, - это получается внутренния команда движка? Хотелось бы узнать весь список.

Изменено пользователем jONES
Ссылка на комментарий
Поделиться на другие сайты

 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 - значение в ней. Названия произвольные, так захотелось автору скрипта, но из названий примерно понятно что для чего.

На остальные вопросы не вижу смысла отвечать, т.к. это базовый синтаксис языка. Изменено пользователем jONES
Ссылка на комментарий
Поделиться на другие сайты

Не знаю 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, чтобы знать, зачем ей эти значения.

Ссылка на комментарий
Поделиться на другие сайты

Значит мне для получения информации по интересующему вопросу, нужно обращатся в "вопрос-ответ" ? Окей, я не знал.

Ну да, я вообще в этом новичок. Понимаю, у вас горит от "таких" мододелов, но у меня хорошая цель и постараюсь ее достичь.

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

Спасибо, SF_elamaunt, за разъяснения также. :)

П.с.: Ожидал негатива со стороны олдов. Видимо уже все сгорели от новичков. =)

Спасибо.

Ссылка на комментарий
Поделиться на другие сайты

Значит мне для получения информации по интересующему вопросу, нужно обращатся в "вопрос-ответ" ? Окей, я не знал.

Спасибо.

Вообще - да.

Но по lua - пиши здесь.

Изменено пользователем jONES
Ссылка на комментарий
Поделиться на другие сайты

Вообще - да.

Но по lua - пиши здесь.

Раз Джонс фактически открыл тут тему по скриптингу DoW, то тогда прямо в стартер этой темы надо разместить архивчик с общеизвестными доками по scar- и AI-коду. Без них эта тема смысла вообще не имеет. Для начала все сюда пишущие должны ознакомиться с официальной документацией. Без неё разговоры тут беспредметны. И прямо в стартере надо указать эту рекомендацию -- прочтите сначала доку, прежде чем писать сюда. А дока по scar-коду, между прочим, очень хорошая. По AI-коду хуже, но разобраться в ней тоже труда особого не составляет... для тех, кому программирование не тёмный лес конечно... Другим людям сюда писать смысла просто нет. Тема ну ОЧ-ЧЕНЬ специфическая и не самая простая. Но я только за буду, если найдутся люди, которые в этой теме захотят просветиться и будут иметь реальный неподдельный интерес. Сейчас таких людей в Природе очень мало...

Общее замечание. Разобраться в скриптовых языках DoW-движка не сложнее, чем разобраться в таком например языке программирования, как Паскаль. Если вы знаете Паскаль или Си, то вы фактически готовый спец, чтобы до кучи разобраться в скриптовом языке для DoW. Флаг вам в руки, товарищи. :) ...А бронепоезд навстречу к вам сам прибежит... ;)

Ссылка на комментарий
Поделиться на другие сайты

Если честно, я не понял о каких документациях говорите.

Покопался в папках 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!". Этого не происходит. Почему? Забыл что-то добавить?

...Кажется это не исполняется через "задачи"?..

Изменено пользователем Yahlo
Ссылка на комментарий
Поделиться на другие сайты

Если честно, я не понял о каких документациях говорите.

Вот смотри тут после установки DoW-мод-тулзов:

q5R2bl4Y0aw.jpg

Два самых интересных файла там это те, что отмечены на скрине выше: "function_list.htm" и "function_list_ai.htm". Первое -- дока по scar-коду, второе -- дока по AI-коду.

Я скопировал код в свой objective.scar и исполняю его через задачи. (Файл работает (инициируется), т. к. уже копировал туда пример с задачей и она отобразилась в игре, но криво)

Если правильно понимаю, то каждый интервал в консоль будет отправляться сообщение "Hello World!". Этого не происходит. Почему? Забыл что-то добавить?

Вопрос лишь в том, через какой механизм ты этот код запускаешь. Есть разные способы запустить код в игре. Ты нам тут так толком и не раскрыл "великую тайну", как именно ты пытался запустить этот код. ;) Какие ещё такие "задачи" ты имел ввиду? Можно scar-код запускать через специальный винкондишен например, а можно прямым импортом в один из стандартных скар-файлов ДоВ. Так каким именно методом ты воспользовался? ;) Код твой должен работать нормально, если ты его правильно запустишь.

Ссылка на комментарий
Поделиться на другие сайты

  • 5 месяцев спустя...

Приветствую всех любителей DOW и просто людей читающих данный пост!

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

Заранее приношу прошу прощения, если я ошибся темой для поста или допустил любую другую ошибку в оформлении поста!

Вступление: В DOW я играю уже довольно давно, полностью прошел оригинал и аддоны к нему. И последнее время, я всячески пытаюсь улучшить кампанию Soulstorm, хочу сделать ее такой, какой я ее вижу своим взглядом. Но одна вещь не дает мне покоя..

Сам вопрос: Я хочу в кампанию для игрока на обычные провинции добавить союзного бота. Если скажете, что уже существует такая модификация, то я соглашусь, но там реализация немного хромает как мне кажется. В том моде союзный бот добавляется при условии, что: если игрок нападает на провинцию бота и если военная мощь провинции больше 4 то добавляется союзный бот и игроку и боту(итого получается режим 2х2). Но я хочу сделать подобное и для игрока, то есть: если бот нападает на провинцию игрока и если военная мощь провинции игрока больше 4 то на сторону игрока добавляется союзный бот. Если отредактировать файл settings*.ai то это не решит проблему. Союзный бот у игрока будет добавляться только на вражеской провинции. Поэтому я подумал, что можно это реализовать скриптово, и поэтому пишу в данную тему. Друзья, прошу вашей помощи, подскажите или хотя бы направьте в нужное русло. Буду бесконечно благодарен вам! Спасибо!

Ссылка на комментарий
Поделиться на другие сайты

  • 4 месяца спустя...
Можно как то заставить отряды мгновенно получать оружие/пополнение не редактируя баланс? Думал сделать через setsimrate( float ), но она крашит игру если вызывать из скрипта карты.

Выглядит норм!

По вопросу: Есть модификаторы на скорость реинфорса, и другие разные полезные. Через скрипт карты (или условие победы) их надо применить на всех игроков.

Я хочу пофиксить невидимый Монолит.

Так как он есть юнит, сквад и здание, хочу попробовать на 2 тире некронов, вместо призыва 3-его тира здания, призвать его как юнит, а здание заставить самоуничтожиться или сделать призрачным.

Уничтожив здание - проиграешь по условию победы "Destroy HQ". То есть это условие надо будет переписать под твои изменения.

Я хочу пофиксить невидимый Монолит.
Опиши, в чем эта проблема? Изменено пользователем jONES
Ссылка на комментарий
Поделиться на другие сайты

По вопросу: Есть модификаторы на скорость реинфорса, и другие разные полезные. Через скрипт карты (или условие победы) их надо применить на всех игроков.

Спустя 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)Мгновенная выдача оружия, сержанта отрядам

Изменено пользователем jONES
Ссылка на комментарий
Поделиться на другие сайты

Есть еще 3 проблемы которые я не могу решить(

1)Мне нужно сохранить состояние отряда, чтобы в будущем я мог его восстановить

2)Нужно удалить требования оружия к зданиям, пока в голову приходит создать все типы зданий и сделать их невидимыми, но как я не знаю

3)Мгновенная выдача оружия, сержанта отрядам

Теперь ты расскажи, чего вообще хочешь добиться? )

Возможно тебе и не надо ничего хранить, удалять, воссоздавать? Возможно тебе просто надо отряду сделать _despawn, а потом обратно _spawn ?

Изменено пользователем jONES
Ссылка на комментарий
Поделиться на другие сайты

Делаю аналог карты

Там перед стартом сохраняется состояние арены и в конце восстанавливается.

Возможно тебе просто надо отряду сделать _despawn, а потом обратно _spawn ?

Если отряд можно было бы дублировать, то один можно деспавнить на момент когда придется восстановить а второй отправить в бой

Изменено пользователем VenerateTheImmortalLenin
Ссылка на комментарий
Поделиться на другие сайты

2)Нужно удалить требования оружия к зданиям, пока в голову приходит создать все типы зданий и сделать их невидимыми, но как я не знаю

3)Мгновенная выдача оружия, сержанта отрядам

ответ

Use Squad_ForceUpgradeWeapons to force all troops in a squad to upgrade their weapons regardless of requirments.

---------

Но тут требуется имя оружия которое я не могу нигде взять, ведь нету функции ДатьСписокВозможногоОружияОтряда().

Можно было бы хранить массив из имен всего возможного оружия в игре, и циклом проходить имеет ли отряд его. Но там аж 900 возможного оружия, не хотелось бы иметь такой огромный цикл.

Чтобы не делать цикл по 900 позициям, надо "всего лишь" создать двухуровневые таблицы, на первом уровне - список всех сквадов, на втором - всего доступного оружия для этих сквадов.

Корсикс Мод Студия - поддерживает выполнение lua скриптов, так что надо программно пройтись по списку сквадов, получить список составляющих юнитов, из него - список доступных оружий.

Потом сформировать LUA файл с таблицами из полученных данных, эти таблицы использовать в сценарии карты

Делаю аналог карты

Идея интересная, было бы круто, если бы в дов-варианте отряды не только перестреливались, но ещё и абилки использовали

Тогда потребуется и табличка с абилками!

Изменено пользователем jONES
Ссылка на комментарий
Поделиться на другие сайты

Чтобы не делать цикл по 900 позициям, надо "всего лишь" создать двухуровневые таблицы, на первом уровне - список всех сквадов, на втором - всего доступного

Это то что я не хотел делать, но выбора видимо нет.

Идея интересная, было бы круто, если бы в дов-варианте отряды не только перестреливались, но ещё и абилки использовали.

А если включить Cpu он начнет сам абилки применять?

Ссылка на комментарий
Поделиться на другие сайты

А если включить Cpu он начнет сам абилки применять?

Всё конечно возможно... Но не факт. Возможно захочет отойти к позиции HQ и перегруппироваться.

Изменено пользователем jONES
Ссылка на комментарий
Поделиться на другие сайты

Можно как-то вызвать setsimrate(float) из скрипта карты? Если посмотреть в консоль то видно что скрипт карты не знает о этой функции. Может какой файл нужно подключить?

mymymym.gif

Ссылка на комментарий
Поделиться на другие сайты

Можно как-то вызвать setsimrate(float) из скрипта карты? Если посмотреть в консоль то видно что скрипт карты не знает о этой функции. Может какой файл нужно подключить?

mymymym.gif

Подобные функции работают только в -dev режиме, когда игра пишет дополнительные логи на диск. -dev - это параметр запуска игры, добавляется в батник или в ярлык

Ссылка на комментарий
Поделиться на другие сайты

План такой:

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 пунктах. Я нашел функцию возврата количества деспавнутых сквадов и в теории можно через нее сделать и через группы. Но может есть способ через название?

Подскажите как лучше сделать :-

Изменено пользователем PolTorta
Ссылка на комментарий
Поделиться на другие сайты

  • 2 недели спустя...
Я сломался на 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 )

Ссылка на комментарий
Поделиться на другие сайты

  • 1 месяц спустя...

Можно через 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"

}

Ссылка на комментарий
Поделиться на другие сайты

  • 1 месяц спустя...

Возможно ли в скриптах 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

Изменено пользователем VenerateTheImmortalLenin
Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
×
×
  • Создать...