v 0.1.1
This commit is contained in:
parent
c83df06c45
commit
c00df91c1c
|
@ -7,18 +7,18 @@
|
||||||
|
|
||||||
This mod features three tiers of air filtering machines. These machines remove pollution from the air in their region by using air filters. Each consecutive tier has a larger radius and stronger filtering effect. Keep in mind that you will still need filters spread around your base at strategic locations to effectively counteract the spread of pollution.
|
This mod features three tiers of air filtering machines. These machines remove pollution from the air in their region by using air filters. Each consecutive tier has a larger radius and stronger filtering effect. Keep in mind that you will still need filters spread around your base at strategic locations to effectively counteract the spread of pollution.
|
||||||
|
|
||||||
#### Air filter machine 1
|
### Air filter machine 1
|
||||||
You start with a basic passive air filter machine that cleans the air in its own [chunk](https://wiki.factorio.com/Map_structure#Chunk). It should help keep biter attacks at bay through the early game.
|
You start with a basic passive air filter machine that cleans the air in its own [chunk](https://wiki.factorio.com/Map_structure#Chunk). It should help keep biter attacks at bay through the early game.
|
||||||
|
|
||||||
#### Air filter machine 2
|
### Air filter machine 2
|
||||||
The upgraded version has a stronger filtering effect. In addition, by using a moderate amount of electricity this machine is able to pull in pollution from neighboring chunks in the shape of a diamond. This version has a radius of two chunks (in [manhattan distance](https://en.wikipedia.org/wiki/Taxicab_geometry)). Note that a continuous amount of energy is consumed for this suction effect in addition to the cost of filtering the air.
|
The upgraded version has a stronger filtering effect. In addition, by using a moderate amount of electricity this machine is able to pull in pollution from neighboring chunks in the shape of a diamond. This version has a radius of two chunks (in [manhattan distance](https://en.wikipedia.org/wiki/Taxicab_geometry)). Note that a continuous amount of energy is consumed for this suction effect in addition to the cost of filtering the air.
|
||||||
|
|
||||||
![range_mark_2](https://github.com/JoeyDP/Factorio-Better-Air-Filtering/blob/master/res/radius_mk2.png?raw=true)
|
![range_mark_2](https://github.com/JoeyDP/Factorio-Better-Air-Filtering/blob/master/res/radius_mk2.png?raw=true)
|
||||||
|
|
||||||
#### Air filter machine 3
|
### Air filter machine 3
|
||||||
The third and final upgrade of the air filtering machine features a larger radius of three chunks along with more air filtering per second.
|
The third and final upgrade of the air filtering machine features a larger radius of three chunks along with more air filtering per second.
|
||||||
|
|
||||||
#### Filter Types
|
### Filter Types
|
||||||
There are currently two types of filters: __expendable filters__ and __recyclable filters__. The first ones are easier to craft, but filter out less pollution and are destroyed upon use. Recyclable filters are more expensive but can be refreshed with a bit of coal to be used again.
|
There are currently two types of filters: __expendable filters__ and __recyclable filters__. The first ones are easier to craft, but filter out less pollution and are destroyed upon use. Recyclable filters are more expensive but can be refreshed with a bit of coal to be used again.
|
||||||
|
|
||||||
> Known issue: used air filters cannot be extracted from the first tier of air filter machines by inserters. Factorio does not feature inserters that can extract from burnt_result_inventory.
|
> Known issue: used air filters cannot be extracted from the first tier of air filter machines by inserters. Factorio does not feature inserters that can extract from burnt_result_inventory.
|
||||||
|
|
|
@ -7,3 +7,11 @@ Date: 2019.10.08
|
||||||
- Only English
|
- Only English
|
||||||
License:
|
License:
|
||||||
- Using MIT License.
|
- Using MIT License.
|
||||||
|
---------------------------------------------------------------------------------------------------
|
||||||
|
Version: 0.1.1
|
||||||
|
Date: 2019.10.09
|
||||||
|
Features:
|
||||||
|
- Pollution is now registered in the pollution statistics rather than the fluid statistics.
|
||||||
|
- Air filter machines now accept speed and efficiency modules or beacon effects.
|
||||||
|
Fixes:
|
||||||
|
- Invalid entity issue when removing air filter machine during update resolved.
|
||||||
|
|
|
@ -38,13 +38,6 @@ function positionToChunk(position)
|
||||||
return { x = math.floor(position.x / 32), y = math.floor(position.y / 32) }
|
return { x = math.floor(position.x / 32), y = math.floor(position.y / 32) }
|
||||||
end
|
end
|
||||||
|
|
||||||
function movePollution(surface, chunkFrom, chunkTo, amount)
|
|
||||||
amount = math.min(amount, surface.get_pollution(chunkToPosition(chunkFrom)))
|
|
||||||
surface.pollute(chunkToPosition(chunkFrom), -amount)
|
|
||||||
surface.pollute(chunkToPosition(chunkTo), amount)
|
|
||||||
return amount
|
|
||||||
end
|
|
||||||
|
|
||||||
function getBasePurificationRate(entity)
|
function getBasePurificationRate(entity)
|
||||||
-- Depends mostly on recipe (optimal recipe used per machine). Should be multiplied by crafting speed to achieve actual max purification rate
|
-- Depends mostly on recipe (optimal recipe used per machine). Should be multiplied by crafting speed to achieve actual max purification rate
|
||||||
if entity.name == "air-filter-machine-1" then
|
if entity.name == "air-filter-machine-1" then
|
||||||
|
@ -176,10 +169,11 @@ function absorbChunk(chunk)
|
||||||
-- game.print("To absorb: " .. toAbsorb)
|
-- game.print("To absorb: " .. toAbsorb)
|
||||||
|
|
||||||
local totalInsertedAmount = 0.0
|
local totalInsertedAmount = 0.0
|
||||||
for _, filter in pairs(chunk.filters) do
|
for _, filter in pairs(chunk:getFilters()) do
|
||||||
local toInsert = (getAbsorptionRate(filter) / totalAbsorptionRate) * toAbsorb
|
local toInsert = (getAbsorptionRate(filter) / totalAbsorptionRate) * toAbsorb
|
||||||
if toInsert > 0 then
|
if toInsert > 0 then
|
||||||
local insertedAmount = filter.insert_fluid({ name = "pollution", amount = toInsert })
|
local insertedAmount = filter.insert_fluid({ name = "pollution", amount = toInsert })
|
||||||
|
game.pollution_statistics.on_flow(filter.name, -insertedAmount)
|
||||||
totalInsertedAmount = totalInsertedAmount + insertedAmount
|
totalInsertedAmount = totalInsertedAmount + insertedAmount
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -332,13 +326,14 @@ local FilteredChunk = {
|
||||||
surface = nil,
|
surface = nil,
|
||||||
x = 0,
|
x = 0,
|
||||||
y = 0,
|
y = 0,
|
||||||
filters = {},
|
--filters = {}
|
||||||
}
|
}
|
||||||
|
|
||||||
function FilteredChunk:new (o)
|
function FilteredChunk:new (o)
|
||||||
o = o or {}
|
o = o or {}
|
||||||
setmetatable(o, self)
|
setmetatable(o, self)
|
||||||
self.__index = self
|
self.__index = self
|
||||||
|
o.filters = o.filters or {}
|
||||||
return o
|
return o
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -347,7 +342,6 @@ function createFilteredChunk(surface, x, y)
|
||||||
chunk.surface = surface
|
chunk.surface = surface
|
||||||
chunk.x = x
|
chunk.x = x
|
||||||
chunk.y = y
|
chunk.y = y
|
||||||
chunk.filters = {} -- this statement, though it appears to have no effect, has a large impact on the saving of global state.
|
|
||||||
return chunk
|
return chunk
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -355,7 +349,25 @@ function FilteredChunk:equal(other)
|
||||||
return self.surface.name == other.surface.name and self.x == other.x and self.y == other.y
|
return self.surface.name == other.surface.name and self.x == other.x and self.y == other.y
|
||||||
end
|
end
|
||||||
|
|
||||||
|
function FilteredChunk:getFilters()
|
||||||
|
local filters = {}
|
||||||
|
for _, filter in pairs(self.filters) do
|
||||||
|
if filter.valid then
|
||||||
|
table.insert(filters, filter)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
self.filters = filters
|
||||||
|
return filters
|
||||||
|
end
|
||||||
|
|
||||||
function FilteredChunk:addToMap()
|
function FilteredChunk:addToMap()
|
||||||
|
|
||||||
|
--game.print("Active chunks before: ")
|
||||||
|
--for i, c in pairs(air_filtered_chunks) do
|
||||||
|
-- game.print(serpent.line(c))
|
||||||
|
--end
|
||||||
|
--game.print(serpent.block(global.air_filtered_chunks_map))
|
||||||
|
|
||||||
--game.print("Adding chunk to map")
|
--game.print("Adding chunk to map")
|
||||||
local chunkListX = global.air_filtered_chunks_map[self.surface.name] or {}
|
local chunkListX = global.air_filtered_chunks_map[self.surface.name] or {}
|
||||||
local chunkListY = chunkListX[self.x] or {}
|
local chunkListY = chunkListX[self.x] or {}
|
||||||
|
@ -364,23 +376,47 @@ function FilteredChunk:addToMap()
|
||||||
chunkListX[self.x] = chunkListY
|
chunkListX[self.x] = chunkListY
|
||||||
global.air_filtered_chunks_map[self.surface.name] = chunkListX
|
global.air_filtered_chunks_map[self.surface.name] = chunkListX
|
||||||
table.insert(air_filtered_chunks, self)
|
table.insert(air_filtered_chunks, self)
|
||||||
|
|
||||||
|
|
||||||
|
--game.print("Active chunks after: ")
|
||||||
|
--for i, c in pairs(air_filtered_chunks) do
|
||||||
|
-- game.print(serpent.line(c))
|
||||||
|
--end
|
||||||
|
--game.print(serpent.block(global.air_filtered_chunks_map))
|
||||||
end
|
end
|
||||||
|
|
||||||
function FilteredChunk:removeFromMap()
|
function FilteredChunk:removeFromMap()
|
||||||
--game.print("Removing chunk from map")
|
--game.print("Removing chunk from map")
|
||||||
table.remove(global.air_filtered_chunks_map[self.surface.name][self.x], self.y)
|
global.air_filtered_chunks_map[self.surface.name][self.x][self.y] = nil
|
||||||
|
|
||||||
for i, c in pairs(air_filtered_chunks) do
|
for i, c in pairs(air_filtered_chunks) do
|
||||||
if self:equal(c) then
|
if self:equal(c) then
|
||||||
table.remove(air_filtered_chunks, i)
|
|
||||||
--game.print("Removing chunk from list")
|
--game.print("Removing chunk from list")
|
||||||
|
table.remove(air_filtered_chunks, i)
|
||||||
break
|
break
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
--local i = 1
|
||||||
|
--while i <= #air_filtered_chunks do
|
||||||
|
-- local c = air_filtered_chunks[i]
|
||||||
|
-- if self:equal(c) then
|
||||||
|
-- --game.print("Removing chunk from list")
|
||||||
|
-- table.remove(air_filtered_chunks, i)
|
||||||
|
-- else
|
||||||
|
-- i = i + 1
|
||||||
|
-- end
|
||||||
|
--end
|
||||||
|
|
||||||
|
--game.print("Remaining chunks: ")
|
||||||
|
--for _, c in pairs(air_filtered_chunks) do
|
||||||
|
-- game.print(serpent.line(c))
|
||||||
|
--end
|
||||||
end
|
end
|
||||||
|
|
||||||
function FilteredChunk:getTotalAbsorptionRate()
|
function FilteredChunk:getTotalAbsorptionRate()
|
||||||
local totalAbsorptionRate = 0.0
|
local totalAbsorptionRate = 0.0
|
||||||
for _, filter in pairs(self.filters) do
|
for _, filter in pairs(self:getFilters()) do
|
||||||
local absorptionRate = getAbsorptionRate(filter)
|
local absorptionRate = getAbsorptionRate(filter)
|
||||||
totalAbsorptionRate = totalAbsorptionRate + absorptionRate
|
totalAbsorptionRate = totalAbsorptionRate + absorptionRate
|
||||||
end
|
end
|
||||||
|
@ -389,7 +425,7 @@ end
|
||||||
|
|
||||||
function FilteredChunk:getTotalSuctionRate(distance)
|
function FilteredChunk:getTotalSuctionRate(distance)
|
||||||
local totalSuctionRate = 0.0
|
local totalSuctionRate = 0.0
|
||||||
for _, filter in pairs(self.filters) do
|
for _, filter in pairs(self:getFilters()) do
|
||||||
if inRadius(filter, distance) then
|
if inRadius(filter, distance) then
|
||||||
local suctionRate = getSuctionRate(filter)
|
local suctionRate = getSuctionRate(filter)
|
||||||
totalSuctionRate = totalSuctionRate + suctionRate
|
totalSuctionRate = totalSuctionRate + suctionRate
|
||||||
|
@ -498,6 +534,7 @@ function onEntityRemoved(event)
|
||||||
if pollution > 0 then
|
if pollution > 0 then
|
||||||
--game.print("Dispersing " .. pollution .. " pollution back")
|
--game.print("Dispersing " .. pollution .. " pollution back")
|
||||||
event.entity.surface.pollute(event.entity.position, pollution)
|
event.entity.surface.pollute(event.entity.position, pollution)
|
||||||
|
game.pollution_statistics.on_flow(event.entity.name, pollution)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -522,6 +559,7 @@ function preEntityRemoved(event)
|
||||||
if pollution > 0 then
|
if pollution > 0 then
|
||||||
--game.print("Dispersing " .. pollution .. " pollution back")
|
--game.print("Dispersing " .. pollution .. " pollution back")
|
||||||
event.entity.surface.pollute(event.entity.position, pollution)
|
event.entity.surface.pollute(event.entity.position, pollution)
|
||||||
|
game.pollution_statistics.on_flow(event.entity.name, pollution)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
{
|
{
|
||||||
"name": "better-air-filtering",
|
"name": "better-air-filtering",
|
||||||
"version": "0.1.0",
|
"version": "0.1.1",
|
||||||
"title": "Better Air Filtering",
|
"title": "Better Air Filtering",
|
||||||
"author": "Joey De Pauw",
|
"author": "Joey De Pauw",
|
||||||
"contact": "joeydepauw@gmail.com",
|
"contact": "joeydepauw@gmail.com",
|
||||||
|
|
|
@ -5,8 +5,8 @@ air-filter-machine-3=Air filter machine 3
|
||||||
|
|
||||||
[entity-description]
|
[entity-description]
|
||||||
air-filter-machine-1=Passive air filter that reduces pollution in the current chunk using air filters.
|
air-filter-machine-1=Passive air filter that reduces pollution in the current chunk using air filters.
|
||||||
air-filter-machine-2=A stronger air filter that uses electricity to pull pollution towards it from a 2 chunk radius.
|
air-filter-machine-2=An air filter machine that uses electricity to pull pollution towards it from a 2 chunk radius.
|
||||||
air-filter-machine-3=An even stronger air filter, capable of cleaning pollution in a 3 chunk radius.
|
air-filter-machine-3=Powerful air filter, capable of cleaning pollution in a 3 chunk radius.
|
||||||
|
|
||||||
|
|
||||||
[item-name]
|
[item-name]
|
||||||
|
|
|
@ -0,0 +1,9 @@
|
||||||
|
for surfaceName, chunkListX in pairs(global.air_filtered_chunks_map) do
|
||||||
|
for x, chunkListY in pairs(chunkListX) do
|
||||||
|
for y, chunk in pairs(chunkListY) do
|
||||||
|
if chunk.filters == nil or #chunk.filters == 0 then
|
||||||
|
global.air_filtered_chunks_map[surfaceName][x][y] = nil
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
|
@ -72,7 +72,10 @@ data:extend({
|
||||||
fixed_recipe = "filter-air",
|
fixed_recipe = "filter-air",
|
||||||
ingredient_count = 1,
|
ingredient_count = 1,
|
||||||
return_ingredients_on_change = true,
|
return_ingredients_on_change = true,
|
||||||
module_slots = 0,
|
module_specification =
|
||||||
|
{
|
||||||
|
module_slots = 0
|
||||||
|
},
|
||||||
allowed_effects=nil
|
allowed_effects=nil
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
@ -162,9 +165,12 @@ data:extend({
|
||||||
energy_usage = "50kW",
|
energy_usage = "50kW",
|
||||||
fixed_recipe = "filter-air2",
|
fixed_recipe = "filter-air2",
|
||||||
ingredient_count = 2,
|
ingredient_count = 2,
|
||||||
|
module_specification =
|
||||||
|
{
|
||||||
|
module_slots = 2
|
||||||
|
},
|
||||||
|
allowed_effects = {"consumption", "speed"},
|
||||||
return_ingredients_on_change = true,
|
return_ingredients_on_change = true,
|
||||||
module_slots = 0,
|
|
||||||
allowed_effects=nil
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
type = "assembling-machine",
|
type = "assembling-machine",
|
||||||
|
@ -251,8 +257,12 @@ data:extend({
|
||||||
energy_usage = "100kW",
|
energy_usage = "100kW",
|
||||||
fixed_recipe = "filter-air2",
|
fixed_recipe = "filter-air2",
|
||||||
ingredient_count = 2,
|
ingredient_count = 2,
|
||||||
|
module_specification =
|
||||||
|
{
|
||||||
|
module_slots = 3
|
||||||
|
},
|
||||||
|
allowed_effects = {"consumption", "speed"},
|
||||||
return_ingredients_on_change = true,
|
return_ingredients_on_change = true,
|
||||||
module_slots = 0,
|
module_slots = 0,
|
||||||
allowed_effects=nil
|
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
|
@ -109,6 +109,7 @@ data:extend({
|
||||||
type = "recipe",
|
type = "recipe",
|
||||||
name = "filter-air",
|
name = "filter-air",
|
||||||
hide_from_player_crafting = true,
|
hide_from_player_crafting = true,
|
||||||
|
hide_from_stats = true,
|
||||||
icons = {
|
icons = {
|
||||||
{
|
{
|
||||||
icon = "__base__/graphics/icons/fluid/pollution.png"
|
icon = "__base__/graphics/icons/fluid/pollution.png"
|
||||||
|
@ -135,6 +136,7 @@ data:extend({
|
||||||
type = "recipe",
|
type = "recipe",
|
||||||
name = "filter-air2",
|
name = "filter-air2",
|
||||||
hide_from_player_crafting = true,
|
hide_from_player_crafting = true,
|
||||||
|
hide_from_stats = true,
|
||||||
icons = {
|
icons = {
|
||||||
{
|
{
|
||||||
icon = "__base__/graphics/icons/fluid/pollution.png"
|
icon = "__base__/graphics/icons/fluid/pollution.png"
|
||||||
|
@ -163,6 +165,7 @@ data:extend({
|
||||||
type = "recipe",
|
type = "recipe",
|
||||||
name = "liquid-pollution",
|
name = "liquid-pollution",
|
||||||
hide_from_player_crafting = true,
|
hide_from_player_crafting = true,
|
||||||
|
hide_from_stats = true,
|
||||||
category = "air-filtering-advanced",
|
category = "air-filtering-advanced",
|
||||||
subgroup = "raw-material",
|
subgroup = "raw-material",
|
||||||
order = "c[filter-air]",
|
order = "c[filter-air]",
|
||||||
|
|
Reference in New Issue