This commit is contained in:
Joey De Pauw 2019-10-09 12:45:02 +02:00
parent c83df06c45
commit c00df91c1c
8 changed files with 93 additions and 25 deletions

View File

@ -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.

View File

@ -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.

View File

@ -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

View File

@ -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",

View File

@ -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]

View File

@ -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

View File

@ -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
} }
}) })

View File

@ -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]",