--luacheck: ignore local Event = require 'utils.event' local Global = require 'utils.global' local Task = require 'utils.task' local arty_count = {} local Public = {} local Token = require 'utils.token' local WPT = require 'maps.amap.table' local artillery_target_entities = { 'character', 'tank', 'car', 'radar', 'lab', 'furnace', 'locomotive', 'cargo-wagon', 'fluid-wagon', 'artillery-wagon', 'artillery-turret', 'laser-turret', 'gun-turret', 'flamethrower-turret', -- 'silo', 'spidertron' } Global.register( arty_count, function(tbl) arty_count = tbl end ) function Public.reset_table() arty_count.max = 200 arty_count.all = {} arty_count.count = 0 arty_count.pace = 1 arty_count.radius = 350 arty_count.distance = 1400 arty_count.surface = {} end function Public.get(key) if key then return arty_count[key] else return arty_count end end function Public.set(key, value) if key and (value or value == false) then this[key] = value return this[key] elseif key then return this[key] else return this end end local on_init = function() Public.reset_table() end local function add_bullet() for k, p in pairs(arty_count.all) do if arty_count.all[k].valid then arty_count.all[k].insert {name = 'artillery-shell', count = '5'} end end end local function on_chunk_generated(event) local surface = event.surface local left_top_x = event.area.left_top.x local left_top_y = event.area.left_top.y local position for x = 0, 31, 1 do for y = 0, 31, 1 do position = {x = left_top_x + x, y = left_top_y + y} local q = position.x * position.x local w = position.y * position.y local distance = math.sqrt(q + w) if distance >= arty_count.distance then if arty_count.count >= arty_count.max then return else local roll = math.random(1, 2024) if roll == 1 then local arty = surface.create_entity {name = 'artillery-turret', position = position, force = 'enemy'} -- arty.insert{name='artillery-shell', count = '5'} --local k = #arty_count.all -- game.print(k) arty_count.all[arty.unit_number] = arty -- game.print(arty_count.all[1].name) arty_count.count = arty_count.count + 1 -- game.print(arty_count.count) -- game.print(position) end end end end end end local function on_entity_died(event) local entity = event.entity if not entity or not entity.valid then return end if arty_count.all[entity.unit_number] then arty_count.all[entity.unit_number] = nil arty_count.count = arty_count.count - 1 end -- local force = entity.force -- local name = entity.name -- if name == 'artillery-turret' and force.name == 'enemy' then -- arty_count.all[entity.unit_number] = nil -- arty_count.count = arty_count.count -1 -- -- if arty_count.count <= 0 then -- arty_count.count = 0 -- end end function on_player_changed_position(event) local player = game.players[event.player_index] local surface = player.surface if not surface.valid then return end local position = player.position local q = position.x * position.x local w = position.y * position.y local distance = math.sqrt(q + w) --artillery-targeting-remote game.print('123') surface.create_entity( { name = 'artillery-targeting-remote', position = position, force = 'enemy' -- target = position, -- speed = 0.001 } ) game.print('logging') end local artillery_target_callback = Token.register( function(data) local position = data.position local entity = data.entity if not entity.valid then return end local tx, ty = position.x, position.y local pos = entity.position local x, y = pos.x, pos.y local dx, dy = tx - x, ty - y local d = dx * dx + dy * dy -- if d >= 1024 and d <= 441398 then -- 704 in depth~ if entity.name == 'character' then entity.surface.create_entity { name = 'artillery-projectile', position = position, target = entity, force = 'enemy', speed = arty_count.pace } elseif entity.name ~= 'character' then entity.surface.create_entity { name = 'rocket', position = position, target = entity, force = 'enemy', speed = arty_count.pace } end end -- end ) local function do_artillery_turrets_targets() --local surface = arty_count.surface local this = WPT.get() local surface = game.surfaces[this.active_surface_index] --选取重炮 local roll_table = {} for index, arty in pairs(arty_count.all) do if arty.valid then roll_table[#roll_table + 1] = arty else arty_count.all[index] = nil -- <- if not valid, remove from table arty_count.count = arty_count.count - 1 end end if #roll_table <= 0 then return end local roll = math.random(1, #roll_table) local position = roll_table[roll].position --扫描区域 -- local normal_area = {left_top = {-480, -480}, right_bottom = {480, 480}} -- game.print(123) -- normal_area= roll_table[roll].artillery_area -- game.print(12) local entities = surface.find_entities_filtered {position = position, radius = arty_count.radius, name = artillery_target_entities, force = game.forces.player} -- local entities = surface.find_entities_filtered {area = normal_area, name = artillery_target_entities, force = 'player'} if #entities == 0 then return end --开火 for i = 1, arty_count.count do local entity = entities[math.random(#entities)] --game.print(entity.position) if entity and entity.valid then local data = {position = position, entity = entity} Task.set_timeout_in_ticks(i * 60, artillery_target_callback, data) end end end Event.add(defines.events.on_chunk_generated, on_chunk_generated) Event.add(defines.events.on_entity_died, on_entity_died) --Event.add(defines.events.on_player_changed_position, on_player_changed_position) --Event.on_nth_tick(600, add_bullet) Event.on_nth_tick(10, do_artillery_turrets_targets) Event.on_init(on_init) return Public