From 621c1486bf40fd3a72c34321ab7b2c4e038dc9ab Mon Sep 17 00:00:00 2001 From: Maxim Martyanov Date: Tue, 21 Jul 2020 09:40:32 +0300 Subject: [PATCH 01/11] Make grief prevention more aggressive: kill player's character and hold all crafting queue in corpse (via pre-death inventory resize by bonus multiplier, same used in RPG system and returned by this system back to normal sizes), instead relying on Factorio's item placement, so no items are lost from team. Corrected shown message on player abuse attempt. P.S. Not a Lua developer at all, so styleguide may be broken. --- antigrief.lua | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/antigrief.lua b/antigrief.lua index 1923af13..bfd06fa5 100644 --- a/antigrief.lua +++ b/antigrief.lua @@ -614,12 +614,23 @@ end local function on_player_cancelled_crafting(event) local player = game.players[event.player_index] - local count = #event.items + local count = event.items.get_item_count() -- Error in calculations were just misinterpretation of API, #event.items returned item slots, not actual count. + + local playerInventoryStacks = #player.get_main_inventory() -- Get this to calculate overhead + player inventory + local canceledCraftingQueueStacks = #event.items -- Get item stacks num from crafting queue + + if canceledCraftingQueueStacks > playerInventoryStacks then + player.character.character_inventory_slots_bonus = canceledCraftingQueueStacks + playerInventoryStacks -- Resize player's inventory for this entity at maximum level to hold crafting queue + inventory, so don't cause item drop. + for i = 1, canceledCraftingQueueStacks do -- Manually insert crafting queue to inventory + player.character.get_main_inventory().insert(event.items[i]) + end + player.character.die('player') -- Kill griefer!11 Thanks to RPG system - inventory size will automagically returned to it's previous state, so there is no abuse of playable RPG. + end if count > 40 then Utils.action_warning( '{Crafting}', - player.name .. ' canceled their craft of item ' .. event.recipe.name .. ' of total count ' .. count .. '.' + player.name .. ' canceled their craft of item ' .. event.recipe.name .. ' of total count ' .. count .. ' in raw items (' .. canceledCraftingQueueStacks .. ' slots)' -- Corrected message ) if not this.cancel_crafting_history[player.index] then this.cancel_crafting_history[player.index] = {} From 340ee13fb99f1b7c79b7caccea1c3d7817b5624e Mon Sep 17 00:00:00 2001 From: Maxim Martyanov Date: Tue, 21 Jul 2020 14:00:13 +0300 Subject: [PATCH 02/11] Renamed variables to match codestyle and moved block to it's logical location --- antigrief.lua | 22 ++++++++++------------ 1 file changed, 10 insertions(+), 12 deletions(-) diff --git a/antigrief.lua b/antigrief.lua index bfd06fa5..0f60d68e 100644 --- a/antigrief.lua +++ b/antigrief.lua @@ -614,24 +614,22 @@ end local function on_player_cancelled_crafting(event) local player = game.players[event.player_index] - local count = event.items.get_item_count() -- Error in calculations were just misinterpretation of API, #event.items returned item slots, not actual count. + local crafting_queue_item_count = event.items.get_item_count() + local player_inventory_maximum_slot_count = #player.get_main_inventory() + local crafting_queue_canceled_item_slot_count = #event.items - local playerInventoryStacks = #player.get_main_inventory() -- Get this to calculate overhead + player inventory - local canceledCraftingQueueStacks = #event.items -- Get item stacks num from crafting queue - - if canceledCraftingQueueStacks > playerInventoryStacks then - player.character.character_inventory_slots_bonus = canceledCraftingQueueStacks + playerInventoryStacks -- Resize player's inventory for this entity at maximum level to hold crafting queue + inventory, so don't cause item drop. - for i = 1, canceledCraftingQueueStacks do -- Manually insert crafting queue to inventory + if crafting_queue_canceled_item_slot_count > player_inventory_maximum_slot_count then + player.character.character_inventory_slots_bonus = crafting_queue_canceled_item_slot_count + player_inventory_maximum_slot_count + for i = 1, crafting_queue_canceled_item_slot_count do player.character.get_main_inventory().insert(event.items[i]) end - player.character.die('player') -- Kill griefer!11 Thanks to RPG system - inventory size will automagically returned to it's previous state, so there is no abuse of playable RPG. - end + player.character.die('player') - if count > 40 then Utils.action_warning( '{Crafting}', - player.name .. ' canceled their craft of item ' .. event.recipe.name .. ' of total count ' .. count .. ' in raw items (' .. canceledCraftingQueueStacks .. ' slots)' -- Corrected message + player.name .. ' canceled their craft of item ' .. event.recipe.name .. ' of total count ' .. crafting_queue_item_count .. ' in raw items (' .. crafting_queue_canceled_item_slot_count .. ' slots) and was punished.' ) + if not this.cancel_crafting_history[player.index] then this.cancel_crafting_history[player.index] = {} end @@ -643,7 +641,7 @@ local function on_player_cancelled_crafting(event) local str = '[' .. t .. '] ' str = str .. player.name .. ' canceled ' str = str .. ' item ' .. event.recipe.name - str = str .. ' count was a total of: ' .. count + str = str .. ' count was a total of: ' .. crafting_queue_item_count str = str .. ' at X:' str = str .. math.floor(player.position.x) str = str .. ' Y:' From 81f810aab8d42787f72f977c43a0ab11cb47a89d Mon Sep 17 00:00:00 2001 From: Maxim Martyanov Date: Tue, 21 Jul 2020 15:12:09 +0300 Subject: [PATCH 03/11] One more thing to fix - dual queuing (copper plates and iron plates, for example), and count only empty slots in player's inventory --- antigrief.lua | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/antigrief.lua b/antigrief.lua index 0f60d68e..c5b0a624 100644 --- a/antigrief.lua +++ b/antigrief.lua @@ -615,11 +615,11 @@ local function on_player_cancelled_crafting(event) local player = game.players[event.player_index] local crafting_queue_item_count = event.items.get_item_count() - local player_inventory_maximum_slot_count = #player.get_main_inventory() + local player_inventory_free_slot_count = player.get_main_inventory().count_empty_stacks() local crafting_queue_canceled_item_slot_count = #event.items - if crafting_queue_canceled_item_slot_count > player_inventory_maximum_slot_count then - player.character.character_inventory_slots_bonus = crafting_queue_canceled_item_slot_count + player_inventory_maximum_slot_count + if crafting_queue_canceled_item_slot_count > player_inventory_free_slot_count then + player.character.character_inventory_slots_bonus = crafting_queue_canceled_item_slot_count + player_inventory_free_slot_count for i = 1, crafting_queue_canceled_item_slot_count do player.character.get_main_inventory().insert(event.items[i]) end From e3837464b08a7f13a4fdba6b5c0e72a74dc6e433 Mon Sep 17 00:00:00 2001 From: Maxim Martyanov Date: Tue, 21 Jul 2020 15:14:54 +0300 Subject: [PATCH 04/11] Count in addition to inventory full player's inventory size to be sure it can hold everything without invalidation. --- antigrief.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/antigrief.lua b/antigrief.lua index c5b0a624..26cd5afa 100644 --- a/antigrief.lua +++ b/antigrief.lua @@ -619,7 +619,7 @@ local function on_player_cancelled_crafting(event) local crafting_queue_canceled_item_slot_count = #event.items if crafting_queue_canceled_item_slot_count > player_inventory_free_slot_count then - player.character.character_inventory_slots_bonus = crafting_queue_canceled_item_slot_count + player_inventory_free_slot_count + player.character.character_inventory_slots_bonus = crafting_queue_canceled_item_slot_count + #player.get_main_inventory() for i = 1, crafting_queue_canceled_item_slot_count do player.character.get_main_inventory().insert(event.items[i]) end From 162d1e1e9a48b3e68aecd403a98c1a80f2630bc5 Mon Sep 17 00:00:00 2001 From: MewMew Date: Wed, 22 Jul 2020 05:59:32 +0200 Subject: [PATCH 05/11] update --- maps/expanse/functions.lua | 61 +++++++++++++++++++++++------------ maps/expanse/main.lua | 24 ++++++++++++-- maps/expanse/price_raffle.lua | 2 +- 3 files changed, 63 insertions(+), 24 deletions(-) diff --git a/maps/expanse/functions.lua b/maps/expanse/functions.lua index 24c52d56..f18a741e 100644 --- a/maps/expanse/functions.lua +++ b/maps/expanse/functions.lua @@ -2,16 +2,16 @@ local Price_raffle = require 'maps.expanse.price_raffle' local Public = {} local price_modifiers = { - ["unit-spawner"] = -128, + ["unit-spawner"] = -256, ["unit"] = -16, ["turret"] = -128, ["tree"] = -8, - ["simple-entity"] = -12, - ["cliff"] = -32, - ["water"] = -4, - ["water-green"] = -4, - ["deepwater"] = -4, - ["deepwater-green"] = -4, + ["simple-entity"] = 2, + ["cliff"] = -128, + ["water"] = -5, + ["water-green"] = -5, + ["deepwater"] = -5, + ["deepwater-green"] = -5, ["water-mud"] = -6, ["water-shallow"] = -6, } @@ -30,18 +30,19 @@ local function get_cell_value(expanse, left_top) if price_modifiers[tile.name] then value = value + price_modifiers[tile.name] end - end - - local distance = math.sqrt(left_top.x ^ 2 + left_top.y ^ 2) - local value = value * (distance * 0.005) - - local ore_modifier = distance * 0.00025 - if ore_modifier > 0.5 then ore_modifier = 0.5 end - + end for _, entity in pairs(entities) do if price_modifiers[entity.type] then value = value + price_modifiers[entity.type] end + end + + local distance = math.sqrt(left_top.x ^ 2 + left_top.y ^ 2) + local value = value * (distance * 0.005) + local ore_modifier = distance * 0.00025 + if ore_modifier > 0.33 then ore_modifier = 0.33 end + + for _, entity in pairs(entities) do if entity.type == "resource" then if entity.name == "crude-oil" then value = value + (entity.amount * ore_modifier * 0.01) @@ -96,7 +97,7 @@ end function Public.expand(expanse, left_top) local source_surface = game.surfaces[expanse.source_surface] if not source_surface then return end - source_surface.request_to_generate_chunks({x = 0, y = 0}, 3) + source_surface.request_to_generate_chunks(left_top, 3) source_surface.force_generate_chunk_requests() local square_size = expanse.square_size @@ -134,12 +135,17 @@ function Public.expand(expanse, left_top) if game.tick == 0 then local a = math.floor(expanse.square_size * 0.5) - surface.create_entity({name = "crude-oil", position = {a - 3, a}, amount = 300000}) - local e = surface.create_entity({name = "offshore-pump", force = "player", position = {a + 1, a}}) - e.destructible = false - e.minable = false + for x = 1, 3, 1 do + for y = 1, 3, 1 do + surface.set_tiles({{name = "water", position = {a + x, a + y - 2}}}, true) + end + end + surface.create_entity({name = "crude-oil", position = {a - 3, a}, amount = 1500000}) surface.create_entity({name = "rock-big", position = {a, a}}) surface.create_entity({name = "tree-0" .. math.random(1,9), position = {a, a - 1}}) + surface.spill_item_stack({a, a + 2}, {name = "small-plane", count = 1}, false, nil, false) + surface.spill_item_stack({a + 0.5, a + 2.5}, {name = "small-plane", count = 1}, false, nil, false) + surface.spill_item_stack({a - 0.5, a + 2.5}, {name = "small-plane", count = 1}, false, nil, false) end end @@ -176,6 +182,16 @@ function Public.set_container(expanse, entity) local inventory = container.entity.get_inventory(defines.inventory.chest) + if not inventory.is_empty() then + local contents = inventory.get_contents() + if contents["small-plane"] then + local count_removed = inventory.remove({name = "small-plane", count = 1}) + if count_removed > 0 then + init_container(expanse, entity) + end + end + end + for key, item_stack in pairs(container.price) do local count_removed = inventory.remove(item_stack) container.price[key].count = container.price[key].count - count_removed @@ -191,7 +207,10 @@ function Public.set_container(expanse, entity) for name, count in pairs(inventory.get_contents()) do entity.surface.spill_item_stack(entity.position, {name = name, count = count}, true, nil, false) end - end + end + if math.random(1, 3) == 1 then + entity.surface.spill_item_stack(entity.position, {name = "small-plane", count = 1}, true, nil, false) + end entity.destructible = true entity.die() return diff --git a/maps/expanse/main.lua b/maps/expanse/main.lua index 81a12742..0c324d9b 100644 --- a/maps/expanse/main.lua +++ b/maps/expanse/main.lua @@ -16,7 +16,7 @@ Global.register( local function reset() expanse.containers = {} - expanse.source_surface = 1 + if not expanse.source_surface then expanse.source_surface = "nauvis" end expanse.square_size = 15 local map_gen_settings = { @@ -42,6 +42,26 @@ local function reset() } game.create_surface("expanse", map_gen_settings) + if expanse.source_surface == "nauvis" then + local surface = game.surfaces[1] + local map_gen_settings = surface.map_gen_settings + map_gen_settings.autoplace_controls = { + ["coal"] = {frequency = 10, size = 0.7, richness = 0.5,}, + ["stone"] = {frequency = 10, size = 0.7, richness = 0.5,}, + ["copper-ore"] = {frequency = 10, size = 0.7, richness = 0.75,}, + ["iron-ore"] = {frequency = 10, size = 0.7, richness = 1,}, + ["uranium-ore"] = {frequency = 10, size = 0.5, richness = 1,}, + ["crude-oil"] = {frequency = 25, size = 1.5, richness = 1.5,}, + ["trees"] = {frequency = 1.5, size = 1, richness = 1}, + ["enemy-base"] = {frequency = 10, size = 2, richness = 1}, + } + map_gen_settings.starting_area = 0.25 + surface.map_gen_settings = map_gen_settings + for chunk in surface.get_chunks() do + surface.delete_chunk({chunk.x, chunk.y}) + end + end + local source_surface = game.surfaces[expanse.source_surface] source_surface.request_to_generate_chunks({x = 0, y = 0}, 4) source_surface.force_generate_chunk_requests() @@ -111,7 +131,7 @@ local function infini_rock(entity) local a = math.floor(expanse.square_size * 0.5) if entity.position.x == a and entity.position.y == a then entity.surface.create_entity({name = "rock-big", position = {a, a}}) - entity.surface.spill_item_stack(entity.position, {name = ores[math.random(1,4)], count = math.random(125, 250)}, true, nil, true) + entity.surface.spill_item_stack(entity.position, {name = ores[math.random(1,4)], count = math.random(100, 200)}, true, nil, true) end end diff --git a/maps/expanse/price_raffle.lua b/maps/expanse/price_raffle.lua index 99696941..b979ef35 100644 --- a/maps/expanse/price_raffle.lua +++ b/maps/expanse/price_raffle.lua @@ -227,7 +227,7 @@ function Public.roll_item_stack(remaining_budget, blacklist) if not blacklist[item_name] and item_worth <= remaining_budget then break end end - local stack_size = game.item_prototypes[item_name].stack_size * 16 + local stack_size = game.item_prototypes[item_name].stack_size * 32 local item_count = 1 From 93f883ddd1f8e65ca8cada67bdfebc1db308123b Mon Sep 17 00:00:00 2001 From: MewMew Date: Wed, 22 Jul 2020 06:12:45 +0200 Subject: [PATCH 06/11] map description --- locale/en/locale.cfg | 5 +++++ maps/expanse/functions.lua | 2 +- maps/expanse/main.lua | 5 +++++ 3 files changed, 11 insertions(+), 1 deletion(-) diff --git a/locale/en/locale.cfg b/locale/en/locale.cfg index c006c3fe..f919a122 100644 --- a/locale/en/locale.cfg +++ b/locale/en/locale.cfg @@ -8,6 +8,11 @@ map_info_main_caption=--Desert Oasis-- map_info_sub_caption=Survival in the dry sands. map_info_text=This is a harsh world, the heat is unbearable and the sand is sharp like diamonds.\nMake sure to stay properly hydrated.\nDrink some water from a pond, or sip it out of a barrel to stay refreshed.\n\nWe shall not attempt to travel without a proper vehicle.\nMany building foundations are not possible to be set up outside of the oasis.\nRailways between them however should be possible.\n\nLuckily the ship's moisture meter module did survive the crash.\nIt may come in handy! +[expanse] +map_info_main_caption=-- E x p a n s e -- +map_info_sub_caption= +map_info_text=The blue chests are hungry.\nFeed them and they will reward you with more land.\n\nThe friendly infini tree will provide you with all the wood you ever wanted.\nThe everlasting rock with be happy to provide resources for you.\n\nIf you find yourself stuck, put a reroll token in the chest to get a new offer.\nUnlocking chests may drop additional tokens. + [fish_defender] map_info_main_caption=--Fish Defender-- map_info_sub_caption= *blb blubby blub* diff --git a/maps/expanse/functions.lua b/maps/expanse/functions.lua index f18a741e..bf2db238 100644 --- a/maps/expanse/functions.lua +++ b/maps/expanse/functions.lua @@ -208,7 +208,7 @@ function Public.set_container(expanse, entity) entity.surface.spill_item_stack(entity.position, {name = name, count = count}, true, nil, false) end end - if math.random(1, 3) == 1 then + if math.random(1, 4) == 1 then entity.surface.spill_item_stack(entity.position, {name = "small-plane", count = 1}, true, nil, false) end entity.destructible = true diff --git a/maps/expanse/main.lua b/maps/expanse/main.lua index 0c324d9b..ecda1963 100644 --- a/maps/expanse/main.lua +++ b/maps/expanse/main.lua @@ -3,6 +3,7 @@ require 'modules.satellite_score' local Event = require 'utils.event' local Functions = require 'maps.expanse.functions' local Global = require 'utils.global' +local Map_info = require "modules.map_info" local math_round = math.round @@ -159,6 +160,10 @@ local function on_player_joined_game(event) end local function on_init(event) + local T = Map_info.Pop_info() + T.localised_category = "expanse" + T.main_caption_color = {r = 170, g = 170, b = 0} + T.sub_caption_color = {r = 120, g = 120, b = 0} reset() end From ca7fd371d1b7f8b96392fa232b5ff88f86d56bcc Mon Sep 17 00:00:00 2001 From: MewMew Date: Wed, 22 Jul 2020 09:12:04 +0200 Subject: [PATCH 07/11] leavers drop their tokens --- locale/en/locale.cfg | 2 +- maps/expanse/functions.lua | 2 +- maps/expanse/main.lua | 25 +++++++++++++++++++++---- 3 files changed, 23 insertions(+), 6 deletions(-) diff --git a/locale/en/locale.cfg b/locale/en/locale.cfg index f919a122..e3fd5a06 100644 --- a/locale/en/locale.cfg +++ b/locale/en/locale.cfg @@ -11,7 +11,7 @@ map_info_text=This is a harsh world, the heat is unbearable and the sand is shar [expanse] map_info_main_caption=-- E x p a n s e -- map_info_sub_caption= -map_info_text=The blue chests are hungry.\nFeed them and they will reward you with more land.\n\nThe friendly infini tree will provide you with all the wood you ever wanted.\nThe everlasting rock with be happy to provide resources for you.\n\nIf you find yourself stuck, put a reroll token in the chest to get a new offer.\nUnlocking chests may drop additional tokens. +map_info_text=The blue chests are hungry.\nFeed them and they will reward you with more land.\n\nThe friendly infini tree will provide you with all the wood you ever wanted.\nThe everlasting rock with be happy to provide resources for you.\n\nIf you find yourself stuck, put a reroll token, the small plane toy, in the chest to get a new offer.\nUnlocking chests may drop additional tokens. [fish_defender] map_info_main_caption=--Fish Defender-- diff --git a/maps/expanse/functions.lua b/maps/expanse/functions.lua index bf2db238..f18a741e 100644 --- a/maps/expanse/functions.lua +++ b/maps/expanse/functions.lua @@ -208,7 +208,7 @@ function Public.set_container(expanse, entity) entity.surface.spill_item_stack(entity.position, {name = name, count = count}, true, nil, false) end end - if math.random(1, 4) == 1 then + if math.random(1, 3) == 1 then entity.surface.spill_item_stack(entity.position, {name = "small-plane", count = 1}, true, nil, false) end entity.destructible = true diff --git a/maps/expanse/main.lua b/maps/expanse/main.lua index ecda1963..8e2ebc50 100644 --- a/maps/expanse/main.lua +++ b/maps/expanse/main.lua @@ -133,6 +133,7 @@ local function infini_rock(entity) if entity.position.x == a and entity.position.y == a then entity.surface.create_entity({name = "rock-big", position = {a, a}}) entity.surface.spill_item_stack(entity.position, {name = ores[math.random(1,4)], count = math.random(100, 200)}, true, nil, true) + entity.surface.spill_item_stack(entity.position, {name = "stone", count = math.random(25, 50)}, true, nil, true) end end @@ -159,6 +160,21 @@ local function on_player_joined_game(event) end end +local function on_player_left_game(event) + local player = game.players[event.player_index] + if not player.character then return end + if not player.character.valid then return end + local inventory = player.get_main_inventory() + if not inventory then return end + local removed_count = inventory.remove({name = "small-plane", count = 999}) + if removed_count > 0 then + for _ = 1, removed_count, 1 do + player.surface.spill_item_stack(player.position, {name = "small-plane", count = 1}, false, nil, false) + end + game.print(player.name .. " dropped their tokens! [gps=" .. math.floor(player.position.x) .. "," .. math.floor(player.position.y) .. "]") + end +end + local function on_init(event) local T = Map_info.Pop_info() T.localised_category = "expanse" @@ -168,10 +184,11 @@ local function on_init(event) end Event.on_init(on_init) -Event.add(defines.events.on_gui_opened, on_gui_opened) -Event.add(defines.events.on_gui_closed, on_gui_closed) Event.add(defines.events.on_chunk_generated, on_chunk_generated) Event.add(defines.events.on_entity_died, infini_resource) -Event.add(defines.events.on_robot_mined_entity, infini_resource) +Event.add(defines.events.on_gui_closed, on_gui_closed) +Event.add(defines.events.on_gui_opened, on_gui_opened) +Event.add(defines.events.on_player_joined_game, on_player_joined_game) +Event.add(defines.events.on_player_left_game, on_player_left_game) Event.add(defines.events.on_player_mined_entity, infini_resource) -Event.add(defines.events.on_player_joined_game, on_player_joined_game) \ No newline at end of file +Event.add(defines.events.on_robot_mined_entity, infini_resource) \ No newline at end of file From caba716520434ba28716ad3436228b908ae52043 Mon Sep 17 00:00:00 2001 From: MewMew Date: Wed, 22 Jul 2020 12:25:33 +0200 Subject: [PATCH 08/11] map ping when chest is unlocked --- maps/expanse/functions.lua | 6 ++++-- maps/expanse/main.lua | 24 ++++++++++++++---------- 2 files changed, 18 insertions(+), 12 deletions(-) diff --git a/maps/expanse/functions.lua b/maps/expanse/functions.lua index f18a741e..a8d9a4fe 100644 --- a/maps/expanse/functions.lua +++ b/maps/expanse/functions.lua @@ -202,7 +202,9 @@ function Public.set_container(expanse, entity) if #container.price == 0 then Public.expand(expanse, container.left_top) - expanse.containers[entity.unit_number] = nil + local a = math.floor(expanse.square_size * 0.5) + local expansion_position = {x = expanse.containers[entity.unit_number].left_top.x + a, y = expanse.containers[entity.unit_number].left_top.y + a} + expanse.containers[entity.unit_number] = nil if not inventory.is_empty() then for name, count in pairs(inventory.get_contents()) do entity.surface.spill_item_stack(entity.position, {name = name, count = count}, true, nil, false) @@ -213,7 +215,7 @@ function Public.set_container(expanse, entity) end entity.destructible = true entity.die() - return + return expansion_position end for slot = 1, 30, 1 do diff --git a/maps/expanse/main.lua b/maps/expanse/main.lua index 8e2ebc50..bd7dbbf8 100644 --- a/maps/expanse/main.lua +++ b/maps/expanse/main.lua @@ -108,22 +108,26 @@ local function on_chunk_generated(event) event.surface.set_tiles(tiles, true) end -local function on_gui_opened(event) +local function container_opened(event) local entity = event.entity if not entity then return end if not entity.valid then return end if not entity.unit_number then return end - if entity.force.index ~= 3 then return end - Functions.set_container(expanse, entity) + if entity.force.index ~= 3 then return end + local expansion_position = Functions.set_container(expanse, entity) + if expansion_position then + local player = game.players[event.player_index] + local colored_player_name = table.concat({"[color=", player.color.r * 0.6 + 0.35, ",", player.color.g * 0.6 + 0.35, ",", player.color.b * 0.6 + 0.35, "]", player.name, "[/color]"}) + game.print(colored_player_name .. " unlocked new grounds! [gps=" .. math.floor(expansion_position.x) .. "," .. math.floor(expansion_position.y) .. ",expanse]") + end +end + +local function on_gui_opened(event) + container_opened(event) end local function on_gui_closed(event) - local entity = event.entity - if not entity then return end - if not entity.valid then return end - if not entity.unit_number then return end - if entity.force.index ~= 3 then return end - Functions.set_container(expanse, entity) + container_opened(event) end local ores = {"iron-ore", "iron-ore", "copper-ore", "coal"} @@ -171,7 +175,7 @@ local function on_player_left_game(event) for _ = 1, removed_count, 1 do player.surface.spill_item_stack(player.position, {name = "small-plane", count = 1}, false, nil, false) end - game.print(player.name .. " dropped their tokens! [gps=" .. math.floor(player.position.x) .. "," .. math.floor(player.position.y) .. "]") + game.print(player.name .. " dropped their tokens! [gps=" .. math.floor(player.position.x) .. "," .. math.floor(player.position.y) .. "," .. player.surface.name .. "]") end end From 4a6559e342bba90e0b11280e2297915d2ef51d01 Mon Sep 17 00:00:00 2001 From: MewMew Date: Wed, 22 Jul 2020 14:47:12 +0200 Subject: [PATCH 09/11] map ping on token use --- maps/expanse/functions.lua | 2 ++ 1 file changed, 2 insertions(+) diff --git a/maps/expanse/functions.lua b/maps/expanse/functions.lua index a8d9a4fe..04c3870a 100644 --- a/maps/expanse/functions.lua +++ b/maps/expanse/functions.lua @@ -188,6 +188,8 @@ function Public.set_container(expanse, entity) local count_removed = inventory.remove({name = "small-plane", count = 1}) if count_removed > 0 then init_container(expanse, entity) + container = expanse.containers[entity.unit_number] + game.print("The hungry chest has renewed it's offer! [gps=" .. math.floor(entity.position.x) .. "," .. math.floor(entity.position.y) .. ",expanse]") end end end From 5b60da71d25fbfed182f5b794dbfff1e8b6ac5d8 Mon Sep 17 00:00:00 2001 From: Gerkiz Date: Wed, 22 Jul 2020 18:58:42 +0200 Subject: [PATCH 10/11] fixes --- maps/mountain_fortress_v3/breached_wall.lua | 1 + maps/mountain_fortress_v3/main.lua | 5 +- .../resource_generator.lua | 116 +++- maps/mountain_fortress_v3/table.lua | 3 +- maps/mountain_fortress_v3/terrain.lua | 25 +- modules/rpg_v2.lua | 559 ++++++++++++++---- modules/wave_defense/main.lua | 2 +- 7 files changed, 580 insertions(+), 131 deletions(-) diff --git a/maps/mountain_fortress_v3/breached_wall.lua b/maps/mountain_fortress_v3/breached_wall.lua index 04f9b5ae..7e40e642 100644 --- a/maps/mountain_fortress_v3/breached_wall.lua +++ b/maps/mountain_fortress_v3/breached_wall.lua @@ -78,6 +78,7 @@ local function distance(player) rpg_extra.reward_new_players = bonus_xp_on_join * rpg_extra.breached_walls WPT.set().breached_wall = breached_wall + 1 WPT.set().placed_trains_in_zone.placed = 0 + WPT.set().placed_trains_in_zone.randomized = false WPT.set().placed_trains_in_zone.positions = {} raise_event(Balance.events.breached_wall, {}) diff --git a/maps/mountain_fortress_v3/main.lua b/maps/mountain_fortress_v3/main.lua index 045c7f81..9410734c 100644 --- a/maps/mountain_fortress_v3/main.lua +++ b/maps/mountain_fortress_v3/main.lua @@ -233,8 +233,9 @@ function Public.reset_map() RPG.set_surface_name('mountain_fortress_v3') RPG.enable_health_and_mana_bars(true) RPG.enable_wave_defense(true) - RPG.enable_mana(false) - RPG.enable_flame_boots(false) + RPG.enable_mana(true) + RPG.enable_flame_boots(true) + RPG.personal_tax_rate(1) disable_tech() diff --git a/maps/mountain_fortress_v3/resource_generator.lua b/maps/mountain_fortress_v3/resource_generator.lua index 4f795b8b..73e66e10 100644 --- a/maps/mountain_fortress_v3/resource_generator.lua +++ b/maps/mountain_fortress_v3/resource_generator.lua @@ -87,14 +87,126 @@ local resource_loot = { recipe = 'stone-wall', output = {item = 'stone-wall', min_rate = 1 / 4 / 60, distance_factor = 1 / 8 / 60 / 512} }, - weight = 2 + weight = 10 }, { stack = { recipe = 'iron-gear-wheel', output = {item = 'iron-gear-wheel', min_rate = 1 / 4 / 60, distance_factor = 1 / 6 / 60 / 512} }, + weight = 12 + }, + { + stack = { + recipe = 'inserter', + output = {item = 'inserter', min_rate = 1 / 4 / 60, distance_factor = 1 / 8 / 60 / 512} + }, + weight = 12 + }, + { + stack = { + recipe = 'transport-belt', + output = {item = 'transport-belt', min_rate = 1 / 4 / 60, distance_factor = 1 / 8 / 60 / 512} + }, + weight = 8 + }, + { + stack = { + recipe = 'underground-belt', + output = {item = 'underground-belt', min_rate = 1 / 4 / 60, distance_factor = 1 / 8 / 60 / 512} + }, + weight = 8 + }, + { + stack = { + recipe = 'small-electric-pole', + output = {item = 'small-electric-pole', min_rate = 1 / 4 / 60, distance_factor = 1 / 6 / 60 / 512} + }, + weight = 8 + }, + { + stack = { + recipe = 'fast-transport-belt', + output = {item = 'fast-transport-belt', min_rate = 1 / 4 / 60, distance_factor = 1 / 12 / 60 / 512} + }, + weight = 5 + }, + { + stack = { + recipe = 'fast-underground-belt', + output = {item = 'fast-underground-belt', min_rate = 1 / 4 / 60, distance_factor = 1 / 12 / 60 / 512} + }, + weight = 5 + }, + { + stack = { + recipe = 'solar-panel', + output = {item = 'solar-panel', min_rate = 1 / 4 / 60, distance_factor = 1 / 12 / 60 / 512} + }, weight = 3 + }, + { + stack = { + recipe = 'productivity-module', + output = {item = 'productivity-module', min_rate = 1 / 4 / 60, distance_factor = 1 / 20 / 60 / 512} + }, + weight = 0.9 + }, + { + stack = { + recipe = 'effectivity-module', + output = {item = 'effectivity-module', min_rate = 1 / 4 / 60, distance_factor = 1 / 20 / 60 / 512} + }, + weight = 0.9 + }, + { + stack = { + recipe = 'speed-module', + output = {item = 'speed-module', min_rate = 1 / 4 / 60, distance_factor = 1 / 20 / 60 / 512} + }, + weight = 0.8 + }, + { + stack = { + recipe = 'productivity-module-2', + output = {item = 'productivity-module-2', min_rate = 1 / 4 / 60, distance_factor = 1 / 20 / 60 / 512} + }, + weight = 0.5 + }, + { + stack = { + recipe = 'effectivity-module-2', + output = {item = 'effectivity-module-2', min_rate = 1 / 4 / 60, distance_factor = 1 / 20 / 60 / 512} + }, + weight = 0.5 + }, + { + stack = { + recipe = 'speed-module-2', + output = {item = 'speed-module-2', min_rate = 1 / 4 / 60, distance_factor = 1 / 20 / 60 / 512} + }, + weight = 0.5 + }, + { + stack = { + recipe = 'productivity-module-3', + output = {item = 'productivity-module-3', min_rate = 1 / 4 / 60, distance_factor = 1 / 30 / 60 / 512} + }, + weight = 0.25 + }, + { + stack = { + recipe = 'effectivity-module-3', + output = {item = 'effectivity-module-3', min_rate = 1 / 4 / 60, distance_factor = 1 / 30 / 60 / 512} + }, + weight = 0.25 + }, + { + stack = { + recipe = 'speed-module-3', + output = {item = 'speed-module-3', min_rate = 1 / 4 / 60, distance_factor = 1 / 30 / 60 / 512} + }, + weight = 0.10 } } @@ -116,7 +228,7 @@ local furnace_loot = { { stack = { furance_item = 'steel-plate', - output = {item = 'steel-plate', min_rate = 0.5 / 8 / 60, distance_factor = 1 / 25 / 60 / 512} + output = {item = 'steel-plate', min_rate = 0.5 / 8 / 60, distance_factor = 1 / 15 / 60 / 512} }, weight = 1 } diff --git a/maps/mountain_fortress_v3/table.lua b/maps/mountain_fortress_v3/table.lua index 0530d352..97bcd850 100644 --- a/maps/mountain_fortress_v3/table.lua +++ b/maps/mountain_fortress_v3/table.lua @@ -89,7 +89,8 @@ function Public.reset_table() this.placed_trains_in_zone = { placed = 0, positions = {}, - limit = 5 + limit = 5, + randomized = false } end diff --git a/maps/mountain_fortress_v3/terrain.lua b/maps/mountain_fortress_v3/terrain.lua index 8e8f7653..e5e8fca6 100644 --- a/maps/mountain_fortress_v3/terrain.lua +++ b/maps/mountain_fortress_v3/terrain.lua @@ -114,6 +114,12 @@ local function place_wagon(data) local placed_trains_in_zone = WPT.get('placed_trains_in_zone') + if not placed_trains_in_zone.randomized then + placed_trains_in_zone.limit = math.random(1, 5) + placed_trains_in_zone.randomized = true + placed_trains_in_zone = WPT.get('placed_trains_in_zone') + end + if placed_trains_in_zone.placed >= placed_trains_in_zone.limit then return end @@ -1416,7 +1422,7 @@ local function process_level_2_position(x, y, data) --Main Rock Terrain local no_rocks_2 = get_noise('no_rocks_2', p, seed + 75000) if no_rocks_2 > 0.80 or no_rocks_2 < -0.80 then - tiles[#tiles + 1] = {name = 'dirt-' .. math.floor(no_rocks_2 * 8) % 2 + 5, position = p} + tiles[#tiles + 1] = {name = 'grass-' .. math.random(1, 4), position = p} if math.random(1, 512) == 1 then treasure[#treasure + 1] = {position = p, chest = 'wooden-chest'} end @@ -1426,7 +1432,7 @@ local function process_level_2_position(x, y, data) if math.random(1, 2048) == 1 then treasure[#treasure + 1] = {position = p, chest = 'wooden-chest'} end - tiles[#tiles + 1] = {name = 'dirt-7', position = p} + tiles[#tiles + 1] = {name = 'grass-' .. math.random(1, 4), position = p} if math.random(1, 100) > 25 then entities[#entities + 1] = {name = rock_raffle[math.random(1, size_of_rock_raffle)], position = p} end @@ -1508,9 +1514,9 @@ local function process_level_1_position(x, y, data) --Resource Spots if smol_areas < -0.72 then - if math.random(1, 8) == 1 then - Generate_resources(buildings, p, Public.level_depth) - end + -- if math.random(1, 8) == 1 then + Generate_resources(buildings, p, Public.level_depth) + -- end end local no_rocks = get_noise('no_rocks', p, seed + 25000) @@ -1565,7 +1571,9 @@ local function process_level_1_position(x, y, data) end Public.levels = { + process_level_4_position, process_level_1_position, + process_level_6_position, process_level_2_position, process_level_3_position, process_level_4_position, @@ -1588,11 +1596,12 @@ local function is_out_of_map(p) end local function process_bits(x, y, data) + local levels = Public.levels local left_top_y = data.area.left_top.y - local index = math.floor((math.abs(left_top_y / Public.level_depth)) % 13) + 1 - local process_level = Public.levels[index] + local index = math.floor((math.abs(left_top_y / Public.level_depth)) % 15) + 1 + local process_level = levels[index] if not process_level then - process_level = Public.levels[#Public.levels] + process_level = levels[#levels] end process_level(x, y, data) diff --git a/modules/rpg_v2.lua b/modules/rpg_v2.lua index 208c4f14..5a060ce0 100644 --- a/modules/rpg_v2.lua +++ b/modules/rpg_v2.lua @@ -47,7 +47,9 @@ local rpg_extra = { enable_health_and_mana_bars = false, enable_mana = false, enable_wave_defense = false, - enable_flame_boots = false + enable_flame_boots = false, + mana_per_tick = 0.1, + force_mana_per_tick = false } local rpg_frame_icons = { 'entity/small-worm-turret', @@ -111,7 +113,7 @@ local projectile_types = { ['petroleum-gas-barrel'] = {name = 'flamethrower-fire-stream', count = 4, max_range = 24, tick_speed = 1}, ['light-oil-barrel'] = {name = 'flamethrower-fire-stream', count = 4, max_range = 24, tick_speed = 1}, ['heavy-oil-barrel'] = {name = 'flamethrower-fire-stream', count = 4, max_range = 24, tick_speed = 1}, - ['sulfuric-acid-barrel'] = { + ['acid-stream-spitter-big'] = { name = 'acid-stream-spitter-big', count = 3, max_range = 16, @@ -119,7 +121,7 @@ local projectile_types = { force = 'enemy' }, ['lubricant-barrel'] = {name = 'acid-stream-spitter-big', count = 3, max_range = 16, tick_speed = 1}, - ['railgun-dart'] = {name = 'railgun-beam', count = 5, max_range = 40, tick_speed = 5}, + ['railgun-beam'] = {name = 'railgun-beam', count = 5, max_range = 40, tick_speed = 5}, ['shotgun-shell'] = {name = 'shotgun-pellet', count = 16, max_range = 24, tick_speed = 1}, ['piercing-shotgun-shell'] = {name = 'piercing-shotgun-pellet', count = 16, max_range = 24, tick_speed = 1}, ['firearm-magazine'] = {name = 'shotgun-pellet', count = 16, max_range = 24, tick_speed = 1}, @@ -164,55 +166,243 @@ local conjure_items = { [1] = { name = 'Stone Wall', obj_to_create = 'stone-wall', - level = '10', + level = 10, + target = true, type = 'item', - mana_cost = 40, - tick = 60, + mana_cost = 35, + tick = 160, enabled = true }, [2] = { - name = 'Steel Chest', - obj_to_create = 'steel-chest', - level = '10', + name = 'Wooden Chest', + obj_to_create = 'wooden-chest', + level = 2, + target = true, type = 'item', - mana_cost = 40, - tick = 60, + mana_cost = 30, + tick = 160, enabled = true }, [3] = { - name = 'Transport Belt', - obj_to_create = 'transport-belt', - level = '10', + name = 'Iron Chest', + obj_to_create = 'iron-chest', + level = 10, + target = true, type = 'item', mana_cost = 40, - tick = 60, + tick = 260, enabled = true }, [4] = { - name = 'Sandy Rock', - obj_to_create = 'sand-rock-big', - level = '10', - type = 'entity', - mana_cost = 40, - tick = 120, + name = 'Steel Chest', + obj_to_create = 'steel-chest', + level = 15, + target = true, + type = 'item', + mana_cost = 50, + tick = 360, enabled = true }, [5] = { - name = 'Smol Biter', - obj_to_create = 'small-biter', - level = '10', - type = 'entity', + name = 'Transport Belt', + obj_to_create = 'transport-belt', + level = 3, + target = true, + type = 'item', mana_cost = 40, - tick = 120, + tick = 160, enabled = true }, [6] = { - name = 'Aoe Grenade', - obj_to_create = 'grenade', - level = '10', - type = 'entity', + name = 'Fast Transport Belt', + obj_to_create = 'fast-transport-belt', + level = 20, + target = true, + type = 'item', + mana_cost = 50, + tick = 260, + enabled = true + }, + [7] = { + name = 'Express Transport Belt', + obj_to_create = 'express-transport-belt', + level = 60, + target = true, + type = 'item', + mana_cost = 60, + tick = 360, + enabled = true + }, + [8] = { + name = 'Underground Belt', + obj_to_create = 'underground-belt', + level = 3, + target = true, + type = 'item', mana_cost = 40, - tick = 120, + tick = 160, + enabled = true + }, + [9] = { + name = 'Fast Underground Belt', + obj_to_create = 'fast-underground-belt', + level = 20, + target = true, + type = 'item', + mana_cost = 50, + tick = 260, + enabled = true + }, + [10] = { + name = 'Express Underground Belt', + obj_to_create = 'express-underground-belt', + level = 60, + target = true, + type = 'item', + mana_cost = 60, + tick = 360, + enabled = true + }, + [11] = { + name = 'Sandy Rock', + obj_to_create = 'sand-rock-big', + level = 80, + target = true, + type = 'entity', + mana_cost = 80, + tick = 420, + enabled = true + }, + [12] = { + name = 'Smol Biter', + obj_to_create = 'small-biter', + level = 50, + target = true, + biter = true, + type = 'entity', + mana_cost = 55, + tick = 220, + enabled = true + }, + [13] = { + name = 'Smol Spitter', + obj_to_create = 'small-spitter', + level = 50, + target = true, + biter = true, + type = 'entity', + mana_cost = 55, + tick = 220, + enabled = true + }, + [14] = { + name = 'Medium Biter', + obj_to_create = 'medium-biter', + level = 70, + target = true, + biter = true, + type = 'entity', + mana_cost = 77, + tick = 420, + enabled = true + }, + [15] = { + name = 'Medium Spitter', + obj_to_create = 'medium-spitter', + level = 70, + target = true, + type = 'entity', + mana_cost = 77, + tick = 420, + enabled = true + }, + [16] = { + name = 'Bitter Spawner', + obj_to_create = 'biter-spawner', + level = 100, + target = true, + biter = true, + type = 'entity', + mana_cost = 300, + tick = 1420, + enabled = true + }, + [17] = { + name = 'Spitter Spawner', + obj_to_create = 'spitter-spawner', + level = 100, + target = true, + biter = true, + type = 'entity', + mana_cost = 300, + tick = 1420, + enabled = true + }, + [18] = { + name = 'AOE Grenade', + obj_to_create = 'grenade', + target = true, + amount = 1, + damage = true, + force = 'player', + level = 30, + type = 'special', + mana_cost = 60, + tick = 420, + enabled = true + }, + [19] = { + name = 'Big AOE Grenade', + obj_to_create = 'cluster-grenade', + target = true, + amount = 2, + damage = true, + force = 'player', + level = 50, + type = 'special', + mana_cost = 80, + tick = 620, + enabled = true + }, + [20] = { + name = 'Pointy Rocket', + obj_to_create = 'rocket', + range = 240, + target = true, + amount = 4, + damage = true, + force = 'enemy', + level = 40, + type = 'special', + mana_cost = 60, + tick = 420, + enabled = true + }, + [21] = { + name = 'Bitter Spew', + obj_to_create = 'acid-stream-spitter-big', + target = true, + amount = 1, + range = 0, + force = 'player', + level = 70, + type = 'special', + mana_cost = 90, + tick = 520, + enabled = true + }, + [22] = { + name = 'Fire my lazors!!', + obj_to_create = 'railgun-beam', + target = false, + amount = 3, + damage = true, + range = 240, + force = 'player', + level = 50, + type = 'special', + mana_cost = 66, + tick = 320, enabled = true } } @@ -356,7 +546,13 @@ local function get_heal_modifier(player) end local function get_mana_modifier(player) - return (rpg_t[player.index].magicka - 10) * 0.00505 + if rpg_t[player.index].level <= 40 then + return (rpg_t[player.index].magicka - 10) * 0.02000 + elseif rpg_t[player.index].level <= 80 then + return (rpg_t[player.index].magicka - 10) * 0.01800 + else + return (rpg_t[player.index].magicka - 10) * 0.01400 + end end local function get_life_on_hit(player) @@ -413,7 +609,7 @@ local function update_player_stats(player) player_modifiers[player.index].character_loot_pickup_distance_bonus['rpg'] = math.round(v * 0.22, 3) player_modifiers[player.index].character_item_pickup_distance_bonus['rpg'] = math.round(v * 0.25, 3) player_modifiers[player.index].character_resource_reach_distance_bonus['rpg'] = math.round(v * 0.15, 3) - rpg_t[player.index].mana_max = math.round(rpg_t[player.index].mana_max + math.round(v * 1, 3)) + rpg_t[player.index].mana_max = math.round(rpg_t[player.index].mana_max + math.round(v * 0.9, 3)) local dexterity = rpg_t[player.index].dexterity - 10 player_modifiers[player.index].character_running_speed_modifier['rpg'] = math.round(dexterity * 0.0015, 3) @@ -554,7 +750,7 @@ local function extra_settings(player) local setting_grid = scroll_pane.add({type = 'table', column_count = 2}) - local health_bar_gui_input = nil + local health_bar_gui_input if rpg_extra.enable_health_and_mana_bars then local health_bar_label = setting_grid.add( @@ -575,13 +771,16 @@ local function extra_settings(player) input_style.vertical_align = 'center' health_bar_gui_input = create_input_element(health_bar_input, 'boolean', rpg_t[player.index].show_bars) health_bar_gui_input.tooltip = 'Checked = true\nUnchecked = false' + if not rpg_extra.enable_mana then + health_bar_label.caption = 'Show health bar?' + end end local reset_label = setting_grid.add( { type = 'label', - caption = 'Reset your skillpoints.', + caption = 'Reset your skillpoints?', tooltip = '' } ) @@ -615,7 +814,7 @@ local function extra_settings(player) setting_grid.add( { type = 'label', - caption = 'Enable item reach distance bonus.', + caption = 'Enable item reach distance bonus?', tooltip = 'Don´t feeling like picking up others people loot?\nYou can toggle it here.' } ) @@ -645,7 +844,7 @@ local function extra_settings(player) setting_grid.add( { type = 'label', - caption = 'Enable movement speed bonus.', + caption = 'Enable movement speed bonus?', tooltip = 'Don´t feeling like running like the flash?\nYou can toggle it here.' } ) @@ -671,16 +870,16 @@ local function extra_settings(player) local movement_speed_gui_input = create_input_element(movement_speed_input, 'boolean', speed_mod) movement_speed_gui_input.tooltip = 'Checked = true\nUnchecked = false' - local enable_entity_gui_input = nil - local conjure_gui_input = nil - local flame_boots_gui_input = nil + local enable_entity_gui_input + local conjure_gui_input + local flame_boots_gui_input if rpg_extra.enable_flame_boots then local flame_boots_label = setting_grid.add( { type = 'label', - caption = 'Enable flame boots.', + caption = 'Enable flame boots?', tooltip = 'When the bullets simply don´t bite.' } ) @@ -716,8 +915,8 @@ local function extra_settings(player) setting_grid.add( { type = 'label', - caption = 'Enable spawning entities with raw-fish.', - tooltip = 'When simply constructing items is not enough.' + caption = 'Enable spawning with raw-fish?', + tooltip = 'When simply constructing items is not enough.\nNOTE! Use Raw-fish to cast spells.' } ) @@ -769,11 +968,19 @@ local function extra_settings(player) if entity.type == 'item' then conjure_label.tooltip = conjure_label.tooltip .. - '[item=' .. entity.obj_to_create .. '] requires ' .. entity.mana_cost .. ' mana to cast.\n' + '[item=' .. + entity.obj_to_create .. + '] requires ' .. entity.mana_cost .. ' mana to cast. Level: ' .. entity.level .. '\n' elseif entity.type == 'entity' then conjure_label.tooltip = conjure_label.tooltip .. - '[entity=' .. entity.obj_to_create .. '] requires ' .. entity.mana_cost .. ' mana to cast.\n' + '[entity=' .. + entity.obj_to_create .. + '] requires ' .. entity.mana_cost .. ' mana to cast. Level: ' .. entity.level .. '\n' + elseif entity.type == 'special' then + conjure_label.tooltip = + conjure_label.tooltip .. + entity.name .. ' requires ' .. entity.mana_cost .. ' mana to cast. Level: ' .. entity.level .. '\n' end end end @@ -784,7 +991,7 @@ local function extra_settings(player) movement_speed_gui_input = movement_speed_gui_input } - if rpg_extra.health_bar_gui_input then + if rpg_extra.enable_health_and_mana_bars then data.health_bar_gui_input = health_bar_gui_input end @@ -1057,7 +1264,7 @@ local function draw_gui(player, forced) add_gui_description(tt, 'MANA\nBONUS', w1) local magic = rpg_t[player.index].magicka - 10 local v = magic * 0.22 - value = '+ ' .. math.round(math.round(v * 1, 3)) + value = '+ ' .. (math.floor(get_mana_modifier(player) * 10) / 10) e = add_gui_stat(tt, value, w2) e.tooltip = 'Mana regen bonus: ' .. (math.floor(get_mana_modifier(player) * 10) / 10) end @@ -1370,10 +1577,10 @@ local function on_entity_died(event) local amount = rpg_xp_yield[event.entity.name] amount = amount / 5 if global.biter_health_boost then - local health_pool = global.biter_health_boost_units[event.entity.unit_number] - if health_pool then - amount = amount * (1 / health_pool[2]) - end + local health_pool = global.biter_health_boost_units[event.entity.unit_number] + if health_pool then + amount = amount * (1 / health_pool[2]) + end end if rpg_extra.turret_kills_to_global_pool then @@ -1457,7 +1664,7 @@ local function regen_health_player(players) end end if player.gui.left[main_frame_name] then - draw_gui(player, true) + draw_gui(player) end ::continue:: @@ -1471,7 +1678,9 @@ local function regen_health_player(players) player.character.prototype.max_health + player.character_health_bonus + player.force.character_health_bonus ) - if not rendering.is_valid(rpg_t[player.index].health_bar) then + if not rpg_t[player.index].health_bar then + rpg_t[player.index].health_bar = create_healthbar(player, 0.5) + elseif not rendering.is_valid(rpg_t[player.index].health_bar) then rpg_t[player.index].health_bar = create_healthbar(player, 0.5) end set_bar(player.character.health, max_life, rpg_t[player.index].health_bar) @@ -1486,33 +1695,42 @@ local function regen_mana_player(players) for i = 1, #players do local player = players[i] local mana_per_tick = get_mana_modifier(player) - if mana_per_tick <= 0 then - mana_per_tick = (math.floor(0.5 * 10) / 10) + if mana_per_tick <= 0.1 then + mana_per_tick = rpg_extra.mana_per_tick end - mana_per_tick = (math.floor(mana_per_tick * 10) / 10) + + if rpg_extra.force_mana_per_tick then + mana_per_tick = 1 + end + if player and player.valid then if player.character and player.character.valid then if rpg_t[player.index].mana >= rpg_t[player.index].mana_max then - return + goto continue end rpg_t[player.index].mana = rpg_t[player.index].mana + mana_per_tick - rpg_t[player.index].mana = (math.floor(rpg_t[player.index].mana * 10) / 10) + if rpg_t[player.index].mana >= rpg_t[player.index].mana_max then rpg_t[player.index].mana = rpg_t[player.index].mana_max end + rpg_t[player.index].mana = (math.round(rpg_t[player.index].mana * 10) / 10) end end + ::continue:: + if rpg_extra.enable_health_and_mana_bars then if rpg_t[player.index].show_bars then - if not rendering.is_valid(rpg_t[player.index].mana_bar) then + if not rpg_t[player.index].mana_bar then + rpg_t[player.index].mana_bar = create_manabar(player, 0.5) + elseif not rendering.is_valid(rpg_t[player.index].mana_bar) then rpg_t[player.index].mana_bar = create_manabar(player, 0.5) end set_bar(rpg_t[player.index].mana, rpg_t[player.index].mana_max, rpg_t[player.index].mana_bar, true) end end if player.gui.left[main_frame_name] then - draw_gui(player, true) + draw_gui(player) end end end @@ -1553,7 +1771,7 @@ local function give_player_flameboots(event) rpg_t[player.index].mana = 0 end if player.gui.left[main_frame_name] then - draw_gui(player, true) + draw_gui(player) end end @@ -1883,12 +2101,6 @@ local function on_player_joined_game(event) Public.gain_xp(player, rpg_extra.reward_new_players) end end - if rpg_extra.enable_health_and_mana_bars then - rpg_t[player.index].health_bar = create_healthbar(player, 0.5) - if rpg_extra.enable_mana then - rpg_t[player.index].mana_bar = create_manabar(player, 0.5) - end - end for _, p in pairs(game.connected_players) do draw_level_text(p) end @@ -1923,17 +2135,30 @@ local function splash_damage(surface, position, final_damage_amount) end local function create_projectile(surface, name, position, force, target, max_range) - surface.create_entity( - { - name = name, - position = position, - force = force, - source = position, - target = target, - max_range = max_range, - speed = 0.4 - } - ) + if max_range then + surface.create_entity( + { + name = name, + position = position, + force = force, + source = position, + target = target, + max_range = max_range, + speed = 0.4 + } + ) + else + surface.create_entity( + { + name = name, + position = position, + force = force, + source = position, + target = target, + speed = 0.4 + } + ) + end end local function get_near_coord_modifier(range) @@ -1947,31 +2172,61 @@ local function get_near_coord_modifier(range) return coord end -local function get_near_range(range) - local r = math.random(1, math.floor(range * 2)) - for i = 1, 2, 1 do - local r2 = math.random(1, math.floor(range * 2)) - if r2 < r then - r = r2 - end +local function damage_entity(e) + if not e.health then + return + end + + if e.force.name == 'player' then + return + end + + e.surface.create_entity({name = 'water-splash', position = e.position}) + + if e.type == 'entity-ghost' then + e.destroy() + return + end + + e.health = e.health - math.random(30, 90) + if e.health <= 0 then + e.die('enemy') end - return r end -local function is_position_near(area, p) - local status = false - local function inside(pos) - local lt = area.left_top - local rb = area.right_bottom - - return pos.x >= lt.x and pos.y >= lt.y and pos.x <= rb.x and pos.y <= rb.y +local function floaty_hearts(entity, c) + local position = {x = entity.position.x - 0.75, y = entity.position.y - 1} + local b = 1.35 + for a = 1, c, 1 do + local p = { + (position.x + 0.4) + (b * -1 + math.random(0, b * 20) * 0.1), + position.y + (b * -1 + math.random(0, b * 20) * 0.1) + } + entity.surface.create_entity( + {name = 'flying-text', position = p, text = '♥', color = {math.random(150, 255), 0, 255}} + ) end +end - if inside(p, area) then - status = true - end +local function tame_unit_effects(player, entity) + floaty_hearts(entity, 7) - return status + rendering.draw_text { + text = '~' .. player.name .. "'s pet~", + surface = player.surface, + target = entity, + target_offset = {0, -2.6}, + color = { + r = player.color.r * 0.6 + 0.25, + g = player.color.g * 0.6 + 0.25, + b = player.color.b * 0.6 + 0.25, + a = 1 + }, + scale = 1.05, + font = 'default-large-semibold', + alignment = 'center', + scale_with_zoom = false + } end local function on_player_used_capsule(event) @@ -2022,6 +2277,10 @@ local function on_player_used_capsule(event) return end + if rpg_t[player.index].level <= object.level then + return p('You lack the level to cast this spell.', Color.fail) + end + local object_name = object.name local obj_name = object.obj_to_create @@ -2030,7 +2289,7 @@ local function on_player_used_capsule(event) return end - local radius = 10 + local radius = 15 local area = { left_top = {x = position.x - radius, y = position.y - radius}, right_bottom = {x = position.x + radius, y = position.y + radius} @@ -2047,17 +2306,54 @@ local function on_player_used_capsule(event) rpg_t[player.index].mana = rpg_t[player.index].mana - object.mana_cost end - if projectile_types[obj_name] then + local target_pos + if object.target then + target_pos = {position.x, position.y} + elseif projectile_types[obj_name] then local coord_modifier = get_near_coord_modifier(projectile_types[obj_name].max_range) local proj_pos = {position.x + coord_modifier.x, position.y + coord_modifier.y} - create_projectile(surface, obj_name, position, 'player', proj_pos, 0) + target_pos = proj_pos + end + + local range + if object.range then + range = object.range else - surface.create_entity({name = obj_name, position = position, force = 'player'}) + range = 0 + end + + local force + if object.force then + force = object.force + else + force = 'player' + end + + if projectile_types[obj_name] then + for i = 1, object.amount do + local damage_area = { + left_top = {x = position.x - 2, y = position.y - 2}, + right_bottom = {x = position.x + 2, y = position.y + 2} + } + create_projectile(surface, obj_name, position, force, target_pos, range) + if object.damage then + for _, e in pairs(surface.find_entities_filtered({area = damage_area})) do + damage_entity(e) + end + end + end + else + if object.biter then + local e = surface.create_entity({name = obj_name, position = position, force = force}) + tame_unit_effects(player, e) + else + surface.create_entity({name = obj_name, position = position, force = force}) + end end rpg_t[player.index].last_spawned = game.tick + object.tick if player.gui.left[main_frame_name] then - draw_gui(player, true) + draw_gui(player) end if rpg_extra.enable_health_and_mana_bars then if rpg_t[player.index].show_bars then @@ -2140,7 +2436,7 @@ function Public.rpg_reset_player(player, one_time_reset) rotated_entity_delay = 0, gui_refresh_delay = 0, last_mined_entity_position = {x = 0, y = 0}, - show_bars = true + show_bars = false } rpg_t[player.index].points_to_distribute = old_points_to_distribute + total rpg_t[player.index].xp = old_xp @@ -2169,7 +2465,7 @@ function Public.rpg_reset_player(player, one_time_reset) rotated_entity_delay = 0, gui_refresh_delay = 0, last_mined_entity_position = {x = 0, y = 0}, - show_bars = true + show_bars = false } end draw_gui_char_button(player) @@ -2326,7 +2622,7 @@ function Public.enable_health_and_mana_bars(value) if value then rpg_extra.enable_health_and_mana_bars = value else - return error('No value given.', 2) + rpg_extra.enable_health_and_mana_bars = false end end @@ -2336,7 +2632,7 @@ function Public.enable_mana(value) if value then rpg_extra.enable_mana = value else - return error('No value given.', 2) + rpg_extra.enable_mana = false end end @@ -2347,7 +2643,7 @@ function Public.enable_wave_defense(value) if value then rpg_extra.enable_wave_defense = value else - return error('No value given.', 2) + rpg_extra.enable_wave_defense = false end end @@ -2357,7 +2653,17 @@ function Public.enable_flame_boots(value) if value then rpg_extra.enable_flame_boots = value else - return error('No value given.', 2) + rpg_extra.enable_flame_boots = false + end +end + +--- Enables/disabled personal tax. +---@param value +function Public.personal_tax_rate(value) + if value then + rpg_extra.personal_tax_rate = value + else + rpg_extra.personal_tax_rate = nil end end @@ -2454,15 +2760,23 @@ Gui.on_click( if health_bar_gui_input and health_bar_gui_input.valid then if not health_bar_gui_input.state then rpg_t[player.index].show_bars = false - if rendering.is_valid(rpg_t[player.index].health_bar) then - rendering.destroy(rpg_t[player.index].health_bar) + if rpg_t[player.index].health_bar then + if rendering.is_valid(rpg_t[player.index].health_bar) then + rendering.destroy(rpg_t[player.index].health_bar) + end end - if rendering.is_valid(rpg_t[player.index].mana_bar) then - rendering.destroy(rpg_t[player.index].mana_bar) + if rpg_extra.enable_mana then + if rpg_t[player.index].mana_bar then + if rendering.is_valid(rpg_t[player.index].mana_bar) then + rendering.destroy(rpg_t[player.index].mana_bar) + end + end end elseif health_bar_gui_input.state then rpg_t[player.index].show_bars = true - if not rendering.is_valid(rpg_t[player.index].health_bar) then + if not rpg_t[player.index].health_bar then + rpg_t[player.index].health_bar = create_healthbar(player, 0.5) + elseif not rendering.is_valid(rpg_t[player.index].health_bar) then rpg_t[player.index].health_bar = create_healthbar(player, 0.5) end local max_life = @@ -2471,14 +2785,25 @@ Gui.on_click( player.force.character_health_bonus ) set_bar(player.character.health, max_life, rpg_t[player.index].health_bar) - if not rendering.is_valid(rpg_t[player.index].mana_bar) then - rpg_t[player.index].mana_bar = create_manabar(player, 0.5) + if rpg_extra.enable_mana then + if not rpg_t[player.index].mana_bar then + rpg_t[player.index].mana_bar = create_manabar(player, 0.5) + elseif not rendering.is_valid(rpg_t[player.index].mana_bar) then + rpg_t[player.index].mana_bar = create_manabar(player, 0.5) + end + set_bar( + rpg_t[player.index].mana, + rpg_t[player.index].mana_max, + rpg_t[player.index].mana_bar, + true + ) end - set_bar(rpg_t[player.index].mana, rpg_t[player.index].mana_max, rpg_t[player.index].mana_bar, true) end end - draw_gui(player, true) + if player.gui.left[main_frame_name] then + draw_gui(player, false) + end frame.destroy() end end diff --git a/modules/wave_defense/main.lua b/modules/wave_defense/main.lua index ce410006..5e067ae8 100644 --- a/modules/wave_defense/main.lua +++ b/modules/wave_defense/main.lua @@ -88,7 +88,7 @@ end local function get_random_close_spawner(surface) local wave_defense_table = WD.get_table() - local spawners = surface.find_entities_filtered({type = "unit-spawner"}) + local spawners = surface.find_entities_filtered({type = "unit-spawner", force = 'enemy'}) if not spawners[1] then return false end local center = wave_defense_table.target.position local spawner = spawners[math_random(1,#spawners)] From 0f4cf43078d5cdcba17d5a120ed6f0e6909fce54 Mon Sep 17 00:00:00 2001 From: MewMew Date: Thu, 23 Jul 2020 09:00:36 +0200 Subject: [PATCH 11/11] more config options --- maps/expanse/functions.lua | 27 ++++++++++++++---- maps/expanse/main.lua | 56 ++++++++++++++++++++++---------------- 2 files changed, 54 insertions(+), 29 deletions(-) diff --git a/maps/expanse/functions.lua b/maps/expanse/functions.lua index 04c3870a..9f27e6aa 100644 --- a/maps/expanse/functions.lua +++ b/maps/expanse/functions.lua @@ -16,6 +16,23 @@ local price_modifiers = { ["water-shallow"] = -6, } +local function reward_tokens(expanse, entity) + local chance = expanse.token_chance % 1 + local count = math.floor(expanse.token_chance) + + if chance > 0 then + chance = math.floor(chance * 1000) + if math.random(1, 1000) <= chance then + entity.surface.spill_item_stack(entity.position, {name = "small-plane", count = 1}, true, nil, false) + end + end + if count > 0 then + for _ = 1, count, 1 do + entity.surface.spill_item_stack(entity.position, {name = "small-plane", count = 1}, true, nil, false) + end + end +end + local function get_cell_value(expanse, left_top) local square_size = expanse.square_size local value = square_size ^ 2 @@ -38,13 +55,13 @@ local function get_cell_value(expanse, left_top) end local distance = math.sqrt(left_top.x ^ 2 + left_top.y ^ 2) - local value = value * (distance * 0.005) + local value = value * (distance * expanse.price_distance_modifier) local ore_modifier = distance * 0.00025 - if ore_modifier > 0.33 then ore_modifier = 0.33 end + if ore_modifier > expanse.max_ore_price_modifier then ore_modifier = expanse.max_ore_price_modifier end for _, entity in pairs(entities) do if entity.type == "resource" then - if entity.name == "crude-oil" then + if entity.prototype.resource_category == "basic-fluid" then value = value + (entity.amount * ore_modifier * 0.01) else value = value + (entity.amount * ore_modifier) @@ -212,9 +229,7 @@ function Public.set_container(expanse, entity) entity.surface.spill_item_stack(entity.position, {name = name, count = count}, true, nil, false) end end - if math.random(1, 3) == 1 then - entity.surface.spill_item_stack(entity.position, {name = "small-plane", count = 1}, true, nil, false) - end + reward_tokens(expanse, entity) entity.destructible = true entity.die() return expansion_position diff --git a/maps/expanse/main.lua b/maps/expanse/main.lua index bd7dbbf8..c17795b2 100644 --- a/maps/expanse/main.lua +++ b/maps/expanse/main.lua @@ -5,8 +5,6 @@ local Functions = require 'maps.expanse.functions' local Global = require 'utils.global' local Map_info = require "modules.map_info" -local math_round = math.round - local expanse = {} Global.register( expanse, @@ -15,10 +13,28 @@ Global.register( end ) +local function set_nauvis() + local surface = game.surfaces[1] + local map_gen_settings = surface.map_gen_settings + map_gen_settings.autoplace_controls = { + ["coal"] = {frequency = 10, size = 0.7, richness = 0.5,}, + ["stone"] = {frequency = 10, size = 0.7, richness = 0.5,}, + ["copper-ore"] = {frequency = 10, size = 0.7, richness = 0.75,}, + ["iron-ore"] = {frequency = 10, size = 0.7, richness = 1,}, + ["uranium-ore"] = {frequency = 10, size = 0.5, richness = 1,}, + ["crude-oil"] = {frequency = 25, size = 1.5, richness = 1.5,}, + ["trees"] = {frequency = 1.5, size = 1, richness = 1}, + ["enemy-base"] = {frequency = 10, size = 2, richness = 1}, + } + map_gen_settings.starting_area = 0.25 + surface.map_gen_settings = map_gen_settings + for chunk in surface.get_chunks() do + surface.delete_chunk({chunk.x, chunk.y}) + end +end + local function reset() expanse.containers = {} - if not expanse.source_surface then expanse.source_surface = "nauvis" end - expanse.square_size = 15 local map_gen_settings = { ["water"] = 0, @@ -43,25 +59,7 @@ local function reset() } game.create_surface("expanse", map_gen_settings) - if expanse.source_surface == "nauvis" then - local surface = game.surfaces[1] - local map_gen_settings = surface.map_gen_settings - map_gen_settings.autoplace_controls = { - ["coal"] = {frequency = 10, size = 0.7, richness = 0.5,}, - ["stone"] = {frequency = 10, size = 0.7, richness = 0.5,}, - ["copper-ore"] = {frequency = 10, size = 0.7, richness = 0.75,}, - ["iron-ore"] = {frequency = 10, size = 0.7, richness = 1,}, - ["uranium-ore"] = {frequency = 10, size = 0.5, richness = 1,}, - ["crude-oil"] = {frequency = 25, size = 1.5, richness = 1.5,}, - ["trees"] = {frequency = 1.5, size = 1, richness = 1}, - ["enemy-base"] = {frequency = 10, size = 2, richness = 1}, - } - map_gen_settings.starting_area = 0.25 - surface.map_gen_settings = map_gen_settings - for chunk in surface.get_chunks() do - surface.delete_chunk({chunk.x, chunk.y}) - end - end + --set_nauvis() local source_surface = game.surfaces[expanse.source_surface] source_surface.request_to_generate_chunks({x = 0, y = 0}, 4) @@ -184,6 +182,18 @@ local function on_init(event) T.localised_category = "expanse" T.main_caption_color = {r = 170, g = 170, b = 0} T.sub_caption_color = {r = 120, g = 120, b = 0} + + if not expanse.source_surface then expanse.source_surface = "nauvis" end + if not expanse.token_chance then expanse.token_chance = 0.33 end + if not expanse.price_distance_modifier then expanse.price_distance_modifier = 0.004 end + if not expanse.max_ore_price_modifier then expanse.max_ore_price_modifier = 0.33 end + if not expanse.square_size then expanse.square_size = 16 end + + --[[ + expanse.token_chance = 2.5 + expanse.price_distance_modifier = 0.001 + expanse.max_ore_price_modifier = 0.01 + ]] reset() end