Factorio logo

Factorio обновилась до экспериментальной 0.14.9!
Скачать Factorio 0.14.9 можно на нашем сайте.

Список изменений версии 0.14.6 — 0.14.9(Changelog):

На Английском языке (оригинал)

Factorio logo

Экспериментальная версия Factorio обновилась до 0.14.0!
Скачать Factorio 0.14.0 можно на нашем сайте.

Список изменений версии 0.14.0(Changelog):

На Английском языке (оригинал)

0.14.0
Особенности:
Исправлен мультиплеер
1) Внутренняя надежность и стабильность.
2) Игрокам не придется ждать других клиентов, чтобы скачать и загрузить игру.
3) Снижение сетевого трафика.
4) Возможность открыть меню и выйти из игры во время подключения к игре.
5) Сервер не остановливает/замедляет игру, когда какой-нибудь игрок слишком медленный(лагает), отключается или сохраняет игру дольше, чем сервер.
6) Игроков автоматически выкидывает из игры после 3 ошибок синхронизации.
7) Настройки скорости загрузки.

Добавлена команда «/team», для отправки сообщения всем игрокам с одной команды.

Незначительные особенности:
При выборе фильтров инвентаря — фильтр автоматически устанавливается на курсор если таковые имеются(?).

Изменения:
Отключена возможность загрузки сохранений старых версий (До 0.11.0 (можно использовать 0.11.22, чтобы загрузить старые сейвы и сохранить их заново).
Убрана опция, для включения/отключения скрытия задержки(?), теперь она всегда включена у клиентов (и отключена на сервере).

Исправления:
Factorio больше не вылетает при отключении устройства Direct3D из-за блокировки экрана или перехода в режим сна.

Моды.
Добавлена сетка оборудования для: автомобилей, танков, локомотивов и грузовых вагонов.
Изменение категорий оборудования и сетки оборудования*, которые определяют, какое оборудование может быть установлено в эту сетку*.
Changed equipment grids to work as protoypes: defined and referenced by things that use them.(???)

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

Скрипты:
— Fixed LuaSurface::map_gen_settings.shift not working.
— Fixed chunk positions would get improperly rounded instead of floored.
— Added LuaConstantCombinatorControlBehavior::enabled read/write.
— Added upper limit to resolution parameter of LuaGameScript::take_screenshot function. Limit for width and height is 16384.
— Added LuaStyle::visible read/write.


Всем привет с вами Naikoraptor.

Сегодня мы поговорим о

  • Создании своей технологии
  • Системе migrations
  • О  слоях игры ( Collision )

(я специально затягиваю и откладываю entities на потом, ибо свои постройки имеют столько свойств что я боюсь что-либо попросту забыть, под них я выделю отдельный урок)

И так начнем:

Создании своей технологии

Для начала подумаем, для каких целей она нам нужна? Мы будем Разблокировать рецепты? Или улучшать что либо? Ведь технологии немного отличаются в этих случаях.

вот вам коды из API.

  • reload() — Эта функция позволяет перезагрузить изученную технологию на картах, полезно если вы внесли правки, а новую карту вам создавать не хочется.
  • forse = LuaForse — Какая сила применяет эту технологию (Игрок, строение, поротивник) эту строку пропускаем всегда, пока еще никто не нашел ей применения, да и впрочем бесполезна она, но любезный разработчик на всякий случай дал нам её.
  • name = string — Имя технологии
  • localised_name = string — Локализованное имя (Но ведь мы помним, что мы все делаем через locale.cfg?)
  • enabled = bool —  Строки блокировки на подобие строки в рецептах, в принципе ей не пользуются. Разве что разблокировать через скрипт
  • upgrade = bool — Является указание на то, улучшение это или нет
  • prerequisites = dictionary string → LuaTechnology  — Таблица технологий которые должны быть исследованы чтобы эта технология стала доступной для исследования
  • research_unit_count = uint — Какие и сколько баночек на 1 исследование
  • research_unit_energydouble — Сколько времени на 1 исследование.
  • order = string строка сортировки технологий

Теперь давайте сами попробуем сделать технологию нашим бочкам из прошлых примеров.

Для начала нужно «заблокирвоать» все наши рецепты у бочек, тоесть каждому рецепту добавляем строку: enabled = false либо enabled = "false" разницы никакой.

После этого создаем файл Tehnology.lua

В нем прописываем  data:extend({ })

Технологии как и все остальное прописываются в отдельных { },{ }, { }.

type = "technology",
name = "Bochka",
icon = "__base__/graphics/icons/fluid/empty-crude-oil-barrel.png", --[[ картинка технологии, и хоть в api про них ничего не сказано, но в игре их обязательно нужно указывать ]]
icon_size = 32, --[[ НЕ обязательно, но если картинку обрезает, указываем её размер (картинка всегда квадрат) ]]
effects = --[[Что будет делать Технология после исследования]]
{
{
type = "unlock-recipe",
recipe = "empty-barrel-M"
},
{
type = "unlock-recipe",
recipe = "fill-barrel"
},
{
type = "unlock-recipe",
recipe = "empty-barrel"
},
},
prerequisites = {},
unit =
{
count = 35, --Количество исследований
ingredients =
{
{"science-pack-1", 1} --[[ ресурс и количество, кстати чтобы не было ошибок я вам напомню что есть:
science-pack-1, science-pack-2,science-pack-3, alien-science-pack]]
},
time = 30 -- время одного исследования
}

И заходим в игру.1drGYQE

 

 

 

 

 

Технология работает, рецепты за ранее не доступны.

 

 

 

Migrations

По другому этот раздел можно назвать: «Обновления мода».

Ведь с первого раза не возможно сделать так, как хочется в итоге, верно? Поэтому часто может получаться так, что рецепты предметов будут меняться. Но как быть с теми картами где рецепты уже исследованы? Ведь там они останутся прежними хоть ты тресни (Игра исследованные технологии и рецепты сохраняет отдельно, для упрощения загрузки и экономии памяти).

 

Рассмотрим вполне реальную ситуацию: Когда мы поняли что баланс нарушен.

Допустим крафтить бочку для воды из 10 железа это дорого. Поэтому мы меняем в её рецепте на 9. Но зайдя на нашу карту на которой мы играем уже несколько Зилионов или бромилионов часов мы обнаруживаем что бочка все так-же крафтится из 10 железа. Мы думаем может мы что-то не так увидели, и открываем список технологий. Но там тоже указано то рецепт будет давать из 10 листов. Что-же нам делать?

Создаем в корне мода папку migrations.

Там создаем файл с «именем новой версии мода»

К примеру у меня сейчас он называется MyMod_0.1.1 Значит я создаю в папке файл MyMod_0.1.2.lua

Этот файл подключать не нужно!

Этот файл активируется тогда, и только тогда когда вы заходите на карту старой версии. Он Переписывает Эту карту под версию нашего мода и активирует файл.

Чаще всего в нем будем прописывать вот это:

for i, player in ipairs(game.players) do
player.force.reset_technologies()
player.force.reset_recipes()
end

Это обновляет все рецепты и все технологии.

Теперь заходим в info.json и там меняем с 0.1.1 на 0.1.2 и переименовываем папку мода таким же образом

Готово! Мод обновлен!

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

 

Слои игры ( Collision )

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

Например Слой воды и слой Строений. Ведь ни одно здание не может быть поставлено на воду верно?

Вот список слоев:

  • "ground-tile" - Слой перемещения персонажа (1-й слой)
  • "water-tile"  - Слой не доступный ля перемещения персонажа (0-й слой)
  • "resource-layer" - Слой Руд (3-й слой)
  • "floor-layer"    - Слой Бетона либо кирпичей (2-й слой)
  • "object-layer"   - Слой объектов (Высший 4-тый слой)
  • "player-layer"   - Слой персонажа (Высший 4-тый слой)

Заметили что 2 слоя находятся на 1-м уровне?  Слой персонажа не используется ничем кроме персонажа, Хотя он и эквивалентен слоям объектов.

Все это хотя и не особо важно, но дает простор для создания интересных штук для некоторых. Например когда я баловался с этими параметрами я создал нечто вроде Блоков «моста» которые ставяться на воду, но позволяют ставить поверх них что угодно. Или напрмиер я создал » рыбную ферму» которая ставиться только на воду.

Строки слоев есть у всех объектов и поверхностей (entities и tiles) Но думаю это уж желающие сами найдут


Привет опять, и сразу к сути, сегодня мы поговорим про:

  • Создание своего рецепта
  • Систематизацию предметов внутри игры и свои группы
  • Локализация игры

И в качестве бонуса (Решил опередить время ради одного человека, что написал в вк) :

  • Как отключить элементы обычной игры либо изменить их

Создание своего рецепта

Начну пожалуй с интересной особенности фактории. Помните в инвентаре персонажа список крафтов? Этот список имеет спецефическую особенность: «Указывать Рецепты по ссылке на предмет».

Не понятно? (А я уверен что не понятно).

Давайте объясню на примере нашей бочки. Пока у неё нет рецепта, она не видна в списке, Однако если мы откроем список предметов (например в сундуке запроса), то там она будет.

Но как только мы добавим нашей бочке хотя-бы 1 рецепт её получения, то она сразу же появится в списке в инвентаре (За исключением пары моментов, про них я расскажу чуть позднее).

Теперь перейдем к структуре рецептов, прописываются они так-же как и итемы, то есть в data:extend({ }) и в отдельных  { }, { }

 

Начинается рецепт с

type = "recipe",

А далее идут все так-же ключевые слова:

  • name = string — Имя рецепта (Лучше создавать имя рецепта идентичное с именем предмета,так проще )
  • category = string — Категории рецептов. Есть некоторые категории которые ограничивают возможность доступа машин или игрока к крафтам (это может быть категория «smelting», которая разрешает обработку предмета в печи, но запрещает его сборку, либо «oil-processing» которая разрешает крафт только в Нефте-перерабатывающем заводе, остальные стандартные категории можно найти в самих рецептах в  base, либо создать их самому но об этом в другой раз) 
  • energy_required = float — Время в секундах, необходимое для крафта (если пропустить сроку то автоматически будет указано 0,5)
  • ingredients = array of ingredients — Указать ингредиенты можно 2-мя способами, кратким и полным.

При кратком способе достаточно указать список предметов и их количество. Например

 

ingredients = {
{"iron_plate",5},
{"wood",10}
} --Тоесть тут мы требуем 5 Железа и 10 дерева на крафт.

 

Однако при кратком способе нельзя указывать жидкости ( к тому-же для этого нужна специальная категория)

Полный способ требует еще объявление типа ингредиента, то есть наша запись из прошлого примера будет выглядеть так:

 

ingredients = {
{type="item", name="iron_plate", amount=5},
{type="item", name="wood", amount=10}
},

 

 

Далее:

  • enabled = bool — Если эту строку не указывать, то рецепт будет доступен всем и сразу,  если указать false ,то тогда потребуется его разблокировать (например исследование либо скрипт).
  • result = string — Указывает результат после крафта (пример result = "iron_chest" )
  • result_count = int — указывает сколько итемов получится после крафта

Следующие строки работают как на итемы так и на рецепты, но о том зачем рецептам картинки я расскажу позже.

  • icon = string
  • group = string
  • subgroup = string
  • order = string

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

Строки result и result_count заменяются единой строкой схожей с полной записью ингредиентов,

пример:

results=
{
{type="fluid", name="heavy-oil", amount=3},
{type="fluid", name="light-oil", amount=3},
{type="fluid", name="petroleum-gas", amount=4}
},

 

А теперь я поделюсь с вами одной фишкой: Если вы хотите делать несколько предметов но устройство  позволяет вам делать только 1 на выходе, то можете делать его через категорию oil-procesing, но в ингредиенты и в выход указывать предметы не являющиеся жидкими.

А теперь давайте все проверим на практике:

Помните нашу бочку? Все что мы успели, так это создать её, но по Screenshot_16идее она должна переносить воду в более удобное место. Делать это мы будем так-же, как и разработчики поступали с бочками нефти (2 предмета и 2 крафта).

По этому Быстренько переходим в наш мод и создаем там вторую бочку (к примеру с капелькой на иконке)

Теперь В папке с бочкой создадим файл recipes.lua (Хотя при желании вы можете прям тут прописывать рецепты, как и итемы, но лучше все держать раздельным, это упросит вам ориентирование в моде)

Для начала создадим рецепт самой бочке. Не будем выдумывать велосипедов и укажем ей просто 10 железных листовScreenshot_19

data:extend({
{
type = "recipe",
name = "empty-barrel-M",
ingredients ={{"iron-plate",10}},
result="WaterB", --[[ Вобщето я советал вам создавать предмет и рецепт
с одинаковым именем, но кто я такой, что-бы свои советы слушать?]]
},
})

Кстати после появления рецепта наша бочка появилась в списке

Теперь дадим Бочке возможность брать в себя воду и отдавать назад, добавив 2 рецепта:

 

{
type = "recipe",
name = "fill-barrel",
category = "crafting-with-fluid",
subgroup = "barrel",
order = "b",
ingredients =
{
{type="fluid", name="water", amount=30},
{type="item", name="WaterB", amount=1},
},
results=
{
{type="item", name="WaterBF", amount=1}
}
},
{
type = "recipe",
name = "empty-barrel",
category = "crafting-with-fluid",
subgroup = "barrel",
order = "c",
icon = "__base__/graphics/icons/fluid/empty-crude-oil-barrel.png",
ingredients =
{
{type="item", name="WaterBF", amount=1}
},
results=
{
{type="fluid", name=water", amount=30},
{type="item", name="WaterB", amount=1}
}
},

 

Заходим в игру и проверяемScreenshot_20

 

 

 

 

 

 

 

Систематизация (Order, Group, Subgroup)

Чтобы проще представить о чем идет речь, вспомните сетку крафтов, Именно там отмечаются все предметы и их рецепты. Теперь давайте разберемся что и как работает.

У рецептов и предметов есть 3 строки систематизации, Это group, subgroup, order.

Теперь конкретика:

group отвечает за то в какой вкладке находится итем\рецепт.

subgroup говорит в какой строке будет находиться предмет

order отвечает какой он будет по порядку.

Удобно то что  group никто и никогда не использует, так как subgroup уже содержится в некоторой группе (Формально subgroup решает не номер строки а просто подгруппу, но на деле выходит просто разбиение на строки), сортировка выполняется по алфавиту — то есть с начало будет стоять предметы с order’ом » a » потом «aa» потом например «ab» потом «b», и даже если буква пропущена, то ничего страшного, он просто поставит их по алфавиту из возможных.

Разработчики в оригинальной игре настолько намудрили подписывая свои группы что гораздо проще создать свою группу и там уже спокойно создавать свою классификацию.

Именно этим сейчас и займемся:

Создаем файл group.lua

Пишем data:extend ({ })

И сразу запоминаем: type = "item-group"   и type = "item-subgroup"

 

Первый создаст вкладку, второй строку.

Давайте начнем с Группы:

{
type = "item-group",
name = "MyModItems",                            --Название для кода
icon = "__base__/graphics/icons/big-biter.png", -- Картинка (можете свою сделать)
inventory_order = "a",                          -- Сортировка в инвентаре (Будут первыми так как А первая буква :]
order = "d",                                    -- номер вкладки (4-тая )
},

И теперь под группа:

{
type = "item-subgroup",
name = "MyModItems-resourses", -- Имя для кода
group = "MyModItems", -- номер вкладки
order = "c", -- номер строки (3-тья)
},

 

Теперь давайте поменяем сортировку в наших бочкахBVgpqQW

в саб группу рецептов и предметов вписываем

MyModItems-resourses

а в Ордер его порядок (там уж сами как удобнее)

И конечно проверяем в игре (не забудьте подключить этот файл)

 

Локализация игры

Теперь осталось только добавить языков и наш мод фактически будет считаться готовым (хоть и добавляет он всего 1 бочку для переноса воды, но ведь это тоже мод )

Переходим в корневую папку Мода и Добавляем там папку locale

В ней создаем папку языка: для русского — ru, для английского — en, более подробно можете посмотреть в папке игры, там много вариантов. В папке создаем locale.cfg

и открываем его нашим ноутпадом.

ВАЖНО: этот файл не нужно подключать, потому-что как мы помним, папка языков зарезервирована под именем locale.

сам же перевод интуитивно понятен, я просто покажу как мы переименуем наши бочки:

в фаил locale.cfg пишем:

 

[item-name]
WaterB=Бочка для воды
WaterBF=Заполненая бочка для воды
[recipe-name]
empty-barrel-M=Бочка для воды
fill-barrel=Заполнить бочку
empty-barrel=Опустошить бочку

 

То-есть в [скобках] прописана категория

До «=» пишется название в коде

После «=» перевод.

ВАЖНО: не ставьте пробелов до и после равно (вообще лучше без лишних пробелов) игра считывает их как символы и на выходе вы  получаете пустые иконки предметов, вместо любого текста.

ТОЖЕ ВАЖНО: в ноутпаде есть кнопка смены кодировки, всегда устанавливайте 8-ми битную кодировку в UTF-8 без BOM

Более подробно название категорий можно найти в base.

А, вот еще фича:

 

[item-description]
WaterBF=На моем рисунке - Капля!!!

Таким образом можно делать подпись для Предметов\рецептов и прочего.

 

 

БОНУСНАЯ СЕКЦИЯ

По поводу смены Файлов других модов или базовой игры. Это осуществляется через одну специальную луа команду, я не буду вдоватся в детали так как это и так секция по просьбам (Аля для продвинутых)

Создаем любой Lua фаqл (я предпочитаю changes.lua)

туда вписываем без всяких скобок

data.raw["string"]["string"].параметр =

В первые скобки вносим type объекта, во второй его имя в коде, в паремтр строку которую хотим изменить, и собственно её новое значение.

Пример

data.raw["ammo"]["flame-thrower-ammo"].magazine_size = 500 Эта строка сделает Обьем магазина для огнемета равным 500 едениц. Или например нам нужно чтобы огнемет лежал в нашей вкладке мода. Тогда делаем так

 

data.raw["ammo"]["flame-thrower-ammo"].subgroup =
data.raw["ammo"]["flame-thrower-ammo"].order =

И так далее.

Теперь по поводу того как можно отключать вообще Итемы.

Если этот итем изначален (например пистолет)

data.raw["gun"]["pistol"].enabled = falseТак как нет ни одной технологии которая его разблокирует, то его не станет.

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

На сегодня все