From c984907aec32f17d21b17996ce543d076f88306b Mon Sep 17 00:00:00 2001 From: PHIDIAS Date: Sun, 27 Apr 2025 07:35:25 +0900 Subject: [PATCH] Dual Mode for Waterfill Command (#391) * Update waterfill.lua * Update waterfill.lua * Update waterfill.lua * Clean up water fill logic * Update waterfill.lua --------- Co-authored-by: Cooldude2606 <25043174+Cooldude2606@users.noreply.github.com> --- exp_scenario/module/commands/waterfill.lua | 63 +++++++++++++++------- 1 file changed, 45 insertions(+), 18 deletions(-) diff --git a/exp_scenario/module/commands/waterfill.lua b/exp_scenario/module/commands/waterfill.lua index a3c9d602..bb6beb17 100644 --- a/exp_scenario/module/commands/waterfill.lua +++ b/exp_scenario/module/commands/waterfill.lua @@ -7,6 +7,14 @@ local Commands = require("modules/exp_commands") local Selection = require("modules.exp_legacy.modules.control.selection") --- @dep modules.control.selection local SelectionName = "ExpCommand_Waterfill" +local planet = { + ["nauvis"] = "water-mud", + ["gleba"] = "wetland-blue-slime", + ["vulcanus"] = "lava", + ["fulgora"] = "oil-ocean-shallow", + ["aquilo"] = "ammoniacal-ocean" +} + --- Toggle player selection mode for artillery Commands.new("waterfill", { "exp-commands_waterfill.description" }) :register(function(player) @@ -33,12 +41,15 @@ Selection.on_selection(SelectionName, function(event) local player = game.players[event.player_index] local surface = event.surface + --[[ if surface.planet and surface.planet ~= game.planets.nauvis then player.print({ "exp-commands_waterfill.nauvis-only" }, Commands.print_settings.error) return end + ]] local area_size = (area.right_bottom.x - area.left_top.x) * (area.right_bottom.y - area.left_top.y) + if area_size > 1000 then player.print({ "exp-commands_waterfill.area-too-large", 1000, area_size }, Commands.print_settings.error) return @@ -48,34 +59,50 @@ Selection.on_selection(SelectionName, function(event) local item_count_craft = math.min(math.floor(player.get_item_count("explosives") / 10), player.get_item_count("barrel"), player.get_item_count("grenade")) local item_count_total = item_count_cliff + item_count_craft - if item_count_total < area_size then - player.print({ "exp-commands_waterfill.too-few-explosives", area_size, item_count_total }, Commands.print_settings.error) - return - end - local tile_count = 0 + local failed_tiles = 0 local tiles_to_make = {} - for x = area.left_top.x, area.right_bottom.x do - for y = area.left_top.y, area.right_bottom.y do + local chests = surface.find_entities_filtered{ area = area, name = "steel-chest", force = player.force } + local tile_to_apply = (surface.planet and planet[surface.planet]) or "water-mud" + + if #chests > 0 then + for _, chest in pairs(chests) do tile_count = tile_count + 1 - tiles_to_make[tile_count] = { - name = "water-mud", - position = { x, y }, - } + if chest.get_inventory(defines.inventory.chest).is_empty() and tile_count <= item_count_total then + tiles_to_make[tile_count] = { name = tile_to_apply, position = { chest.position.x, chest.position.y } } + chest.destroy() + else + failed_tiles = failed_tiles + 1 + end end + + else + if item_count_total < area_size then + player.print({ "exp-commands_waterfill.too-few-explosives", area_size, item_count_total }, Commands.print_settings.error) + return + end + + for x = area.left_top.x, area.right_bottom.x do + for y = area.left_top.y, area.right_bottom.y do + tile_count = tile_count + 1 + tiles_to_make[tile_count] = { name = tile_to_apply, position = { x, y } } + end + end + + failed_tiles = surface.count_tiles_filtered{ area = area, name = tile_to_apply } end surface.set_tiles(tiles_to_make, true, "abort_on_collision", true, false, player, 0) - local remaining_tiles = surface.count_tiles_filtered{ area = area, name = "water-mud" } - local t_diff = tile_count - remaining_tiles + local tiles_made = tile_count - failed_tiles + assert(tiles_made >= 0) - if item_count_cliff >= t_diff then - player.remove_item{ name = "cliff-explosives", count = t_diff } + if item_count_cliff >= tiles_made then + player.remove_item{ name = "cliff-explosives", count = tiles_made } else if item_count_cliff > 0 then player.remove_item{ name = "cliff-explosives", count = item_count_cliff } end - local item_count_needed = t_diff - item_count_cliff + local item_count_needed = tiles_made - item_count_cliff if item_count_needed > 0 then player.remove_item{ name = "explosives", count = 10 * item_count_needed } player.remove_item{ name = "barrel", count = item_count_needed } @@ -83,8 +110,8 @@ Selection.on_selection(SelectionName, function(event) end end - if remaining_tiles > 0 then - player.print({ "exp-commands_waterfill.part-complete", tile_count, remaining_tiles }, Commands.print_settings.default) + if failed_tiles > 0 then + player.print({ "exp-commands_waterfill.part-complete", tile_count, failed_tiles }, Commands.print_settings.default) else player.print({ "exp-commands_waterfill.complete", tile_count }, Commands.print_settings.default) end