mirror of
https://github.com/veden/Rampant.git
synced 2025-02-03 13:11:54 +02:00
see changelog
This commit is contained in:
parent
70da8b9682
commit
aa0bbf7839
@ -308,10 +308,10 @@ function upgrade.attempt(natives)
|
|||||||
game.surfaces[natives.activeSurface].print("Rampant - Version 0.17.22")
|
game.surfaces[natives.activeSurface].print("Rampant - Version 0.17.22")
|
||||||
global.version = 89
|
global.version = 89
|
||||||
end
|
end
|
||||||
if (global.version < 91) then
|
if (global.version < 92) then
|
||||||
|
|
||||||
game.surfaces[natives.activeSurface].print("Rampant - Version 0.17.25")
|
game.surfaces[natives.activeSurface].print("Rampant - Version 0.17.26")
|
||||||
global.version = 91
|
global.version = 92
|
||||||
end
|
end
|
||||||
|
|
||||||
return starting ~= global.version, natives
|
return starting ~= global.version, natives
|
||||||
|
@ -1,3 +1,25 @@
|
|||||||
|
---------------------------------------------------------------------------------------------------
|
||||||
|
Version: 0.17.26
|
||||||
|
Date: 5. 14. 2019
|
||||||
|
Contributions:
|
||||||
|
- Choumiko - Added event hooks for script_built and script_destroyed events
|
||||||
|
Optimizations:
|
||||||
|
- Disabled full map scan by default in favor of script_built and script_destroyed events. If a mod does not use these events and creates or destroys entities through scripts, you may need to re-enable this feature in the mod map settings under Compatibility: enable full map scan.
|
||||||
|
Improvements:
|
||||||
|
- Added a check for script created resources in the script_built and script_destroyed events
|
||||||
|
- When a squad is destroyed its last few chunk moves now receive a portion of the death generator pheromone from the chunk they died on
|
||||||
|
Tweaks:
|
||||||
|
- Removed unused mapping tables
|
||||||
|
- Chunk properties now use <= instead of == when checking for minimum allowed values
|
||||||
|
- Increased death pheromone generator amount to 1300
|
||||||
|
- Increased retreat levels by 30%
|
||||||
|
- Increased raiding base activition threshold to 550
|
||||||
|
- Decreased minimum cooldown time for attack waves in aggressive state to 30 seconds
|
||||||
|
- Reduced all player generator values by half
|
||||||
|
Bugfixes:
|
||||||
|
- Memory leak with settlers last tick map
|
||||||
|
- Multiple version of chunks where in the processing queue causing double processing issues with a duplicate context
|
||||||
|
|
||||||
---------------------------------------------------------------------------------------------------
|
---------------------------------------------------------------------------------------------------
|
||||||
Version: 0.17.25
|
Version: 0.17.25
|
||||||
Date: 5. 8. 2019
|
Date: 5. 8. 2019
|
||||||
|
31
control.lua
31
control.lua
@ -115,6 +115,9 @@ local unregisterEnemyBaseStructure = chunkUtils.unregisterEnemyBaseStructure
|
|||||||
local registerEnemyBaseStructure = chunkUtils.registerEnemyBaseStructure
|
local registerEnemyBaseStructure = chunkUtils.registerEnemyBaseStructure
|
||||||
local makeImmortalEntity = chunkUtils.makeImmortalEntity
|
local makeImmortalEntity = chunkUtils.makeImmortalEntity
|
||||||
|
|
||||||
|
local registerResource = chunkUtils.registerResource
|
||||||
|
local unregisterResource = chunkUtils.unregisterResource
|
||||||
|
|
||||||
local upgradeEntity = baseUtils.upgradeEntity
|
local upgradeEntity = baseUtils.upgradeEntity
|
||||||
local rebuildNativeTables = baseUtils.rebuildNativeTables
|
local rebuildNativeTables = baseUtils.rebuildNativeTables
|
||||||
|
|
||||||
@ -203,7 +206,7 @@ local function rebuildMap()
|
|||||||
|
|
||||||
map.chunkToRetreats = {}
|
map.chunkToRetreats = {}
|
||||||
map.chunkToRallys = {}
|
map.chunkToRallys = {}
|
||||||
map.chunkToSpawner = {}
|
-- map.chunkToSpawner = {}
|
||||||
map.chunkToSettler = {}
|
map.chunkToSettler = {}
|
||||||
|
|
||||||
map.chunkToPassable = {}
|
map.chunkToPassable = {}
|
||||||
@ -538,12 +541,18 @@ end)
|
|||||||
local function onBuild(event)
|
local function onBuild(event)
|
||||||
local entity = event.created_entity or event.entity
|
local entity = event.created_entity or event.entity
|
||||||
if (entity.surface.index == natives.activeSurface) then
|
if (entity.surface.index == natives.activeSurface) then
|
||||||
accountPlayerEntity(map, entity, natives, true, false)
|
if (entity.type == "resource") and (entity.force.name == "neutral") then
|
||||||
if natives.safeBuildings then
|
-- print("registering resource", entity.name)
|
||||||
if natives.safeEntities[entity.type] or natives.safeEntityName[entity.name] then
|
registerResource(entity, map)
|
||||||
entity.destructible = false
|
else
|
||||||
end
|
-- print("registering entity", entity.name)
|
||||||
end
|
accountPlayerEntity(map, entity, natives, true, false)
|
||||||
|
if natives.safeBuildings then
|
||||||
|
if natives.safeEntities[entity.type] or natives.safeEntityName[entity.name] then
|
||||||
|
entity.destructible = false
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -551,7 +560,11 @@ local function onMine(event)
|
|||||||
local entity = event.entity
|
local entity = event.entity
|
||||||
local surface = entity.surface
|
local surface = entity.surface
|
||||||
if (surface.index == natives.activeSurface) then
|
if (surface.index == natives.activeSurface) then
|
||||||
accountPlayerEntity(map, entity, natives, false, false)
|
if (entity.type == "resource") and (entity.force.name == "neutral") then
|
||||||
|
unregisterResource(entity, map)
|
||||||
|
else
|
||||||
|
accountPlayerEntity(map, entity, natives, false, false)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -779,7 +792,7 @@ end
|
|||||||
local function onResourceDepleted(event)
|
local function onResourceDepleted(event)
|
||||||
local entity = event.entity
|
local entity = event.entity
|
||||||
if (entity.surface.index == natives.activeSurface) then
|
if (entity.surface.index == natives.activeSurface) then
|
||||||
chunkUtils.unregisterResource(entity, map)
|
unregisterResource(entity, map)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"name" : "Rampant",
|
"name" : "Rampant",
|
||||||
"factorio_version" : "0.17",
|
"factorio_version" : "0.17",
|
||||||
"version" : "0.17.25",
|
"version" : "0.17.26",
|
||||||
"title" : "Rampant",
|
"title" : "Rampant",
|
||||||
"author" : "Veden",
|
"author" : "Veden",
|
||||||
"homepage" : "https://forums.factorio.com/viewtopic.php?f=94&t=31445",
|
"homepage" : "https://forums.factorio.com/viewtopic.php?f=94&t=31445",
|
||||||
|
@ -20,6 +20,7 @@ local MAX_TICKS_BEFORE_SORT_CHUNKS = constants.MAX_TICKS_BEFORE_SORT_CHUNKS
|
|||||||
-- imported functions
|
-- imported functions
|
||||||
|
|
||||||
local createChunk = chunkUtils.createChunk
|
local createChunk = chunkUtils.createChunk
|
||||||
|
local mapScanChunk = chunkUtils.mapScanChunk
|
||||||
local initialScan = chunkUtils.initialScan
|
local initialScan = chunkUtils.initialScan
|
||||||
local chunkPassScan = chunkUtils.chunkPassScan
|
local chunkPassScan = chunkUtils.chunkPassScan
|
||||||
|
|
||||||
@ -63,25 +64,28 @@ function chunkProcessor.processPendingChunks(natives, map, surface, pendingStack
|
|||||||
local topLeft = event.area.left_top
|
local topLeft = event.area.left_top
|
||||||
local x = topLeft.x
|
local x = topLeft.x
|
||||||
local y = topLeft.y
|
local y = topLeft.y
|
||||||
local chunk = createChunk(x, y)
|
|
||||||
|
|
||||||
topOffset[1] = x
|
topOffset[1] = x
|
||||||
topOffset[2] = y
|
topOffset[2] = y
|
||||||
bottomOffset[1] = x + CHUNK_SIZE
|
bottomOffset[1] = x + CHUNK_SIZE
|
||||||
bottomOffset[2] = y + CHUNK_SIZE
|
bottomOffset[2] = y + CHUNK_SIZE
|
||||||
|
|
||||||
chunk = initialScan(chunk, natives, surface, map, tick, evolutionFactor, rebuilding)
|
if map[x] and map[x][y] then
|
||||||
|
mapScanChunk(map[x][y], surface, map)
|
||||||
|
else
|
||||||
|
if map[x] == nil then
|
||||||
|
map[x] = {}
|
||||||
|
end
|
||||||
|
|
||||||
if (chunk ~= SENTINEL_IMPASSABLE_CHUNK) then
|
local chunk = createChunk(x, y)
|
||||||
local chunkX = chunk.x
|
|
||||||
|
chunk = initialScan(chunk, natives, surface, map, tick, evolutionFactor, rebuilding)
|
||||||
|
|
||||||
if map[chunkX] == nil then
|
if (chunk ~= SENTINEL_IMPASSABLE_CHUNK) then
|
||||||
map[chunkX] = {}
|
map[x][y] = chunk
|
||||||
end
|
processQueue[#processQueue+1] = chunk
|
||||||
map[chunkX][chunk.y] = chunk
|
end
|
||||||
|
end
|
||||||
processQueue[#processQueue+1] = chunk
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
||||||
if (#processQueue > natives.nextChunkSort) or
|
if (#processQueue > natives.nextChunkSort) or
|
||||||
|
@ -23,7 +23,7 @@ function chunkPropertyUtils.getWormCount(map, chunk)
|
|||||||
end
|
end
|
||||||
|
|
||||||
function chunkPropertyUtils.setWormCount(map, chunk, count)
|
function chunkPropertyUtils.setWormCount(map, chunk, count)
|
||||||
if (count == 0) then
|
if (count <= 0) then
|
||||||
map.chunkToWorms[chunk] = nil
|
map.chunkToWorms[chunk] = nil
|
||||||
else
|
else
|
||||||
map.chunkToWorms[chunk] = count
|
map.chunkToWorms[chunk] = count
|
||||||
@ -31,7 +31,7 @@ function chunkPropertyUtils.setWormCount(map, chunk, count)
|
|||||||
end
|
end
|
||||||
|
|
||||||
function chunkPropertyUtils.setNestCount(map, chunk, count)
|
function chunkPropertyUtils.setNestCount(map, chunk, count)
|
||||||
if (count == 0) then
|
if (count <= 0) then
|
||||||
map.chunkToNests[chunk] = nil
|
map.chunkToNests[chunk] = nil
|
||||||
else
|
else
|
||||||
map.chunkToNests[chunk] = count
|
map.chunkToNests[chunk] = count
|
||||||
@ -43,7 +43,7 @@ function chunkPropertyUtils.getChunkSettlerTick(map, chunk)
|
|||||||
end
|
end
|
||||||
|
|
||||||
function chunkPropertyUtils.setChunkSettlerTick(map, chunk, tick)
|
function chunkPropertyUtils.setChunkSettlerTick(map, chunk, tick)
|
||||||
if (tick == 0) then
|
if (tick <= 0) then
|
||||||
map.chunkToSettler[chunk] = nil
|
map.chunkToSettler[chunk] = nil
|
||||||
else
|
else
|
||||||
map.chunkToSettler[chunk] = tick
|
map.chunkToSettler[chunk] = tick
|
||||||
@ -87,21 +87,13 @@ function chunkPropertyUtils.setRetreatTick(map, chunk, tick)
|
|||||||
end
|
end
|
||||||
|
|
||||||
function chunkPropertyUtils.setResourceGenerator(map, chunk, resourceGenerator)
|
function chunkPropertyUtils.setResourceGenerator(map, chunk, resourceGenerator)
|
||||||
if (resourceGenerator == 0) then
|
if (resourceGenerator <= 0) then
|
||||||
map.chunkToResource[chunk] = nil
|
map.chunkToResource[chunk] = nil
|
||||||
else
|
else
|
||||||
map.chunkToResource[chunk] = resourceGenerator
|
map.chunkToResource[chunk] = resourceGenerator
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
function chunkPropertyUtils.setChunkSpawnerEggTick(map, chunk, tick)
|
|
||||||
map.chunkToSpawner[chunk] = tick
|
|
||||||
end
|
|
||||||
|
|
||||||
function chunkPropertyUtils.getChunkSpawnerEggTick(map, chunk)
|
|
||||||
return map.chunkToSpawner[chunk] or 0
|
|
||||||
end
|
|
||||||
|
|
||||||
function chunkPropertyUtils.getResourceGenerator(map, chunk)
|
function chunkPropertyUtils.getResourceGenerator(map, chunk)
|
||||||
return map.chunkToResource[chunk] or 0
|
return map.chunkToResource[chunk] or 0
|
||||||
end
|
end
|
||||||
@ -223,7 +215,7 @@ function chunkPropertyUtils.getSquadsOnChunk(map, chunk)
|
|||||||
end
|
end
|
||||||
|
|
||||||
function chunkPropertyUtils.setPlayerBaseGenerator(map, chunk, playerGenerator)
|
function chunkPropertyUtils.setPlayerBaseGenerator(map, chunk, playerGenerator)
|
||||||
if (playerGenerator == 0) then
|
if (playerGenerator <= 0) then
|
||||||
map.chunkToPlayerBase[chunk] = nil
|
map.chunkToPlayerBase[chunk] = nil
|
||||||
else
|
else
|
||||||
map.chunkToPlayerBase[chunk] = playerGenerator
|
map.chunkToPlayerBase[chunk] = playerGenerator
|
||||||
|
@ -169,12 +169,12 @@ local function scanPaths(chunk, surface, map)
|
|||||||
end
|
end
|
||||||
|
|
||||||
local function scorePlayerBuildings(surface, map)
|
local function scorePlayerBuildings(surface, map)
|
||||||
return (surface.count_entities_filtered(map.filteredEntitiesPlayerQuery50) * 50) +
|
return (surface.count_entities_filtered(map.filteredEntitiesPlayerQuery50) * 25) +
|
||||||
(surface.count_entities_filtered(map.filteredEntitiesPlayerQuery200) * 200) +
|
(surface.count_entities_filtered(map.filteredEntitiesPlayerQuery200) * 100) +
|
||||||
(surface.count_entities_filtered(map.filteredEntitiesPlayerQuery1000) * 1000) +
|
(surface.count_entities_filtered(map.filteredEntitiesPlayerQuery1000) * 500) +
|
||||||
(surface.count_entities_filtered(map.filteredEntitiesPlayerQuery2000) * 2000) +
|
(surface.count_entities_filtered(map.filteredEntitiesPlayerQuery2000) * 1000) +
|
||||||
(surface.count_entities_filtered(map.filteredEntitiesPlayerQuery3500) * 3500) +
|
(surface.count_entities_filtered(map.filteredEntitiesPlayerQuery3500) * 1750) +
|
||||||
(surface.count_entities_filtered(map.filteredEntitiesPlayerQuery12000) * 12000)
|
(surface.count_entities_filtered(map.filteredEntitiesPlayerQuery12000) * 6000)
|
||||||
end
|
end
|
||||||
|
|
||||||
function chunkUtils.initialScan(chunk, natives, surface, map, tick, evolutionFactor, rebuilding)
|
function chunkUtils.initialScan(chunk, natives, surface, map, tick, evolutionFactor, rebuilding)
|
||||||
@ -399,11 +399,11 @@ function chunkUtils.unregisterEnemyBaseStructure(map, entity)
|
|||||||
end
|
end
|
||||||
|
|
||||||
function chunkUtils.accountPlayerEntity(map, entity, natives, addObject, creditNatives)
|
function chunkUtils.accountPlayerEntity(map, entity, natives, addObject, creditNatives)
|
||||||
|
|
||||||
if (BUILDING_PHEROMONES[entity.type] ~= nil) and (entity.force.name ~= "enemy") then
|
if (BUILDING_PHEROMONES[entity.type] ~= nil) and (entity.force.name ~= "enemy") then
|
||||||
local entityValue = BUILDING_PHEROMONES[entity.type]
|
local entityValue = BUILDING_PHEROMONES[entity.type]
|
||||||
|
|
||||||
local overlapArray = getEntityOverlapChunks(map, entity)
|
local overlapArray = getEntityOverlapChunks(map, entity)
|
||||||
if not addObject then
|
if not addObject then
|
||||||
if creditNatives then
|
if creditNatives then
|
||||||
if (natives.state == AI_STATE_ONSLAUGHT) then
|
if (natives.state == AI_STATE_ONSLAUGHT) then
|
||||||
@ -439,6 +439,16 @@ function chunkUtils.unregisterResource(entity, map)
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
function chunkUtils.registerResource(entity, map)
|
||||||
|
local overlapArray = getEntityOverlapChunks(map, entity)
|
||||||
|
|
||||||
|
for i=1,#overlapArray do
|
||||||
|
local chunk = overlapArray[i]
|
||||||
|
if (chunk ~= SENTINEL_IMPASSABLE_CHUNK) then
|
||||||
|
addResourceGenerator(map, chunk, RESOURCE_NORMALIZER)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
function chunkUtils.makeImmortalEntity(surface, entity)
|
function chunkUtils.makeImmortalEntity(surface, entity)
|
||||||
local repairPosition = entity.position
|
local repairPosition = entity.position
|
||||||
|
@ -40,8 +40,8 @@ constants.VERSION_88 = 88
|
|||||||
|
|
||||||
constants.MAGIC_MAXIMUM_NUMBER = 1e99 -- used in loops trying to find the lowest/highest score
|
constants.MAGIC_MAXIMUM_NUMBER = 1e99 -- used in loops trying to find the lowest/highest score
|
||||||
constants.MAGIC_MAXIMUM_BASE_NUMBER = 100000000
|
constants.MAGIC_MAXIMUM_BASE_NUMBER = 100000000
|
||||||
constants.RETREAT_MOVEMENT_PHEROMONE_LEVEL_MIN = 10000
|
constants.RETREAT_MOVEMENT_PHEROMONE_LEVEL_MIN = 13000
|
||||||
constants.RETREAT_MOVEMENT_PHEROMONE_LEVEL_MAX = 170000
|
constants.RETREAT_MOVEMENT_PHEROMONE_LEVEL_MAX = 221000
|
||||||
|
|
||||||
constants.PROCESS_QUEUE_SIZE = 85
|
constants.PROCESS_QUEUE_SIZE = 85
|
||||||
constants.SCAN_QUEUE_SIZE = 10
|
constants.SCAN_QUEUE_SIZE = 10
|
||||||
@ -90,6 +90,8 @@ constants.CHUNK_ALL_DIRECTIONS = 3
|
|||||||
constants.BASE_SEARCH_RADIUS = 4 * constants.CHUNK_SIZE
|
constants.BASE_SEARCH_RADIUS = 4 * constants.CHUNK_SIZE
|
||||||
constants.EVOLUTION_INCREMENTS = 0.05
|
constants.EVOLUTION_INCREMENTS = 0.05
|
||||||
|
|
||||||
|
constants.DIVISOR_DEATH_TRAIL_TABLE = { 0.75, 0.65, 0.55, 0.45, 0.35 }
|
||||||
|
|
||||||
-- ai
|
-- ai
|
||||||
|
|
||||||
constants.MAX_TICKS_BEFORE_SORT_CHUNKS = 60 * 60 * 30 -- 1 tick = 1/60 sec * 60 = 1 second
|
constants.MAX_TICKS_BEFORE_SORT_CHUNKS = 60 * 60 * 30 -- 1 tick = 1/60 sec * 60 = 1 second
|
||||||
@ -107,7 +109,7 @@ constants.AI_TUNNEL_COST = 100
|
|||||||
constants.AI_MAX_POINTS = 12500
|
constants.AI_MAX_POINTS = 12500
|
||||||
constants.AI_MAX_OVERFLOW_POINTS = constants.AI_MAX_POINTS * 3
|
constants.AI_MAX_OVERFLOW_POINTS = constants.AI_MAX_POINTS * 3
|
||||||
|
|
||||||
constants.RAIDING_MINIMUM_BASE_THRESHOLD = 250
|
constants.RAIDING_MINIMUM_BASE_THRESHOLD = 550
|
||||||
|
|
||||||
constants.AI_UNIT_REFUND = 3
|
constants.AI_UNIT_REFUND = 3
|
||||||
|
|
||||||
@ -132,7 +134,7 @@ constants.BASE_AI_STATE_OVERDRIVE = 4
|
|||||||
constants.BASE_AI_STATE_MUTATE = 5
|
constants.BASE_AI_STATE_MUTATE = 5
|
||||||
|
|
||||||
|
|
||||||
constants.AGGRESSIVE_CAN_ATTACK_WAIT_MIN_DURATION = 1
|
constants.AGGRESSIVE_CAN_ATTACK_WAIT_MIN_DURATION = 0.5
|
||||||
constants.AGGRESSIVE_CAN_ATTACK_WAIT_MAX_DURATION = 3
|
constants.AGGRESSIVE_CAN_ATTACK_WAIT_MAX_DURATION = 3
|
||||||
|
|
||||||
constants.AI_MIN_STATE_DURATION = 7
|
constants.AI_MIN_STATE_DURATION = 7
|
||||||
@ -380,7 +382,7 @@ constants.NO_RETREAT_SQUAD_SIZE_BONUS_MAX = 0.40
|
|||||||
-- pheromone amounts
|
-- pheromone amounts
|
||||||
|
|
||||||
constants.MOVEMENT_PENALTY_AMOUNT = 300000
|
constants.MOVEMENT_PENALTY_AMOUNT = 300000
|
||||||
constants.DEATH_PHEROMONE_GENERATOR_AMOUNT = 750
|
constants.DEATH_PHEROMONE_GENERATOR_AMOUNT = 1300
|
||||||
constants.PLAYER_PHEROMONE_GENERATOR_AMOUNT = 300
|
constants.PLAYER_PHEROMONE_GENERATOR_AMOUNT = 300
|
||||||
|
|
||||||
constants.IMPASSABLE_TERRAIN_GENERATOR_AMOUNT = 0
|
constants.IMPASSABLE_TERRAIN_GENERATOR_AMOUNT = 0
|
||||||
@ -436,31 +438,31 @@ constants.MAX_PENALTY_BEFORE_PURGE = 36000
|
|||||||
-- player building pheromones
|
-- player building pheromones
|
||||||
|
|
||||||
constants.BUILDING_PHEROMONES = {}
|
constants.BUILDING_PHEROMONES = {}
|
||||||
constants.BUILDING_PHEROMONES["wall"] = 50
|
constants.BUILDING_PHEROMONES["wall"] = 25
|
||||||
constants.BUILDING_PHEROMONES["transport-belt"] = 50 -- 1
|
constants.BUILDING_PHEROMONES["transport-belt"] = 25 -- 1
|
||||||
constants.BUILDING_PHEROMONES["splitter"] = 200
|
constants.BUILDING_PHEROMONES["splitter"] = 100
|
||||||
constants.BUILDING_PHEROMONES["pump"] = 200
|
constants.BUILDING_PHEROMONES["pump"] = 100
|
||||||
constants.BUILDING_PHEROMONES["offshore-pump"] = 200 -- 2
|
constants.BUILDING_PHEROMONES["offshore-pump"] = 100 -- 2
|
||||||
constants.BUILDING_PHEROMONES["lamp"] = 1000
|
constants.BUILDING_PHEROMONES["lamp"] = 500
|
||||||
constants.BUILDING_PHEROMONES["generator"] = 1000
|
constants.BUILDING_PHEROMONES["generator"] = 500
|
||||||
constants.BUILDING_PHEROMONES["solar-panel"] = 1000
|
constants.BUILDING_PHEROMONES["solar-panel"] = 500
|
||||||
constants.BUILDING_PHEROMONES["programmable-speaker"] = 1000
|
constants.BUILDING_PHEROMONES["programmable-speaker"] = 500
|
||||||
constants.BUILDING_PHEROMONES["accumulator"] = 1000
|
constants.BUILDING_PHEROMONES["accumulator"] = 500
|
||||||
constants.BUILDING_PHEROMONES["assembling-machine"] = 1000
|
constants.BUILDING_PHEROMONES["assembling-machine"] = 500
|
||||||
constants.BUILDING_PHEROMONES["turret"] = 1000
|
constants.BUILDING_PHEROMONES["turret"] = 500
|
||||||
constants.BUILDING_PHEROMONES["roboport"] = 1000
|
constants.BUILDING_PHEROMONES["roboport"] = 500
|
||||||
constants.BUILDING_PHEROMONES["beacon"] = 1000
|
constants.BUILDING_PHEROMONES["beacon"] = 500
|
||||||
constants.BUILDING_PHEROMONES["ammo-turret"] = 1000 -- 3
|
constants.BUILDING_PHEROMONES["ammo-turret"] = 500 -- 3
|
||||||
constants.BUILDING_PHEROMONES["boiler"] = 2000
|
constants.BUILDING_PHEROMONES["boiler"] = 500
|
||||||
constants.BUILDING_PHEROMONES["furnace"] = 2000
|
constants.BUILDING_PHEROMONES["furnace"] = 500
|
||||||
constants.BUILDING_PHEROMONES["lab"] = 2000
|
constants.BUILDING_PHEROMONES["lab"] = 500
|
||||||
constants.BUILDING_PHEROMONES["reactor"] = 2000
|
constants.BUILDING_PHEROMONES["reactor"] = 500
|
||||||
constants.BUILDING_PHEROMONES["radar"] = 2000
|
constants.BUILDING_PHEROMONES["radar"] = 500
|
||||||
constants.BUILDING_PHEROMONES["electric-turret"] = 2000 -- 4
|
constants.BUILDING_PHEROMONES["electric-turret"] = 500 -- 4
|
||||||
constants.BUILDING_PHEROMONES["fluid-turret"] = 3500
|
constants.BUILDING_PHEROMONES["fluid-turret"] = 1750
|
||||||
constants.BUILDING_PHEROMONES["mining-drill"] = 3500 -- 5
|
constants.BUILDING_PHEROMONES["mining-drill"] = 1750 -- 5
|
||||||
constants.BUILDING_PHEROMONES["artillery-turret"] = 12000
|
constants.BUILDING_PHEROMONES["artillery-turret"] = 6000
|
||||||
constants.BUILDING_PHEROMONES["rocket-silo"] = 12000 -- 6
|
constants.BUILDING_PHEROMONES["rocket-silo"] = 6000 -- 6
|
||||||
|
|
||||||
|
|
||||||
-- constants.RETREAT_FILTER = {}
|
-- constants.RETREAT_FILTER = {}
|
||||||
|
@ -285,13 +285,15 @@ function mapProcessor.scanMap(map, surface, natives, tick)
|
|||||||
|
|
||||||
local retreats = map.chunkToRetreats
|
local retreats = map.chunkToRetreats
|
||||||
local rallys = map.chunkToRallys
|
local rallys = map.chunkToRallys
|
||||||
local spawners = map.chunkToSpawner
|
-- local spawners = map.chunkToSpawner
|
||||||
local settlers = map.chunkToSettler
|
local settlers = map.chunkToSettler
|
||||||
local drained = map.chunkToDrained
|
local drained = map.chunkToDrained
|
||||||
|
|
||||||
local processQueue = map.processQueue
|
local processQueue = map.processQueue
|
||||||
local endIndex = mMin(index + SCAN_QUEUE_SIZE, #processQueue)
|
local endIndex = mMin(index + SCAN_QUEUE_SIZE, #processQueue)
|
||||||
|
|
||||||
|
local isFullMapScan = settings.global["rampant-enableFullMapScan"].value
|
||||||
|
|
||||||
for x=index,endIndex do
|
for x=index,endIndex do
|
||||||
local chunk = processQueue[x]
|
local chunk = processQueue[x]
|
||||||
|
|
||||||
@ -311,12 +313,12 @@ function mapProcessor.scanMap(map, surface, natives, tick)
|
|||||||
rallys[chunk] = nil
|
rallys[chunk] = nil
|
||||||
end
|
end
|
||||||
|
|
||||||
local spawnerTick = spawners[chunk]
|
-- local spawnerTick = spawners[chunk]
|
||||||
if spawnerTick and ((tick - spawnerTick) > INTERVAL_SPAWNER) then
|
-- if spawnerTick and ((tick - spawnerTick) > INTERVAL_SPAWNER) then
|
||||||
spawners[chunk] = nil
|
-- spawners[chunk] = nil
|
||||||
end
|
-- end
|
||||||
|
|
||||||
local settlerTick = spawners[chunk]
|
local settlerTick = settlers[chunk]
|
||||||
if settlerTick and ((tick - settlerTick) > 0) then
|
if settlerTick and ((tick - settlerTick) > 0) then
|
||||||
settlers[chunk] = nil
|
settlers[chunk] = nil
|
||||||
end
|
end
|
||||||
@ -336,7 +338,9 @@ function mapProcessor.scanMap(map, surface, natives, tick)
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
mapScanChunk(chunk, surface, map)
|
if isFullMapScan then
|
||||||
|
mapScanChunk(chunk, surface, map)
|
||||||
|
end
|
||||||
|
|
||||||
local nests = getNestCount(map, chunk)
|
local nests = getNestCount(map, chunk)
|
||||||
if (nests > 0) then
|
if (nests > 0) then
|
||||||
|
@ -21,6 +21,8 @@ local RESOURCE_PHEROMONE = constants.RESOURCE_PHEROMONE
|
|||||||
|
|
||||||
local ATTACK_SCORE_KAMIKAZE = constants.ATTACK_SCORE_KAMIKAZE
|
local ATTACK_SCORE_KAMIKAZE = constants.ATTACK_SCORE_KAMIKAZE
|
||||||
|
|
||||||
|
local DIVISOR_DEATH_TRAIL_TABLE = constants.DIVISOR_DEATH_TRAIL_TABLE
|
||||||
|
|
||||||
local BASE_CLEAN_DISTANCE = constants.BASE_CLEAN_DISTANCE
|
local BASE_CLEAN_DISTANCE = constants.BASE_CLEAN_DISTANCE
|
||||||
|
|
||||||
local SQUAD_BUILDING = constants.SQUAD_BUILDING
|
local SQUAD_BUILDING = constants.SQUAD_BUILDING
|
||||||
@ -48,6 +50,7 @@ local SENTINEL_IMPASSABLE_CHUNK = constants.SENTINEL_IMPASSABLE_CHUNK
|
|||||||
-- imported functions
|
-- imported functions
|
||||||
|
|
||||||
local mRandom = math.random
|
local mRandom = math.random
|
||||||
|
local mMin = math.min
|
||||||
local tRemove = table.remove
|
local tRemove = table.remove
|
||||||
|
|
||||||
local euclideanDistancePoints = mathUtils.euclideanDistancePoints
|
local euclideanDistancePoints = mathUtils.euclideanDistancePoints
|
||||||
@ -55,6 +58,8 @@ local euclideanDistancePoints = mathUtils.euclideanDistancePoints
|
|||||||
local findMovementPosition = movementUtils.findMovementPosition
|
local findMovementPosition = movementUtils.findMovementPosition
|
||||||
|
|
||||||
local removeSquadFromChunk = chunkPropertyUtils.removeSquadFromChunk
|
local removeSquadFromChunk = chunkPropertyUtils.removeSquadFromChunk
|
||||||
|
local addDeathGenerator = chunkPropertyUtils.addDeathGenerator
|
||||||
|
local getDeathGenerator = chunkPropertyUtils.getDeathGenerator
|
||||||
|
|
||||||
local getNestCount = chunkPropertyUtils.getNestCount
|
local getNestCount = chunkPropertyUtils.getNestCount
|
||||||
|
|
||||||
@ -295,6 +300,13 @@ function squadAttack.squadsDispatch(map, surface, natives)
|
|||||||
if (memberCount == 0) then
|
if (memberCount == 0) then
|
||||||
tRemove(squads, i)
|
tRemove(squads, i)
|
||||||
removeSquadFromChunk(map, squad)
|
removeSquadFromChunk(map, squad)
|
||||||
|
local deathGen = getDeathGenerator(map, squad.chunk)
|
||||||
|
local penalties = squad.penalties
|
||||||
|
for x=1,mMin(#squad.penalties,5) do
|
||||||
|
addDeathGenerator(map,
|
||||||
|
penalties[x].c,
|
||||||
|
deathGen * DIVISOR_DEATH_TRAIL_TABLE[x])
|
||||||
|
end
|
||||||
group.destroy()
|
group.destroy()
|
||||||
elseif (memberCount > AI_MAX_BITER_GROUP_SIZE) then
|
elseif (memberCount > AI_MAX_BITER_GROUP_SIZE) then
|
||||||
local members = group.members
|
local members = group.members
|
||||||
|
@ -12502,6 +12502,7 @@ rampant-energyThiefEnemy=World: Energy Thief Biter Faction
|
|||||||
rampant-poisonEnemy=World: Poison Biter Faction
|
rampant-poisonEnemy=World: Poison Biter Faction
|
||||||
|
|
||||||
rampant-disableCollidingProjectiles=Projectiles: Non biter force colliding projectiles
|
rampant-disableCollidingProjectiles=Projectiles: Non biter force colliding projectiles
|
||||||
|
rampant-enableFullMapScan=Compatibility: Enable full map scanning
|
||||||
|
|
||||||
[mod-setting-description]
|
[mod-setting-description]
|
||||||
rampant-unitSpawnerBreath=Now unit spawners breath air so they are affected by things like poison capsules
|
rampant-unitSpawnerBreath=Now unit spawners breath air so they are affected by things like poison capsules
|
||||||
@ -12589,4 +12590,5 @@ rampant-energyThiefEnemy=Energy Thief Biter Faction, Major resistance to Electri
|
|||||||
rampant-poisonEnemy=Poison Biter Faction, Only Biters. On death creates a cloud that heals biters and hurts player objects. Major resistance to Poison, Minor weakness to Electric, Minor weakness to Explosive, Minor weakness to Laser, Minor resistance to Fire.
|
rampant-poisonEnemy=Poison Biter Faction, Only Biters. On death creates a cloud that heals biters and hurts player objects. Major resistance to Poison, Minor weakness to Electric, Minor weakness to Explosive, Minor weakness to Laser, Minor resistance to Fire.
|
||||||
|
|
||||||
rampant-disableCollidingProjectiles=Biter projectiles no longer collide with other biters, worms or nests. Everything else still collides with biter projectiles.
|
rampant-disableCollidingProjectiles=Biter projectiles no longer collide with other biters, worms or nests. Everything else still collides with biter projectiles.
|
||||||
rampant-liteMode=AI is still fully functional but the map scanning and processing is slowed, which will cause pheromones to remain longer, reduce the number of attacks spawned, and pheromones will spread slower.
|
rampant-liteMode=AI is still fully functional but the map scanning and processing is slowed, which will cause pheromones to remain longer, reduce the number of attacks spawned, and pheromones will spread slower.
|
||||||
|
rampant-enableFullMapScan=This setting causes the game map to slowly be scanned for entities created or destroyed outside of the factorio event system. (If a mod isn't using script_raised_built or script_raised_destroyed this will cause Rampant to still eventually be consistent with the game map)
|
11
settings.lua
11
settings.lua
@ -17,7 +17,7 @@ data:extend({
|
|||||||
default_value = true,
|
default_value = true,
|
||||||
order = "b[modifier]-b[trigger]",
|
order = "b[modifier]-b[trigger]",
|
||||||
per_user = false
|
per_user = false
|
||||||
},
|
},
|
||||||
|
|
||||||
{
|
{
|
||||||
type = "bool-setting",
|
type = "bool-setting",
|
||||||
@ -539,6 +539,15 @@ data:extend({
|
|||||||
per_user = false
|
per_user = false
|
||||||
},
|
},
|
||||||
|
|
||||||
|
{
|
||||||
|
type = "bool-setting",
|
||||||
|
name = "rampant-enableFullMapScan",
|
||||||
|
setting_type = "runtime-global",
|
||||||
|
default_value = false,
|
||||||
|
order = "n[modifier]-a[optimize]",
|
||||||
|
per_user = false
|
||||||
|
},
|
||||||
|
|
||||||
{
|
{
|
||||||
type = "bool-setting",
|
type = "bool-setting",
|
||||||
name = "rampant-unkillableLogisticRobots",
|
name = "rampant-unkillableLogisticRobots",
|
||||||
|
@ -30,7 +30,7 @@ function tests.pheromoneLevels(size)
|
|||||||
for i=1,#chunk do
|
for i=1,#chunk do
|
||||||
str = str .. " " .. tostring(i) .. "/" .. tostring(chunk[i])
|
str = str .. " " .. tostring(i) .. "/" .. tostring(chunk[i])
|
||||||
end
|
end
|
||||||
str = str .. " " .. "p/" .. game.surfaces[global.natives.activeSurface].get_pollution(chunk) .. " " .. "n/" .. chunkPropertyUtils.getNestCount(global.map, chunk) .. " " .. "w/" .. chunkPropertyUtils.getWormCount(global.map, chunk)
|
str = str .. " " .. "p/" .. game.surfaces[global.natives.activeSurface].get_pollution(chunk) .. " " .. "n/" .. chunkPropertyUtils.getNestCount(global.map, chunk) .. " " .. "w/" .. chunkPropertyUtils.getWormCount(global.map, chunk) .. " pg/" .. chunkPropertyUtils.getPlayerBaseGenerator(global.map, chunk)
|
||||||
if (chunk.x == playerChunkX) and (chunk.y == playerChunkY) then
|
if (chunk.x == playerChunkX) and (chunk.y == playerChunkY) then
|
||||||
print("=============")
|
print("=============")
|
||||||
print(chunk.x, chunk.y, str)
|
print(chunk.x, chunk.y, str)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user