| 
		 | 
		 | 
	
	| 
 Канал 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
   524 EGP
        Рейтинг канала: 5(215) Репутация: 56 Сообщения: 4630 
  Зарегистрирован: 12.08.2014
      | 
         | 
		
	  | Molodoy : | 
	 
	
	  | 
Достал из 9.cat файл 0001-L007.xml.Немного перевел на русский язык миссию.Кинул его в папку t.Но игра его не подхватывает.Что я не так делаю то ? )
 | 
	 
 
 
 
Для того что бы ответить на вопрос, нужно показать как вы это делали и куда пихали 
        	 _________________ CMDR: Fallout(EG)
 
ED - если застряли: https://discord.gg/yZqwPbJaCq
 
 
Пользуйте мои моды как хотите....  | 
		
		
		| 
		
		 | 
        
     | 
	
		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
   433 EGP
       Репутация: 73 Сообщения: 1279  Откуда: Кыргызстан Зарегистрирован: 12.11.2008
      | 
         | 
		Ребята это конечно всё хорошо, но игра начинает притягивать и отлепиться от неё всё трудней, а по сему давайте о насущном - собственно о самом модинге. У меня появилась одна мысля, а именно создание горячей клавиши со следующим функционалом, т.е. при нажатии на клавишу открывалась бы Карта зоны, но с максимальным отдалением зума, в следствии чего горячую клавишу можно назвать Карта вселенной.
 
А за одно и поднатаскаете так сказать новичков    
        	 _________________ Очевидное-невероятное  | 
		
		
		| 
		
		 | 
        
     | 
	
		Арманкессилон
   1758 EGP
               Репутация: 348 Сообщения: 13230  Откуда: Ставрополь Зарегистрирован: 16.08.2007
       | 
         | 
		HikeR, eliseeff, переносите ваш спор в личку. 
        	 _________________ Все астероиды не пересчитать!  | 
		
		
		| 
		
		 | 
        
     | 
	
		DNA78
   433 EGP
       Репутация: 73 Сообщения: 1279  Откуда: Кыргызстан Зарегистрирован: 12.11.2008
      | 
         | 
		
	  | eliseeff : | 
	 
	
	  
Не знаю как дальше пойдет, но судя по хребту, с горячими клавишами для моддинга все пока очень плохо. 
 
Инпут_экшнс все жестко прописаны в экзешнике. Юзеру их добавлять нельзя. Биндинг для файлов модов тоже не поддерживается. 
 | 
	 
 
 
Если такое положение дел с моддингом не изменится, то делать в этой игре особо нечего будет, за исключением пары-тройки месяцев на поиграть.
 
И как у них язык поворачивается называть эту игру Х4 без такой составляющей как моддинг в Х3    
 
 
...уровень хайпа падает    
        	 _________________ Очевидное-невероятное  | 
		
		
		| 
		
		 | 
        
     | 
	 | 
	
		| 
		
		 | 
	
     | 
	| 
	  Канал X4: Foundations ->
	  Модовый и скриптовый отсек X4: Foundations: «Ковыряем движок и всё такое» | 
	
		| 
		
		 |