143 lines
4.1 KiB
Lua

if (bitersEnrageG) then
return bitersEnrageG
end
local bitersEnrage = {}
local bitersInRange_Query = {
position = nil,
radius = 32,
limit = 200,
force = "enemy",
type = {"unit"}
}
local function enrageStickersParameters()
local enrageStickers = {}
for i = 1, 13 do
enrageStickers[#enrageStickers+1] = {lvl = i, movementModifier = 1 + (i-1)*0.10, tint = {r = 0.3+(i-1)*0.05, g = 0.7-(i-1)*0.05, b = 0.5-(i-1)*0.02, a = 0.005 + 0.02*(i-1) }, name = "enrage-sticker-lvl"..i.."-rampant"}
end
return enrageStickers
end
function bitersEnrage.createStickers()
local enrageStickers = enrageStickersParameters()
for i, stickerParameters in pairs (enrageStickers) do
-- stickerTemplate.animation.tint = stickerParameters.tint
-- stickerTemplate.target_movement_modifier = stickerParameters.movementModifier
data:extend({{
type = "sticker",
name = stickerParameters.name,
flags = {"not-on-map"},
animation =
{
filename = "__base__/graphics/entity/fire-flame/fire-flame-13.png",
line_length = 8,
width = 60,
height = 118,
frame_count = 25,
blend_mode = "normal",
animation_speed = 0.5,
scale = 0.3,
tint = stickerParameters.tint,
--shift = math3d.vector2.mul({-0.078125, -1.8125}, 0.1),
draw_as_glow = true
},
force_visibility = "ally",
duration_in_ticks = 30 * 60,
target_movement_modifier = stickerParameters.movementModifier
}}
)
end
end
local function createEnrageSequence()
local enrageSequence = {}
local enrageStickers = enrageStickersParameters()
local prevSticker
for i, stickerParameters in pairs (enrageStickers) do
enrageSequence[(prevSticker or "none")] = stickerParameters.name
prevSticker = stickerParameters.name
end
if prevSticker then
enrageSequence[prevSticker] = prevSticker
end
return enrageSequence
end
local enrageSequence = createEnrageSequence()
local function getNeighborChunksArray(map, x, y)
local neighbors = {}
local chunkYRow1 = y - 32
local chunkYRow3 = y + 32
local xChunks = map[x-32]
if xChunks then
neighbors[#neighbors+1] = xChunks[chunkYRow1]
neighbors[#neighbors+1] = xChunks[y]
neighbors[#neighbors+1] = xChunks[chunkYRow3]
end
xChunks = map[x+32]
if xChunks then
neighbors[#neighbors+1] = xChunks[chunkYRow1]
neighbors[#neighbors+1] = xChunks[y]
neighbors[#neighbors+1] = xChunks[chunkYRow3]
end
xChunks = map[x]
if xChunks then
neighbors[#neighbors+1] = xChunks[chunkYRow1]
neighbors[#neighbors+1] = xChunks[chunkYRow3]
end
return neighbors
end
function bitersEnrage.enrageBitersInRange(map, position, chunk, tick)
if chunk == -1 then
return false
end
if chunk.enrageTick and (chunk.enrageTick > tick) then
return false
end
local surface = map.surface
bitersInRange_Query.position = position
local entities = surface.find_entities_filtered(bitersInRange_Query)
chunk.enrageTick = tick + 600
if #entities > 60 then
local neighbors = getNeighborChunksArray(map, chunk.x, chunk.y)
for i, neighborChunk in pairs(neighbors) do
if neighborChunk ~= -1 then
neighborChunk.enrageTick = chunk.enrageTick
end
end
local flyingTextparameters = {text = "biters enraged", surface = surface, position = position, color = {1, 0, 0}, speed = 4, time_to_live = 120}
for i, player in pairs(game.connected_players) do
if player.valid then
if map.surface.index == ((player.surface and player.surface.index) or 0) then
player.create_local_flying_text(flyingTextparameters)
end
end
end
local enrageStickerName
for i, entity in pairs(entities) do
if entity.valid and (not entity.has_flag("not-in-kill-statistics")) then
if entity.stickers then
for ii, sticker in pairs(entity.stickers) do
if enrageSequence[sticker.name] then
enrageStickerName = enrageSequence[sticker.name]
end
end
end
enrageStickerName = (enrageStickerName or enrageSequence["none"])
surface.create_entity({name= enrageStickerName, position = position, target = entity})
end
end
end
end
bitersEnrageG = bitersEnrage
return bitersEnrage