diff --git a/control.lua b/control.lua index 0c718d84..695c8fbc 100644 --- a/control.lua +++ b/control.lua @@ -143,8 +143,8 @@ require 'modules.autostash' --require 'maps.railway_troopers.main' --![[You fell in a dark cave, will you survive?]]-- +--require 'maps.cave_choppy.main' --require 'maps.cave_miner' ---require 'maps.cave_choppy.cave_miner' --require 'maps.cave_miner_v2.main' --![[Hungry boxes eat your items, but reward you with new territory to build.]]-- diff --git a/maps/cave_choppy/choppy.lua b/maps/cave_choppy/forest_world.lua similarity index 99% rename from maps/cave_choppy/choppy.lua rename to maps/cave_choppy/forest_world.lua index 4eb5e096..c4506719 100644 --- a/maps/cave_choppy/choppy.lua +++ b/maps/cave_choppy/forest_world.lua @@ -1,18 +1,16 @@ --luacheck: ignore ---choppy-- mewmew made this -- --- modified by gerkiz +-- By gerkiz require 'modules.dynamic_landfill' require 'modules.satellite_score' require 'modules.spawners_contain_biters' require 'functions.create_entity_chain' require 'functions.create_tile_chain' ---require "maps.choppy_map_intro" local unearthing_worm = require 'functions.unearthing_worm' local unearthing_biters = require 'functions.unearthing_biters' local tick_tack_trap = require 'functions.tick_tack_trap' -local Module = require 'modules.infinity_chest' +local Module = require 'infinity_chest' local Simplex = require 'utils.simplex_noise'.d2 local Event = require 'utils.event' local table_insert = table.insert diff --git a/maps/cave_choppy/infinity_chest.lua b/maps/cave_choppy/infinity_chest.lua new file mode 100644 index 00000000..7899bc52 --- /dev/null +++ b/maps/cave_choppy/infinity_chest.lua @@ -0,0 +1,265 @@ +local Public = {} + +local Event = require 'utils.event' +local Token = require 'utils.token' +local Gui = require 'utils.gui' +local Task = require 'utils.task' +local Global = require 'utils.global' + +local format = string.format + +local chests = {} +local chests_next = {} + +Global.register( + {chests = chests, chests_next = chests_next}, + function(tbl) + chests = tbl.chests + chests_next = tbl.chests_next + end +) + +local chest_gui_frame_name = Gui.uid_name() +local chest_content_table_name = Gui.uid_name() + +function Public.create_chest(surface, position, storage) + local entity = surface.create_entity {name = 'infinity-chest', position = position, force = 'neutral'} + chests[entity.unit_number] = {entity = entity, storage = storage} + return entity +end + +local function built_entity(event) + local entity = event.created_entity + if not entity or not entity.valid or entity.name ~= 'infinity-chest' then + return + end + + entity.active = false + + chests[entity.unit_number] = {entity = entity, storage = {}} +end + +local function get_stack_size(name) + local proto = game.item_prototypes[name] + if not proto then + log('item prototype ' .. name .. ' not found') + return 1 + end + + return proto.stack_size +end + +local function do_item(name, count, inv, storage) + local size = get_stack_size(name) + local diff = count - size + + if diff == 0 then + return + end + + local new_amount = 0 + + if diff > 0 then + inv.remove({name = name, count = diff}) + local prev = storage[name] or 0 + new_amount = prev + diff + elseif diff < 0 then + local prev = storage[name] + if not prev then + return + end + + diff = math.min(prev, -diff) + local inserted = inv.insert({name = name, count = diff}) + new_amount = prev - inserted + end + + if new_amount == 0 then + storage[name] = nil + else + storage[name] = new_amount + end +end + +local function tick() + local chest_id, chest_data = next(chests, chests_next[1]) + + chests_next[1] = chest_id + + if not chest_id then + return + end + + local entity = chest_data.entity + if not entity or not entity.valid then + chests[chest_id] = nil + else + local storage = chest_data.storage + local inv = entity.get_inventory(1) --defines.inventory.chest + local contents = inv.get_contents() + + for name, count in pairs(contents) do + do_item(name, count, inv, storage) + end + + for name, _ in pairs(storage) do + if not contents[name] then + do_item(name, 0, inv, storage) + end + end + end +end + +local function create_chest_gui_content(frame, player, chest) + local storage = chest.storage + local inv = chest.entity.get_inventory(1).get_contents() + + local grid = frame[chest_content_table_name] + + if grid then + grid.clear() + else + grid = frame.add {type = 'table', name = chest_content_table_name, column_count = 10, style = 'slot_table'} + end + + for name, count in pairs(storage) do + local number = count + (inv[name] or 0) + grid.add { + type = 'sprite-button', + sprite = 'item/' .. name, + number = number, + tooltip = name, + --style = 'slot_button' + enabled = false + } + end + + for name, count in pairs(inv) do + if not storage[name] then + grid.add { + type = 'sprite-button', + sprite = 'item/' .. name, + number = count, + tooltip = name, + --style = 'slot_button' + enabled = false + } + end + end + + player.opened = frame +end + +local chest_gui_content_callback +chest_gui_content_callback = + Token.register( + function(data) + local player = data.player + + if not player or not player.valid then + return + end + + local opened = data.opened + if not opened or not opened.valid then + return + end + + local entity = data.chest.entity + if not entity.valid then + player.opened = nil + opened.destroy() + return + end + + if not player.connected then + player.opened = nil + opened.destroy() + return + end + + create_chest_gui_content(opened, player, data.chest) + + Task.set_timeout_in_ticks(60, chest_gui_content_callback, data) + end +) + +local function gui_opened(event) + if not event.gui_type == defines.gui_type.entity then + return + end + + local entity = event.entity + if not entity or not entity.valid or entity.name ~= 'infinity-chest' then + return + end + + local chest = chests[entity.unit_number] + + if not chest then + return + end + + local player = game.get_player(event.player_index) + if not player or not player.valid then + return + end + + local frame = + player.gui.center.add { + type = 'frame', + name = chest_gui_frame_name, + caption = 'Infinite Storage Chest', + direction = 'vertical' + } + + local text = + frame.add { + type = 'label', + caption = format( + 'This chest stores unlimited quantity of items (up to 48 different item types).\nThe chest is best used with an inserter to add / remove items.\nIf the chest is mined or destroyed the items are lost.' + ) + } + text.style.single_line = false + + local content_header = frame.add {type = 'label', caption = 'Content'} + content_header.style.font = 'default-listbox' + + create_chest_gui_content(frame, player, chest) + + Task.set_timeout_in_ticks(60, chest_gui_content_callback, {player = player, chest = chest, opened = frame}) +end + +Event.add(defines.events.on_built_entity, built_entity) +Event.add(defines.events.on_robot_built_entity, built_entity) +Event.add(defines.events.on_tick, tick) +Event.add(defines.events.on_gui_opened, gui_opened) + +Event.add( + defines.events.on_player_died, + function(event) + local player = game.get_player(event.player_index or 0) + + if not player or not player.valid then + return + end + + local element = player.gui.center + + if element and element.valid then + element = element[chest_gui_frame_name] + if element and element.valid then + element.destroy() + end + end + end +) + +Gui.on_custom_close( + chest_gui_frame_name, + function(event) + event.element.destroy() + end +) + +return Public diff --git a/maps/cave_choppy/cave_miner.lua b/maps/cave_choppy/main.lua similarity index 99% rename from maps/cave_choppy/cave_miner.lua rename to maps/cave_choppy/main.lua index 4b4a64c7..26907963 100644 --- a/maps/cave_choppy/cave_miner.lua +++ b/maps/cave_choppy/main.lua @@ -1,22 +1,15 @@ --luacheck: ignore --- Cave Miner -- mewmew made this -- --- modified by Gerkiz -- +-- By Gerkiz -require 'choppy' +require 'forest_world' require 'player_elevator' require 'modules.rocks_broken_paint_tiles' require 'cave_miner_kaboomsticks' ---require "modules.satellite_score" ---require "modules.explosive_biters" ---require "modules.spawners_contain_biters" ---require "modules.teleporting_worms" ---require "modules.splice_double" ---require "modules.biters_double_damage" local enable_fishbank_terminal = true local simplex_noise = require 'utils.simplex_noise'.d2 local Event = require 'utils.event' -local Module = require 'modules.infinity_chest' +local Module = require 'infinity_chest' local market_items = require 'cave_miner_market_items' local Map = require 'modules.map_info' @@ -1914,6 +1907,14 @@ local function on_market_item_purchased(event) end end +local function disable_tech() + game.forces.player.technologies['spidertron'].enabled = false + game.forces.player.technologies['spidertron'].researched = false + game.forces.player.technologies['optics'].researched = true + game.forces.player.technologies['artillery'].researched = false + game.forces.player.technologies['atomic-bomb'].enabled = false +end + local function on_init() local T = Map.Pop_info() T.main_caption = 'Cave Choppy' @@ -1951,6 +1952,8 @@ local function on_init() ]]) T.main_caption_color = {r = 150, g = 150, b = 0} T.sub_caption_color = {r = 0, g = 150, b = 0} + + disable_tech() end Event.on_init(on_init) diff --git a/maps/mountain_fortress_v3/icw/functions.lua b/maps/mountain_fortress_v3/icw/functions.lua index 6f194a2a..34233730 100644 --- a/maps/mountain_fortress_v3/icw/functions.lua +++ b/maps/mountain_fortress_v3/icw/functions.lua @@ -13,11 +13,13 @@ local fallout_width = 64 local fallout_debris = {} for x = fallout_width * -1 - 32, fallout_width + 32, 1 do - for y = fallout_width * -1 - 32, fallout_width + 32, 1 do - local position = {x = x, y = y} - local fallout = sqrt(position.x ^ 2 + position.y ^ 2) - if fallout > fallout_width then - fallout_debris[#fallout_debris + 1] = {position.x, position.y} + if x < -31 or x > 31 then + for y = fallout_width * -1 - 32, fallout_width + 32, 1 do + local position = {x = x, y = y} + local fallout = sqrt(position.x ^ 2 + position.y ^ 2) + if fallout > fallout_width then + fallout_debris[#fallout_debris + 1] = {position.x, position.y} + end end end end @@ -32,7 +34,7 @@ local reconstruct_all_trains = ) local function get_tile_name() - local main_tile_name = 'tutorial-grid' + local main_tile_name = 'black-refined-concrete' local modded = is_game_modded() if modded then if game.active_mods['Krastorio2'] then @@ -200,6 +202,50 @@ local function input_filtered(wagon_inventory, chest, chest_inventory, free_slot end end +local remove_lights_token = + Token.register( + function(data) + local id = data.id + if id then + rendering.destroy(id) + end + end +) + +function Public.glimpse_of_lights(icw) + local surface = WPT.get('loco_surface') + if not surface or not surface.valid then + return + end + + local hazardous_debris = icw.hazardous_debris + if not hazardous_debris then + return + end + + local text = rendering.draw_text + local position = fallout_debris[random(1, size_of_debris)] + + local p = {x = position[1], y = position[2]} + local get_tile = surface.get_tile(p) + if get_tile.valid and get_tile.name == 'out-of-map' then + local id = + text { + text = '★', + surface = surface, + target = position, + color = {r = 1, g = 1, b = 0}, + orientation = random(0, 100) * 0.01, + scale = 0.4, + font = 'heading-1', + alignment = 'center', + scale_with_zoom = false + } + + Task.set_timeout_in_ticks(300, remove_lights_token, {id = id}) + end +end + function Public.hazardous_debris(icw) local speed = icw.speed local surface = WPT.get('loco_surface') @@ -214,15 +260,6 @@ function Public.hazardous_debris(icw) local create = surface.create_entity - for _ = 1, 16 * speed, 1 do - local position = fallout_debris[random(1, size_of_debris)] - local p = {x = position[1], y = position[2]} - local get_tile = surface.get_tile(p) - if get_tile.valid and get_tile.name == 'out-of-map' then - create({name = 'blue-laser', position = position, force = 'neutral', target = {position[1], position[2] + fallout_width * 2}, speed = speed}) - end - end - for _ = 1, 16 * speed, 1 do local position = fallout_debris[random(1, size_of_debris)] local p = {x = position[1], y = position[2]} diff --git a/maps/mountain_fortress_v3/icw/main.lua b/maps/mountain_fortress_v3/icw/main.lua index 211cd12d..0e93b157 100644 --- a/maps/mountain_fortress_v3/icw/main.lua +++ b/maps/mountain_fortress_v3/icw/main.lua @@ -97,6 +97,7 @@ local function on_tick() if tick % 10 == 0 then Functions.item_transfer(icw) Functions.hazardous_debris(icw) + Functions.glimpse_of_lights(icw) end if tick % 240 == 0 then Functions.update_minimap(icw) diff --git a/maps/mountain_fortress_v3/locomotive.lua b/maps/mountain_fortress_v3/locomotive.lua index 67721bbc..981502df 100644 --- a/maps/mountain_fortress_v3/locomotive.lua +++ b/maps/mountain_fortress_v3/locomotive.lua @@ -1084,7 +1084,7 @@ local function gui_click(event) player.name .. ' has bought the locomotive health modifier for ' .. format_number(item.price, true) .. ' coins.' } ) - this.locomotive_max_health = this.locomotive_max_health + 4000 * item.stack + this.locomotive_max_health = this.locomotive_max_health + (this.locomotive_max_health * 0.5 * item.stack) local m = this.locomotive_health / this.locomotive_max_health if this.carriages then diff --git a/maps/mountain_fortress_v3/loot.lua b/maps/mountain_fortress_v3/loot.lua index 23e6d8ac..dc415b0a 100644 --- a/maps/mountain_fortress_v3/loot.lua +++ b/maps/mountain_fortress_v3/loot.lua @@ -64,6 +64,10 @@ function Public.add(surface, position, chest) container.insert({name = 'coin', count = random(1, 128)}) elseif random(1, 128) == 1 then container.insert({name = 'coin', count = random(1, 256)}) + elseif random(1, 256) == 1 then + container.insert({name = 'coin', count = random(1, 512)}) + elseif random(1, 512) == 1 then + container.insert({name = 'coin', count = random(1, 1024)}) end for _ = 1, 3, 1 do diff --git a/modules/rpg/functions.lua b/modules/rpg/functions.lua index 50bbce26..9c03c7f5 100644 --- a/modules/rpg/functions.lua +++ b/modules/rpg/functions.lua @@ -734,6 +734,35 @@ function Public.global_pool(players, count) return end +local damage_player_over_time_token = + Token.register( + function(data) + local player = data.player + local damage = data.damage + if not player.character or not player.character.valid then + return + end + player.character.health = player.character.health - damage + player.character.surface.create_entity({name = 'water-splash', position = player.position}) + end +) + +--- Damages a player over time. +function Public.damage_player_over_time(player, amount, damage) + if not player or not player.valid then + return + end + + amount = amount or 5 + damage = damage or 10 + local tick = 20 + for _ = 1, amount, 1 do + Task.set_timeout_in_ticks(tick, damage_player_over_time_token, {player = player, damage = damage}) + tick = tick + 15 + damage = damage + 10 + end +end + --- Distributes the global xp pool to every connected player. function Public.distribute_pool() local count = #game.connected_players diff --git a/modules/rpg/main.lua b/modules/rpg/main.lua index 6d6ad47e..a56528cd 100644 --- a/modules/rpg/main.lua +++ b/modules/rpg/main.lua @@ -1098,8 +1098,8 @@ local function on_player_used_capsule(event) elseif object.obj_to_create == 'warp-gate' then player.teleport(surface.find_non_colliding_position('character', game.forces.player.get_spawn_position(surface), 3, 0, 5), surface) rpg_t[player.index].mana = 0 - player.character.health = 10 - player.character.surface.create_entity({name = 'water-splash', position = player.position}) + Functions.damage_player_over_time(player, 10) + player.play_sound {path = 'utility/armor_insert', volume_modifier = 1} p(({'rpg_main.warped_ok'}), Color.info) rpg_t[player.index].mana = rpg_t[player.index].mana - object.mana_cost elseif projectile_types[obj_name] then -- projectiles