|
|
|
Канал X4: Foundations »
Модовый и скриптовый отсек X4: Foundations: «Ковыряем движок и всё такое» |
|
|
egornov.ivan
-36 EGP Репутация: -5 Сообщения: 61 Заблокирован Откуда: Блинолопатная скотоублюдия Зарегистрирован: 26.04.2017
 |
|
HikeR : |
операция конкатенации строк очень затратная
|
Это только в Lua или во всех интерпретируемых языках? Даже не представляю как без регулярок и склейки строк жить
|
|
|
HikeR
145 EGP
   Рейтинг канала: 2(24) Репутация: 30 Сообщения: 886 Откуда: Великий Новгород Зарегистрирован: 20.09.2005
 |
|
везде по разному, но в Lua так. а жить просто, в данном случае даже очень:
Код: |
- icon = string.format("\027#FF%02x%02x%02x#", iconcolor.r, iconcolor.g, iconcolor.b) .. "\027[workshop_error]\027X"
+ icon = string.format("\027#FF%02x%02x%02x#\027[workshop_error]\027X", iconcolor.r, iconcolor.g, iconcolor.b) |
когда в XR с каким-то патчем добавили исходники всех Lua-скриптов я даже пару раз пробовал писать им по поводу оптимизаций. отмазались типа слишком незаметная экономия памяти получается на общем фоне и мол UI у нас работает в отдельном потоке, хоть Войну и Мир каждый кадр склеивай.
|
|
|
eliseeff
268 EGP
      Рейтинг канала: 2(21) Репутация: 5 Сообщения: 932
Зарегистрирован: 07.03.2015
 |
|
HikeR : |
везде по разному, но в Lua так. а жить просто, в данном случае даже очень:
Код: |
- icon = string.format("\027#FF%02x%02x%02x#", iconcolor.r, iconcolor.g, iconcolor.b) .. "\027[workshop_error]\027X"
+ icon = string.format("\027#FF%02x%02x%02x#\027[workshop_error]\027X", iconcolor.r, iconcolor.g, iconcolor.b) |
когда в XR с каким-то патчем добавили исходники всех Lua-скриптов я даже пару раз пробовал писать им по поводу оптимизаций. отмазались типа слишком незаметная экономия памяти получается на общем фоне и мол UI у нас работает в отдельном потоке, хоть Войну и Мир каждый кадр склеивай.
|
Честно сказать, очень сильно сомневаюсь, что string.format "легче" конкатенации.
Мало того, не вижу какой-то проблемы в использовании обычной конкатенации средствами луа, поскольку копейки...
Но если уж такая нужда сэкономить две копейки, можно попробовать через фуфайку использовать сишную конкатенацию.
|
|
|
HikeR
145 EGP
   Рейтинг канала: 2(24) Репутация: 30 Сообщения: 886 Откуда: Великий Новгород Зарегистрирован: 20.09.2005
 |
|
string.format в данном случае уже есть, он использует сишную реализацию и не вызывает срабатывание сборки мусора при каждом выходе из локальной области видимости. там хоть и luajit, но мусор-то никуда не девается, а выделение/очистка памяти никогда и нигде не была лёгкой и незатратной процедурой. из таких вот "копеек" складывается нехилый такой рубль.
а ещё немцы любят делать так, как будто букварь не для них был написан.
Код: |
for i = 1, iteration + 1 do
text = " " .. text
end |
да и в бесплатном (в отличии от букваря) мануале самой Lua имеется самый универсальный способ
Код: |
-- вместо дикого
local a = a .. b .. " " .. c .. func(d)
-- нужно пользовать
local a = table.concat(a, b, " ", c, func(d)) |
может они и доки в своём MD, который, может быть, вылизан до совершенства за многие лета, но в Lua им точно стоит подтянуться. может тогда не будут глаза, как говорится, вытекать от таких вот перлов
Код: |
local balance = GetPlayerMoney()
if fee then
balance = GetPlayerMoney() - fee
end |
как будто за время выполнения проверки условия баланс может измениться.
p.s.
просто для души: немецкий вариант проверки a<b
Код: |
if (printedamount / 1000) < 1 then |
привет, тройное приведение к float.
Последний раз редактировалось: HikeR (03:26 02-12-2018), всего редактировалось 2 раз(а) |
|
|
eliseeff
268 EGP
      Рейтинг канала: 2(21) Репутация: 5 Сообщения: 932
Зарегистрирован: 07.03.2015
 |
|
HikeR : |
string.format в данном случае уже есть
|
Ну да, с этим согласен...
HikeR : |
может они и доки в своём MD, который, может быть, вылизан до совершенства за многие лета
|
Да тоже хватает перлов...
HikeR : |
Код: |
local balance = GetPlayerMoney()
if fee then
balance = GetPlayerMoney() - fee
end |
как будто за время выполнения проверки условия баланс может измениться.
|
А откуда кусочек? Хотелось бы глянуть на эту хохму...
Мне вот еще понравилось в другом месте:
Код: |
-- Get the list of suitable ships
if menu.mode == "wareexchange" then
menu.ships = { GetTradeShipData(menu.modeparam[1]) }
else
menu.ships = GetTradeShipList()
for i = #menu.ships, 1, -1 do
local ship = menu.ships[i]
local commander = GetCommander(ship.shipid)
if IsSameComponent(ship.shipid, menu.playership) then
table.remove(menu.ships, i)
elseif commander and not IsSameComponent(commander, menu.playership) then
table.remove(menu.ships, i)
elseif GetBuildAnchor(ship.shipid) then
table.remove(menu.ships, i)
elseif #GetTransportUnitMacros(GetComponentData(ship.shipid, "macro")) == 0 then
table.remove(menu.ships, i)
end
end
end
-- Find the ship
if menu.ships and #menu.ships ~= 0 then
for i, s in ipairs(menu.ships) do
if IsSameComponent(s.shipid, menu.shipid) then
menu.ship = s
end
end
end |
Кто это городил, по-моему, вообще не понимал, что делает.
Вот на кой ляд сначала отсеивать "неподходящие" корабли, а потом делать еще один цикл, чтобы среди оставшихся найти "нужный"? Надо просто сразу искать нужный. А когда он найден - брэк, чтоб не перебирать оставшиеся.
Да, да, у меня возник тот же логичный вопрос: может быть, возможен случай, что "нужный" корабль может оказаться "неподходящим".
Так нет. Он обязан найтись по-любому, иначе меню выдаст ошибку и не сможет быть построено.
На сей перл можно полюбоваться в menu_trading_transaction.lua
В своем моде я этот кусок заменил на
Код: |
if menu.mode == "wareexchange" then
menu.ship = GetTradeShipData(menu.modeparam[1])
else
menu.ships = GetTradeShipList()
for _, ship in ipairs(menu.ships) do
if IsSameComponent(ship.shipid, menu.shipid) then
menu.ship = ship
break
end
end
end |
....................................................................................................................................................
Кстати, мало того, перед первым куском там еще и вот это:
Код: |
if #menu.trades ~= 0 then
for i, trade in ipairs(menu.trades) do
if IsSameTrade(trade.id, menu.tradeid) then
menu.trade = trade
end
end
end |
Это, конечно, не так ржачно, но ЗАЧЕМ заканчивать цикл, когда нужный результат найден? Брэк поставить религия не позволяет?
|
|
|
HikeR
145 EGP
   Рейтинг канала: 2(24) Репутация: 30 Сообщения: 886 Откуда: Великий Новгород Зарегистрирован: 20.09.2005
 |
|
eliseeff : |
А откуда кусочек?
|
menu_map.lua:6829
>может быть, возможен случай, что "нужный" корабль может оказаться "неподходящим"... В своем моде я этот кусок заменил на
я бы в целях отладки оставил оба варианта, сравнивал результат и в случае чего писал в лог или там к названию корабля крякозяблу добавил. всё таки там сначала идёт обратный цикл (который, правда, смотрится так, что хотели использовать множественный if, а воткнули elseif). с другой стороны, удаление элементов так и делается,
отсутствие break может быть нужно для нахождения последнего подходящего элемента. хотя для этого можно использовать как раз таки обратный цикл.
а так даже в этом "абзаце" имеются два разных программных стиля итерирования таблиц, медленный и печальный c ipairs() и расово правильный
Код: |
for i = #menu.ships, 1, -1 do
local ship = menu.ships[i]
--
end |
грустно всё это.
|
|
|
Molodoy
65 EGP
 Репутация: 0 Сообщения: 116 Откуда: Видное Зарегистрирован: 22.12.2004
 |
|
Достал из 9.cat файл 0001-L007.xml.Немного перевел на русский язык миссию.Кинул его в папку t.Но игра его не подхватывает.Что я не так делаю то ? )
_________________ МегаКосмонавт |
|
|
HikeR
145 EGP
   Рейтинг канала: 2(24) Репутация: 30 Сообщения: 886 Откуда: Великий Новгород Зарегистрирован: 20.09.2005
 |
|
уже взятые задания вроде как прописываются в сейвах. а также доступные задания, предложения, скидки и ещё много чего. типа вот сейв сразу после начала новой игры:
Код: |
<offer id="238686" component="[0xd87f]" distance="50000" actor="[0x68e82]" name="Опоздание на встречу!" description="Я опаздываю на важную встречу! Мне срочно нужен корабль!" faction="civilian" type="transport" level="medium" rewardtext="Высокомощные катализаторы">
<locations>
<location component="[0xd87f]" connection="connectionui"/>
</locations>
<briefing>
<objective step="1" type="pickup_person" text="Дэнила Эррис"/>
<objective step="2" type="flyto" text="ТЕЛ Фабрика деталей корпуса I"/>
</briefing>
</offer> |
Последний раз редактировалось: HikeR (11:43 02-12-2018), всего редактировалось 1 раз |
|
|
HikeR
145 EGP
   Рейтинг канала: 2(24) Репутация: 30 Сообщения: 886 Откуда: Великий Новгород Зарегистрирован: 20.09.2005
 |
|
как подписать свой сейв с многаденег
во вложении готовый ключ для подписи. нужны будут утилиты openssl и base64.
1) получаем открытый ключ из закрытого для проверки:
Код: |
$ openssl rsa -in private.key.nopass -pubout > public.key |
2) распаковываем сейв, вырезаем с самого конца содержимое тегов <signature>...</signature> (это и есть подпись, сохраняем её в signature.b64), сами теги и содержимое удаляем, сохраняем файл.
3) раскодируем и проверяем сохранение и подпись:
Код: |
$ base64 -d signature.b64 > save.sig
$ openssl dgst -sha512 -verify public.key -signature save.sig save.xml
Verified OK
|
4) если всё OK, идём дальше. редактируем, сохраняем сейв, подписываем его и конвертируем в base64 полученную подпись:
Код: |
$ openssl dgst -sha512 -sign private.key.nopass -out new_save.sig save.xml
$ base64 -w0 new_save.sig > new_save.b64 |
5) содержимое файла new_save.b64 вставляем обратно в сохранение между тегами <signature>...</signature> в конце файла прямо перед перед последним тегом </savegame>
6) профит
|
|
|
alexalsp
521 EGP
      Рейтинг канала: 5(215) Репутация: 56 Сообщения: 4560
Зарегистрирован: 12.08.2014
 |
|
Molodoy : |
Достал из 9.cat файл 0001-L007.xml.Немного перевел на русский язык миссию.Кинул его в папку t.Но игра его не подхватывает.Что я не так делаю то ? )
|
Для того что бы ответить на вопрос, нужно показать как вы это делали и куда пихали
_________________ CMDR: Fallout(EG)
ED - если застряли: https://discord.gg/w56kPWH
Пользуйте мои моды как хотите.... |
|
|
eliseeff
268 EGP
      Рейтинг канала: 2(21) Репутация: 5 Сообщения: 932
Зарегистрирован: 07.03.2015
 |
|
Molodoy : |
Достал из 9.cat файл 0001-L007.xml.Немного перевел на русский язык миссию.Кинул его в папку t.Но игра его не подхватывает.Что я не так делаю то ? )
|
Не советую пихать целиком текстовик в папку t. Если и подхватывается, то в игре вскоре тексты начинают мигать гирляндой.
Делайте дифф и юзайте extensions.
добавлено спустя 33 минуты:
HikeR : |
я бы в целях отладки оставил оба варианта
|
Ну так я ж не сразу код заменил...
HikeR : |
отсутствие break может быть нужно для нахождения последнего подходящего элемента.
|
В данном случае цикл ищет один конкретный компонент.
Последний раз редактировалось: eliseeff (17:02 02-12-2018), всего редактировалось 1 раз |
|
|
Molodoy
65 EGP
 Репутация: 0 Сообщения: 116 Откуда: Видное Зарегистрирован: 22.12.2004
 |
|
eliseeff : |
Делайте дифф и юзайте extensions.
|
Эмм . Про дифф можно поподробнее или примем
_________________ МегаКосмонавт |
|
|
HikeR
145 EGP
   Рейтинг канала: 2(24) Репутация: 30 Сообщения: 886 Откуда: Великий Новгород Зарегистрирован: 20.09.2005
 |
|
оставляете в файле только изменённые строки и делов.
Код: |
<page id="1001" title="Interface" descr="Text for interface and menus" voice="no">
<!-- t id="8909">An error occurred</t -->
<t id="8909">Произошла ошибка</t>
</page> |
p.s.
под *никсы есть библиотека libxmldiff, работает по RFC5261 и также может генерить патчи по этому RFC.
по вышеприведенному примеру работает так:
Код: |
$ xml-diff -f 0001-L007.xml.ori -t 0001-L007.xml -o patch.xml
$ cat patch.xml
<?xml version="1.0"?>
<x:changes xmlns:x="urn:xml-changes">
<x:replace sel="*/*[1]/*[1738]/text()">Произошла ошибка</x:replace></x:changes>
|
Последний раз редактировалось: HikeR (17:45 02-12-2018), всего редактировалось 1 раз |
|
|
egornov.ivan
-36 EGP Репутация: -5 Сообщения: 61 Заблокирован Откуда: Блинолопатная скотоублюдия Зарегистрирован: 26.04.2017
 |
|
На некоторых сайтах уже ругают качество "русека", что там разрабы говорят на эту тему? Планируют подгонять текст под интерфейс или интерфейс под текст?
|
|
|
IvanMosc
50 EGP
 Репутация: -8 Сообщения: 199
Зарегистрирован: 22.05.2013
 |
|
разрабы говорят что "русек" в бете... ругаться рано, разве нет?
|
|
|
eliseeff
268 EGP
      Рейтинг канала: 2(21) Репутация: 5 Сообщения: 932
Зарегистрирован: 07.03.2015
 |
|
egornov.ivan : |
На некоторых сайтах уже ругают качество "русека", что там разрабы говорят на эту тему? Планируют подгонять текст под интерфейс или интерфейс под текст?
|
Будет неплохо уяснить две вещи:
1. Я не имею права говорить от лица разработчиков.
2. Я не имею права оглашать информацию, которая не была публично оглашена самими разработчиками.
Ну а "ругают качество" - это слишком расплывчато. Без конкретики мне просто жаль время тратить на перелив из пустого в порожнее.
Подгонять текст под интерфейс - вы вообще представляете кол-во работы даже без каких-то там "подгонов"?
Народ бузит - понимаю... Но есть вещи реальные, а есть - НЕреальные. Сделать перевод за три недели - НЕреально. Работа идет. Бузить и кидаться какахами - что ж, если кому-то так легче, чем просто потерпеть, пусть будет так...
|
|
|
egornov.ivan
-36 EGP Репутация: -5 Сообщения: 61 Заблокирован Откуда: Блинолопатная скотоублюдия Зарегистрирован: 26.04.2017
 |
|
eliseeff : |
Поэтому оставьте ваши поучения себе.
|
Чтож вы так все воспринимаете в штыки? HikeR просто предложил сменить собор на базар с комиттерами
|
|
|
DNA78
429 EGP
     Репутация: 73 Сообщения: 1270 Откуда: Кыргызстан Зарегистрирован: 12.11.2008
 |
|
Ребята это конечно всё хорошо, но игра начинает притягивать и отлепиться от неё всё трудней, а по сему давайте о насущном - собственно о самом модинге. У меня появилась одна мысля, а именно создание горячей клавиши со следующим функционалом, т.е. при нажатии на клавишу открывалась бы Карта зоны, но с максимальным отдалением зума, в следствии чего горячую клавишу можно назвать Карта вселенной.
А за одно и поднатаскаете так сказать новичков
_________________ Очевидное-невероятное |
|
|
Арманкессилон
1740 EGP
             Репутация: 346 Сообщения: 13122 Откуда: Ставрополь Зарегистрирован: 16.08.2007
 |
|
HikeR, eliseeff, переносите ваш спор в личку.
_________________ Все астероиды не пересчитать! |
|
|
DNA78
429 EGP
     Репутация: 73 Сообщения: 1270 Откуда: Кыргызстан Зарегистрирован: 12.11.2008
 |
|
eliseeff : |
Не знаю как дальше пойдет, но судя по хребту, с горячими клавишами для моддинга все пока очень плохо.
Инпут_экшнс все жестко прописаны в экзешнике. Юзеру их добавлять нельзя. Биндинг для файлов модов тоже не поддерживается.
|
Если такое положение дел с моддингом не изменится, то делать в этой игре особо нечего будет, за исключением пары-тройки месяцев на поиграть.
И как у них язык поворачивается называть эту игру Х4 без такой составляющей как моддинг в Х3
...уровень хайпа падает
_________________ Очевидное-невероятное |
|
|
|
|
|
Канал X4: Foundations ->
Модовый и скриптовый отсек X4: Foundations: «Ковыряем движок и всё такое» |
|