143 lines
4.1 KiB
Lua
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 |