├── .gitignore ├── LICENSE ├── README.md ├── changelog.txt ├── common-properties.lua ├── data.lua ├── entities.lua ├── equipment.lua ├── info.json └── items.lua /.gitignore: -------------------------------------------------------------------------------- 1 | .vs/ 2 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2020 Erik Wellmann 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Minimal mod allowing incompatibility with the base mod 2 | 3 | This mod is incompatible with the base mod and removes nearly all features from the game. 4 | It is meant for mod development, gameplay is not really possible with only this mod enabled. 5 | 6 | This mod provides the minimal prototypes needed to load the game without the base mod. 7 | Modders are encouraged to build their own mod on top of this one or depend on this mod to aid development of mods incompatible with the base mod. 8 | 9 | **To load the game with this mod enabled, you have to disable the base mod: Open mod-list.json, find "base" and set "enabled" to false. 10 | If you do not do this, this mod will most likely not be loaded by the game.** 11 | -------------------------------------------------------------------------------- /changelog.txt: -------------------------------------------------------------------------------- 1 | --------------------------------------------------------------------------------------------------- 2 | Version: 0.2.1 3 | Date: ???? 4 | Changes: 5 | --------------------------------------------------------------------------------------------------- 6 | Version: 0.2.0 7 | Date: 2020-12-14 8 | Features: 9 | - Updated to 1.1.6. 10 | --------------------------------------------------------------------------------------------------- 11 | Version: 0.1.0 12 | Date: 2020-09-02 13 | Features: 14 | - Updated to 1.0.0. 15 | - Enforced "dummy-x" naming scheme for more prototypes. 16 | --------------------------------------------------------------------------------------------------- 17 | Version: 0.0.3 18 | Date: 2020-07-03 19 | Features: 20 | - Updated to 0.18.34. 21 | --------------------------------------------------------------------------------------------------- 22 | Version: 0.0.2 23 | Date: 2020-04-27 24 | Features: 25 | - Updated to 0.18.21. 26 | --------------------------------------------------------------------------------------------------- 27 | Version: 0.0.1 28 | Date: 2020-04-10 29 | Major Features: 30 | - Initial release. 31 | -------------------------------------------------------------------------------- /common-properties.lua: -------------------------------------------------------------------------------- 1 | -- Note: None of these properties are meant for use in a normal mod, 2 | -- because they mostly produce empty images and have no function in-game beyond being loadable. 3 | 4 | -- All properties are based on the formats documented on the wiki: https://wiki.factorio.com/Prototype_overview 5 | 6 | local properties = {} 7 | 8 | properties.sound_filename = "__core__/sound/achievement-unlocked.ogg" 9 | properties.sprite_filename = "__core__/graphics/empty.png" 10 | properties.sprite_filename_32px = "__core__/graphics/icons/unknown.png" 11 | properties.render_layer = "object" 12 | 13 | -- This function is applied directly to the prototype table and adds the icon to it 14 | properties.add_icon = function(prototype) 15 | prototype.icon = properties.sprite_filename 16 | prototype.icon_size = 1 17 | return prototype 18 | end 19 | 20 | -- Any property that is a table is returned via a function. 21 | -- This means that everything gets a copy of the table, not a reference to the table. 22 | 23 | properties.color = function() return {1, 1, 1, 1} end -- white 24 | properties.bounding_box = function() return {{0, 0}, {0, 0}} end 25 | -- splitter: bounding box width must be > 0.5, height must be > 1 26 | properties.nonzero_bounding_box = function() return {{-0.95, -1.0}, {0.1, 0.1}} end 27 | properties.vector = function() return {0, 0} end 28 | properties.sound = function() 29 | return {filename = properties.sound_filename} 30 | end 31 | properties.sprite = function() 32 | return 33 | { 34 | filename = properties.sprite_filename, 35 | size = 1 36 | } 37 | end 38 | -- properties.sprite() is also used as SpriteVariations and Sprite4Way 39 | properties.rotated_sprite = function() 40 | local sprite = properties.sprite() 41 | sprite.direction_count = 1 42 | return sprite 43 | end 44 | properties.rotated_sprite_custom_direction_count = function(direction_count) 45 | local sprite = properties.sprite() 46 | sprite.filename = properties.sprite_filename_32px 47 | sprite.direction_count = direction_count 48 | return sprite 49 | end 50 | properties.sprite_8_way = function() 51 | return 52 | { 53 | north = properties.sprite(), 54 | north_east = properties.sprite(), 55 | east = properties.sprite(), 56 | south_east = properties.sprite(), 57 | south = properties.sprite(), 58 | south_west = properties.sprite(), 59 | west = properties.sprite(), 60 | north_west = properties.sprite() 61 | } 62 | end 63 | properties.animation = function() 64 | return properties.sprite() 65 | end 66 | -- properties.animation() is also used as AnimationVariations and Animation4Way 67 | properties.rotated_animation = function() 68 | local animation = properties.animation() 69 | animation.direction_count = 1 70 | return animation 71 | end 72 | properties.attack_parameters = function() 73 | return 74 | { 75 | type = "stream", -- required by fluid turret 76 | ammo_type = {category = "dummy-ammo-category"}, 77 | range = 1, 78 | cooldown = 1, 79 | animation = properties.rotated_animation() -- required by unit 80 | } 81 | end 82 | properties.rail_piece_layers = function() 83 | return 84 | { 85 | metals = properties.sprite(), 86 | backplates = properties.sprite(), 87 | ties = properties.sprite(), 88 | stone_path = properties.sprite() 89 | } 90 | end 91 | properties.rail_pictures = function() 92 | return 93 | { 94 | straight_rail_horizontal = properties.rail_piece_layers(), 95 | straight_rail_vertical = properties.rail_piece_layers(), 96 | straight_rail_diagonal_left_top = properties.rail_piece_layers(), 97 | straight_rail_diagonal_right_top = properties.rail_piece_layers(), 98 | straight_rail_diagonal_right_bottom = properties.rail_piece_layers(), 99 | straight_rail_diagonal_left_bottom = properties.rail_piece_layers(), 100 | curved_rail_vertical_left_top = properties.rail_piece_layers(), 101 | curved_rail_vertical_right_top = properties.rail_piece_layers(), 102 | curved_rail_vertical_right_bottom = properties.rail_piece_layers(), 103 | curved_rail_vertical_left_bottom = properties.rail_piece_layers(), 104 | curved_rail_horizontal_left_top = properties.rail_piece_layers(), 105 | curved_rail_horizontal_right_top = properties.rail_piece_layers(), 106 | curved_rail_horizontal_right_bottom = properties.rail_piece_layers(), 107 | curved_rail_horizontal_left_bottom = properties.rail_piece_layers(), 108 | rail_endings = properties.sprite_8_way() 109 | } 110 | end 111 | properties.oriented_cliff_prototype = function() 112 | return 113 | { 114 | collision_bounding_box = properties.bounding_box(), 115 | pictures = {properties.sprite()}, 116 | fill_volume = 1 117 | } 118 | end 119 | properties.electric_energy_source = function() 120 | return 121 | { 122 | type = "electric", 123 | buffer_capacity = "1J", 124 | input_flow_limit = "1W", 125 | -- this works even for entities that technically *output* energy 126 | usage_priority = "primary-input" 127 | } 128 | end 129 | properties.void_energy_source = function() 130 | return {type = "void"} 131 | end 132 | properties.burner_energy_source = function() 133 | return {type = "burner", fuel_inventory_size = 1} 134 | end 135 | properties.wire_connection_point = function() 136 | return 137 | { 138 | wire = {}, 139 | shadow = {} 140 | } 141 | end 142 | properties.damage_prototype = function() 143 | return {amount = 1, type = "physical"} 144 | end 145 | properties.fluid_box = function() 146 | return {pipe_connections = {}} 147 | end 148 | properties.heat_buffer = function() 149 | return 150 | { 151 | -- because min temp defaults to 15 and this must be >= min temp 152 | max_temperature = 15, 153 | specific_heat = "1J", 154 | max_transfer = "1J" 155 | } 156 | end 157 | 158 | return properties -------------------------------------------------------------------------------- /data.lua: -------------------------------------------------------------------------------- 1 | local properties = require("common-properties") 2 | require("items") 3 | require("entities") 4 | require("equipment") 5 | 6 | -- The utility constants are defined in the core mod. 7 | -- Removing this property means trigger-target-types "common" and "ground-unit" do not have to be created. 8 | data.raw["utility-constants"]["default"].default_trigger_target_mask_by_type = nil 9 | -- The "x-unknown" prototypes are defined in the core mod. 10 | -- Setting the subgroup to an existing one means the default subgroup "fluid" does not have to be created. 11 | data.raw["fluid"]["fluid-unknown"].subgroup = "other" 12 | -- Setting the collision mask to something walkable means the game accepts this as the needed tile prototype. 13 | data.raw["tile"]["tile-unknown"].collision_mask = {"ground-tile"} 14 | 15 | -- Miscellaneous prototypes that are required by the required prototypes. Mostly categories. 16 | data:extend({ 17 | { 18 | type = "recipe-category", 19 | name = "crafting" 20 | }, 21 | { 22 | type = "resource-category", 23 | name = "basic-solid" 24 | }, 25 | { 26 | type = "fuel-category", 27 | name = "chemical" 28 | }, 29 | { 30 | type = "ammo-category", 31 | name = "dummy-ammo-category" 32 | }, 33 | { 34 | type = "equipment-category", 35 | name = "dummy-equipment-category" 36 | }, 37 | { 38 | type = "module-category", 39 | name = "dummy-module-category" 40 | }, 41 | { 42 | type = "optimized-particle", 43 | name = "dummy-optimized-particle", 44 | life_time = 2, 45 | pictures = properties.animation(), 46 | render_layer = properties.render_layer, 47 | render_layer_when_on_ground = properties.render_layer 48 | }, 49 | properties.add_icon 50 | { 51 | type = "item-group", 52 | name = "dummy-item-group" 53 | } 54 | }) 55 | 56 | -- The remaining core prototypes 57 | -- Core prototypes are named prototypes that the game requires to always exist, for example a "signal-everything" virtual signal. 58 | -- Core prototypes that are items or entities are included in items.lua and entities.lua respectively. 59 | data:extend({ 60 | { 61 | type = "item-subgroup", 62 | name = "other", 63 | group = "dummy-item-group" 64 | }, 65 | { 66 | type = "equipment-grid", 67 | name = "dummy-equipment-grid", 68 | equipment_categories = {"dummy-equipment-category"}, 69 | height = 1, 70 | width = 1 71 | }, 72 | properties.add_icon 73 | { 74 | type = "virtual-signal", 75 | name = "signal-everything", 76 | subgroup = "other" 77 | }, 78 | properties.add_icon 79 | { 80 | type = "virtual-signal", 81 | name = "signal-anything", 82 | subgroup = "other" 83 | }, 84 | properties.add_icon 85 | { 86 | type = "virtual-signal", 87 | name = "signal-each", 88 | subgroup = "other" 89 | }, 90 | { 91 | type = "damage-type", 92 | name = "physical" 93 | }, 94 | { 95 | type = "damage-type", 96 | name = "impact" 97 | }, 98 | { 99 | type = "trivial-smoke", 100 | name = "smoke-building", 101 | animation = properties.animation(), 102 | duration = 1, 103 | cyclic = true 104 | } 105 | }) 106 | 107 | -- The map settings are required, despite not being a core prototype. These map settings are simply a copy from the base mod. 108 | data:extend({ 109 | { 110 | type="map-settings", 111 | name="map-settings", 112 | 113 | pollution= 114 | { 115 | enabled=true, 116 | diffusion_ratio=0.02, 117 | min_to_diffuse=15, 118 | ageing=1, 119 | expected_max_per_chunk=150, 120 | min_to_show_per_chunk=50, 121 | min_pollution_to_damage_trees = 60, 122 | pollution_with_max_forest_damage = 150, 123 | pollution_per_tree_damage = 50, 124 | pollution_restored_per_tree_damage = 10, 125 | max_pollution_to_restore_trees = 20, 126 | enemy_attack_pollution_consumption_modifier = 1 127 | }, 128 | 129 | enemy_evolution= 130 | { 131 | enabled=true, 132 | time_factor = 0.000004, 133 | destroy_factor = 0.002, 134 | pollution_factor = 0.0000009 135 | }, 136 | 137 | enemy_expansion= 138 | { 139 | enabled = true, 140 | max_expansion_distance = 7, 141 | friendly_base_influence_radius = 2, 142 | enemy_building_influence_radius = 2, 143 | building_coefficient = 0.1, 144 | other_base_coefficient = 2.0, 145 | neighbouring_chunk_coefficient = 0.5, 146 | neighbouring_base_chunk_coefficient = 0.4; 147 | max_colliding_tiles_coefficient = 0.9, 148 | settler_group_min_size = 5, 149 | settler_group_max_size = 20, 150 | min_expansion_cooldown = 4 * 3600, 151 | max_expansion_cooldown = 60 * 3600 152 | }, 153 | 154 | unit_group= 155 | { 156 | min_group_gathering_time = 3600, 157 | max_group_gathering_time = 10 * 3600, 158 | max_wait_time_for_late_members = 2 * 3600, 159 | max_group_radius = 30.0, 160 | min_group_radius = 5.0, 161 | max_member_speedup_when_behind = 1.4, 162 | max_member_slowdown_when_ahead = 0.6, 163 | max_group_slowdown_factor = 0.3, 164 | max_group_member_fallback_factor = 3, 165 | member_disown_distance = 10, 166 | tick_tolerance_when_member_arrives = 60, 167 | max_gathering_unit_groups = 30, 168 | max_unit_group_size = 200 169 | }, 170 | 171 | steering= 172 | { 173 | default= 174 | { 175 | radius = 1.2, 176 | separation_force = 0.005, 177 | separation_factor = 1.2, 178 | force_unit_fuzzy_goto_behavior = false 179 | }, 180 | moving= 181 | { 182 | radius = 3, 183 | separation_force = 0.01, 184 | separation_factor = 3, 185 | 186 | force_unit_fuzzy_goto_behavior = false 187 | } 188 | }, 189 | 190 | path_finder= 191 | { 192 | fwd2bwd_ratio = 5, 193 | goal_pressure_ratio = 2, 194 | max_steps_worked_per_tick = 1000, 195 | max_work_done_per_tick = 8000, 196 | use_path_cache = true, 197 | short_cache_size = 5, 198 | long_cache_size = 25, 199 | short_cache_min_cacheable_distance = 10, 200 | short_cache_min_algo_steps_to_cache = 50, 201 | long_cache_min_cacheable_distance = 30, 202 | cache_max_connect_to_cache_steps_multiplier = 100, 203 | cache_accept_path_start_distance_ratio = 0.2, 204 | cache_accept_path_end_distance_ratio = 0.15, 205 | negative_cache_accept_path_start_distance_ratio = 0.3, 206 | negative_cache_accept_path_end_distance_ratio = 0.3, 207 | cache_path_start_distance_rating_multiplier = 10, 208 | cache_path_end_distance_rating_multiplier = 20, 209 | stale_enemy_with_same_destination_collision_penalty = 30, 210 | ignore_moving_enemy_collision_distance = 5, 211 | enemy_with_different_destination_collision_penalty = 30, 212 | general_entity_collision_penalty = 10, 213 | general_entity_subsequent_collision_penalty = 3, 214 | extended_collision_penalty = 3, 215 | max_clients_to_accept_any_new_request = 10, 216 | max_clients_to_accept_short_new_request = 100, 217 | direct_distance_to_consider_short_request = 100, 218 | short_request_max_steps = 1000, 219 | short_request_ratio = 0.5, 220 | min_steps_to_check_path_find_termination = 2000, 221 | start_to_goal_cost_multiplier_to_terminate_path_find = 2000.0, 222 | overload_levels = {0, 100, 500}, 223 | overload_multipliers = {2, 3, 4}, 224 | negative_path_cache_delay_interval = 20 225 | }, 226 | 227 | max_failed_behavior_count = 3, 228 | 229 | difficulty_settings = 230 | { 231 | recipe_difficulty = defines.difficulty_settings.recipe_difficulty.normal, 232 | technology_difficulty = defines.difficulty_settings.technology_difficulty.normal, 233 | -- technology_price_multiplier -- not needed 234 | -- research_queue_setting -- not needed 235 | } 236 | } 237 | }) 238 | -------------------------------------------------------------------------------- /entities.lua: -------------------------------------------------------------------------------- 1 | -- This file contains all entities, including ones that are core prototypes. 2 | -- Core prototypes are named prototypes that the game requires to always exist, for example a "copper-cable" item. 3 | 4 | local properties = require("common-properties") 5 | 6 | -- These functions are applied directly to the prototype table. 7 | -- This allows to easily create many prototypes that inherit from the same base class/prototype, without copy pasting properties. 8 | local function add_turret_properties(prototype) 9 | prototype.call_for_help_radius = 1 10 | prototype.attack_parameters = properties.attack_parameters() 11 | prototype.folded_animation = properties.rotated_animation() 12 | return prototype 13 | end 14 | 15 | local function add_combinator_properties(prototype) 16 | prototype.energy_source = properties.void_energy_source() 17 | prototype.active_energy_usage = "1J" 18 | prototype.sprites = properties.sprite() 19 | prototype.activity_led_sprites = properties.sprite() 20 | prototype.input_connection_bounding_box = properties.bounding_box() 21 | prototype.output_connection_bounding_box = properties.bounding_box() 22 | prototype.activity_led_light_offsets = 23 | { 24 | properties.vector(), 25 | properties.vector(), 26 | properties.vector(), 27 | properties.vector() 28 | } 29 | prototype.screen_light_offsets = 30 | { 31 | properties.vector(), 32 | properties.vector(), 33 | properties.vector(), 34 | properties.vector() 35 | } 36 | prototype.input_connection_points = 37 | { 38 | properties.wire_connection_point(), 39 | properties.wire_connection_point(), 40 | properties.wire_connection_point(), 41 | properties.wire_connection_point() 42 | } 43 | prototype.output_connection_points = 44 | { 45 | properties.wire_connection_point(), 46 | properties.wire_connection_point(), 47 | properties.wire_connection_point(), 48 | properties.wire_connection_point() 49 | } 50 | return prototype 51 | end 52 | 53 | local function add_vehicle_properties(prototype) 54 | prototype.braking_force = 1 55 | prototype.energy_per_hit_point = 1 56 | prototype.friction_force = 1 57 | prototype.weight = 1 58 | return prototype 59 | end 60 | 61 | local function add_rolling_stock_properties(prototype) 62 | prototype = add_vehicle_properties(prototype) 63 | prototype.air_resistance = 1 64 | 65 | -- copied from vanilla because these values are finicky 66 | prototype.collision_box = {{-0.6, -2.4}, {0.6, 2.4}} 67 | prototype.connection_distance = 3 68 | prototype.joint_distance = 4 69 | 70 | prototype.max_speed = 1 71 | prototype.pictures = properties.rotated_sprite() 72 | prototype.vertical_selection_shift = 1 73 | return prototype 74 | end 75 | 76 | local function add_pipe_properties(prototype) 77 | prototype.horizontal_window_bounding_box = properties.bounding_box() 78 | prototype.vertical_window_bounding_box = properties.bounding_box() 79 | prototype.fluid_box = properties.fluid_box() 80 | prototype.pictures = 81 | { 82 | straight_vertical_single = properties.sprite(), 83 | straight_vertical = properties.sprite(), 84 | straight_vertical_window = properties.sprite(), 85 | straight_horizontal = properties.sprite(), 86 | straight_horizontal_window = properties.sprite(), 87 | corner_up_right = properties.sprite(), 88 | corner_up_left = properties.sprite(), 89 | corner_down_right = properties.sprite(), 90 | corner_down_left = properties.sprite(), 91 | t_up = properties.sprite(), 92 | t_down = properties.sprite(), 93 | t_right = properties.sprite(), 94 | t_left = properties.sprite(), 95 | cross = properties.sprite(), 96 | ending_up = properties.sprite(), 97 | ending_down = properties.sprite(), 98 | ending_right = properties.sprite(), 99 | ending_left = properties.sprite(), 100 | horizontal_window_background = properties.sprite(), 101 | vertical_window_background = properties.sprite(), 102 | fluid_background = properties.sprite(), 103 | low_temperature_flow = properties.sprite(), 104 | middle_temperature_flow = properties.sprite(), 105 | high_temperature_flow = properties.sprite(), 106 | gas_flow = properties.animation() 107 | } 108 | return prototype 109 | end 110 | 111 | local function add_transport_belt_connectable_properties(prototype) 112 | prototype.collision_box = properties.nonzero_bounding_box() 113 | prototype.speed = 1 114 | prototype.belt_animation_set = 115 | { 116 | animation_set = properties.rotated_sprite_custom_direction_count(20) 117 | } 118 | return prototype 119 | end 120 | 121 | -- entity prototypes, one of each, alphabetical by type 122 | data:extend({ 123 | { 124 | type = "accumulator", 125 | name = "dummy-accumulator", 126 | energy_source = properties.electric_energy_source(), 127 | picture = properties.sprite(), 128 | charge_cooldown = 1, 129 | discharge_cooldown = 1 130 | }, 131 | add_turret_properties 132 | { 133 | type = "ammo-turret", 134 | name = "dummy-ammo-turret", 135 | automated_ammo_count = 1, 136 | inventory_size = 1 137 | }, 138 | add_combinator_properties 139 | { 140 | type = "arithmetic-combinator", 141 | name = "dummy-arithmetic-combinator", 142 | plus_symbol_sprites = properties.sprite(), 143 | minus_symbol_sprites = properties.sprite(), 144 | multiply_symbol_sprites = properties.sprite(), 145 | divide_symbol_sprites = properties.sprite(), 146 | modulo_symbol_sprites = properties.sprite(), 147 | power_symbol_sprites = properties.sprite(), 148 | left_shift_symbol_sprites = properties.sprite(), 149 | right_shift_symbol_sprites = properties.sprite(), 150 | and_symbol_sprites = properties.sprite(), 151 | or_symbol_sprites = properties.sprite(), 152 | xor_symbol_sprites = properties.sprite() 153 | }, 154 | { 155 | type = "arrow", 156 | name = "dummy-arrow", 157 | arrow_picture = properties.sprite() 158 | }, 159 | { 160 | type = "artillery-flare", 161 | name = "dummy-artillery-flare", 162 | life_time = 1, 163 | pictures = properties.animation(), 164 | render_layer = properties.render_layer, 165 | render_layer_when_on_ground = properties.render_layer, 166 | map_color = properties.color() 167 | }, 168 | { 169 | type = "artillery-projectile", 170 | name = "dummy-artillery-projectile", 171 | reveal_map = true, 172 | map_color = properties.color() 173 | }, 174 | { 175 | type = "artillery-turret", 176 | name = "dummy-artillery-turret", 177 | ammo_stack_limit = 1, 178 | automated_ammo_count = 1, 179 | gun = "dummy-gun", 180 | inventory_size = 1, 181 | manual_range_modifier = 1, 182 | turret_rotation_speed = 1 183 | }, 184 | add_rolling_stock_properties 185 | { 186 | type = "artillery-wagon", 187 | name = "dummy-artillery-wagon", 188 | ammo_stack_limit = 1, 189 | gun = "dummy-gun", 190 | inventory_size = 1, 191 | manual_range_modifier = 1, 192 | turret_rotation_speed = 1 193 | }, 194 | { 195 | type = "assembling-machine", 196 | name = "dummy-assembling-machine", 197 | energy_usage = "1J", 198 | energy_source = properties.void_energy_source(), 199 | crafting_speed = 1, 200 | crafting_categories = {"crafting"} 201 | }, 202 | { 203 | type = "beacon", 204 | name = "dummy-beacon", 205 | animation = properties.animation(), 206 | base_picture = properties.sprite(), 207 | distribution_effectivity = 1, 208 | energy_source = properties.void_energy_source(), 209 | energy_usage = "1J", 210 | module_specification = {}, 211 | supply_area_distance = 1 212 | }, 213 | { 214 | type = "beam", 215 | name = "dummy-beam", 216 | body = properties.animation(), 217 | damage_interval = 1, 218 | head = properties.animation(), 219 | tail = properties.animation(), 220 | width = 1 221 | }, 222 | { 223 | type = "boiler", 224 | name = "dummy-boiler", 225 | burning_cooldown = 1, 226 | energy_consumption = "1J", 227 | energy_source = properties.void_energy_source(), 228 | fluid_box = properties.fluid_box(), 229 | output_fluid_box = properties.fluid_box(), 230 | target_temperature = 1, 231 | structure = 232 | { 233 | north = properties.sprite(), 234 | east = properties.sprite(), 235 | south = properties.sprite(), 236 | west = properties.sprite(), 237 | }, 238 | fire = {}, 239 | fire_glow = {}, 240 | }, 241 | { 242 | type = "burner-generator", 243 | name = "dummy-burner-generator", 244 | animation = properties.animation(), 245 | burner = properties.burner_energy_source(), 246 | energy_source = properties.electric_energy_source(), 247 | max_power_output = "1J" 248 | }, 249 | add_vehicle_properties 250 | { 251 | type = "car", 252 | name = "dummy-car", 253 | animation = properties.rotated_animation(), 254 | energy_source = properties.void_energy_source(), 255 | consumption = "1J", 256 | effectivity = 1, 257 | inventory_size = 1, 258 | rotation_speed = 1 259 | }, 260 | add_rolling_stock_properties 261 | { 262 | type = "cargo-wagon", 263 | name = "dummy-cargo-wagon", 264 | inventory_size = 1 265 | }, 266 | { 267 | type = "character", 268 | name = "dummy-character", 269 | mining_speed = 1, 270 | running_speed = 1, 271 | distance_per_frame = 1, 272 | maximum_corner_sliding_distance = 1, 273 | heartbeat = properties.sound(), 274 | eat = properties.sound(), 275 | inventory_size = 1, 276 | build_distance = 1, 277 | drop_item_distance = 1, 278 | reach_distance = 1, 279 | reach_resource_distance = 1, 280 | item_pickup_distance = 1, 281 | loot_pickup_distance = 1, 282 | ticks_to_keep_gun = 1, 283 | ticks_to_keep_aiming_direction = 1, 284 | ticks_to_stay_in_combat = 1, 285 | damage_hit_tint = properties.color(), 286 | running_sound_animation_positions = {}, 287 | mining_with_tool_particles_animation_positions = {}, 288 | animations = 289 | { 290 | { 291 | idle = properties.rotated_animation(), 292 | idle_with_gun = properties.rotated_animation(), 293 | running = properties.rotated_animation(), 294 | running_with_gun = properties.rotated_sprite_custom_direction_count(18), 295 | mining_with_tool = properties.rotated_animation() 296 | } 297 | } 298 | }, 299 | { 300 | type = "character-corpse", 301 | name = "dummy-character-corpse", 302 | time_to_live = 1, 303 | picture = properties.animation() 304 | }, 305 | { 306 | type = "cliff", 307 | name = "dummy-cliff", 308 | grid_offset = properties.vector(), 309 | grid_size = {1, 1}, -- must be non-zero vector 310 | orientations = { 311 | west_to_east = properties.oriented_cliff_prototype(), 312 | north_to_south = properties.oriented_cliff_prototype(), 313 | east_to_west = properties.oriented_cliff_prototype(), 314 | south_to_north = properties.oriented_cliff_prototype(), 315 | west_to_north = properties.oriented_cliff_prototype(), 316 | north_to_east = properties.oriented_cliff_prototype(), 317 | east_to_south = properties.oriented_cliff_prototype(), 318 | south_to_west = properties.oriented_cliff_prototype(), 319 | west_to_south = properties.oriented_cliff_prototype(), 320 | north_to_west = properties.oriented_cliff_prototype(), 321 | east_to_north = properties.oriented_cliff_prototype(), 322 | south_to_east = properties.oriented_cliff_prototype(), 323 | west_to_none = properties.oriented_cliff_prototype(), 324 | none_to_east = properties.oriented_cliff_prototype(), 325 | north_to_none = properties.oriented_cliff_prototype(), 326 | none_to_south = properties.oriented_cliff_prototype(), 327 | east_to_none = properties.oriented_cliff_prototype(), 328 | none_to_west = properties.oriented_cliff_prototype(), 329 | south_to_none = properties.oriented_cliff_prototype(), 330 | none_to_north = properties.oriented_cliff_prototype() 331 | } 332 | }, 333 | { 334 | type = "combat-robot", 335 | name = "dummy-combat-robot", 336 | speed = 1, 337 | attack_parameters = properties.attack_parameters(), 338 | idle = properties.rotated_animation(), 339 | in_motion = properties.rotated_animation(), 340 | shadow_idle = properties.rotated_animation(), 341 | shadow_in_motion = properties.rotated_animation(), 342 | time_to_live = 1 343 | }, 344 | { 345 | type = "constant-combinator", 346 | name = "dummy-constant-combinator", 347 | item_slot_count = 1, 348 | sprites = properties.sprite(), 349 | activity_led_sprites = properties.sprite(), 350 | activity_led_light_offsets = 351 | { 352 | properties.vector(), 353 | properties.vector(), 354 | properties.vector(), 355 | properties.vector() 356 | }, 357 | circuit_wire_connection_points = 358 | { 359 | properties.wire_connection_point(), 360 | properties.wire_connection_point(), 361 | properties.wire_connection_point(), 362 | properties.wire_connection_point() 363 | } 364 | }, 365 | { 366 | type = "construction-robot", 367 | name = "dummy-construction-robot", 368 | speed = 1, 369 | max_payload_size = 1, 370 | cargo_centered = properties.vector(), 371 | construction_vector = properties.vector() 372 | }, 373 | { 374 | type = "container", 375 | name = "dummy-container", 376 | inventory_size = 1, 377 | picture = properties.sprite() 378 | }, 379 | { 380 | type = "corpse", 381 | name = "dummy-corpse" 382 | }, 383 | { 384 | type = "curved-rail", 385 | name = "dummy-curved-rail", 386 | pictures = properties.rail_pictures(), 387 | placeable_by = {item = "dummy-rail-planner", count = 1} 388 | }, 389 | add_combinator_properties 390 | { 391 | type = "decider-combinator", 392 | name = "dummy-decider-combinator", 393 | equal_symbol_sprites = properties.sprite(), 394 | greater_or_equal_symbol_sprites = properties.sprite(), 395 | greater_symbol_sprites = properties.sprite(), 396 | less_or_equal_symbol_sprites = properties.sprite(), 397 | less_symbol_sprites = properties.sprite(), 398 | not_equal_symbol_sprites = properties.sprite() 399 | }, 400 | { 401 | type = "deconstructible-tile-proxy", 402 | name = "dummy-deconstructible-tile-proxy" 403 | }, 404 | { 405 | type = "electric-energy-interface", 406 | name = "dummy-electric-energy-interface", 407 | energy_source = properties.electric_energy_source() 408 | }, 409 | { 410 | type = "electric-pole", 411 | name = "dummy-electric-pole", 412 | connection_points = { 413 | properties.wire_connection_point() 414 | }, 415 | pictures = properties.rotated_sprite(), 416 | supply_area_distance = 1 417 | }, 418 | add_turret_properties 419 | { 420 | type = "electric-turret", 421 | name = "dummy-electric-turret", 422 | energy_source = properties.void_energy_source() 423 | }, 424 | { 425 | type = "entity-ghost", 426 | name = "dummy-entity-ghost" 427 | }, 428 | { 429 | type = "explosion", 430 | name = "dummy-explosion", 431 | animations = properties.animation() 432 | }, 433 | { 434 | type = "fire", 435 | name = "dummy-fire", 436 | damage_per_tick = properties.damage_prototype(), 437 | spread_delay = 1, 438 | spread_delay_deviation = 1 439 | }, 440 | { 441 | type = "fish", 442 | name = "dummy-fish", 443 | pictures = properties.sprite() 444 | }, 445 | { 446 | type = "flame-thrower-explosion", 447 | name = "dummy-flame-thrower-explosion", 448 | animations = properties.animation(), 449 | damage = properties.damage_prototype(), 450 | slow_down_factor = 1 451 | }, 452 | add_turret_properties 453 | { 454 | type = "fluid-turret", 455 | name = "dummy-fluid-turret", 456 | activation_buffer_ratio = 1, 457 | fluid_box = properties.fluid_box(), 458 | fluid_buffer_input_flow = 1, 459 | fluid_buffer_size = 1, 460 | turret_base_has_direction = true 461 | }, 462 | add_rolling_stock_properties 463 | { 464 | type = "fluid-wagon", 465 | name = "dummy-fluid-wagon", 466 | capacity = 1 467 | }, 468 | { 469 | type = "furnace", 470 | name = "dummy-furnace", 471 | energy_usage = "1J", 472 | energy_source = properties.void_energy_source(), 473 | crafting_speed = 1, 474 | crafting_categories = {"crafting"}, 475 | result_inventory_size = 1, 476 | source_inventory_size = 1 477 | }, 478 | { 479 | type = "gate", 480 | name = "dummy-gate", 481 | activation_distance = 1, 482 | close_sound = properties.sound(), 483 | open_sound = properties.sound(), 484 | horizontal_animation = properties.animation(), 485 | horizontal_rail_animation_left = properties.animation(), 486 | horizontal_rail_animation_right = properties.animation(), 487 | horizontal_rail_base = properties.animation(), 488 | opening_speed = 1, 489 | timeout_to_close = 1, 490 | vertical_animation = properties.animation(), 491 | vertical_rail_animation_left = properties.animation(), 492 | vertical_rail_animation_right = properties.animation(), 493 | vertical_rail_base = properties.animation(), 494 | wall_patch = properties.animation() 495 | }, 496 | { 497 | type = "generator", 498 | name = "dummy-generator", 499 | effectivity = 1, 500 | energy_source = properties.electric_energy_source(), 501 | fluid_box = properties.fluid_box(), 502 | fluid_usage_per_tick = 1, 503 | horizontal_animation = properties.animation(), 504 | maximum_temperature = 1, 505 | vertical_animation = properties.animation(), 506 | max_power_output = "1J" 507 | }, 508 | { 509 | type = "heat-interface", 510 | name = "dummy-heat-interface", 511 | heat_buffer = properties.heat_buffer() 512 | }, 513 | { 514 | type = "heat-pipe", 515 | name = "dummy-heat-pipe", 516 | heat_buffer = properties.heat_buffer(), 517 | connection_sprites = 518 | { 519 | single = properties.sprite(), 520 | straight_vertical = properties.sprite(), 521 | straight_horizontal = properties.sprite(), 522 | corner_right_down = properties.sprite(), 523 | corner_left_down = properties.sprite(), 524 | corner_right_up = properties.sprite(), 525 | corner_left_up = properties.sprite(), 526 | t_up = properties.sprite(), 527 | t_right = properties.sprite(), 528 | t_down = properties.sprite(), 529 | t_left = properties.sprite(), 530 | ending_up = properties.sprite(), 531 | ending_right = properties.sprite(), 532 | ending_down = properties.sprite(), 533 | ending_left = properties.sprite(), 534 | cross = properties.sprite() 535 | }, 536 | heat_glow_sprites = 537 | { 538 | single = properties.sprite(), 539 | straight_vertical = properties.sprite(), 540 | straight_horizontal = properties.sprite(), 541 | corner_right_down = properties.sprite(), 542 | corner_left_down = properties.sprite(), 543 | corner_right_up = properties.sprite(), 544 | corner_left_up = properties.sprite(), 545 | t_up = properties.sprite(), 546 | t_right = properties.sprite(), 547 | t_down = properties.sprite(), 548 | t_left = properties.sprite(), 549 | ending_up = properties.sprite(), 550 | ending_right = properties.sprite(), 551 | ending_down = properties.sprite(), 552 | ending_left = properties.sprite(), 553 | cross = properties.sprite() 554 | } 555 | }, 556 | { 557 | type = "highlight-box", 558 | name = "dummy-highlight-box" 559 | }, 560 | { 561 | type = "infinity-container", 562 | name = "dummy-infinity-container", 563 | inventory_size = 1, 564 | picture = properties.sprite(), 565 | erase_contents_when_mined = true 566 | }, 567 | add_pipe_properties 568 | { 569 | type = "infinity-pipe", 570 | name = "dummy-infinity-pipe" 571 | }, 572 | { 573 | type = "inserter", 574 | name = "dummy-inserter", 575 | 576 | -- copied from vanilla because these values are finicky 577 | collision_box = {{-0.15, -0.15}, {0.15, 0.15}}, 578 | pickup_position = {0, -1}, 579 | insert_position = {0, 1.2}, 580 | 581 | energy_source = properties.void_energy_source(), 582 | extension_speed = 1, 583 | hand_base_picture = properties.sprite(), 584 | hand_base_shadow = properties.sprite(), 585 | hand_closed_picture = properties.sprite(), 586 | hand_closed_shadow = properties.sprite(), 587 | hand_open_picture = properties.sprite(), 588 | hand_open_shadow = properties.sprite(), 589 | platform_picture = properties.sprite(), 590 | rotation_speed = 1 591 | }, 592 | { 593 | type = "item-entity", 594 | name = "dummy-item-entity" 595 | }, 596 | { 597 | type = "item-request-proxy", 598 | name = "dummy-item-request-proxy", 599 | picture = properties.sprite() 600 | }, 601 | { 602 | type = "lab", 603 | name = "dummy-lab", 604 | energy_source = properties.void_energy_source(), 605 | energy_usage = "1J", 606 | inputs = {}, 607 | off_animation = properties.animation(), 608 | on_animation = properties.animation() 609 | }, 610 | { 611 | type = "lamp", 612 | name = "dummy-lamp", 613 | energy_source = properties.void_energy_source(), 614 | energy_usage_per_tick = "1J", 615 | picture_off = properties.sprite(), 616 | picture_on = properties.sprite() 617 | }, 618 | { 619 | type = "land-mine", 620 | name = "dummy-land-mine", 621 | picture_safe = properties.sprite(), 622 | picture_set = properties.sprite(), 623 | trigger_radius = 1 624 | }, 625 | { 626 | type = "leaf-particle", 627 | name = "leaf-particle-for-migration" -- deprecated prototype 628 | }, 629 | add_transport_belt_connectable_properties 630 | { 631 | type = "linked-belt", 632 | name = "dummy-linked-belt", 633 | structure = 634 | { 635 | direction_in = properties.sprite(), 636 | direction_out = properties.sprite() 637 | }, 638 | tile_width = 1, 639 | tile_height = 1 640 | }, 641 | { 642 | type = "linked-container", 643 | name = "dummy-linked-container", 644 | inventory_size = 1 645 | }, 646 | add_transport_belt_connectable_properties 647 | { 648 | type = "loader", 649 | name = "dummy-loader", 650 | filter_count = 1, 651 | structure = 652 | { 653 | direction_in = properties.sprite(), 654 | direction_out = properties.sprite() 655 | }, 656 | tile_width = 1 657 | }, 658 | add_transport_belt_connectable_properties 659 | { 660 | type = "loader-1x1", 661 | name = "dummy-loader-1x1", 662 | filter_count = 1, 663 | structure = 664 | { 665 | direction_in = properties.sprite(), 666 | direction_out = properties.sprite() 667 | }, 668 | tile_width = 1, 669 | tile_height = 1 670 | }, 671 | add_rolling_stock_properties 672 | { 673 | type = "locomotive", 674 | name = "dummy-locomotive", 675 | energy_source = properties.void_energy_source(), 676 | max_power = "1J", 677 | reversing_power_modifier = 1 678 | }, 679 | { 680 | type = "logistic-container", 681 | name = "dummy-logistic-container", 682 | inventory_size = 1, 683 | picture = properties.sprite(), 684 | logistic_mode = "active-provider" 685 | }, 686 | { 687 | type = "logistic-robot", 688 | name = "dummy-logistic-robot", 689 | speed = 1, 690 | max_payload_size = 1, 691 | cargo_centered = properties.vector() 692 | }, 693 | { 694 | type = "market", 695 | name = "dummy-market", 696 | picture = properties.sprite() 697 | }, 698 | { 699 | type = "mining-drill", 700 | name = "dummy-mining-drill", 701 | animations = properties.animation(), 702 | energy_source = properties.void_energy_source(), 703 | energy_usage = "1J", 704 | mining_speed = 1, 705 | resource_categories = {"basic-solid"}, 706 | resource_searching_radius = 1, 707 | vector_to_place_result = properties.vector() 708 | }, 709 | { 710 | type = "offshore-pump", 711 | name = "dummy-offshore-pump", 712 | fluid = "fluid-unknown", 713 | fluid_box = properties.fluid_box(), 714 | pumping_speed = 1, 715 | graphics_set = 716 | { 717 | animation = properties.animation() 718 | } 719 | }, 720 | { 721 | type = "particle", 722 | name = "particle-for-migration" -- deprecated prototype 723 | }, 724 | { 725 | type = "particle-source", 726 | name = "dummy-particle-source", 727 | height = 1, 728 | horizontal_speed = 1, 729 | particle = "dummy-optimized-particle", 730 | time_before_start = 1, 731 | time_to_live = 1, 732 | vertical_speed = 1 733 | }, 734 | add_pipe_properties 735 | { 736 | type = "pipe", 737 | name = "dummy-pipe" 738 | }, 739 | { 740 | type = "pipe-to-ground", 741 | name = "dummy-pipe-to-ground", 742 | fluid_box = properties.fluid_box(), 743 | pictures = { 744 | down = properties.sprite(), 745 | up = properties.sprite(), 746 | left = properties.sprite(), 747 | right = properties.sprite(), 748 | } 749 | }, 750 | { 751 | type = "player-port", 752 | name = "dummy-player-port", 753 | animation = properties.animation() 754 | }, 755 | { 756 | type = "power-switch", 757 | name = "dummy-power-switch", 758 | circuit_wire_connection_point = properties.wire_connection_point(), 759 | led_off = properties.sprite(), 760 | led_on = properties.sprite(), 761 | left_wire_connection_point = properties.wire_connection_point(), 762 | overlay_loop = properties.animation(), 763 | overlay_start = properties.animation(), 764 | overlay_start_delay = 1, 765 | power_on_animation = properties.animation(), 766 | right_wire_connection_point = properties.wire_connection_point() 767 | }, 768 | { 769 | type = "programmable-speaker", 770 | name = "dummy-programmable-speaker", 771 | energy_source = properties.void_energy_source(), 772 | energy_usage_per_tick = "1J", 773 | instruments = {}, 774 | maximum_polyphony = 1, 775 | sprite = properties.sprite() 776 | }, 777 | { 778 | type = "projectile", 779 | name = "dummy-projectile", 780 | acceleration = 1, 781 | animation = properties.animation() 782 | }, 783 | { 784 | type = "pump", 785 | name = "dummy-pump", 786 | animations = properties.animation(), 787 | energy_source = properties.void_energy_source(), 788 | energy_usage = "1J", 789 | fluid_box = properties.fluid_box(), 790 | pumping_speed = 1 791 | }, 792 | { 793 | type = "radar", 794 | name = "dummy-radar", 795 | energy_per_nearby_scan = "1J", 796 | energy_per_sector = "1J", 797 | energy_source = properties.void_energy_source(), 798 | energy_usage = "1J", 799 | max_distance_of_nearby_sector_revealed = 1, 800 | max_distance_of_sector_revealed = 1, 801 | pictures = properties.rotated_sprite() 802 | }, 803 | { 804 | type = "rail-chain-signal", 805 | name = "dummy-rail-chain-signal", 806 | animation = properties.rotated_animation(), 807 | -- HACK 808 | selection_box_offsets= (function() 809 | local t = {} 810 | for i=1,8 do 811 | t[#t+1] = properties.vector() 812 | end 813 | return t 814 | end)() 815 | }, 816 | { 817 | type = "rail-remnants", 818 | name = "dummy-rail-remnants", 819 | bending_type = "straight", 820 | pictures = properties.rail_pictures(), 821 | collision_box = properties.nonzero_bounding_box() 822 | }, 823 | { 824 | type = "rail-signal", 825 | name = "dummy-rail-signal", 826 | animation = properties.rotated_animation() 827 | }, 828 | { 829 | type = "reactor", 830 | name = "dummy-reactor", 831 | consumption = "1J", 832 | energy_source = properties.void_energy_source(), 833 | heat_buffer = properties.heat_buffer(), 834 | working_light_picture = properties.sprite() 835 | }, 836 | { 837 | type = "resource", 838 | name = "dummy-resource", 839 | stage_counts = {}, 840 | stages = properties.animation(), 841 | minable = {mining_time = 1} 842 | }, 843 | { 844 | type = "roboport", 845 | name = "dummy-roboport", 846 | base = properties.sprite(), 847 | base_animation = properties.animation(), 848 | base_patch = properties.sprite(), 849 | charge_approach_distance = 1, 850 | charging_energy = "1J", 851 | construction_radius = 1, 852 | door_animation_down = properties.animation(), 853 | door_animation_up = properties.animation(), 854 | energy_source = properties.void_energy_source(), 855 | energy_usage = "1J", 856 | logistics_radius = 1, 857 | material_slots_count = 1, 858 | recharge_minimum = "1J", 859 | recharging_animation = properties.animation(), 860 | request_to_open_door_timeout = 1, 861 | robot_slots_count = 0, 862 | spawn_and_station_height = 1 863 | }, 864 | { 865 | type = "rocket-silo", 866 | name = "dummy-rocket-silo", 867 | energy_usage = "1J", 868 | energy_source = properties.void_energy_source(), 869 | crafting_speed = 1, 870 | crafting_categories = {"crafting"}, 871 | active_energy_usage = "1J", 872 | idle_energy_usage = "1J", 873 | lamp_energy_usage = "1J", 874 | rocket_entity = "dummy-rocket-silo-rocket", 875 | satellite_animation = properties.animation(), 876 | satellite_shadow_animation = properties.animation(), 877 | arm_02_right_animation = properties.animation(), 878 | arm_01_back_animation = properties.animation(), 879 | arm_03_front_animation = properties.animation(), 880 | shadow_sprite = properties.sprite(), 881 | hole_sprite = properties.sprite(), 882 | hole_light_sprite = properties.sprite(), 883 | rocket_shadow_overlay_sprite = properties.sprite(), 884 | rocket_glow_overlay_sprite = properties.sprite(), 885 | door_back_sprite = properties.sprite(), 886 | door_front_sprite = properties.sprite(), 887 | base_day_sprite = properties.sprite(), 888 | base_front_sprite = properties.sprite(), 889 | red_lights_back_sprites = properties.sprite(), 890 | red_lights_front_sprites = properties.sprite(), 891 | hole_clipping_box = properties.bounding_box(), 892 | door_back_open_offset = properties.vector(), 893 | door_front_open_offset = properties.vector(), 894 | silo_fade_out_start_distance = 1, 895 | silo_fade_out_end_distance = 1, 896 | times_to_blink = 1, 897 | light_blinking_speed = 1, 898 | door_opening_speed = 1, 899 | rocket_parts_required = 1 900 | }, 901 | { 902 | type = "rocket-silo-rocket", 903 | name = "dummy-rocket-silo-rocket", 904 | rocket_sprite = properties.sprite(), 905 | rocket_shadow_sprite = properties.sprite(), 906 | rocket_glare_overlay_sprite = properties.sprite(), 907 | rocket_smoke_bottom1_animation = properties.animation(), 908 | rocket_smoke_bottom2_animation = properties.animation(), 909 | rocket_smoke_top1_animation = properties.animation(), 910 | rocket_smoke_top2_animation = properties.animation(), 911 | rocket_smoke_top3_animation = properties.animation(), 912 | rocket_flame_animation = properties.animation(), 913 | rocket_flame_left_animation = properties.animation(), 914 | rocket_flame_right_animation = properties.animation(), 915 | rocket_rise_offset = properties.vector(), 916 | rocket_flame_left_rotation = 1, 917 | rocket_flame_right_rotation = 1, 918 | rocket_render_layer_switch_distance = 1, 919 | full_render_layer_switch_distance = 1, 920 | rocket_launch_offset = properties.vector(), 921 | effects_fade_in_start_distance = 1, 922 | effects_fade_in_end_distance = 1, 923 | shadow_fade_out_start_ratio = 1, 924 | shadow_fade_out_end_ratio = 1, 925 | rocket_visible_distance_from_center = 1, 926 | rising_speed = 1, 927 | engine_starting_speed = 1, 928 | flying_speed = 1, 929 | flying_acceleration = 1, 930 | inventory_size = 1 931 | }, 932 | { 933 | type = "rocket-silo-rocket-shadow", 934 | name = "dummy-rocket-silo-rocket-shadow" 935 | }, 936 | { 937 | type = "simple-entity", 938 | name = "dummy-simple-entity", 939 | picture = properties.sprite() 940 | }, 941 | { 942 | type = "simple-entity-with-force", 943 | name = "dummy-simple-entity-with-force", 944 | picture = properties.sprite() 945 | }, 946 | { 947 | type = "simple-entity-with-owner", 948 | name = "dummy-simple-entity-with-owner", 949 | picture = properties.sprite() 950 | }, 951 | { 952 | type = "smoke", 953 | name = "smoke-for-migration", -- deprecated prototype 954 | animation = properties.animation() 955 | }, 956 | { 957 | type = "smoke-with-trigger", 958 | name = "dummy-smoke-with-trigger", 959 | animation = properties.animation() 960 | }, 961 | { 962 | type = "solar-panel", 963 | name = "dummy-solar-panel", 964 | energy_source = properties.electric_energy_source(), 965 | picture = properties.sprite(), 966 | production = "1J" 967 | }, 968 | { 969 | type = "speech-bubble", 970 | name = "dummy-speech-bubble", 971 | style = "speech_bubble" -- defined in __core__/prototypes/style.lua 972 | }, 973 | { 974 | type = "spider-leg", 975 | name = "dummy-spider-leg", 976 | part_length = 1, 977 | initial_movement_speed = 1, 978 | movement_acceleration = 1, 979 | movement_based_position_selection_distance = 1, 980 | graphics_set = {}, 981 | target_position_randomisation_distance = 1, 982 | minimal_step_size = 1 983 | }, 984 | add_vehicle_properties 985 | { 986 | type = "spider-vehicle", 987 | name = "dummy-spider-vehicle", 988 | energy_source = properties.void_energy_source(), 989 | inventory_size = 1, 990 | graphics_set = {}, 991 | spider_engine = 992 | { 993 | military_target = "dummy-simple-entity-with-force", 994 | legs = 995 | { 996 | leg = "dummy-spider-leg", 997 | mount_position = properties.vector(), 998 | ground_position = properties.vector(), 999 | blocking_legs = {} 1000 | } 1001 | }, 1002 | height = 1, 1003 | chunk_exploration_radius = 1, 1004 | movement_energy_consumption = "1J", 1005 | automatic_weapon_cycling = true, 1006 | chain_shooting_cooldown_modifier = 1 1007 | }, 1008 | add_transport_belt_connectable_properties 1009 | { 1010 | type = "splitter", 1011 | name = "dummy-splitter", 1012 | structure = properties.animation(), 1013 | tile_height = 1 1014 | }, 1015 | { 1016 | type = "sticker", 1017 | name = "dummy-sticker", 1018 | duration_in_ticks = 1 1019 | }, 1020 | { 1021 | type = "storage-tank", 1022 | name = "dummy-storage-tank", 1023 | flow_length_in_ticks = 1, 1024 | fluid_box = properties.fluid_box(), 1025 | pictures = 1026 | { 1027 | picture = properties.sprite(), 1028 | window_background = properties.sprite(), 1029 | fluid_background = properties.sprite(), 1030 | flow_sprite = properties.sprite(), 1031 | gas_flow = properties.animation() 1032 | }, 1033 | window_bounding_box = properties.bounding_box() 1034 | }, 1035 | { 1036 | type = "straight-rail", 1037 | name = "dummy-straight-rail", 1038 | pictures = properties.rail_pictures(), 1039 | placeable_by = {item = "dummy-rail-planner", count = 1} 1040 | }, 1041 | { 1042 | type = "stream", 1043 | name = "dummy-stream", 1044 | particle_horizontal_speed = 1, 1045 | particle_horizontal_speed_deviation = 0, 1046 | particle_spawn_interval = 1, 1047 | particle_vertical_acceleration = 1 1048 | }, 1049 | { 1050 | type = "tile-ghost", 1051 | name = "dummy-tile-ghost" 1052 | }, 1053 | { 1054 | type = "train-stop", 1055 | name = "dummy-train-stop", 1056 | animation_ticks_per_frame = 1 1057 | }, 1058 | add_transport_belt_connectable_properties 1059 | { 1060 | type = "transport-belt", 1061 | name = "dummy-transport-belt", 1062 | tile_width = 1, 1063 | tile_height = 1, 1064 | connector_frame_sprites = 1065 | { 1066 | -- HACK 1067 | frame_main = (function() 1068 | local t = {} 1069 | for i=1,7 do 1070 | t[#t+1] = properties.animation() 1071 | end 1072 | return t 1073 | end)(), 1074 | frame_shadow = (function() 1075 | local t = {} 1076 | for i=1,7 do 1077 | t[#t+1] = properties.animation() 1078 | end 1079 | return t 1080 | end)(), 1081 | frame_main_scanner = properties.animation(), 1082 | frame_main_scanner_movement_speed = 1, 1083 | frame_main_scanner_horizontal_start_shift = properties.vector(), 1084 | frame_main_scanner_horizontal_end_shift = properties.vector(), 1085 | frame_main_scanner_horizontal_y_scale = 1, 1086 | frame_main_scanner_horizontal_rotation = 1, 1087 | frame_main_scanner_vertical_start_shift = properties.vector(), 1088 | frame_main_scanner_vertical_end_shift = properties.vector(), 1089 | frame_main_scanner_vertical_y_scale = 1, 1090 | frame_main_scanner_vertical_rotation = 1, 1091 | frame_main_scanner_cross_horizontal_start_shift = properties.vector(), 1092 | frame_main_scanner_cross_horizontal_end_shift = properties.vector(), 1093 | frame_main_scanner_cross_horizontal_y_scale = 1, 1094 | frame_main_scanner_cross_horizontal_rotation = 1, 1095 | frame_main_scanner_cross_vertical_start_shift = properties.vector(), 1096 | frame_main_scanner_cross_vertical_end_shift = properties.vector(), 1097 | frame_main_scanner_cross_vertical_y_scale = 1, 1098 | frame_main_scanner_cross_vertical_rotation = 1, 1099 | frame_main_scanner_nw_ne = properties.animation(), 1100 | frame_main_scanner_sw_se = properties.animation() 1101 | } 1102 | }, 1103 | { 1104 | type = "tree", 1105 | name = "dummy-tree", 1106 | pictures = properties.sprite() 1107 | }, 1108 | add_turret_properties 1109 | { 1110 | type = "turret", 1111 | name = "dummy-turret" 1112 | }, 1113 | add_transport_belt_connectable_properties 1114 | { 1115 | type = "underground-belt", 1116 | name = "dummy-underground-belt", 1117 | max_distance = 1, 1118 | tile_width = 1, 1119 | tile_height = 1, 1120 | structure = 1121 | { 1122 | direction_in = properties.sprite(), 1123 | direction_out = properties.sprite() 1124 | }, 1125 | underground_sprite = properties.sprite() 1126 | }, 1127 | { 1128 | type = "unit", 1129 | name = "dummy-unit", 1130 | attack_parameters = properties.attack_parameters(), 1131 | distance_per_frame = 1, 1132 | distraction_cooldown = 1, 1133 | movement_speed = 1, 1134 | pollution_to_join_attack = 1, 1135 | run_animation = properties.rotated_animation(), 1136 | vision_distance = 1 1137 | }, 1138 | { 1139 | type = "unit-spawner", 1140 | name = "dummy-unit-spawner", 1141 | animations = properties.animation(), 1142 | call_for_help_radius = 1, 1143 | max_count_of_owned_units = 1, 1144 | max_friends_around_to_spawn = 1, 1145 | max_richness_for_spawn_shift = 1, 1146 | max_spawn_shift = 1, 1147 | pollution_absorption_absolute = 1, 1148 | pollution_absorption_proportional = 1, 1149 | result_units = {{"dummy-unit", {{1, 1}}}}, 1150 | spawning_cooldown = {1, 1}, 1151 | spawning_radius = 1, 1152 | spawning_spacing = 1 1153 | }, 1154 | { 1155 | type = "wall", 1156 | name = "dummy-wall", 1157 | pictures = 1158 | { 1159 | single = properties.sprite(), 1160 | straight_vertical = properties.sprite(), 1161 | straight_horizontal = properties.sprite(), 1162 | corner_right_down = properties.sprite(), 1163 | corner_left_down = properties.sprite(), 1164 | t_up = properties.sprite(), 1165 | ending_right = properties.sprite(), 1166 | ending_left = properties.sprite() 1167 | } 1168 | } 1169 | }) 1170 | -------------------------------------------------------------------------------- /equipment.lua: -------------------------------------------------------------------------------- 1 | -- This file contains all equipment. 2 | 3 | local properties = require("common-properties") 4 | 5 | -- This functions is applied directly to the prototype table. 6 | -- This allows to easily create many prototypes that inherit from the same base class/prototype, without copy pasting properties. 7 | local function add_equipment_properties(prototype) 8 | prototype.sprite = properties.sprite() 9 | prototype.shape = { 10 | type = "full", 11 | width = 1, 12 | height = 1 13 | } 14 | prototype.categories = {"dummy-equipment-category"} 15 | prototype.energy_source = properties.electric_energy_source() 16 | prototype.take_result = "dummy-item" 17 | return prototype 18 | end 19 | 20 | data:extend({ 21 | add_equipment_properties 22 | { 23 | type = "active-defense-equipment", 24 | name = "dummy-active-defense-equipment", 25 | automatic = false, 26 | ability_icon = properties.sprite(), 27 | attack_parameters = properties.attack_parameters() 28 | }, 29 | add_equipment_properties 30 | { 31 | type = "battery-equipment", 32 | name = "dummy-battery-equipment" 33 | }, 34 | add_equipment_properties 35 | { 36 | type = "belt-immunity-equipment", 37 | name = "dummy-belt-immunity-equipment", 38 | energy_consumption = "1J" 39 | }, 40 | add_equipment_properties 41 | { 42 | type = "energy-shield-equipment", 43 | name = "dummy-energy-shield-equipment", 44 | energy_per_shield = "1J", 45 | max_shield_value = 1 46 | }, 47 | add_equipment_properties 48 | { 49 | type = "generator-equipment", 50 | name = "dummy-generator-equipment", 51 | power = "1J" 52 | }, 53 | add_equipment_properties 54 | { 55 | type = "movement-bonus-equipment", 56 | name = "dummy-movement-bonus-equipment", 57 | energy_consumption = "1J", 58 | movement_bonus = 1 59 | }, 60 | add_equipment_properties 61 | { 62 | type = "night-vision-equipment", 63 | name = "dummy-night-vision-equipment", 64 | energy_input = "1J", 65 | color_lookup = {{1, "identity"}} 66 | }, 67 | add_equipment_properties 68 | { 69 | type = "roboport-equipment", 70 | name = "dummy-roboport-equipment", 71 | charge_approach_distance = 1, 72 | charging_energy = "1J", 73 | construction_radius = 1, 74 | recharging_animation = properties.animation(), 75 | spawn_and_station_height = 1 76 | }, 77 | add_equipment_properties 78 | { 79 | type = "solar-panel-equipment", 80 | name = "dummy-solar-panel-equipment", 81 | power = "1J" 82 | } 83 | }) 84 | -------------------------------------------------------------------------------- /info.json: -------------------------------------------------------------------------------- 1 | { 2 | "name" : "minimal-no-base-mod", 3 | "version": "0.2.1", 4 | "title" : "Minimal mod allowing incompatibility with the base mod", 5 | "author" : "Bilka", 6 | "description" : "This mod provides the minimal prototypes needed to load the game without the base mod. Modders are encouraged to build their own mod on top of this one or depend on it to aid development of mods incompatible with the base mod.", 7 | "factorio_version" : "1.1", 8 | "dependencies" : ["! base"] 9 | } 10 | -------------------------------------------------------------------------------- /items.lua: -------------------------------------------------------------------------------- 1 | -- This file contains all items, including ones that are core prototypes. 2 | -- Core prototypes are named prototypes that the game requires to always exist, for example a "copper-cable" item. 3 | 4 | local properties = require("common-properties") 5 | 6 | -- These functions are applied directly to the prototype table. 7 | -- This allows to easily create many prototypes that inherit from the same base class/prototype, without copy pasting properties. 8 | local function add_item_properties(prototype) 9 | prototype = properties.add_icon(prototype) 10 | prototype.stack_size = 1 11 | return prototype 12 | end 13 | 14 | local function add_selection_tool_properties(prototype) 15 | prototype = add_item_properties(prototype) 16 | prototype.selection_color = properties.color() 17 | prototype.alt_selection_color = properties.color() 18 | prototype.selection_mode = "nothing" 19 | prototype.alt_selection_mode = "nothing" 20 | prototype.selection_cursor_box_type = "entity" 21 | prototype.alt_selection_cursor_box_type = "entity" 22 | return prototype 23 | end 24 | 25 | -- item prototypes, one of each, alphabetical by type 26 | data:extend({ 27 | add_item_properties 28 | { 29 | type = "ammo", 30 | name = "dummy-ammo", 31 | ammo_type = 32 | { 33 | category = "dummy-ammo-category" 34 | } 35 | }, 36 | add_item_properties 37 | { 38 | type = "armor", 39 | name = "dummy-armor", 40 | infinite = true 41 | }, 42 | add_selection_tool_properties 43 | { 44 | type = "blueprint", 45 | name = "dummy-blueprint" 46 | }, 47 | add_item_properties 48 | { 49 | type = "blueprint-book", 50 | name = "dummy-blueprint-book", 51 | inventory_size = 1 52 | }, 53 | add_item_properties 54 | { 55 | type = "capsule", 56 | name = "dummy-capsule", 57 | capsule_action = 58 | { 59 | type = "equipment-remote", 60 | equipment = "dummy-active-defense-equipment" 61 | } 62 | }, 63 | add_selection_tool_properties 64 | { 65 | type = "copy-paste-tool", 66 | name = "dummy-copy-paste-tool" 67 | }, 68 | add_selection_tool_properties 69 | { 70 | type = "deconstruction-item", 71 | name = "dummy-deconstruction-item" 72 | }, 73 | add_item_properties 74 | { 75 | type = "gun", 76 | name = "dummy-gun", 77 | attack_parameters = properties.attack_parameters() 78 | }, 79 | add_item_properties 80 | { 81 | type = "item", 82 | name = "dummy-item" 83 | }, 84 | add_item_properties 85 | { 86 | type = "item-with-entity-data", 87 | name = "dummy-item-with-entity-data" 88 | }, 89 | add_item_properties 90 | { 91 | type = "item-with-inventory", 92 | name = "dummy-item-with-inventory", 93 | inventory_size = 1 94 | }, 95 | add_item_properties 96 | { 97 | type = "item-with-label", 98 | name = "dummy-item-with-label" 99 | }, 100 | add_item_properties 101 | { 102 | type = "item-with-tags", 103 | name = "dummy-item-with-tags" 104 | }, 105 | add_item_properties 106 | { 107 | type = "mining-tool", 108 | name = "dummy-mining-tool", -- deprecated prototype 109 | infinite = true 110 | }, 111 | add_item_properties 112 | { 113 | type = "module", 114 | name = "dummy-module", 115 | tier = 1, 116 | effect = {}, 117 | category = "dummy-module-category" 118 | }, 119 | add_item_properties 120 | { 121 | type = "rail-planner", 122 | name = "dummy-rail-planner", 123 | straight_rail = "dummy-straight-rail", 124 | curved_rail = "dummy-curved-rail" 125 | }, 126 | add_item_properties 127 | { 128 | type = "repair-tool", 129 | name = "dummy-repair-tool", 130 | infinite = true, 131 | speed = 1 132 | }, 133 | add_selection_tool_properties 134 | { 135 | type = "selection-tool", 136 | name = "dummy-selection-tool" 137 | }, 138 | add_item_properties 139 | { 140 | type = "spidertron-remote", 141 | name = "dummy-spidertron-remote", 142 | icon_color_indicator_mask = properties.sprite_filename 143 | }, 144 | add_item_properties 145 | { 146 | type = "tool", 147 | name = "dummy-tool", 148 | infinite = true 149 | }, 150 | add_selection_tool_properties 151 | { 152 | type = "upgrade-item", 153 | name = "dummy-upgrade-item" 154 | } 155 | }) 156 | 157 | -- core item prototypes that are not contained in the above data:extend 158 | data:extend({ 159 | add_item_properties 160 | { 161 | type = "item", 162 | name = "copper-cable" 163 | }, 164 | add_item_properties 165 | { 166 | type = "item", 167 | name = "red-wire" 168 | }, 169 | add_item_properties 170 | { 171 | type = "item", 172 | name = "green-wire" 173 | } 174 | }) 175 | --------------------------------------------------------------------------------