Factorio - HanziQ
Major Features
  • Added logistic buffer chest. It can request items that are still available to the logistic system.
  • Added the artillery wagon and artillery turret which will automatically shoot biter nests and worms.
  • Added cliffs.

Features
  • Train block visualisation.
  • Building entities over identical ghosts will revive them. When building a different entity on top of a ghost, settings from the ghost will be copied if possible.
  • Train schedules and wait conditions can be rearranged by clicking and dragging.
  • New mini-tutorials: Construction robots.
  • Belts, underground belts and splitters can now fast replace each other.
  • Roboports now provide the repair packs they have for other robots to use.
  • Logistic request tooltips now show the count of items in the requester, on the way, and in the network.
  • The players main inventory can now be filtered.
  • New terrains and new terrain generation.
  • All terrains, including stone path and concrete, have transitions with water.
  • Map generation dialog now contains a preview of the map.

Minor Features
  • Ctrl-delete now deletes whole word in a text field instead of a single character. more
  • Placing output underground belt as ghost properly retains its type as output underground belt. Also underground belts now respect nearby ghosts and become output if there is input ghost nearby. Underground belt and pipe ghosts when hovered show outline of where they will connect more
  • Headless server will automatically save the game when the last player leaves and auto-pause starts.
  • Added support to disable debug settings for non-admin players in multiplayer through the /config command.
  • Dropping items on belts manually (Z) won't spill items if they won't fit on the belt.
  • Trees can now be configured in the generate-map GUI.
  • Hotkeys can be un-bound by right clicking.
  • Rail chain signals can be read by the circuit network.
  • Small electric poles and medium electric poles can be fast-replaced with each other.
  • In multiplayer players can now ride as passengers in cars/tanks.
  • Electric poles and power switches can be opened from the zoomed-to-world view.
  • Terrain can be configured in the generate map GUI.
  • When holding an offshore pump, all valid build positions will be highlighted.
  • After desyncing in multiplayer, the game will not automatically connect back, instead a dialog with more information will be shown.
  • All map visualisations work also when in zoomed in map mode, where normal view and map view is combined based on radar/player coverage.

Graphics
  • More entities in high resolution: laboratory, radar, worker robots (construction and logistic), combat robots (defender, distractor and destroyer), combinators, electric & circuit wires, pumpjack, storage tank, player, solar panel, lamp, roboport, tank.
  • All terrain now supports high resolution.
  • Blueprint previews and ghost entities now have their walls, pipes and belts connected.
  • New alert icons.

Balancing
  • Removed Assembling machine 1 from the production science pack.
  • Changed nuclear reactor stack size to 10.
  • Moved cluster grenade recipe to military 4 research.
  • Changed uranium ammo prerequisite from military 3 to military 4.
  • Explosives now produce 2 per craft.
  • Slightly adjusted some recipe craft times to better reflect their ingredient count.
  • Changed the terrain building size limit to be based off the player reach.
  • Biters scale less with distance and there are generally less biters.
  • Resources are much more spread apart. To compensate, patches are larger. Since it's easier to mine, the amount of resources on the map is 3 times less.
  • Resources scale slightly less over distance.
  • No uranium as a starting resource also no uranium is ever generated near the starting area, you need to go look for it.
  • There is 1.49 times more iron on the map to compensate for the extra iron required in a typical game.

Changes
  • Disabled loading of saves before 0.13.0 version (You can use 0.13 to load older saves and re-save them).
  • Train doesn't need to come to a full stop when manually changing train destination or switching from manual to automated mode.
  • Removed the "shift" value from map generation settings as it wasn't needed anymore.
  • Creating blueprints and using deconstruction planner in zoom-to-world map mode now skip entities covered by fog of war. more
  • Changed the default autosave interval settings from 2 to 5 minutes.
  • It is possible to open/close and interact with the chat console when the map is being saved or server loosing connection dialog is active.
  • The game uses only the cloud version of player-data and achievements on steam to avoid problems with resets.
  • Increased the limit of recipe categories from 255 to 65535.
  • New blueprint no longer includes entities marked for deconstruction.
  • Enable Map Exchange String for sandbox games
  • Copy Paste from assembler to requester chest now scales with assembler speed and recipe crafting time.
  • Blueprints never show the number 1 when held in cursor.
  • Robots in the air from personal roboport now count towards logistics requests for that robot type more
  • Added /server-save command that does the same thing as lua server_save, but doesn't disable achievements. more
  • Gamesave names in the load game dialog that are too long to fit the gui now show in a tooltip in full. more
  • Removed the option to turn off the item groups and sub groups from the GUi. It can still be done through the config file or lua commands.
  • Added separate control option for placing tags on the map, so by default map scroll is left click, and place tag is right click.
  • Allow easier dragging of underground pipes and belts when not moving in a perfect straight line.
  • The Arithmetic Combinator can now use a constant as the first parameter, not only the second. So you can do operations like 2^SIGNAL. more
  • When building blueprints, any already existing building of the same entity type will have their settings updated instead of showing red. more
  • The options menu has been organized better. Some options were moved to a new "Interface" settings menu.
  • Updater proxy settings were removed from the options menu. They can still be accessed through the ini file.
  • Exchange strings are now compressed before being converted into base64.
  • Improved GUI search.
  • Added /delete-blueprint-library *player* command to remove blueprints of players from the game.
  • The map view will attempt to treat very short clicks as clicks instead of drags to make it easier to click things.
  • The explosive cannon shells now target the ground where you shoot.
  • Transition from terrain to water is no longer buildable, meaning entities can no longer be built partially on the water.
  • Resources will have much less trees on them near the player starting area.
  • Tanks no longer take miniscule amounts of damage from hitting trees.
  • Previously, building while running at very high speed would create gaps. These are automatically filled now.
  • Locomotive will show train ID in its tooltip. The ID can be used in circuit network conditions. more
  • When two trains are being merged, the decision which schedule should be used for the merged train has been changed from bigger schedule to schedule that has latest change. more
  • Number of entities in hand when previewing the entity to be built is now aligned to the entity.
  • Added sliding when the player character collides with water or entities with rotated bounding box.
  • Improved drawing of turret radiuses in blueprint. Many overlapping radiuses no longer covers terrain completely.
  • External blueprint library is no longer merged with blueprint library in save. Instead, in-save library is always overwritten by the external one.

Bugfixes
  • Fixed that train arriving to station could give astronomically big penalty causing trains to go through weird places. more
  • Fixed that fluid wagon pumps would sometimes not connect properly more
  • Fixed that module icons in blueprint previews wouldn't render correctly in some cases. more
  • Fixed long mod manager preview labels would extend out of the frame.
  • Fixed that the ~ key couldn't be used to close the console.
  • Fixed that the mining progress was reset when mining selection is lost while mining button pressed. more
  • Catalysts in recipes are automatically recognized and not counted towards production/consumption statistics. more
  • Fixed that ghost rail signal emmited light.
  • Fixed that different icon sizes were not scaled properly when drawn in the alt-info mode. more
  • Fixed latency sound effects in multiplayer latency hiding would sometimes play too many times.
  • Fixed that errors in fonts would give useless errors. more
  • Fixed problems related to trains crashing rarely. more
  • Disabled possibility to attempt opening invalid save/replay by double click or enter.
  • UTF-8 BOM in JSON, INI and LUA files will be ignored instead of causing parsing error. more
  • Fixed that clearing all blueprint icons would cause the entire blueprint to be cleared without a warning. more
  • Conflicts of multi-modifier hotkeys are now resolved correctly. more
  • Fixed sprite rendering at large distances from 0,0. more
  • Interacting with a filter slide bar requesting amount over capacity of a full requester won't dispatch robots anymore.
  • Fixed restart after the second update in a row crashed the game due to duplicated launch parameter (Linux/macOS). more
  • Fixed that "asdf" and "as df" were considered the same when listed in the stop selection. more
  • Buildable item counts in inventory in Sandobx mode now update properly with resource changes. more
  • Fixed that map width/height accepted value of 0. more
  • Fixed crash when loading Vorbis Ogg files with metadata. more
  • Fixed that the manual rail building ended up one tile before the cursor. more
  • Assembling machine can now output product with amount over stack size. more
  • Fixed entity description for resources that require fluids. more
  • Possible fix of the problem that map download blocks all other communication and client is disconnected when downloading. more
  • Fixed that the game could crash when catching up when processing queued gui actions. more
  • Fixed a rare case, when the paused dialog stayed active when reconnecting game after drop. more
  • Fixed colored lights would lose their color when nightvision was on. more
  • Fixed very bad performance when previewing blueprint with one big connected circuit network. more
  • Fixed that an attacking group of biters would sometimes get stuck in a cyclic back-and-forth walking pattern. more
  • Fixed that in certain scenarios, the blueprint library wouldn't synchronise. more
  • Trains now recalculate next station correctly when more stations are en/disabled at the same tick. more
  • Fixed that the server would sometimes quit if a player tried to connect after another player tried to connect unsuccessfully. more
  • Fixed when updater requested administrator rights, updated Factorio would be started in elevated mode too. more
  • Fixed steam "leaking" outside of storage tank window on high sprite quality setting. more
  • Programmable speakers with "Global playback" active won't play for players in a different force.
  • Beam weapon now shows correct damage when modded into dealing damage more times during its duration. more
  • Fixed that large entities wouldn't render correctly on the map. more
  • Fixed that the mining drill wouldn't show the speed bonus in the same format as assembling machines. more
  • Fixed the entity icons for combat robots didn't match the item icons. more
  • Train can't block its own path anymore. more
  • Fixed circuit wire connections wouldn't render correctly in rotated blueprints in some cases. more
  • Fixed that changing the system time forwards would cause Factorio to freeze.
  • Fixed a crash when changing large circuit networks. more
  • Fixed closing window right after it was created would hang the process. more
  • Fixed it was possible to open entity GUIs from zoom-to-world when holding some items in cursor. more
  • Fixed that negative a productivity bonus would show in entity GUIs and create negative progress bars. more
  • Fixed that when biters were attacked but couldn't find a path to the attacker, they would stoically accept their fate. more
  • Fixed that the multiplayer-waiting icon wouldn't render in the map view. more
  • Fixed global achievement progress was multiplied by number of player in multiplayer game. more
  • Fixed that passing a LuaObject instead of a plain Lua table to LuaBootstrap::raise_event would crash the game. more
  • Fixed setting active=false then true on a beacon wouldn't update the beacon correctly. more
  • Possible fix of a crash when a player leaves when a blueprint is being transferred. more
  • Fixed that the rocket silo would get stuck if it died and was re-built by robots while launching the rocket.
  • Fixed transport belt circuit connector would draw over splitter in front of it. more
  • Fixed that it was still possible to get some achievements in a replay. more
  • Fixed that circular references passed through the Lua remote interface would crash the game. more
  • Fixed missing personal robot recharging animation when character was in a vehicle. more
  • Fixed that vertical size of progress bar wasn't respecting the gui scale.
  • Fixed that the number drawn next to cursor when item is held was differently positioned compared to how it is in the inventory.
  • Fixed texture compression would not be disabled when d3dx9.dll is not installed, corrupting sprites that were expected to be compressed.

Optimisations
  • Improved performance of transport belts about x5 times. (https://www.factorio.com/blog/post/fff-176)
  • Added prefetching of the next entity in the update loop improving overall update performance by approx. 10 %.
  • Improved performance of Item manipulation (4% effect on the overall performance).
  • Improved performance of crafting machine (furnace/assembling machine) (2% effect on the overall performance).
  • Improved performance of electric network transfer more than twice. (10% effect on the overall performance).
  • Improved performance of smoke greatly. (2.5% and more effect on big factories).
  • Improved performance when building rail blocks with many segments.
  • Improved performance of logistic provider and requester chests.
  • Improved performance of blueprint previews (the GUI and holding it in the world).
  • Improved game startup time when a sufficiently powerful computer is detected.

Modding
  • Train path finding penalty values are now in utility-constants, to make it viewable and moddable.
  • Fixed storage tank with non-square collision box would not align to tiles in all rotations properly. more
  • Fixed belt-immunity equipment so it now works on cars.
  • Fixed that the radius property for the area trigger effect was called perimeter.
  • Fixed that crafting machine with non-square bounding box was not rotatable. more
  • Removed default values for icon_size, so icon_size is now required property. more
  • Updated the serpent library to version 0.30.
  • Changed the "item that builds this" list for entities so is's sorted first by ItemPrototype::primary_place_result_item and then by normal item prototype sort order.
  • Changed default value of InserterPrototype::allow_custom_vectors to false.
  • Changed "Nothing" technology effect "effect_key" to "effect_description" and changed it to accept localised strings.
  • Changed rocket silo prototype "result_items" to be defined in the item as either "rocket_launch_product" or "rocket_launch_products".
  • Changed the string mod setting type so it will attempt to localise items in the dropdown using "string-mod-setting.mod-name-stting-name-dropdown-item".
  • Changed technology modifier icons so they can be defined per-modifier-type instead of always using the red "+" icon.
  • Changed LuaObject::destroy() so it won't error if called on invalid objects.
  • Changed mod settings so the game will remember settings from removed mods should they be re-added in the future.
  • Changed how TilePrototype::transition_merges_with_tile works. See https://www.factorio.com/blog/post/fff-214 for more details.
  • Scenarios can contain folders with arbitrary names.
  • Added 'single_line' and 'want_ellipsis' to Label style specification.
  • Added force bonus for following robot time to live.
  • Added force bonus for research productivity.
  • Added ability to import and export item-with-tags to/from strings.
  • Added support for fast-replacing character entities.
  • Added CombatRobotPrototype::light.
  • Added TurretPrototype::alert_when_attacking.
  • Added optional 'respawn_time' (in seconds) to the character entity.
  • Added "hide-from-bonus-gui" entity and item prototype flags.
  • Added support for mods to disable custom-input prototypes of other mods.
  • Added support for mods to show changelogs (following the same format as the core game changelog).
  • Added MapGenSettings support to fully define which autoplace definitions are used for a given surface.
  • Added AutoplaceSpecification::default_enabled - if a given autoplace specification should be enabled without being explicitly enabled in map gen settings.
  • Added allowed_effects support to the mining drill.
  • Added optional "has_belt_immunity" property to the unit and car prototype.
  • Added optional "hidden" prototype property to the achievement prototype.
  • Added support to link custom-input prototypes directly to game controls instead of having them act as their own control.
  • Added a new entity type "infinity-container" that can automatically add/remove items from itself; useful for scenarios and modding.
  • Added support for incompatible dependencies.
  • Added an entity prototype flag "hide-alt-info" to never show alt-info for a given entity.
  • Added distance bonus support to the mining tool item type.
  • Added InserterPrototype::draw_held_item.
  • Added FluidPrototype::fuel_value and Generator::burns_fluid.
  • Added mod-developer support to runtime change autoplace specifications enabled through the command line option --enable-runtime-autoplace-modification using F2 in-game.
  • simple-entity, simple-entity-with-owner and simple-entity-with-force can now define 'animations' instead of 'picture' or 'pictures'.

Scripting
  • Fixed that LuaSurface::get_trains() didn't work for trains without locomotives. more
  • Fixed that reversing technology effects in different orders than they where researched could lead to a non-zero number. more
  • Fixed surface_index was off by 1 for on_player_built_tile and on_player_mined_tile events.
  • Fixed possible desync when teleporting underground belt ghosts and pipe to ground ghosts.
  • Changed the robot_built and player_built events to pass the item stack used to do the building instead of the item name and tags.
  • Changed "on_preplayer_mined_item" to "on_pre_player_mined_item".
  • Changed LuaEntity::recipe to LuaEntity::get_recipe() and LuaEntity::set_recipe().
  • Changed LuaSurface::regenerate_decorative/regenerate_entity to accept zero arguments and regenerate everything.
  • Changed the root custom gui containers (top, left, center, goal) to have the corresponding name.
  • Changed the event data from script.raise_event will contain mod_name, the name of the mod that raised it.
  • Changed LuaFluidBox fluid from {type="...", amount=...} to {name="...", amount=...}
  • Changed name of colspan parameter of table to column_count.
  • Changed LuaItemPrototype::group_filters and sub_gorup_filters to item_group_filters and item_subgroup_filters to match the prototype values.
  • LuaEntity::set_recipe() returns the items removed from the entity as a result of setting the new recipe (if any).
  • Moved Mod-gui button flow to gui.top.
  • Removed LuaEntity::passenger read/write.
  • Added style::width/height to set maximal/minimal value at the same time.
  • Added style::align to set the align of inner elements.
  • Added style::stretchable / squashable.
  • Added LuaEntity::get_driver(), set_driver(), get_passenger(), and set_passenger().
  • Added LuaGuiElement::hovered_sprite and clicked_sprite read/write methods for the SpriteButton.
  • Added support to change daytime length and brightness on a per-surface basis.
  • Added GameViewSettings show_rail_block_visualisation property that forces the visualisation to be always on.
  • Added LuaItemStack::export_stack and LuaItemStack::import_stack to export/import supported items to/from strings.
  • Added LuaEntity::tree_color_index read/write access and LuaEntityPrototype::tree_color_count read access.
  • Added LuaEntity::selection_box and secondary_selection_box read.
  • Added LuaBootstrap::mod_name read.
  • Added LuaControl::in_combat read.
  • Added LuaTile::order_deconstruction() and cancel_deconstruction().
  • Added optional cause and force to LuaEntity::die().
  • Added on_player_used_capsule event.
  • Added on_player_promoted and on_player_demoted events.
  • Added on_player_changed_position event.
  • Added LuaEntityPrototype::alert_when_attacking read and LuaEntityPrototype::alert_when_damaged read.
  • Added LuaEntity::power_switch_state read/write.
  • Added on_combat_robot_expired event.
  • Added LuaEntity::relative_turret_orientation read/write for vechicles with turrets.
  • Added LuaEntityPrototype::color read.
  • Added LuaTrain::passengers.
  • Added LuaEntityPrototype::collision_mask_collides_with_self read.
  • Added "fluid", and "recipe" type to the choose-elem-button custom GUI element.
  • Added LuaGuiElement::locked read/write - when true the given choose-elem-button can only be changed through script.
  • Added an optional parameter to LuaSurface::drop_item_stack to mark dropped items for deconstruction.
  • Added LuaForce::cancel_charting(...).
  • Added LuaSurface::force_generate_chunk_requests().
  • Added support for setting a LuaGuiElement as the opened GUI for a player causing it to close with the normal close-GUI methods.
  • Added on_gui_opened and on_gui_closed events.
  • Added on_player_muted/unmuted and on_player_cheat_mode_enabled/disabled events.
  • Added LuaItemStack read properties to tell if a given item is some specific item type.
  • Added LuaAutoplaceControlPrototype, LuaNoiseLayerPrototype, LuaModSettingPrototype, and LuaCustomInputPrototype.
  • Added LuaGameScript autoplace_control_prototypes, noise_layer_prototypes, mod_setting_prototypes, and custom_input_prototypes read.
  • Added LuaForce::reset_evolution().
  • Added LuaSurface::create_trivial_smoke().
  • Added LuaPlayer::enable_recipe_groups() and enable_recipe_subgroups().
  • Added LuaItemStack::rocket_launch_products read.
  • Added on_mod_item_opened event.
  • Added LuaItemPrototype::can_be_mod_opened read.
  • Added the item stack index as a second return value to LuaInventory::find_item_stack.
  • Added LuaItemStack::transfer_stack().
  • Added LuaGuiElement type "slider".
  • Added on_gui_value_changed event - fired when a slider value changes.
  • Added optional color field as a second parameter to the 4 print functions.
  • Added support to change LuaSurface::map_gen_settings runtime.
  • Added LuaEntityPrototype::allowed_effects read.
  • Added LuaEntity::effects read.
  • Added LuaPlayer::can_place_entity(), can_build_from_cursor(), and build_from_cursor().
  • Added LuaSurface::play_sound().
  • Added LuaForce::play_sound().
  • Added LuaGameScript::play_sound() and is_valid_sound_path().
  • Added LuaPlayer::play_sound().
  • Added support to teleport train stops, rail signals, walls, gates, and entities with fluidboxes.
  • Added LuaEntity::rotate().
  • Added LuaEntity::get_infinity_filter() and set_infinity_filter().
  • Added LuaEntity::infinity_filters and remove_unfiltered_items read/write.
  • Added LuaEntityPrototype::rocket_parts_required read.
  • Added LuaEntityPrototype::fixed_recipe read.
  • Added LuaGameScript::kick_player(), ban_player(), unban_player(), purge_player(), mute_player(), and unmute_player().
  • Added LuaPlayer::admin write support.
  • Added LuaGuiElement::focus().
  • Added on_character_corpse_expired event.
  • Added on_pre_ghost_deconstructed event.
  • Added on_player_pipette event.
  • Added LuaEntity::character_corpse_player_index, character_corpse_tick_of_death, and character_corpse_death_cause read/write.
  • Added LuaSurface::get_tile_properties().
  • Added LuaSurface::can_fast_replace().
  • Added support for player associated characters - characters that get logged off/on with a given player but aren't directly controlled by the player.
  • Added LuaEntity::associated_player read/write.
  • Added LuaPlayer::get_associated_characters(), associate_character(), and disassociate_character().
  • Added LuaPlayer::ticks_to_respawn read/write.
  • Added old_state to the on_train_changed_state event.
  • Added LuaRecipe::catalysts read.
  • Added LuaRecipe::hide_from_flow_stats read/write.
  • Added LuaRecipePrototype::hidden_from_flow_stats read.
  • Added LuaEntity::tick_of_last_attack and tick_of_last_damage read for the character entity.
  • Added LuaLogisticNetwork::passive_provider_points and active_provider_points read.
  • Added LuaPlayer::display_resolution read.
  • Added on_player_display_resolution_changed event.
  • Added LuaPlayer::display_scale read.
  • Added on_player_display_scale_changed event.
  • Added LuaTrain::weight and riding_state read.
  • Added LuaEntity::products_finished write.
  • Added optional surface to game.take_screenshot(...).
  • Added LuaEntityPrototype::construction_range and logistics_range read.
  • Added LuaGuiElement::index read.
  • Added LuaForce::max_successful_attemps_per_tick_per_construction_queue and max_failed_attempts_per_tick_per_construction_queue read/write + technology modifiers.
  • Added LuaGuiElement::mouse_button_filter read/write for buttons and sprite-buttons.
  • Added LuaSurface::find_tiles_filtered() and count_tiles_filtered().
  • Added LuaEntity::get_train_stop_trains().
  • Added LuaLogisticNetwork::force read.
  • Added LuaItemStack::item_number read - the unique ID of the item if it has one.


You can get experimental releases by selecting the 'experimental' beta branch under Factorio's properties in Steam.
Factorio - HanziQ
Major Features
  • Added logistic buffer chest. It can request items that are still available to the logistic system.
  • Added the artillery wagon and artillery turret which will automatically shoot biter nests and worms.
  • Added cliffs.

Features
  • Train block visualisation.
  • Building entities over identical ghosts will revive them. When building a different entity on top of a ghost, settings from the ghost will be copied if possible.
  • Train schedules and wait conditions can be rearranged by clicking and dragging.
  • New mini-tutorials: Construction robots.
  • Belts, underground belts and splitters can now fast replace each other.
  • Roboports now provide the repair packs they have for other robots to use.
  • Logistic request tooltips now show the count of items in the requester, on the way, and in the network.
  • The players main inventory can now be filtered.
  • New terrains and new terrain generation.
  • All terrains, including stone path and concrete, have transitions with water.
  • Map generation dialog now contains a preview of the map.

Minor Features
  • Ctrl-delete now deletes whole word in a text field instead of a single character. more
  • Placing output underground belt as ghost properly retains its type as output underground belt. Also underground belts now respect nearby ghosts and become output if there is input ghost nearby. Underground belt and pipe ghosts when hovered show outline of where they will connect more
  • Headless server will automatically save the game when the last player leaves and auto-pause starts.
  • Added support to disable debug settings for non-admin players in multiplayer through the /config command.
  • Dropping items on belts manually (Z) won't spill items if they won't fit on the belt.
  • Trees can now be configured in the generate-map GUI.
  • Hotkeys can be un-bound by right clicking.
  • Rail chain signals can be read by the circuit network.
  • Small electric poles and medium electric poles can be fast-replaced with each other.
  • In multiplayer players can now ride as passengers in cars/tanks.
  • Electric poles and power switches can be opened from the zoomed-to-world view.
  • Terrain can be configured in the generate map GUI.
  • When holding an offshore pump, all valid build positions will be highlighted.
  • After desyncing in multiplayer, the game will not automatically connect back, instead a dialog with more information will be shown.
  • All map visualisations work also when in zoomed in map mode, where normal view and map view is combined based on radar/player coverage.

Graphics
  • More entities in high resolution: laboratory, radar, worker robots (construction and logistic), combat robots (defender, distractor and destroyer), combinators, electric & circuit wires, pumpjack, storage tank, player, solar panel, lamp, roboport, tank.
  • All terrain now supports high resolution.
  • Blueprint previews and ghost entities now have their walls, pipes and belts connected.
  • New alert icons.

Balancing
  • Removed Assembling machine 1 from the production science pack.
  • Changed nuclear reactor stack size to 10.
  • Moved cluster grenade recipe to military 4 research.
  • Changed uranium ammo prerequisite from military 3 to military 4.
  • Explosives now produce 2 per craft.
  • Slightly adjusted some recipe craft times to better reflect their ingredient count.
  • Changed the terrain building size limit to be based off the player reach.
  • Biters scale less with distance and there are generally less biters.
  • Resources are much more spread apart. To compensate, patches are larger. Since it's easier to mine, the amount of resources on the map is 3 times less.
  • Resources scale slightly less over distance.
  • No uranium as a starting resource also no uranium is ever generated near the starting area, you need to go look for it.
  • There is 1.49 times more iron on the map to compensate for the extra iron required in a typical game.

Changes
  • Disabled loading of saves before 0.13.0 version (You can use 0.13 to load older saves and re-save them).
  • Train doesn't need to come to a full stop when manually changing train destination or switching from manual to automated mode.
  • Removed the "shift" value from map generation settings as it wasn't needed anymore.
  • Creating blueprints and using deconstruction planner in zoom-to-world map mode now skip entities covered by fog of war. more
  • Changed the default autosave interval settings from 2 to 5 minutes.
  • It is possible to open/close and interact with the chat console when the map is being saved or server loosing connection dialog is active.
  • The game uses only the cloud version of player-data and achievements on steam to avoid problems with resets.
  • Increased the limit of recipe categories from 255 to 65535.
  • New blueprint no longer includes entities marked for deconstruction.
  • Enable Map Exchange String for sandbox games
  • Copy Paste from assembler to requester chest now scales with assembler speed and recipe crafting time.
  • Blueprints never show the number 1 when held in cursor.
  • Robots in the air from personal roboport now count towards logistics requests for that robot type more
  • Added /server-save command that does the same thing as lua server_save, but doesn't disable achievements. more
  • Gamesave names in the load game dialog that are too long to fit the gui now show in a tooltip in full. more
  • Removed the option to turn off the item groups and sub groups from the GUi. It can still be done through the config file or lua commands.
  • Added separate control option for placing tags on the map, so by default map scroll is left click, and place tag is right click.
  • Allow easier dragging of underground pipes and belts when not moving in a perfect straight line.
  • The Arithmetic Combinator can now use a constant as the first parameter, not only the second. So you can do operations like 2^SIGNAL. more
  • When building blueprints, any already existing building of the same entity type will have their settings updated instead of showing red. more
  • The options menu has been organized better. Some options were moved to a new "Interface" settings menu.
  • Updater proxy settings were removed from the options menu. They can still be accessed through the ini file.
  • Exchange strings are now compressed before being converted into base64.
  • Improved GUI search.
  • Added /delete-blueprint-library *player* command to remove blueprints of players from the game.
  • The map view will attempt to treat very short clicks as clicks instead of drags to make it easier to click things.
  • The explosive cannon shells now target the ground where you shoot.
  • Transition from terrain to water is no longer buildable, meaning entities can no longer be built partially on the water.
  • Resources will have much less trees on them near the player starting area.
  • Tanks no longer take miniscule amounts of damage from hitting trees.
  • Previously, building while running at very high speed would create gaps. These are automatically filled now.
  • Locomotive will show train ID in its tooltip. The ID can be used in circuit network conditions. more
  • When two trains are being merged, the decision which schedule should be used for the merged train has been changed from bigger schedule to schedule that has latest change. more
  • Number of entities in hand when previewing the entity to be built is now aligned to the entity.
  • Added sliding when the player character collides with water or entities with rotated bounding box.
  • Improved drawing of turret radiuses in blueprint. Many overlapping radiuses no longer covers terrain completely.
  • External blueprint library is no longer merged with blueprint library in save. Instead, in-save library is always overwritten by the external one.

Bugfixes
  • Fixed that train arriving to station could give astronomically big penalty causing trains to go through weird places. more
  • Fixed that fluid wagon pumps would sometimes not connect properly more
  • Fixed that module icons in blueprint previews wouldn't render correctly in some cases. more
  • Fixed long mod manager preview labels would extend out of the frame.
  • Fixed that the ~ key couldn't be used to close the console.
  • Fixed that the mining progress was reset when mining selection is lost while mining button pressed. more
  • Catalysts in recipes are automatically recognized and not counted towards production/consumption statistics. more
  • Fixed that ghost rail signal emmited light.
  • Fixed that different icon sizes were not scaled properly when drawn in the alt-info mode. more
  • Fixed latency sound effects in multiplayer latency hiding would sometimes play too many times.
  • Fixed that errors in fonts would give useless errors. more
  • Fixed problems related to trains crashing rarely. more
  • Disabled possibility to attempt opening invalid save/replay by double click or enter.
  • UTF-8 BOM in JSON, INI and LUA files will be ignored instead of causing parsing error. more
  • Fixed that clearing all blueprint icons would cause the entire blueprint to be cleared without a warning. more
  • Conflicts of multi-modifier hotkeys are now resolved correctly. more
  • Fixed sprite rendering at large distances from 0,0. more
  • Interacting with a filter slide bar requesting amount over capacity of a full requester won't dispatch robots anymore.
  • Fixed restart after the second update in a row crashed the game due to duplicated launch parameter (Linux/macOS). more
  • Fixed that "asdf" and "as df" were considered the same when listed in the stop selection. more
  • Buildable item counts in inventory in Sandobx mode now update properly with resource changes. more
  • Fixed that map width/height accepted value of 0. more
  • Fixed crash when loading Vorbis Ogg files with metadata. more
  • Fixed that the manual rail building ended up one tile before the cursor. more
  • Assembling machine can now output product with amount over stack size. more
  • Fixed entity description for resources that require fluids. more
  • Possible fix of the problem that map download blocks all other communication and client is disconnected when downloading. more
  • Fixed that the game could crash when catching up when processing queued gui actions. more
  • Fixed a rare case, when the paused dialog stayed active when reconnecting game after drop. more
  • Fixed colored lights would lose their color when nightvision was on. more
  • Fixed very bad performance when previewing blueprint with one big connected circuit network. more
  • Fixed that an attacking group of biters would sometimes get stuck in a cyclic back-and-forth walking pattern. more
  • Fixed that in certain scenarios, the blueprint library wouldn't synchronise. more
  • Trains now recalculate next station correctly when more stations are en/disabled at the same tick. more
  • Fixed that the server would sometimes quit if a player tried to connect after another player tried to connect unsuccessfully. more
  • Fixed when updater requested administrator rights, updated Factorio would be started in elevated mode too. more
  • Fixed steam "leaking" outside of storage tank window on high sprite quality setting. more
  • Programmable speakers with "Global playback" active won't play for players in a different force.
  • Beam weapon now shows correct damage when modded into dealing damage more times during its duration. more
  • Fixed that large entities wouldn't render correctly on the map. more
  • Fixed that the mining drill wouldn't show the speed bonus in the same format as assembling machines. more
  • Fixed the entity icons for combat robots didn't match the item icons. more
  • Train can't block its own path anymore. more
  • Fixed circuit wire connections wouldn't render correctly in rotated blueprints in some cases. more
  • Fixed that changing the system time forwards would cause Factorio to freeze.
  • Fixed a crash when changing large circuit networks. more
  • Fixed closing window right after it was created would hang the process. more
  • Fixed it was possible to open entity GUIs from zoom-to-world when holding some items in cursor. more
  • Fixed that negative a productivity bonus would show in entity GUIs and create negative progress bars. more
  • Fixed that when biters were attacked but couldn't find a path to the attacker, they would stoically accept their fate. more
  • Fixed that the multiplayer-waiting icon wouldn't render in the map view. more
  • Fixed global achievement progress was multiplied by number of player in multiplayer game. more
  • Fixed that passing a LuaObject instead of a plain Lua table to LuaBootstrap::raise_event would crash the game. more
  • Fixed setting active=false then true on a beacon wouldn't update the beacon correctly. more
  • Possible fix of a crash when a player leaves when a blueprint is being transferred. more
  • Fixed that the rocket silo would get stuck if it died and was re-built by robots while launching the rocket.
  • Fixed transport belt circuit connector would draw over splitter in front of it. more
  • Fixed that it was still possible to get some achievements in a replay. more
  • Fixed that circular references passed through the Lua remote interface would crash the game. more
  • Fixed missing personal robot recharging animation when character was in a vehicle. more
  • Fixed that vertical size of progress bar wasn't respecting the gui scale.
  • Fixed that the number drawn next to cursor when item is held was differently positioned compared to how it is in the inventory.
  • Fixed texture compression would not be disabled when d3dx9.dll is not installed, corrupting sprites that were expected to be compressed.

Optimisations
  • Improved performance of transport belts about x5 times. (https://www.factorio.com/blog/post/fff-176)
  • Added prefetching of the next entity in the update loop improving overall update performance by approx. 10 %.
  • Improved performance of Item manipulation (4% effect on the overall performance).
  • Improved performance of crafting machine (furnace/assembling machine) (2% effect on the overall performance).
  • Improved performance of electric network transfer more than twice. (10% effect on the overall performance).
  • Improved performance of smoke greatly. (2.5% and more effect on big factories).
  • Improved performance when building rail blocks with many segments.
  • Improved performance of logistic provider and requester chests.
  • Improved performance of blueprint previews (the GUI and holding it in the world).
  • Improved game startup time when a sufficiently powerful computer is detected.

Modding
  • Train path finding penalty values are now in utility-constants, to make it viewable and moddable.
  • Fixed storage tank with non-square collision box would not align to tiles in all rotations properly. more
  • Fixed belt-immunity equipment so it now works on cars.
  • Fixed that the radius property for the area trigger effect was called perimeter.
  • Fixed that crafting machine with non-square bounding box was not rotatable. more
  • Removed default values for icon_size, so icon_size is now required property. more
  • Updated the serpent library to version 0.30.
  • Changed the "item that builds this" list for entities so is's sorted first by ItemPrototype::primary_place_result_item and then by normal item prototype sort order.
  • Changed default value of InserterPrototype::allow_custom_vectors to false.
  • Changed "Nothing" technology effect "effect_key" to "effect_description" and changed it to accept localised strings.
  • Changed rocket silo prototype "result_items" to be defined in the item as either "rocket_launch_product" or "rocket_launch_products".
  • Changed the string mod setting type so it will attempt to localise items in the dropdown using "string-mod-setting.mod-name-stting-name-dropdown-item".
  • Changed technology modifier icons so they can be defined per-modifier-type instead of always using the red "+" icon.
  • Changed LuaObject::destroy() so it won't error if called on invalid objects.
  • Changed mod settings so the game will remember settings from removed mods should they be re-added in the future.
  • Changed how TilePrototype::transition_merges_with_tile works. See https://www.factorio.com/blog/post/fff-214 for more details.
  • Scenarios can contain folders with arbitrary names.
  • Added 'single_line' and 'want_ellipsis' to Label style specification.
  • Added force bonus for following robot time to live.
  • Added force bonus for research productivity.
  • Added ability to import and export item-with-tags to/from strings.
  • Added support for fast-replacing character entities.
  • Added CombatRobotPrototype::light.
  • Added TurretPrototype::alert_when_attacking.
  • Added optional 'respawn_time' (in seconds) to the character entity.
  • Added "hide-from-bonus-gui" entity and item prototype flags.
  • Added support for mods to disable custom-input prototypes of other mods.
  • Added support for mods to show changelogs (following the same format as the core game changelog).
  • Added MapGenSettings support to fully define which autoplace definitions are used for a given surface.
  • Added AutoplaceSpecification::default_enabled - if a given autoplace specification should be enabled without being explicitly enabled in map gen settings.
  • Added allowed_effects support to the mining drill.
  • Added optional "has_belt_immunity" property to the unit and car prototype.
  • Added optional "hidden" prototype property to the achievement prototype.
  • Added support to link custom-input prototypes directly to game controls instead of having them act as their own control.
  • Added a new entity type "infinity-container" that can automatically add/remove items from itself; useful for scenarios and modding.
  • Added support for incompatible dependencies.
  • Added an entity prototype flag "hide-alt-info" to never show alt-info for a given entity.
  • Added distance bonus support to the mining tool item type.
  • Added InserterPrototype::draw_held_item.
  • Added FluidPrototype::fuel_value and Generator::burns_fluid.
  • Added mod-developer support to runtime change autoplace specifications enabled through the command line option --enable-runtime-autoplace-modification using F2 in-game.
  • simple-entity, simple-entity-with-owner and simple-entity-with-force can now define 'animations' instead of 'picture' or 'pictures'.

Scripting
  • Fixed that LuaSurface::get_trains() didn't work for trains without locomotives. more
  • Fixed that reversing technology effects in different orders than they where researched could lead to a non-zero number. more
  • Fixed surface_index was off by 1 for on_player_built_tile and on_player_mined_tile events.
  • Fixed possible desync when teleporting underground belt ghosts and pipe to ground ghosts.
  • Changed the robot_built and player_built events to pass the item stack used to do the building instead of the item name and tags.
  • Changed "on_preplayer_mined_item" to "on_pre_player_mined_item".
  • Changed LuaEntity::recipe to LuaEntity::get_recipe() and LuaEntity::set_recipe().
  • Changed LuaSurface::regenerate_decorative/regenerate_entity to accept zero arguments and regenerate everything.
  • Changed the root custom gui containers (top, left, center, goal) to have the corresponding name.
  • Changed the event data from script.raise_event will contain mod_name, the name of the mod that raised it.
  • Changed LuaFluidBox fluid from {type="...", amount=...} to {name="...", amount=...}
  • Changed name of colspan parameter of table to column_count.
  • Changed LuaItemPrototype::group_filters and sub_gorup_filters to item_group_filters and item_subgroup_filters to match the prototype values.
  • LuaEntity::set_recipe() returns the items removed from the entity as a result of setting the new recipe (if any).
  • Moved Mod-gui button flow to gui.top.
  • Removed LuaEntity::passenger read/write.
  • Added style::width/height to set maximal/minimal value at the same time.
  • Added style::align to set the align of inner elements.
  • Added style::stretchable / squashable.
  • Added LuaEntity::get_driver(), set_driver(), get_passenger(), and set_passenger().
  • Added LuaGuiElement::hovered_sprite and clicked_sprite read/write methods for the SpriteButton.
  • Added support to change daytime length and brightness on a per-surface basis.
  • Added GameViewSettings show_rail_block_visualisation property that forces the visualisation to be always on.
  • Added LuaItemStack::export_stack and LuaItemStack::import_stack to export/import supported items to/from strings.
  • Added LuaEntity::tree_color_index read/write access and LuaEntityPrototype::tree_color_count read access.
  • Added LuaEntity::selection_box and secondary_selection_box read.
  • Added LuaBootstrap::mod_name read.
  • Added LuaControl::in_combat read.
  • Added LuaTile::order_deconstruction() and cancel_deconstruction().
  • Added optional cause and force to LuaEntity::die().
  • Added on_player_used_capsule event.
  • Added on_player_promoted and on_player_demoted events.
  • Added on_player_changed_position event.
  • Added LuaEntityPrototype::alert_when_attacking read and LuaEntityPrototype::alert_when_damaged read.
  • Added LuaEntity::power_switch_state read/write.
  • Added on_combat_robot_expired event.
  • Added LuaEntity::relative_turret_orientation read/write for vechicles with turrets.
  • Added LuaEntityPrototype::color read.
  • Added LuaTrain::passengers.
  • Added LuaEntityPrototype::collision_mask_collides_with_self read.
  • Added "fluid", and "recipe" type to the choose-elem-button custom GUI element.
  • Added LuaGuiElement::locked read/write - when true the given choose-elem-button can only be changed through script.
  • Added an optional parameter to LuaSurface::drop_item_stack to mark dropped items for deconstruction.
  • Added LuaForce::cancel_charting(...).
  • Added LuaSurface::force_generate_chunk_requests().
  • Added support for setting a LuaGuiElement as the opened GUI for a player causing it to close with the normal close-GUI methods.
  • Added on_gui_opened and on_gui_closed events.
  • Added on_player_muted/unmuted and on_player_cheat_mode_enabled/disabled events.
  • Added LuaItemStack read properties to tell if a given item is some specific item type.
  • Added LuaAutoplaceControlPrototype, LuaNoiseLayerPrototype, LuaModSettingPrototype, and LuaCustomInputPrototype.
  • Added LuaGameScript autoplace_control_prototypes, noise_layer_prototypes, mod_setting_prototypes, and custom_input_prototypes read.
  • Added LuaForce::reset_evolution().
  • Added LuaSurface::create_trivial_smoke().
  • Added LuaPlayer::enable_recipe_groups() and enable_recipe_subgroups().
  • Added LuaItemStack::rocket_launch_products read.
  • Added on_mod_item_opened event.
  • Added LuaItemPrototype::can_be_mod_opened read.
  • Added the item stack index as a second return value to LuaInventory::find_item_stack.
  • Added LuaItemStack::transfer_stack().
  • Added LuaGuiElement type "slider".
  • Added on_gui_value_changed event - fired when a slider value changes.
  • Added optional color field as a second parameter to the 4 print functions.
  • Added support to change LuaSurface::map_gen_settings runtime.
  • Added LuaEntityPrototype::allowed_effects read.
  • Added LuaEntity::effects read.
  • Added LuaPlayer::can_place_entity(), can_build_from_cursor(), and build_from_cursor().
  • Added LuaSurface::play_sound().
  • Added LuaForce::play_sound().
  • Added LuaGameScript::play_sound() and is_valid_sound_path().
  • Added LuaPlayer::play_sound().
  • Added support to teleport train stops, rail signals, walls, gates, and entities with fluidboxes.
  • Added LuaEntity::rotate().
  • Added LuaEntity::get_infinity_filter() and set_infinity_filter().
  • Added LuaEntity::infinity_filters and remove_unfiltered_items read/write.
  • Added LuaEntityPrototype::rocket_parts_required read.
  • Added LuaEntityPrototype::fixed_recipe read.
  • Added LuaGameScript::kick_player(), ban_player(), unban_player(), purge_player(), mute_player(), and unmute_player().
  • Added LuaPlayer::admin write support.
  • Added LuaGuiElement::focus().
  • Added on_character_corpse_expired event.
  • Added on_pre_ghost_deconstructed event.
  • Added on_player_pipette event.
  • Added LuaEntity::character_corpse_player_index, character_corpse_tick_of_death, and character_corpse_death_cause read/write.
  • Added LuaSurface::get_tile_properties().
  • Added LuaSurface::can_fast_replace().
  • Added support for player associated characters - characters that get logged off/on with a given player but aren't directly controlled by the player.
  • Added LuaEntity::associated_player read/write.
  • Added LuaPlayer::get_associated_characters(), associate_character(), and disassociate_character().
  • Added LuaPlayer::ticks_to_respawn read/write.
  • Added old_state to the on_train_changed_state event.
  • Added LuaRecipe::catalysts read.
  • Added LuaRecipe::hide_from_flow_stats read/write.
  • Added LuaRecipePrototype::hidden_from_flow_stats read.
  • Added LuaEntity::tick_of_last_attack and tick_of_last_damage read for the character entity.
  • Added LuaLogisticNetwork::passive_provider_points and active_provider_points read.
  • Added LuaPlayer::display_resolution read.
  • Added on_player_display_resolution_changed event.
  • Added LuaPlayer::display_scale read.
  • Added on_player_display_scale_changed event.
  • Added LuaTrain::weight and riding_state read.
  • Added LuaEntity::products_finished write.
  • Added optional surface to game.take_screenshot(...).
  • Added LuaEntityPrototype::construction_range and logistics_range read.
  • Added LuaGuiElement::index read.
  • Added LuaForce::max_successful_attemps_per_tick_per_construction_queue and max_failed_attempts_per_tick_per_construction_queue read/write + technology modifiers.
  • Added LuaGuiElement::mouse_button_filter read/write for buttons and sprite-buttons.
  • Added LuaSurface::find_tiles_filtered() and count_tiles_filtered().
  • Added LuaEntity::get_train_stop_trains().
  • Added LuaLogisticNetwork::force read.
  • Added LuaItemStack::item_number read - the unique ID of the item if it has one.


You can get experimental releases by selecting the 'experimental' beta branch under Factorio's properties in Steam.
Factorio - Klonan
Christmas is coming early for Factorio fans. We have a lot of exciting things to show you and announce this week, so hold on tight.
The artillery train
Some of you might remember we said there is an artillery train planned, well we now have a playable version of it, so we can show it to you today. The artillery train (or more correctly, the artillery wagon) is an end-game wagon you can add to a train. It fires artillery shells over large distances, either automatically at nearby bases, or at manually designated targets.

In automatic mode, when the train isn't moving, the artillery wagon will automatically scan for enemy buildings (biter nests and worms) and shoot at them. Manually designating targets is very simple, you click on the ground (or on the map or zoomed map) using a special targeting item. For each click, an artillery wagon in range will fire once at the target.

Firing at the biters from far away isn't all consequence free, as they will come running to your train, so you will have to make sure there are some defences nearby, or are prepared for a quick getaway.

Currently it has a range of 7 chunks (224 tiles) when firing automatically, and a range of 17.5 chunks (560 tiles) when firing manually. The main reason for this range difference is to incentivize players to use manual mode, since it is quite a fun way to use the artillery wagons, and it gives the satisfaction of blowing up biter nests remotely.

Albert is working hard to finish the graphics, but here's a untextured work in progress preview.
https://eu1.factorio.com/assets/img/blog/fff-220-WIP-artillery-wagon.mp4

Projectiles are slow and are shown on the map. They explore every chunk they travel across.
https://eu1.factorio.com/assets/img/blog/fff-220-auto-shooting.mp4

Since they explore the area before exploding, you can zoom in and watch the impact.
https://eu1.factorio.com/assets/img/blog/fff-220-manual-shooting.mp4

New terrain/Transitions
As we proclaimed in FFF #199 we wanted to move grass-to-water transitions, from the grass tile to the water tile to make it impossible to build on tiles that visually have water on them. Moving the transition created some new problems. First we had to change rules for building offshore pumps, as they would be placed too far into land. Walking or driving around water felt very wrong suddenly, as player character would get stuck on corners that looked like they should be walkable. So we had to adjust player and vehicle collisions to account for that.

We also wanted to allow transitions from any terrain type and water. With some adjustments to our new alpha-masking capabilities we were able to create few sets of transition sprites, most of which are shared by multiple tile types. The new problem now is that the transitions are screaming for animated water now. Oh, well...







Official Factorio t-shirts
Its been a long time in the works, and we've been asked about it countless time, but the Factorio T-shirts are finally happening, and will be available next week.

It has been tough to find a printer who can meet our requirements. After many different companies, tests and iterations (such as the batch for the party), we have an order booked for 2,000 T-shirts scheduled to arrive on Monday.

Once we check them and make sure everything is alright, we will open up to orders through our new Eshop on our website. The T-shirts are grey unisex, available in sizes XS to XXL, with the Factorio logo printed on the front. It was especially important to us that the silkscreen was of a high quality, and we are happy to say these are better than your typical print shop. The price is $20 USD per shirt plus shipping. There are some limitations on the countries we will be shipping to.



If everything goes according to the plan, we will send the first shipment on the 13th of December, and subsequent packages every Wednesday after. Packing the orders is all going to be handled by us, and since we are expecting a large initial demand, we hope that you will be understanding if we don't mange to get them to you before Christmas.

For now we will be limiting orders to a maximum of 3 per person, so we can make sure they end up in the hands of fans, and won't all be scooped up by some scalper/reseller. We also reserve the right to cancel any suspicious/large orders to further this goal, and will be looking through the recipients to make sure nobody is taking more than their fair share.

We have the full terms of service on the store, so please check it out before you make any order. We won't really appreciate if we see anybody reselling the shirts, as we aren't really making any profit from this venture, we are just trying to do a good service to our fans. In any case, once we have a good gauge on the demand, we will be able to produce some more batches early next year, so we can keep the supply flowing.

Factorio 0.16 experimental
We had some discussions some weeks ago about when we should release 0.16. Because of the approaching winter holidays, we realized we have two choices, either to release before the winter holidays or some time in January.

We decided that Factorio fans would really like to play during the holidays, so we plan to release 0.16.0 next week.
This date is quite tight, but this week's internal playtesting went well, with only a few bugs and desyncs. It does not include everything we wanted but a smaller and quicker release is probably better.

Please bear in mind that this is an opt-in experimental release of an early access game, there will be bugs, especially since the release is a bit premature. We will have just 1-2 weeks of bugfixing before most of us will go on holiday, so it might not be perfect, but we will make it as playable as possible. Plus some of us (like Rseding91) will be fixing bugs during the holidays.

The next few weeks will be a bit crazy for us, working overtime to fix bugs and pack t-shirts, so let us know how excited you are about the news at the forums.

Level designer needed
As an unrelated footnote to this weeks FFF, we are looking for an experienced level designer to help us develop the mini-tutorial and campaign levels. For more information, see the job description on our website.
Factorio - Klonan
Christmas is coming early for Factorio fans. We have a lot of exciting things to show you and announce this week, so hold on tight.
The artillery train
Some of you might remember we said there is an artillery train planned, well we now have a playable version of it, so we can show it to you today. The artillery train (or more correctly, the artillery wagon) is an end-game wagon you can add to a train. It fires artillery shells over large distances, either automatically at nearby bases, or at manually designated targets.

In automatic mode, when the train isn't moving, the artillery wagon will automatically scan for enemy buildings (biter nests and worms) and shoot at them. Manually designating targets is very simple, you click on the ground (or on the map or zoomed map) using a special targeting item. For each click, an artillery wagon in range will fire once at the target.

Firing at the biters from far away isn't all consequence free, as they will come running to your train, so you will have to make sure there are some defences nearby, or are prepared for a quick getaway.

Currently it has a range of 7 chunks (224 tiles) when firing automatically, and a range of 17.5 chunks (560 tiles) when firing manually. The main reason for this range difference is to incentivize players to use manual mode, since it is quite a fun way to use the artillery wagons, and it gives the satisfaction of blowing up biter nests remotely.

Albert is working hard to finish the graphics, but here's a untextured work in progress preview.
https://eu1.factorio.com/assets/img/blog/fff-220-WIP-artillery-wagon.mp4

Projectiles are slow and are shown on the map. They explore every chunk they travel across.
https://eu1.factorio.com/assets/img/blog/fff-220-auto-shooting.mp4

Since they explore the area before exploding, you can zoom in and watch the impact.
https://eu1.factorio.com/assets/img/blog/fff-220-manual-shooting.mp4

New terrain/Transitions
As we proclaimed in FFF #199 we wanted to move grass-to-water transitions, from the grass tile to the water tile to make it impossible to build on tiles that visually have water on them. Moving the transition created some new problems. First we had to change rules for building offshore pumps, as they would be placed too far into land. Walking or driving around water felt very wrong suddenly, as player character would get stuck on corners that looked like they should be walkable. So we had to adjust player and vehicle collisions to account for that.

We also wanted to allow transitions from any terrain type and water. With some adjustments to our new alpha-masking capabilities we were able to create few sets of transition sprites, most of which are shared by multiple tile types. The new problem now is that the transitions are screaming for animated water now. Oh, well...







Official Factorio t-shirts
Its been a long time in the works, and we've been asked about it countless time, but the Factorio T-shirts are finally happening, and will be available next week.

It has been tough to find a printer who can meet our requirements. After many different companies, tests and iterations (such as the batch for the party), we have an order booked for 2,000 T-shirts scheduled to arrive on Monday.

Once we check them and make sure everything is alright, we will open up to orders through our new Eshop on our website. The T-shirts are grey unisex, available in sizes XS to XXL, with the Factorio logo printed on the front. It was especially important to us that the silkscreen was of a high quality, and we are happy to say these are better than your typical print shop. The price is $20 USD per shirt plus shipping. There are some limitations on the countries we will be shipping to.



If everything goes according to the plan, we will send the first shipment on the 13th of December, and subsequent packages every Wednesday after. Packing the orders is all going to be handled by us, and since we are expecting a large initial demand, we hope that you will be understanding if we don't mange to get them to you before Christmas.

For now we will be limiting orders to a maximum of 3 per person, so we can make sure they end up in the hands of fans, and won't all be scooped up by some scalper/reseller. We also reserve the right to cancel any suspicious/large orders to further this goal, and will be looking through the recipients to make sure nobody is taking more than their fair share.

We have the full terms of service on the store, so please check it out before you make any order. We won't really appreciate if we see anybody reselling the shirts, as we aren't really making any profit from this venture, we are just trying to do a good service to our fans. In any case, once we have a good gauge on the demand, we will be able to produce some more batches early next year, so we can keep the supply flowing.

Factorio 0.16 experimental
We had some discussions some weeks ago about when we should release 0.16. Because of the approaching winter holidays, we realized we have two choices, either to release before the winter holidays or some time in January.

We decided that Factorio fans would really like to play during the holidays, so we plan to release 0.16.0 next week.
This date is quite tight, but this week's internal playtesting went well, with only a few bugs and desyncs. It does not include everything we wanted but a smaller and quicker release is probably better.

Please bear in mind that this is an opt-in experimental release of an early access game, there will be bugs, especially since the release is a bit premature. We will have just 1-2 weeks of bugfixing before most of us will go on holiday, so it might not be perfect, but we will make it as playable as possible. Plus some of us (like Rseding91) will be fixing bugs during the holidays.

The next few weeks will be a bit crazy for us, working overtime to fix bugs and pack t-shirts, so let us know how excited you are about the news at the forums.

Level designer needed
As an unrelated footnote to this weeks FFF, we are looking for an experienced level designer to help us develop the mini-tutorial and campaign levels. For more information, see the job description on our website.
Factorio - Klonan
Cliffs - introduction and gameplay
Several months ago TOGoS (Dan) half-jokingly mentioned that what Factorio really needed was mountains and cliffs. This was also suggested many many many times.Albert immediately got very excited and they started having some discussions about how to make it happen.

Fast forward a few months, and Ernestas had made some cliff graphics that looked really nice when layered onto pretty much any type of terrain. Fast forward a few more months and add a few months of programming and polishing, and cliffs are almost done, so we will be showing them to you today.

Cliffs, together with the other map changes TOGoS did, should make the map look much more diverse and interesting compared to 0.15. Hopefully it will make exploration more fun, since you will be finding more diverse and unique areas in the world.

Since cliffs block your path, they can affect gameplay significantly. To not make this annoying, cliffs are never too long and often have gaps. We tried to balance the length so they will be long enough to create interesting combat situations, or with some modifications serve as a natural wall against the biters, but so long that they block your path when you want to get somewhere. Cliffs will also not appear in the starting area, to give you plenty of space for your initial base.

Finally, in Factorio nothing should stand in the way of automation, so if you don't like cliffs, you can always blow them up using a new mid-game item called "Cliff explosives".

Cliffs - graphics
Map generation is hard mainly because it is procedurally generated. That means that the computer is mixing all the pieces to create the terrain on the fly. This leads the artists to a very difficult situation,because it is very hard to guess in which conditions the tilesets will be used.

Factorio terrain 0.1
We started the generation of terrain in Factorio with very basic rules, mainly mixing clusters of 32px tiles. But obviously that wasn't enough.



Factorio terrain 0.3
With better looking tiles, transitions from one terrain to another, and variations of tiles, terrain looks much better. But this technique was a pain for the artist to generate an interesting and detailed tileset. The 32px grid was killing any attempt to have a natural looking terrain.



Factorio terrain 0.12
New technique: Instead of having only variations of 32px tiles, we produce a tileset with different sizes (x32, x64, x128, x256) in order to break this squary sense of grid, and even being able to render more detail in bigger sized tiles. So terrain looks much more natural. The visible tile-grid is almost gone, and we start spreading a new concept for us: the doodads. These are little sprites of plants and rocks randomly spread throughout the map in order to provide more variability and an organic feeling.



Factorio terrain 0.15
Things are getting better, the doodads were optimised and we're able to place much more of them, creating more interesting patterns and mixtures. It is also worth it to mention that the introduction of the high resolution graphics does a lot to help the look of the terrain.



Factorio terrain 0.16
After all those iterations, the next terrain generation integrates a couple of new concepts: the decals which are "just" doodads but ground-related. Decals are meant to generate terrain accidents and details without being oppressed by the rules of "tileability" and size. Basically decals are patches on top of a tileset that are very rich in detail. In combination with the doodads, the absence of the tile-grid and the high-res, we start to have a natural looking terrain. I have to add that the good and fast work of Ernestas, our environment artist, made possible the evolution of this new state of terrain. Now with our new techniques, the creation of a new tileset is very smooth.



Even with all the improvements, terrain still looks too flat, so another addition to 0.16 are the cliffs. Finally we can break the flatness of the Factorio surface, without having to change the mechanics of the game.



This new feature can add a bit to the fun of designing a factory by taking advantage of the topology of the map.



Or can lead combat to more interesting situations.



There are more additions to the terrain, and we will dedicate more time to this subject in future posts.

Cliffs - Programming
After seeing a graphical mock-up, I was tasked to figure out how they would be integrated into the game.

We had some thoughts about making them tiles, or even a new kind of terrain layer, but in the end decided the simplest way forward was jut to make cliffs entities. The "cliff" entity prototype type has some smart logic in it about how all the different cliff orientations work, and that if a cliff gets destroyed, its neighbours need to be fixed up. There are also some special cases about how they interact with projectiles, but for the most part, cliffs just act as walls.

The other aspect to cliffs is how to generate them on the map. Since we already have an elevation function, we can just place cliffs wherever we have a steep slope, right? Well, it is not quite that simple. Because of the way the cliff entities were designed, we can't just place them anywhere, we need to make sure they get placed many segments in a row. The rows of cliffs also need to be spaced apart (in cases where there's enough of an elevation change to have multiple rows of cliffs), or they don't look good.

The first approach I took was to look at the change in elevation on each side of each 4x4 tile (the size of one cliff segment) cell. If an edge crossed a certain elevation and was steep enough, then we'd say that edge crossed a cliff, and select an appropriate cliff segment to put in the cell based on which edges crossed the cliff elevation upwards or downwards.



A couple of problems became apparent:
  • Slopes of north-south and east-west cell edges that cross a cliff line aren't necessarily correlated. The result being that cliffs running nearly north-to-south, for example, would often have gaps at points where they crossed a grid line to the east or west.
  • There was nothing in this algorithm preventing 'impossible' cells, such as one where every edge has a cliff crossing, and we don't have a cliff graphic to represent that situation.
In the end I removed the slope calculation. We still check that edges cross a threshold elevation, but instead of using slope as the second factor for cliff placement, there's an additional noise layer called 'cliffiness' which applies equally to the north-south and east-west edges. That fact that this noise layer is completely independent of elevation has the added benefit that it's easier to tweak, e.g. to ensure that there are gaps in cliff faces every so often.

To prevent impossible situations, the cliff generator now builds up map of cliffs for an entire chunk at a time, and then, cell by cell, removes edges marked as cliff-crossing until no cell has more than 2 'cliff-crossing' (this concept becoming more and more removed from the original elevation function) edges. Of course edges shared with neighbouring chunks are off-limits to the edge removal algorithm, since they have to match whatever cliffs are generated (independently) for that chunk.

As always, let us know what you think on our forum.
Factorio - Klonan
Cliffs - introduction and gameplay
Several months ago TOGoS (Dan) half-jokingly mentioned that what Factorio really needed was mountains and cliffs. This was also suggested many many many times.Albert immediately got very excited and they started having some discussions about how to make it happen.

Fast forward a few months, and Ernestas had made some cliff graphics that looked really nice when layered onto pretty much any type of terrain. Fast forward a few more months and add a few months of programming and polishing, and cliffs are almost done, so we will be showing them to you today.

Cliffs, together with the other map changes TOGoS did, should make the map look much more diverse and interesting compared to 0.15. Hopefully it will make exploration more fun, since you will be finding more diverse and unique areas in the world.

Since cliffs block your path, they can affect gameplay significantly. To not make this annoying, cliffs are never too long and often have gaps. We tried to balance the length so they will be long enough to create interesting combat situations, or with some modifications serve as a natural wall against the biters, but so long that they block your path when you want to get somewhere. Cliffs will also not appear in the starting area, to give you plenty of space for your initial base.

Finally, in Factorio nothing should stand in the way of automation, so if you don't like cliffs, you can always blow them up using a new mid-game item called "Cliff explosives".

Cliffs - graphics
Map generation is hard mainly because it is procedurally generated. That means that the computer is mixing all the pieces to create the terrain on the fly. This leads the artists to a very difficult situation,because it is very hard to guess in which conditions the tilesets will be used.

Factorio terrain 0.1
We started the generation of terrain in Factorio with very basic rules, mainly mixing clusters of 32px tiles. But obviously that wasn't enough.



Factorio terrain 0.3
With better looking tiles, transitions from one terrain to another, and variations of tiles, terrain looks much better. But this technique was a pain for the artist to generate an interesting and detailed tileset. The 32px grid was killing any attempt to have a natural looking terrain.



Factorio terrain 0.12
New technique: Instead of having only variations of 32px tiles, we produce a tileset with different sizes (x32, x64, x128, x256) in order to break this squary sense of grid, and even being able to render more detail in bigger sized tiles. So terrain looks much more natural. The visible tile-grid is almost gone, and we start spreading a new concept for us: the doodads. These are little sprites of plants and rocks randomly spread throughout the map in order to provide more variability and an organic feeling.



Factorio terrain 0.15
Things are getting better, the doodads were optimised and we're able to place much more of them, creating more interesting patterns and mixtures. It is also worth it to mention that the introduction of the high resolution graphics does a lot to help the look of the terrain.



Factorio terrain 0.16
After all those iterations, the next terrain generation integrates a couple of new concepts: the decals which are "just" doodads but ground-related. Decals are meant to generate terrain accidents and details without being oppressed by the rules of "tileability" and size. Basically decals are patches on top of a tileset that are very rich in detail. In combination with the doodads, the absence of the tile-grid and the high-res, we start to have a natural looking terrain. I have to add that the good and fast work of Ernestas, our environment artist, made possible the evolution of this new state of terrain. Now with our new techniques, the creation of a new tileset is very smooth.



Even with all the improvements, terrain still looks too flat, so another addition to 0.16 are the cliffs. Finally we can break the flatness of the Factorio surface, without having to change the mechanics of the game.



This new feature can add a bit to the fun of designing a factory by taking advantage of the topology of the map.



Or can lead combat to more interesting situations.



There are more additions to the terrain, and we will dedicate more time to this subject in future posts.

Cliffs - Programming
After seeing a graphical mock-up, I was tasked to figure out how they would be integrated into the game.

We had some thoughts about making them tiles, or even a new kind of terrain layer, but in the end decided the simplest way forward was jut to make cliffs entities. The "cliff" entity prototype type has some smart logic in it about how all the different cliff orientations work, and that if a cliff gets destroyed, its neighbours need to be fixed up. There are also some special cases about how they interact with projectiles, but for the most part, cliffs just act as walls.

The other aspect to cliffs is how to generate them on the map. Since we already have an elevation function, we can just place cliffs wherever we have a steep slope, right? Well, it is not quite that simple. Because of the way the cliff entities were designed, we can't just place them anywhere, we need to make sure they get placed many segments in a row. The rows of cliffs also need to be spaced apart (in cases where there's enough of an elevation change to have multiple rows of cliffs), or they don't look good.

The first approach I took was to look at the change in elevation on each side of each 4x4 tile (the size of one cliff segment) cell. If an edge crossed a certain elevation and was steep enough, then we'd say that edge crossed a cliff, and select an appropriate cliff segment to put in the cell based on which edges crossed the cliff elevation upwards or downwards.



A couple of problems became apparent:
  • Slopes of north-south and east-west cell edges that cross a cliff line aren't necessarily correlated. The result being that cliffs running nearly north-to-south, for example, would often have gaps at points where they crossed a grid line to the east or west.
  • There was nothing in this algorithm preventing 'impossible' cells, such as one where every edge has a cliff crossing, and we don't have a cliff graphic to represent that situation.
In the end I removed the slope calculation. We still check that edges cross a threshold elevation, but instead of using slope as the second factor for cliff placement, there's an additional noise layer called 'cliffiness' which applies equally to the north-south and east-west edges. That fact that this noise layer is completely independent of elevation has the added benefit that it's easier to tweak, e.g. to ensure that there are gaps in cliff faces every so often.

To prevent impossible situations, the cliff generator now builds up map of cliffs for an entire chunk at a time, and then, cell by cell, removes edges marked as cliff-crossing until no cell has more than 2 'cliff-crossing' (this concept becoming more and more removed from the original elevation function) edges. Of course edges shared with neighbouring chunks are off-limits to the edge removal algorithm, since they have to match whatever cliffs are generated (independently) for that chunk.

As always, let us know what you think on our forum.
Factorio - HanziQ
Bugfixes
  • Fixed corrupted Windows release. more


You can get experimental releases by selecting the 'experimental' beta branch under Factorio's properties in Steam.
Factorio - HanziQ
Bugfixes
  • Fixed corrupted Windows release. more


You can get experimental releases by selecting the 'experimental' beta branch under Factorio's properties in Steam.
Factorio - Klonan
Hello dear biters and related species from unexplored planet full of life and natural resources. Recently I have been working on several high resolution graphics for your best friends - the tank and the player character. In this article I would like to show their updated visuals to you, as well as a sneak peek at how they are produced. The following text may contain traces of automation.

High Resolution Tank
Like most biter stories end, this story started with the tank. I just took the 3D scene that Pavel made in 2014. There was quite a bit of work required to make it all render correctly, but eventually I arrived at the desired result.



However there was one thing that really bothered me in the process - making the colour mask look good was rather impossible.



In general this is an issue that we already encountered earlier with the locomotive, cargo wagon and train stop. The cause was the RGBA values set for player colours, so I went ahead and changed all of them, I even added a “default” colour, so you can easily revert back to the single player default colour in 0.16 (which is also "Orange").

The dynamic colour algorithm (we call it tint) works in very weird ways, where if Alpha is set to 1.0, it kind of multiplies the mask by some selected colour. Alpha 0.0 somehow makes the whole mask sprite draw additively while colorized by the selected colour.



Regardless of the technical magic, the final verdict is that unless you are doing something extremely specific, the colour mask values should always be at 0.5 Alpha. You might have already noticed that the train colour sliders only allow you to change RGB values and not Alpha. That makes the colour much more stable - any RGB value you pick is going to work, once you start touching the Alpha it can look wrong and broken.

I would like to take this opportunity to ask modders to keep this in mind, as I have noticed multiple mods using 1.0 Alpha values in colour mask tint. The Alpha is black magic, keep it at 0.5 please.
Player character colours
The tank and the car colours are both much nicer now, but the player character colours seem a bit off...



The whole mask-works-with-0.5-alpha has one big condition - both the mask and the masked area of the sprite under it have to be desaturated. And the player graphics are already made to be orange. This is especially visible in the image above on colours like gray.This was never an issue since the player colours were using 1.0 Alpha, apart from the problem that all of the non-default colours looked horrible.



It might have been possible to do some quick hacks and just desaturate the player sprites where needed, but we found it more appropriate to take the opportunity to bring the player character into high resolution and fix it along the way.

High resolution player character
We were already aware that the player character is a very special task. Just the amount of spritesheets and Blend scenes already screams madness. Basically, the player character was split across many Blend files that Albert produced in 2015, each of them having one animation sequence. I honestly didn’t even ask how much work and time did it take for him to create all of this.



The game currently uses:
  • Idle player
  • Idle player with gun in hand
  • Mining player without axe
  • Mining player with axe
  • Running player
  • Running player with gun in hand
  • Player corpse
Each of these animations then have a variation for two armor levels, which can be drawn on top of the basic character. In total we are talking about over 4,000 individual sprites, double that number when we also consider high resolution.



From past experience we already know that re-rendering an entity in high resolution is almost never “just make it have more pixels”. Shaders and details start working differently, and it’s always necessary to do some changes. However, editing 21 Blend files at the same time does not sound very appealing or efficient, so our plan was to merge all of the animation into one huge Blend file. The aim is to have:
  • Blender file with 21 scenes, each rendering one animation.
  • Everything must render automatically.
  • All of the meshes linked so if we edit one, the rest automatically update.
  • All of the meshes use the same materials so we just edit one.
  • It must be possible to revisit the player character in the future.
Per usual this is much easier said than done, it is possible with the tools that Blender has, but would require an extreme amount of manual work. It would also take way too much time, and would be way too fragile.

Graphics workflow
Making the player character in high resolution would have been utterly insane without the use of scripting. In the following part of the article I will show you a few of the most useful Blender scripts that I wrote and used in the process.

1. Copy objects between Blender scenes
The first task sounds simple - copy-paste the objects from the source Blend file to the new one - until you try to do it. In Blender you can Copy + Paste objects between scenes easily, the catch is that in the destination, they are all pasted to the same layer, depending on which layer is active. However the objects forget which layer they are from in the source scene. This is a big problem, but after short thinking I wrote a new object transferring tool.



It is a set of two scripts, the first one prepares objects in the source scene (it changes their names to have a prefix with layer numbers). The second script processes them in destination by reading the name, moving the object to the appropriate layer(s), and cleaning up the name as if nothing ever happened.

2. Link mesh data of identical objects
The copy pasting is great, but every new paste creates a set of new unique objects with unique materials. If you do this 21 times, the amount of duplicate data which is supposed to be the same goes up like a rocket. Generally 3D software has a way to create duplicates which are linked so if you edit one, you also edit the other. However once you break the link, it’s not so easy to bring it back, because the program isn’t sure if the two objects are really the same. In Blender this is possible, but doing it one by one would be way too much work so it’s time for another script.



This one reads every object’s vertices one by one, and saves them to giant lists. It then compares it to another object, and if the other object is identical, it makes a link between them - if not, it keeps both of them unique and adds the new one to the list of vertex data to be compared with.

It’s actually surprisingly fast, considering that it filters through about 5 million vertices, but it still takes several minutes to process.

The result seems good except for one problem - some of the objects have identical mesh data, but special materials that we used for rendering shadows, which is solved by running another script, which searches for objects with the shadow maker material and removes them. This has to be done before linking the mesh data to make sure that our mesh data ends up with the correct materials.

3. Clean material slots
The next step is to unify materials. This is already mostly taken care of because the mesh data already carries the used materials in it, but going through all of them and manually checking was required. It wasn’t helping that every object had defined about 20 material slots, even if it was using just a handful of them.

Whenever you have a mesh with multiple materials being used on different polygons, and you remove some polygons, chances are that you aren’t using all of the materials any more.



So I made myself a script which removes the unused material slots so I wouldn’t have to manually check so many of them. It’s not only more work but it’s also much easier to spot errors when you see only what you need to.

4. Generate Render Layers and Compositor Nodes
With all of the objects correctly linked and materials properly editable, it’s time to figure out how to output this whole thing into sprites. As we already hinted in FFF-146, we are almost always using Render Layers going into Compositor nodes to output many different passes of the same scene.

Since we are keeping the layer structure of the original source, it was possible to set up the rendering system to do the same again. It was still a lot of work because it was not always consistent and many of the scenes required small but hard to spot tweaks.

One thing which helps at least a little bit, is pre-generating all of the render layers with their names and some basic setup, which is consistent between all scenes.



Render Layers aren’t much without a way to save them to the final images - this is handled by the compositor nodes. There is a special case for Ambient Occlusion and Shadow passes, but in general it’s absolutely consistent so scripting this part is great as it removes all need for manual attention to this. The script just reads the Render Layers and generates the nodes to fit them.

5. Rendering and final processing
To render all this from the 3D scene, we are using a fancy system which allows us to render across multiple computers, as the animations would take over 40 hours to render on a single PC.



The rest is basically the same as with the combinators shown in FFF-194, so I won't go into details here.

Result
After all this, we get the player graphics in high resolution, with colour masks working correctly and also a lot of new Blender tools for ourselves to work with.



And here is a preview of how the colour masks work for 0.16.



All the things in this article combined took a lot of time to make, especially the high resolution version of the player character. In the long term we are likely going to do some more changes and adjustments to the player character models and animations. Thanks to the new source files we will be able to do that, and for now we are satisfied with how the player looks for 0.16.

Razer Chroma
Razer contacted us quite a while back and asked us if we could add Razer Chroma support to Factorio. Razer Chroma/Chroma Link means that the game can take control of any supported RGB devices (from mouse and keyboard to LED strips and chairs) and control the colors of the lights.

We implemented the following:
  • Background: Factorio orange (Keyboard, mouse, mousepad, headset)
  • Damage taken animation (Keyboard, mouse, mousepad, headset, chroma link)
  • Player Healthbar when damaged (Keyboard, mouse, mousepad)
  • Player shields when damaged (Keyboard, mouse, mousepad)
  • Progress-bar during game loading, savegame loading, multiplayer map download multiplayer map loading, multiplayer catching up(Keyboard, mouse, mousepad, headset, chroma link)
  • Flash technology key on technology researched (Keyboard)
  • Flash map key when building are destroyed (Keyboard)
  • Custom Ripple animation when achievement is unlocked (Keyboard, mouse, mousepad, headset, chroma link)



People already want to control their light using the circuit network and Lua, so something like that could be cool to add in the future if there is demand for it.

Normally we wouldn't add features to 0.15 after it was marked stable, but since there will be some Razer events, we thought it's good idea to have Factorio in the list of supported games. So the feature was added today to 0.15 as an experimental update but it will be marked as stable next week if nothing is broken.

If you have anything to say you can let us know on our forum.
Factorio - Klonan
Hello dear biters and related species from unexplored planet full of life and natural resources. Recently I have been working on several high resolution graphics for your best friends - the tank and the player character. In this article I would like to show their updated visuals to you, as well as a sneak peek at how they are produced. The following text may contain traces of automation.

High Resolution Tank
Like most biter stories end, this story started with the tank. I just took the 3D scene that Pavel made in 2014. There was quite a bit of work required to make it all render correctly, but eventually I arrived at the desired result.



However there was one thing that really bothered me in the process - making the colour mask look good was rather impossible.



In general this is an issue that we already encountered earlier with the locomotive, cargo wagon and train stop. The cause was the RGBA values set for player colours, so I went ahead and changed all of them, I even added a “default” colour, so you can easily revert back to the single player default colour in 0.16 (which is also "Orange").

The dynamic colour algorithm (we call it tint) works in very weird ways, where if Alpha is set to 1.0, it kind of multiplies the mask by some selected colour. Alpha 0.0 somehow makes the whole mask sprite draw additively while colorized by the selected colour.



Regardless of the technical magic, the final verdict is that unless you are doing something extremely specific, the colour mask values should always be at 0.5 Alpha. You might have already noticed that the train colour sliders only allow you to change RGB values and not Alpha. That makes the colour much more stable - any RGB value you pick is going to work, once you start touching the Alpha it can look wrong and broken.

I would like to take this opportunity to ask modders to keep this in mind, as I have noticed multiple mods using 1.0 Alpha values in colour mask tint. The Alpha is black magic, keep it at 0.5 please.
Player character colours
The tank and the car colours are both much nicer now, but the player character colours seem a bit off...



The whole mask-works-with-0.5-alpha has one big condition - both the mask and the masked area of the sprite under it have to be desaturated. And the player graphics are already made to be orange. This is especially visible in the image above on colours like gray.This was never an issue since the player colours were using 1.0 Alpha, apart from the problem that all of the non-default colours looked horrible.



It might have been possible to do some quick hacks and just desaturate the player sprites where needed, but we found it more appropriate to take the opportunity to bring the player character into high resolution and fix it along the way.

High resolution player character
We were already aware that the player character is a very special task. Just the amount of spritesheets and Blend scenes already screams madness. Basically, the player character was split across many Blend files that Albert produced in 2015, each of them having one animation sequence. I honestly didn’t even ask how much work and time did it take for him to create all of this.



The game currently uses:
  • Idle player
  • Idle player with gun in hand
  • Mining player without axe
  • Mining player with axe
  • Running player
  • Running player with gun in hand
  • Player corpse
Each of these animations then have a variation for two armor levels, which can be drawn on top of the basic character. In total we are talking about over 4,000 individual sprites, double that number when we also consider high resolution.



From past experience we already know that re-rendering an entity in high resolution is almost never “just make it have more pixels”. Shaders and details start working differently, and it’s always necessary to do some changes. However, editing 21 Blend files at the same time does not sound very appealing or efficient, so our plan was to merge all of the animation into one huge Blend file. The aim is to have:
  • Blender file with 21 scenes, each rendering one animation.
  • Everything must render automatically.
  • All of the meshes linked so if we edit one, the rest automatically update.
  • All of the meshes use the same materials so we just edit one.
  • It must be possible to revisit the player character in the future.
Per usual this is much easier said than done, it is possible with the tools that Blender has, but would require an extreme amount of manual work. It would also take way too much time, and would be way too fragile.

Graphics workflow
Making the player character in high resolution would have been utterly insane without the use of scripting. In the following part of the article I will show you a few of the most useful Blender scripts that I wrote and used in the process.

1. Copy objects between Blender scenes
The first task sounds simple - copy-paste the objects from the source Blend file to the new one - until you try to do it. In Blender you can Copy + Paste objects between scenes easily, the catch is that in the destination, they are all pasted to the same layer, depending on which layer is active. However the objects forget which layer they are from in the source scene. This is a big problem, but after short thinking I wrote a new object transferring tool.



It is a set of two scripts, the first one prepares objects in the source scene (it changes their names to have a prefix with layer numbers). The second script processes them in destination by reading the name, moving the object to the appropriate layer(s), and cleaning up the name as if nothing ever happened.

2. Link mesh data of identical objects
The copy pasting is great, but every new paste creates a set of new unique objects with unique materials. If you do this 21 times, the amount of duplicate data which is supposed to be the same goes up like a rocket. Generally 3D software has a way to create duplicates which are linked so if you edit one, you also edit the other. However once you break the link, it’s not so easy to bring it back, because the program isn’t sure if the two objects are really the same. In Blender this is possible, but doing it one by one would be way too much work so it’s time for another script.



This one reads every object’s vertices one by one, and saves them to giant lists. It then compares it to another object, and if the other object is identical, it makes a link between them - if not, it keeps both of them unique and adds the new one to the list of vertex data to be compared with.

It’s actually surprisingly fast, considering that it filters through about 5 million vertices, but it still takes several minutes to process.

The result seems good except for one problem - some of the objects have identical mesh data, but special materials that we used for rendering shadows, which is solved by running another script, which searches for objects with the shadow maker material and removes them. This has to be done before linking the mesh data to make sure that our mesh data ends up with the correct materials.

3. Clean material slots
The next step is to unify materials. This is already mostly taken care of because the mesh data already carries the used materials in it, but going through all of them and manually checking was required. It wasn’t helping that every object had defined about 20 material slots, even if it was using just a handful of them.

Whenever you have a mesh with multiple materials being used on different polygons, and you remove some polygons, chances are that you aren’t using all of the materials any more.



So I made myself a script which removes the unused material slots so I wouldn’t have to manually check so many of them. It’s not only more work but it’s also much easier to spot errors when you see only what you need to.

4. Generate Render Layers and Compositor Nodes
With all of the objects correctly linked and materials properly editable, it’s time to figure out how to output this whole thing into sprites. As we already hinted in FFF-146, we are almost always using Render Layers going into Compositor nodes to output many different passes of the same scene.

Since we are keeping the layer structure of the original source, it was possible to set up the rendering system to do the same again. It was still a lot of work because it was not always consistent and many of the scenes required small but hard to spot tweaks.

One thing which helps at least a little bit, is pre-generating all of the render layers with their names and some basic setup, which is consistent between all scenes.



Render Layers aren’t much without a way to save them to the final images - this is handled by the compositor nodes. There is a special case for Ambient Occlusion and Shadow passes, but in general it’s absolutely consistent so scripting this part is great as it removes all need for manual attention to this. The script just reads the Render Layers and generates the nodes to fit them.

5. Rendering and final processing
To render all this from the 3D scene, we are using a fancy system which allows us to render across multiple computers, as the animations would take over 40 hours to render on a single PC.



The rest is basically the same as with the combinators shown in FFF-194, so I won't go into details here.

Result
After all this, we get the player graphics in high resolution, with colour masks working correctly and also a lot of new Blender tools for ourselves to work with.



And here is a preview of how the colour masks work for 0.16.



All the things in this article combined took a lot of time to make, especially the high resolution version of the player character. In the long term we are likely going to do some more changes and adjustments to the player character models and animations. Thanks to the new source files we will be able to do that, and for now we are satisfied with how the player looks for 0.16.

Razer Chroma
Razer contacted us quite a while back and asked us if we could add Razer Chroma support to Factorio. Razer Chroma/Chroma Link means that the game can take control of any supported RGB devices (from mouse and keyboard to LED strips and chairs) and control the colors of the lights.

We implemented the following:
  • Background: Factorio orange (Keyboard, mouse, mousepad, headset)
  • Damage taken animation (Keyboard, mouse, mousepad, headset, chroma link)
  • Player Healthbar when damaged (Keyboard, mouse, mousepad)
  • Player shields when damaged (Keyboard, mouse, mousepad)
  • Progress-bar during game loading, savegame loading, multiplayer map download multiplayer map loading, multiplayer catching up(Keyboard, mouse, mousepad, headset, chroma link)
  • Flash technology key on technology researched (Keyboard)
  • Flash map key when building are destroyed (Keyboard)
  • Custom Ripple animation when achievement is unlocked (Keyboard, mouse, mousepad, headset, chroma link)



People already want to control their light using the circuit network and Lua, so something like that could be cool to add in the future if there is demand for it.

Normally we wouldn't add features to 0.15 after it was marked stable, but since there will be some Razer events, we thought it's good idea to have Factorio in the list of supported games. So the feature was added today to 0.15 as an experimental update but it will be marked as stable next week if nothing is broken.

If you have anything to say you can let us know on our forum.
...