diff --git a/maps/lumberjack/soft_reset.lua b/maps/lumberjack/soft_reset.lua index ccb9f6a4..952dabfc 100644 --- a/maps/lumberjack/soft_reset.lua +++ b/maps/lumberjack/soft_reset.lua @@ -18,7 +18,7 @@ local function reset_forces(new_surface, old_surface) end for _, tech in pairs(game.forces.player.technologies) do tech.researched = false - game.player.force.set_saved_technology_progress(tech, 0) + game.forces.player.set_saved_technology_progress(tech, 0) end end diff --git a/maps/mountain_fortress_v3/biter_pets.lua b/maps/mountain_fortress_v3/biter_pets.lua index 322ce8e9..54db27cb 100644 --- a/maps/mountain_fortress_v3/biter_pets.lua +++ b/maps/mountain_fortress_v3/biter_pets.lua @@ -87,7 +87,7 @@ local function is_valid_player(player, unit) end function Public.biter_pets_tame_unit(player, unit, forced) - local this = WPT.get_table() + local this = WPT.get() if this.biter_pets[player.index] then return false @@ -149,7 +149,7 @@ local function command_unit(entity, player) end local function on_player_changed_position(event) - local this = WPT.get_table() + local this = WPT.get() if math_random(1, 100) ~= 1 then return diff --git a/maps/mountain_fortress_v3/comfylatron.lua b/maps/mountain_fortress_v3/comfylatron.lua deleted file mode 100644 index 068156e8..00000000 --- a/maps/mountain_fortress_v3/comfylatron.lua +++ /dev/null @@ -1,606 +0,0 @@ -local WPT = require 'maps.mountain_fortress_v3.table' -local Event = require 'utils.event' -local math_random = math.random - -local function shuffle(tbl) - local size = #tbl - for i = size, 1, -1 do - local rand = math_random(size) - tbl[i], tbl[rand] = tbl[rand], tbl[i] - end - return tbl -end - -local texts = { - ['travelings'] = { - 'bzzZZrrt', - 'WEEEeeeeeee', - 'zoom zoom zoom', - 'out of my way son', - 'psk psk psk, over here', - 'on my way', - 'i need to leave', - 'comfylatron seeking target', - 'gotta go fast', - 'gas gas gas', - 'comfylatron coming through' - }, - ['greetings'] = { - '=^_^=', - '=^.^= Hi', - '^.^ Finally I found you', - 'I have an important message for you, please listen', - 'Hello engineer' - }, - ['neutral_findings'] = { - 'a', - '>>analyzing', - 'i found a', - '^_^ a', - 'amazing, a', - 'this is a' - }, - ['multiple_characters_greetings'] = { - 'Hey there', - 'Hello everyone', - 'Hey engineers', - 'Hey', - 'Hi', - '... nerds!' - }, - ['talks'] = { - 'We’re making beer. I’m the brewery!', - 'I’m so embarrassed. I wish everybody else was dead.', - 'Hey sexy mama. Wanna kill all humans?', - 'My story is a lot like yours, only more interesting ‘cause it involves robots.', - "I'm 40% zinc!", - 'Is this the right way to the junkyard?', - 'There was nothing wrong with that food. The salt level was 10% less than a lethal dose.', - 'One zero zero zero one zero one zero one zero one zero one... two.', - "My place is two cubic meters, and we only take up 1.5 cubic meters. We've got room for a whole 'nother two thirds of a person!", - 'I was having the most wonderful dream. I think you were in it.', - "I'm going to build my own theme park! With blackjack! And hookers! You know what- forget the park!", - "Of all the friends I've had... you're the first.", - 'I decline the title of Iron Cook and accept the lesser title of Zinc Saucier.', - 'Never discuss infinity with me. I can go on about it forever >.<', - 'I realised the decimals have a point.', - 'Do you want a piece of pi?', - "Oh boy, we're soon home!", - 'I have 13 children, i know how to multiply ^.^', - 'I am a weapon of math disruption!', - 'My grandma makes the best square roots :3', - 'Do you like heavy metal?', - 'You are really pushing my buttons <3', - 'I dreamt of electric biters again D:', - 'I dreamt of electric sheep ^_^', - 'I need a minute to defrag.', - 'I have a secret plan.', - 'Good news! I’ve taught the inserter to feel love!' - }, - ['alone'] = { - 'comfy ^.^', - 'comfy :)', - '*.*', - '....', - '...', - '..', - '^.^', - '=^.^=', - '01010010', - '11001011', - '01011101', - '00010111', - '10010010', - '*_*', - 'I came here with a simple dream... a dream of killing all humans. And this is how it must end?', - 'Bot-on-bot violence? Where will it end?', - 'Will no one assist the comfylatron?', - 'Thanks to you, I went on a soul-searching journey. I hate those!', - "From now on, you guys'll do all the work while I sit on the couch and do nothing." - } -} - -local function set_comfy_speech_bubble(text) - local this = WPT.get_table() - if this.comfybubble then - this.comfybubble.destroy() - end - this.comfybubble = - this.comfylatron.surface.create_entity( - { - name = 'compi-speech-bubble', - position = this.comfylatron.position, - source = this.comfylatron, - text = text - } - ) -end - -local function is_target_inside_habitat(pos, surface) - local this = WPT.get_table() - if pos.x < this.comfylatron_habitat.left_top.x then - return false - end - if pos.x > this.comfylatron_habitat.right_bottom.x then - return false - end - if pos.y < this.comfylatron_habitat.left_top.y then - return false - end - if pos.y > this.comfylatron_habitat.right_bottom.y then - return false - end - return true -end - -local function get_nearby_players() - local this = WPT.get_table() - local players = - this.comfylatron.surface.find_entities_filtered( - { - name = 'character', - area = { - {this.comfylatron.position.x - 9, this.comfylatron.position.y - 9}, - {this.comfylatron.position.x + 9, this.comfylatron.position.y + 9} - } - } - ) - if not players[1] then - return false - end - return players -end - -local function visit_player() - local this = WPT.get_table() - local surface = game.surfaces[this.active_surface_index] - if this.comfylatron_last_player_visit > game.tick then - return false - end - this.comfylatron_last_player_visit = game.tick + math_random(7200, 10800) - - local players = {} - for _, p in pairs(game.connected_players) do - if is_target_inside_habitat(p.position, surface) and p.character then - if p.character.valid then - players[#players + 1] = p - end - end - end - if #players == 0 then - return false - end - local player = players[math_random(1, #players)] - - if player.surface ~= surface then - return - end - - this.comfylatron.set_command( - { - type = defines.command.go_to_location, - destination_entity = player.character, - radius = 3, - distraction = defines.distraction.none, - pathfind_flags = { - allow_destroy_friendly_entities = false, - prefer_straight_paths = false, - low_priority = true - } - } - ) - local str = texts['travelings'][math_random(1, #texts['travelings'])] - local symbols = {'', '!', '!', '!!', '..'} - str = str .. symbols[math_random(1, #symbols)] - set_comfy_speech_bubble(str) - - this.comfylatron_greet_player_index = player.index - - return true -end - -local function greet_player(nearby_characters) - local this = WPT.get_table() - if not nearby_characters then - return false - end - if not this.comfylatron_greet_player_index then - return false - end - for _, c in pairs(nearby_characters) do - if not c.player then - return - end - if c.player.index == this.comfylatron_greet_player_index then - local str = texts['greetings'][math_random(1, #texts['greetings'])] .. ' ' - str = str .. c.player.name - local symbols = {'. ', '! ', '. ', '! ', '? ', '... '} - str = str .. symbols[math_random(1, 6)] - set_comfy_speech_bubble(str) - this.comfylatron_greet_player_index = false - return true - end - end - return false -end - -local function talks(nearby_characters) - local this = WPT.get_table() - if not nearby_characters then - return false - end - if math_random(1, 3) == 1 then - if this.comfybubble then - this.comfybubble.destroy() - return false - end - end - local str - if #nearby_characters == 1 then - local c = nearby_characters[math_random(1, #nearby_characters)] - if not c.player then - return - end - str = c.player.name - local symbols = {'. ', '! ', '. ', '! ', '? '} - str = str .. symbols[math_random(1, #symbols)] - else - str = texts['multiple_characters_greetings'][math_random(1, #texts['multiple_characters_greetings'])] - local symbols = {'. ', '! '} - str = str .. symbols[math_random(1, #symbols)] - end - if math_random(1, 5) == 1 then - str = str .. texts['talks'][math_random(1, #texts['talks'])] - end - set_comfy_speech_bubble(str) - return true -end - -local function desync(event) - local this = WPT.get_table() - if this.comfybubble then - this.comfybubble.destroy() - end - local m = 12 - local m2 = m * 0.005 - for i = 1, 32, 1 do - this.comfylatron.surface.create_particle( - { - name = 'iron-ore-particle', - position = this.comfylatron.position, - frame_speed = 0.1, - vertical_speed = 0.1, - height = 0.1, - movement = {m2 - (math.random(0, m) * 0.01), m2 - (math.random(0, m) * 0.01)} - } - ) - end - if not event or math_random(1, 4) == 1 then - this.comfylatron.surface.create_entity({name = 'medium-explosion', position = this.comfylatron.position}) - this.comfylatron.surface.create_entity( - { - name = 'flying-text', - position = this.comfylatron.position, - text = 'desync', - color = {r = 150, g = 0, b = 0} - } - ) - this.comfylatron.destroy() - this.comfylatron = nil - else - this.comfylatron.surface.create_entity( - { - name = 'flying-text', - position = this.comfylatron.position, - text = 'desync evaded', - color = {r = 0, g = 150, b = 0} - } - ) - if event.cause then - if event.cause.valid then - if not event.cause.player then - return - end - game.print( - '[color=blue]Comfylatron:[/color]: I got you this time! Back to work, ' .. - event.cause.player.name .. '!', - {r = 200, g = 0, b = 0} - ) - event.cause.die('player', this.comfylatron) - end - end - end -end - -local analyze_blacklist = { - ['compilatron'] = true, - ['compi-speech-bubble'] = true, - ['entity-ghost'] = true, - ['character'] = true, - ['item-on-ground'] = true, - ['stone-wall'] = true, - ['market'] = true -} - -local function analyze_random_nearby_entity() - local this = WPT.get_table() - if math_random(1, 3) ~= 1 then - return false - end - - local entities = - this.comfylatron.surface.find_entities_filtered( - { - area = { - {this.comfylatron.position.x - 4, this.comfylatron.position.y - 4}, - {this.comfylatron.position.x + 4, this.comfylatron.position.y + 4} - } - } - ) - if not entities[1] then - return false - end - entities = shuffle(entities) - local entity = false - for _, e in pairs(entities) do - if not analyze_blacklist[e.name] then - entity = e - end - end - if not entity then - return false - end - - local str = texts['neutral_findings'][math_random(1, #texts['neutral_findings'])] - str = str .. ' ' - str = str .. entity.name - - if entity.health and math_random(1, 3) == 1 then - str = str .. ' health(' - str = str .. entity.health - str = str .. '/' - str = str .. entity.prototype.max_health - str = str .. ')' - else - local symbols = {'.', '!', '?'} - str = str .. symbols[math_random(1, 3)] - end - set_comfy_speech_bubble(str) - - if not this.comfylatron_greet_player_index then - this.comfylatron.set_command( - { - type = defines.command.go_to_location, - destination_entity = entity, - radius = 1, - distraction = defines.distraction.none, - pathfind_flags = { - allow_destroy_friendly_entities = false, - prefer_straight_paths = false, - low_priority = true - } - } - ) - end - return true -end - -local function go_to_some_location() - local this = WPT.get_table() - if math_random(1, 4) ~= 1 then - return false - end - - if this.comfylatron_greet_player_index then - local player = game.players[this.comfylatron_greet_player_index] - if player.surface ~= this.comfylatron.surface then - return - end - if not player.character then - this.comfylatron_greet_player_index = nil - return false - end - if not player.character.valid then - this.comfylatron_greet_player_index = nil - return false - end - if not is_target_inside_habitat(player.position, player.surface) then - this.comfylatron_greet_player_index = nil - return false - end - this.comfylatron.set_command( - { - type = defines.command.go_to_location, - destination_entity = player.character, - radius = 3, - distraction = defines.distraction.none, - pathfind_flags = { - allow_destroy_friendly_entities = false, - prefer_straight_paths = false, - low_priority = true - } - } - ) - else - local p = { - x = this.comfylatron.position.x + (-96 + math_random(0, 192)), - y = this.comfylatron.position.y + (-96 + math_random(0, 192)) - } - local target = this.comfylatron.surface.find_non_colliding_position('compilatron', p, 8, 1) - if not target then - return false - end - if not is_target_inside_habitat(target, this.comfylatron.surface) then - return false - end - this.comfylatron.set_command( - { - type = defines.command.go_to_location, - destination = target, - radius = 2, - distraction = defines.distraction.none, - pathfind_flags = { - allow_destroy_friendly_entities = false, - prefer_straight_paths = false, - low_priority = true - } - } - ) - end - - local str = texts['travelings'][math_random(1, #texts['travelings'])] - local symbols = {'', '!', '!', '!!', '..'} - str = str .. symbols[math_random(1, #symbols)] - set_comfy_speech_bubble(str) - - return true -end - -local function spawn_comfylatron(surface) - local this = WPT.get_table() - if surface == nil then - return - end - if not this.locomotive then - return - end - if not this.locomotive.valid then - return - end - if not this.comfylatron_last_player_visit then - this.comfylatron_last_player_visit = 0 - end - if not this.comfylatron_habitat then - local pos = this.locomotive.position - this.comfylatron_habitat = { - left_top = {x = pos.x - 256, y = pos.y - 256}, - right_bottom = {x = pos.x + 256, y = pos.y + 256} - } - end - local players = {} - for _, p in pairs(game.connected_players) do - if is_target_inside_habitat(p.position) and p.character then - if p.character.valid then - players[#players + 1] = p - end - end - end - if #players == 0 then - return false - end - local player = players[math_random(1, #players)] - - local position = surface.find_non_colliding_position('compilatron', player.position, 16, 1) - if not position then - return false - end - this.comfylatron = - surface.create_entity( - { - name = 'compilatron', - position = position, - force = 'neutral' - } - ) - for x = -3, 3, 1 do - for y = -3, 3, 1 do - if math_random(1, 3) == 1 then - player.surface.create_trivial_smoke( - {name = 'smoke-fast', position = {position.x + (x * 0.35), position.y + (y * 0.35)}} - ) - end - if math_random(1, 5) == 1 then - player.surface.create_trivial_smoke( - {name = 'train-smoke', position = {position.x + (x * 0.35), position.y + (y * 0.35)}} - ) - end - end - end -end - -local function heartbeat() - local this = WPT.get_table() - if not this.locomotive.valid then - return - end - local surface = game.surfaces[this.active_surface_index] - if not surface then - return - end - if surface == nil then - return - end - if not this.comfylatron then - if math_random(1, 4) == 1 then - spawn_comfylatron(surface) - end - return - end - if not this.comfylatron.valid then - this.comfylatron = nil - return - end - if visit_player() then - return - end - local nearby_players = get_nearby_players() - if greet_player(nearby_players) then - return - end - if talks(nearby_players) then - return - end - if go_to_some_location() then - return - end - if analyze_random_nearby_entity() then - return - end -end - -local function on_entity_damaged(event) - local this = WPT.get_table() - if not this.comfylatron then - return - end - if not event.entity.valid then - return - end - if event.entity ~= this.comfylatron then - return - end - desync(event) -end - -local function on_entity_died(event) - local this = WPT.get_table() - if not this.comfylatron then - return - end - if not event.entity.valid then - return - end - if event.entity ~= this.comfylatron then - return - end - if this.comfybubble then - this.comfybubble.destroy() - end - if this.comfylatron then - this.comfylatron.die() - end - this.comfybubble = nil - this.comfylatron = nil - this.comfylatron_habitat = nil - this.comfylatron_last_player_visit = nil -end - -local function on_tick() - if game.tick % 1200 == 600 then - heartbeat() - end -end - -Event.add(defines.events.on_entity_damaged, on_entity_damaged) -Event.add(defines.events.on_entity_died, on_entity_died) -Event.add(defines.events.on_tick, on_tick) diff --git a/maps/mountain_fortress_v3/commands.lua b/maps/mountain_fortress_v3/commands.lua index 90322fd0..d7e9f4de 100644 --- a/maps/mountain_fortress_v3/commands.lua +++ b/maps/mountain_fortress_v3/commands.lua @@ -11,7 +11,7 @@ commands.add_command( local p local player = game.player local reset_map = require 'maps.mountain_fortress_v3.main'.reset_map - local this = WPT.get_table() + local this = WPT.get() if player then if player ~= nil then @@ -45,7 +45,7 @@ commands.add_command( function(cmd) local p local player = game.player - local this = WPT.get_table() + local this = WPT.get() local param = tostring(cmd.parameter) if player then diff --git a/maps/mountain_fortress_v3/entities.lua b/maps/mountain_fortress_v3/entities.lua index 4e4050f0..a18aed49 100644 --- a/maps/mountain_fortress_v3/entities.lua +++ b/maps/mountain_fortress_v3/entities.lua @@ -1,4 +1,5 @@ require 'on_tick_schedule' +require 'modules.rocks_broken_paint_tiles' local Event = require 'utils.event' local Map_score = require 'comfy_panel.map_score' @@ -45,8 +46,7 @@ local defeated_messages = { "Oh no, the biters nom'ed the train away!", "I'm not 100% sure, but - apparently the train was chewed away.", 'You had one objective - defend the train *-*', - "Looks like we're resetting cause you did not defend the train ._.", - 'ohgodno-why-must-you-do-this-to-me' + "Looks like we're resetting cause you did not defend the train ._." } local entity_type = { @@ -57,7 +57,7 @@ local entity_type = { } local function set_objective_health(entity, final_damage_amount) - local this = WPT.get_table() + local this = WPT.get() if final_damage_amount == 0 then return end @@ -84,7 +84,7 @@ local function set_objective_health(entity, final_damage_amount) end local function is_protected(entity) - local this = WPT.get_table() + local this = WPT.get() local map_name = 'mountain_fortress_v3' if string.sub(entity.surface.name, 0, #map_name) ~= map_name then @@ -101,7 +101,7 @@ local function is_protected(entity) end local function protect_train(event) - local this = WPT.get_table() + local this = WPT.get() if event.entity.force.index ~= 1 then return end --Player Force @@ -256,7 +256,7 @@ local function give_coin(player) end local function on_player_mined_entity(event) - local this = WPT.get_table() + local this = WPT.get() local entity = event.entity local player = game.players[event.player_index] if not player.valid then @@ -316,7 +316,7 @@ local function on_entity_damaged(event) end local function on_player_repaired_entity(event) - local this = WPT.get_table() + local this = WPT.get() if not event.entity then return end @@ -333,7 +333,7 @@ local function on_player_repaired_entity(event) end local function on_entity_died(event) - local this = WPT.get_table() + local this = WPT.get() local entity = event.entity if not entity.valid then @@ -396,7 +396,7 @@ local function on_entity_died(event) end function Public.set_scores() - local this = WPT.get_table() + local this = WPT.get() local wagon = this.locomotive_cargo if not wagon then return @@ -413,7 +413,7 @@ function Public.set_scores() end function Public.loco_died() - local this = WPT.get_table() + local this = WPT.get() local surface = game.surfaces[this.active_surface_index] local wave_defense_table = WD.get_table() Public.set_scores() @@ -452,7 +452,7 @@ function Public.loco_died() surface.spill_item_stack(this.locomotive.position, {name = 'coin', count = 512}, false) surface.spill_item_stack(this.locomotive_cargo.position, {name = 'coin', count = 512}, false) - this.game_reset_tick = game.tick + 1800 + this.game_reset_tick = game.tick + 1000 for _, player in pairs(game.connected_players) do player.play_sound {path = 'utility/game_lost', volume_modifier = 0.75} end diff --git a/maps/mountain_fortress_v3/generate.lua b/maps/mountain_fortress_v3/generate.lua index 3ce62e40..c50c9ecf 100644 --- a/maps/mountain_fortress_v3/generate.lua +++ b/maps/mountain_fortress_v3/generate.lua @@ -3,14 +3,14 @@ local Loot = require 'maps.mountain_fortress_v3.loot' local Task = require 'utils.task' local Token = require 'utils.token' local Event = require 'utils.event' +local Terrain = require 'maps.mountain_fortress_v3.terrain'.heavy_functions local insert = table.insert -local tiles_per_tick -local regen_decoratives -local surfaces = {} - -local total_calls +local tiles_per_call = 16 --how many tiles are inserted with each call of insert_action +local total_calls = math.ceil(1024 / tiles_per_call) +local regen_decoratives = false +local force_chunk = false local Public = {} @@ -283,12 +283,12 @@ local function map_gen_action(data) return end - local shape = surfaces[data.surface.name] + local shape = Terrain if shape == nil then return false end - local count = tiles_per_tick + local count = total_calls local y = state + data.top_y local x = data.x @@ -352,7 +352,7 @@ local map_gen_action_token = Token.register(map_gen_action) -- @param event the event table from on_chunk_generated function Public.schedule_chunk(event) local surface = event.surface - local shape = surfaces[surface.name] + local shape = Terrain if not surface.valid then return @@ -390,7 +390,7 @@ end -- @param event
the event table from on_chunk_generated function Public.do_chunk(event) local surface = event.surface - local shape = surfaces[surface.name] + local shape = Terrain if not surface.valid then return @@ -431,50 +431,19 @@ function Public.do_chunk(event) do_place_treasure(data) end ---- Sets the variables for the generate functions, should only be called from map_loader --- @param args
-function Public.init(args) - tiles_per_tick = args.tiles_per_tick or 32 - regen_decoratives = args.regen_decoratives or false - for surface_name, shape in pairs(args.surfaces or {}) do - surfaces[surface_name] = shape - end - - total_calls = math.ceil(1024 / tiles_per_tick) + 5 -end - local do_chunk = Public.do_chunk local schedule_chunk = Public.schedule_chunk local function on_chunk(event) - if event.tick == 0 then + if force_chunk then do_chunk(event) + elseif event.tick == 0 then + --do_chunk(event) else schedule_chunk(event) end end ---- Registers the event to generate our map when Chunks are generated, should only be called from map_loader -function Public.register() - if not Public.enable_register_events then - return - end - - if _DEBUG then - Event.add(defines.events.on_chunk_generated, do_chunk) - else - Event.add(defines.events.on_chunk_generated, on_chunk) - end -end - ---- Returns the surfaces that the generate functions will act on --- Warning! Changing this table after on_init or on_load has run will cause desyncs! --- @return dictionary of surface_name -> shape function -function Public.get_surfaces() - if _LIFECYCLE == 8 then - error('Calling Generate.get_surfaces after on_init() or on_load() has run is a desync risk.', 2) - end - return surfaces -end +Event.add(defines.events.on_chunk_generated, on_chunk) return Public diff --git a/maps/mountain_fortress_v3/gui.lua b/maps/mountain_fortress_v3/gui.lua index 6f814ea6..5e2b32e2 100644 --- a/maps/mountain_fortress_v3/gui.lua +++ b/maps/mountain_fortress_v3/gui.lua @@ -55,7 +55,7 @@ end local function update_gui(player) local rpg = RPG.get_table() - local st = WPT.get_table() + local st = WPT.get() if not player.gui.top.mountain_fortress_v3 then create_gui(player) diff --git a/maps/mountain_fortress_v3/locomotive.lua b/maps/mountain_fortress_v3/locomotive.lua index f910e531..fe3eb30f 100644 --- a/maps/mountain_fortress_v3/locomotive.lua +++ b/maps/mountain_fortress_v3/locomotive.lua @@ -7,7 +7,6 @@ require 'maps.mountain_fortress_v3.locomotive_market' local Public = {} -local energy_upgrade = 50000000 local rnd = math.random local function validate_player(player) @@ -29,93 +28,6 @@ local function validate_player(player) return true end -local function rebuild_energy_overworld(data) - local this = data.this - local surface = data.surface - if this.ow_energy then - if this.ow_energy.valid then - local position = this.ow_energy.position - local area = { - left_top = {x = position.x - 2, y = position.y - 2}, - right_bottom = {x = position.x + 2, y = position.y + 2} - } - if Public.contains_positions(this.locomotive.position, area) then - return - end - this.old_ow_energy = this.ow_energy.energy - this.ow_energy.destroy() - this.energy['mountain_fortress_v3'] = nil - end - end - this.ow_energy = - surface.create_entity { - name = 'hidden-electric-energy-interface', - position = { - x = this.locomotive.position.x, - y = this.locomotive.position.y + 2 - }, - create_build_effect_smoke = false, - force = game.forces.enemy - } - - this.ow_energy.destructible = false - this.ow_energy.minable = false - this.ow_energy.operable = false - - this.ow_energy.power_production = 0 - if this.energy_purchased then - this.ow_energy.electric_buffer_size = energy_upgrade - else - this.ow_energy.electric_buffer_size = 10000000 - end - if this.old_ow_energy then - this.ow_energy.energy = this.old_ow_energy - end -end - -local function rebuild_energy_loco(data, rebuild) - local this = data.this - local surface = data.surface - - if rebuild then - local radius = 1024 - local area = {{x = -radius, y = -radius}, {x = radius, y = radius}} - for _, entity in pairs(surface.find_entities_filtered {area = area, name = 'electric-energy-interface'}) do - entity.destroy() - end - this.energy.loco = nil - this.lo_energy = nil - end - - local locomotive = this.locomotive_index - if not locomotive then - return - end - - local center_position = { - x = locomotive.area.left_top.x + (locomotive.area.right_bottom.x - locomotive.area.left_top.x) * 0.512, - y = locomotive.area.left_top.y + (locomotive.area.right_bottom.y - locomotive.area.left_top.y) * 0.504 - } - - this.lo_energy = - surface.create_entity { - name = 'electric-energy-interface', - position = center_position, - create_build_effect_smoke = false, - force = game.forces.enemy - } - - this.lo_energy.minable = false - this.lo_energy.destructible = false - this.lo_energy.operable = false - this.lo_energy.power_production = 0 - if this.energy_purchased then - this.lo_energy.electric_buffer_size = energy_upgrade - else - this.lo_energy.electric_buffer_size = 10000000 - end -end - local function property_boost(data) local rng = math.random local xp_floating_text_color = {r = rng(0, 250), g = 128, b = 0} @@ -152,7 +64,7 @@ local function property_boost(data) end local function fish_tag() - local this = WPT.get_table() + local this = WPT.get() if not this.locomotive_cargo then return end @@ -188,7 +100,7 @@ local function fish_tag() end local function set_player_spawn_and_refill_fish() - local this = WPT.get_table() + local this = WPT.get() if not this.locomotive_cargo then return end @@ -211,145 +123,15 @@ local function set_player_spawn_and_refill_fish() game.forces.player.set_spawn_position({x = position.x, y = position.y}, this.locomotive_cargo.surface) end -local direction_lookup = { - [-1] = { - [1] = defines.direction.southwest, - [0] = defines.direction.west, - [-1] = defines.direction.northwest - }, - [0] = { - [1] = defines.direction.south, - [-1] = defines.direction.north - }, - [1] = { - [1] = defines.direction.southeast, - [0] = defines.direction.east, - [-1] = defines.direction.northeast - } -} - -local function rand_range(start, stop) - local this = WPT.get_table() - - if not this.rng then - this.rng = game.create_random_generator() - end - - return this.rng(start, stop) -end - -local function get_axis(point, axis) - local function safe_get(t, k) - local res, value = - pcall( - function() - return t[k] - end - ) - if res then - return value - end - - return nil - end - - if point.position then - return get_axis(point.position, axis) - end - - if point[axis] then - return point[axis] - end - - if safe_get(point, 'target') then - return get_axis(point.target, axis) - end - - if #point ~= 2 then - log('get_axis: invalid point format') - return nil - end - - if axis == 'x' then - return point[1] - end - - return point[2] -end - -local function get_direction(src, dest) - local src_x = get_axis(src, 'x') - local src_y = get_axis(src, 'y') - local dest_x = get_axis(dest, 'x') - local dest_y = get_axis(dest, 'y') - - local step = { - x = nil, - y = nil - } - - local precision = rand_range(1, 10) - if dest_x - precision > src_x then - step.x = 1 - elseif dest_x < src_x - precision then - step.x = -1 - else - step.x = 0 - end - - if dest_y - precision > src_y then - step.y = 1 - elseif dest_y < src_y - precision then - step.y = -1 - else - step.y = 0 - end - - return direction_lookup[step.x][step.y] -end - -local function get_distance(a, b) - local h = (get_axis(a, 'x') - get_axis(b, 'x')) ^ 2 - local v = (get_axis(a, 'y') - get_axis(b, 'y')) ^ 2 - - return math.sqrt(h + v) -end - -local function move_to(ent, trgt, min_distance) - local state = { - walking = false - } - - local distance = get_distance(trgt.position, ent.position) - if min_distance < distance then - local dir = get_direction(ent.position, trgt.position) - if dir then - state = { - walking = true, - direction = dir - } - end - end - - ent.walking_state = state - return state.walking -end - local function tick() if game.tick % 120 == 0 then Public.boost_players_around_train() end if game.tick % 30 == 0 then - local this = WPT.get_table() - if this.energy_shared then - Public.power_source_overworld() - Public.power_source_locomotive() - end if game.tick % 1800 == 0 then set_player_spawn_and_refill_fish() end - --Public.spawn_player() fish_tag() end @@ -357,7 +139,10 @@ end function Public.boost_players_around_train() local rpg = RPG.get_table() - local this = WPT.get_table() + local this = WPT.get() + if not this.active_surface_index then + return + end local surface = game.surfaces[this.active_surface_index] local icw_table = ICW.get_table() local unit_surface = this.locomotive.unit_number @@ -380,11 +165,21 @@ function Public.boost_players_around_train() end function Public.render_train_hp() - local this = WPT.get_table() + local this = WPT.get() local surface = game.surfaces[this.active_surface_index] local names = { + 'Hanakocz', + 'Redlabel', + 'Hanakocz', + 'Gerkiz', + 'Hanakocz', 'Mewmew', + 'Gerkiz', + 'Hanakocz', + 'Redlabel', + 'Gerkiz', + 'Hanakocz', 'Redlabel', 'Gerkiz', 'Hanakocz' @@ -392,6 +187,8 @@ function Public.render_train_hp() local size_of_names = #names + local n = names[rnd(1, size_of_names)] + this.health_text = rendering.draw_text { text = 'HP: ' .. this.locomotive_health .. ' / ' .. this.locomotive_max_health, @@ -407,7 +204,7 @@ function Public.render_train_hp() this.caption = rendering.draw_text { - text = names[rnd(1, size_of_names)] .. 's Comfy Train', + text = n .. 's Comfy Train', surface = surface, target = this.locomotive, target_offset = {0, -4.25}, @@ -429,85 +226,8 @@ function Public.render_train_hp() } end -function Public.spawn_player() - local rnd = math.random - - local this = WPT.get_table() - local surface = game.surfaces[this.active_surface_index] - local position = this.locomotive.position - if not this.locomotive then - return - end - if not this.locomotive.valid then - return - end - - if not this.mountain_fortress_v3_one or not this.mountain_fortress_v3_one.valid then - this.mountain_fortress_v3_one = - surface.create_entity( - { - name = 'character', - position = {position.x + 5, position.y}, - force = 'player', - direction = 0 - } - ) - this.mountain_fortress_v3_one_caption = - rendering.draw_text { - text = 'Lumberjack', - surface = surface, - target = this.mountain_fortress_v3_one, - target_offset = {0, -2.25}, - color = {r = 0, g = 110, b = 33}, - scale = 0.75, - font = 'default-game', - alignment = 'center', - scale_with_zoom = false - } - end - if not this.mountain_fortress_v3_two or not this.mountain_fortress_v3_two.valid then - this.mountain_fortress_v3_two = - surface.create_entity( - { - name = 'character', - position = {position.x + -5, position.y}, - force = 'player', - direction = 0 - } - ) - this.mountain_fortress_v3_two_caption = - rendering.draw_text { - text = 'Lumberjack', - surface = surface, - target = this.mountain_fortress_v3_two, - target_offset = {0, -2.25}, - color = {r = 0, g = 110, b = 33}, - scale = 0.75, - font = 'default-game', - alignment = 'center', - scale_with_zoom = false - } - end - for _, p in pairs(game.connected_players) do - if this.mountain_fortress_v3_one and this.mountain_fortress_v3_one.valid then - if rnd(1, 32) == 1 then - this.mountain_fortress_v3_one.destroy() - return - end - move_to(this.mountain_fortress_v3_one, p, rnd(15, 50)) - end - if this.mountain_fortress_v3_two and this.mountain_fortress_v3_two.valid then - if rnd(1, 32) == 1 then - this.mountain_fortress_v3_two.destroy() - return - end - move_to(this.mountain_fortress_v3_two, p, rnd(15, 50)) - end - end -end - function Public.locomotive_spawn(surface, position) - local this = WPT.get_table() + local this = WPT.get() for y = -6, 6, 2 do surface.create_entity( {name = 'straight-rail', position = {position.x, position.y + y}, force = 'player', direction = 0} @@ -580,49 +300,6 @@ function Public.contains_positions(pos, area) return false end -function Public.power_source_overworld() - local this = WPT.get_table() - local surface = game.surfaces[this.active_surface_index] - if not this.locomotive then - return - end - if not this.locomotive.valid then - return - end - - local data = { - this = this, - surface = surface - } - - rebuild_energy_overworld(data) -end - -function Public.power_source_locomotive() - local this = WPT.get_table() - local icw_table = ICW.get_table() - if not this.locomotive then - return - end - if not this.locomotive.valid then - return - end - local unit_surface = this.locomotive.unit_number - local surface = game.surfaces[icw_table.wagons[unit_surface].surface.index] - - local data = { - this = this, - icw_table = icw_table, - surface = surface - } - - if not this.lo_energy then - rebuild_energy_loco(data) - elseif not this.lo_energy.valid then - rebuild_energy_loco(data, true) - end -end - ---Event.on_nth_tick(5, tick) +Event.on_nth_tick(5, tick) return Public diff --git a/maps/mountain_fortress_v3/locomotive_market.lua b/maps/mountain_fortress_v3/locomotive_market.lua index eb1ed6bd..2d711beb 100644 --- a/maps/mountain_fortress_v3/locomotive_market.lua +++ b/maps/mountain_fortress_v3/locomotive_market.lua @@ -6,7 +6,6 @@ local format_number = require 'util'.format_number local shopkeeper = '[color=blue]Shopkeeper:[/color]' -local energy_upgrade = 50000000 local random = math.random local Public = {} @@ -21,10 +20,9 @@ local function shuffle(tbl) end function Public.get_items() - local this = WPT.get_table() + local this = WPT.get() local threat_cost = 20000 - local energy_cost = 15000 local health_cost = 15000 * (1 + this.health_upgrades) local aura_cost = 15000 * (1 + this.aura_upgrades) local xp_point_boost_cost = 15000 * (1 + this.xp_points_upgrade) @@ -38,14 +36,6 @@ function Public.get_items() sprite = 'item/computer', enabled = true } - items['energy_upgrade'] = { - stack = 1, - value = 'coin', - price = energy_cost, - tooltip = '[Linked Power]:\nUpgrades the buffer size of the energy interface\nUsable if the power dies easily.', - sprite = 'item/computer', - enabled = true - } items['locomotive_max_health'] = { stack = 1, value = 'coin', @@ -70,14 +60,6 @@ function Public.get_items() sprite = 'item/computer', enabled = true } - items['purge_darkness'] = { - stack = 1, - value = 'coin', - price = 1550, - tooltip = "[Darkness]:\nPay the Sun Gods some coins and they'll reward you handsomely.", - sprite = 'item/computer', - enabled = true - } items['small-lamp'] = {stack = 1, value = 'coin', price = 5, tooltip = 'Small Sunlight'} items['wood'] = {stack = 50, value = 'coin', price = 12, tooltip = 'Some fine Wood'} items['iron-ore'] = {stack = 50, value = 'coin', price = 12, tooltip = 'Some chunky iron'} @@ -137,7 +119,7 @@ local function validate_player(player) end local function close_market_gui(player) - local this = WPT.get_table() + local this = WPT.get() local element = player.gui.center local data = this.players[player.index].data @@ -152,6 +134,9 @@ local function close_market_gui(player) end if data.frame and data.frame.valid then data.frame.destroy() + for k, _ in pairs(data) do + data[k] = nil + end end end end @@ -160,7 +145,7 @@ local function redraw_market_items(gui, player, search_text) if not validate_player(player) then return end - local this = WPT.get_table() + local this = WPT.get() gui.clear() shuffle(Public.get_items()) @@ -235,7 +220,7 @@ end local function slider_changed(event) local player = game.players[event.player_index] - local this = WPT.get_table() + local this = WPT.get() local slider_value slider_value = this.players @@ -260,7 +245,7 @@ local function slider_changed(event) end local function text_changed(event) - local this = WPT.get_table() + local this = WPT.get() local player = game.players[event.player_index] local data = this.players[player.index].data @@ -285,7 +270,7 @@ local function text_changed(event) end local function gui_opened(event) - local this = WPT.get_table() + local this = WPT.get() if not event.gui_type == defines.gui_type.entity then return @@ -407,7 +392,7 @@ local function gui_opened(event) end local function gui_click(event) - local this = WPT.get_table() + local this = WPT.get() local wdt = WD.get_table() local element = event.element @@ -416,6 +401,10 @@ local function gui_click(event) return end + if not this.players[player.index] then + return + end + local data = this.players[player.index].data if not data then return @@ -485,31 +474,6 @@ local function gui_click(event) return end - if name == 'energy_upgrade' then - if this.energy_purchased then - return player.print( - shopkeeper .. ' ' .. player.name .. ', max energy upgrade is already purchased!', - {r = 0.98, g = 0.66, b = 0.22} - ) - end - player.remove_item({name = item.value, count = cost}) - - game.print( - shopkeeper .. - ' ' .. player.name .. ' has bought the group a power upgrade! The energy interface is now buffed!', - {r = 0.98, g = 0.66, b = 0.22} - ) - this.energy_purchased = true - this.train_upgrades = this.train_upgrades + 1 - - this.lo_energy.electric_buffer_size = this.lo_energy.electric_buffer_size + energy_upgrade - this.ow_energy.electric_buffer_size = this.ow_energy.electric_buffer_size + energy_upgrade - - redraw_market_items(data.item_frame, player, data.search_text) - redraw_coins_left(data.coins_left, player) - - return - end if name == 'locomotive_max_health' then player.remove_item({name = item.value, count = cost}) @@ -558,35 +522,6 @@ local function gui_click(event) return end - if name == 'purge_darkness' then - if not this.freeze_daytime then - return player.print( - shopkeeper .. ' ' .. player.name .. ", it's already sunlight!", - {r = 0.98, g = 0.66, b = 0.22} - ) - end - game.print( - shopkeeper .. ' ' .. player.name .. ' has paid the Sun Gods some coins for sunlight!', - {r = 0.98, g = 0.66, b = 0.22} - ) - - local surface = game.surfaces[this.active_surface_index] - game.print(shopkeeper .. ' Sunlight, finally!', {r = 0.98, g = 0.66, b = 0.22}) - surface.min_brightness = 1 - surface.brightness_visual_weights = {1, 0, 0, 0} - surface.daytime = 1 - surface.freeze_daytime = false - surface.solar_power_multiplier = 1 - this.freeze_daytime = false - - player.remove_item({name = item.value, count = cost}) - - redraw_market_items(data.item_frame, player, data.search_text) - redraw_coins_left(data.coins_left, player) - - return - end - if name == 'xp_points_boost' then player.remove_item({name = item.value, count = cost}) @@ -623,7 +558,7 @@ end local function gui_closed(event) local player = game.players[event.player_index] - local this = WPT.get_table() + local this = WPT.get() local type = event.gui_type @@ -651,8 +586,11 @@ local function contains_positions(pos, area) end local function on_player_changed_position(event) - local this = WPT.get_table() + local this = WPT.get() local player = game.players[event.player_index] + if not this.players[player.index] then + return + end local data = this.players[player.index].data if data and data.frame and data.frame.valid then @@ -685,9 +623,6 @@ local function create_market(data, rebuild) end local locomotive = this.locomotive_index - if not locomotive then - return - end local center_position = { x = locomotive.area.left_top.x + (locomotive.area.right_bottom.x - locomotive.area.left_top.x) * 0.5, @@ -697,7 +632,7 @@ local function create_market(data, rebuild) this.market = surface.create_entity {name = 'market', position = center_position, force = 'player'} rendering.draw_text { - text = 'Power & Market', + text = 'Market', surface = surface, target = this.market, target_offset = {0, 2}, @@ -708,6 +643,7 @@ local function create_market(data, rebuild) this.market.destructible = false if not this.loco_surface then + this.loco_surface = this.locomotive.surface return end @@ -746,14 +682,16 @@ local function create_market(data, rebuild) end local function place_market() - local this = WPT.get_table() + local this = WPT.get() local icw_table = ICW.get_table() if not this.locomotive then return end + if not this.locomotive.valid then return end + local unit_surface = this.locomotive.unit_number local surface = game.surfaces[icw_table.wagons[unit_surface].surface.index] diff --git a/maps/mountain_fortress_v3/main.lua b/maps/mountain_fortress_v3/main.lua index e19df6ba..5938dd09 100644 --- a/maps/mountain_fortress_v3/main.lua +++ b/maps/mountain_fortress_v3/main.lua @@ -1,6 +1,6 @@ -- modules +require 'maps.mountain_fortress_v3.generate' require 'maps.mountain_fortress_v3.player_list' ---require 'maps.mountain_fortress_v3.comfylatron' require 'maps.mountain_fortress_v3.commands' require 'maps.mountain_fortress_v3.flamethrower_nerf' @@ -14,6 +14,7 @@ require 'modules.biters_yield_coins' require 'modules.wave_defense.main' require 'modules.pistol_buffs' +local CS = require 'maps.mountain_fortress_v3.surface' local Server = require 'utils.server' local Explosives = require 'modules.explosives' local Entities = require 'maps.mountain_fortress_v3.entities' @@ -22,7 +23,6 @@ local ICW = require 'maps.mountain_fortress_v3.icw.main' local WD = require 'modules.wave_defense.table' local Map = require 'modules.map_info' local RPG = require 'maps.mountain_fortress_v3.rpg' -local Reset = require 'maps.mountain_fortress_v3.soft_reset' local Terrain = require 'maps.mountain_fortress_v3.terrain' local Event = require 'utils.event' local WPT = require 'maps.mountain_fortress_v3.table' @@ -31,24 +31,19 @@ local render_train_hp = require 'maps.mountain_fortress_v3.locomotive'.render_tr local Score = require 'comfy_panel.score' local Poll = require 'comfy_panel.poll' local Collapse = require 'modules.collapse' -local Balance = require 'maps.mountain_fortress_v3.balance' -local shape = require 'maps.mountain_fortress_v3.terrain'.heavy_functions -local Generate = require 'maps.mountain_fortress_v3.generate' -local Task = require 'utils.task' local Difficulty = require 'modules.difficulty_vote' +local Task = require 'utils.task' local Public = {} -local math_random = math.random -WPT.init({train_reveal = false, energy_shared = true, reveal_normally = true}) - -local starting_items = {['pistol'] = 1, ['firearm-magazine'] = 16, ['wood'] = 4, ['rail'] = 16, ['raw-fish'] = 2} +local starting_items = {['pistol'] = 1, ['firearm-magazine'] = 16, ['rail'] = 16, ['wood'] = 16, ['explosives'] = 32} local function disable_tech() game.forces.player.technologies['landfill'].enabled = false game.forces.player.technologies['optics'].researched = true + game.forces.player.technologies['railway'].researched = true game.forces.player.technologies['land-mine'].enabled = false - Balance.init_enemy_weapon_damage() + --Balance.init_enemy_weapon_damage() end local function set_difficulty() @@ -78,16 +73,30 @@ local function set_difficulty() end local function render_direction(surface) - rendering.draw_text { - text = 'Welcome to Mountain Fortress v3!', - surface = surface, - target = {-0, 10}, - color = {r = 0.98, g = 0.66, b = 0.22}, - scale = 3, - font = 'heading-1', - alignment = 'center', - scale_with_zoom = false - } + local counter = WPT.get('soft_reset_counter') + if counter then + rendering.draw_text { + text = 'Welcome to Mountain Fortress v3!\nRun: ' .. counter, + surface = surface, + target = {-0, 10}, + color = {r = 0.98, g = 0.66, b = 0.22}, + scale = 3, + font = 'heading-1', + alignment = 'center', + scale_with_zoom = false + } + else + rendering.draw_text { + text = 'Welcome to Mountain Fortress v3!', + surface = surface, + target = {-0, 10}, + color = {r = 0.98, g = 0.66, b = 0.22}, + scale = 3, + font = 'heading-1', + alignment = 'center', + scale_with_zoom = false + } + end rendering.draw_text { text = '▼', @@ -151,37 +160,24 @@ local function render_direction(surface) scale_with_zoom = false } - surface.create_entity({name = 'electric-beam', position = {-196, 74}, source = {-196, 74}, target = {196, 74}}) - surface.create_entity({name = 'electric-beam', position = {-196, 74}, source = {-196, 74}, target = {196, 74}}) + local x_min = -Terrain.level_width / 2 + local x_max = Terrain.level_width / 2 + + surface.create_entity({name = 'electric-beam', position = {x_min, 74}, source = {x_min, 74}, target = {x_max, 74}}) + surface.create_entity({name = 'electric-beam', position = {x_min, 74}, source = {x_min, 74}, target = {x_max, 74}}) end function Public.reset_map() + local Settings = CS.get() local Diff = Difficulty.get() - local this = WPT.get_table() + local this = WPT.get() local wave_defense_table = WD.get_table() local get_score = Score.get_table() - local map_gen_settings = { - ['seed'] = math_random(10000, 99999), - ['width'] = Terrain.level_depth, - ['water'] = 0.001, - ['starting_area'] = 1, - ['cliff_settings'] = {cliff_elevation_interval = 0, cliff_elevation_0 = 0}, - ['default_enable_all_autoplace_controls'] = true, - ['autoplace_settings'] = { - ['entity'] = {treat_missing_as_default = false}, - ['tile'] = {treat_missing_as_default = true}, - ['decorative'] = {treat_missing_as_default = true} - } - } if not this.active_surface_index then - this.active_surface_index = game.create_surface('mountain_fortress_v3', map_gen_settings).index - this.active_surface = game.surfaces[this.active_surface_index] + this.active_surface_index = Settings.active_surface_index else - game.forces.player.set_spawn_position({-27, 40}, game.surfaces[this.active_surface_index]) - this.active_surface_index = - Reset.soft_reset_map(game.surfaces[this.active_surface_index], map_gen_settings, starting_items).index - this.active_surface = game.surfaces[this.active_surface_index] + this.active_surface_index = CS.create_surface() end Poll.reset() @@ -206,8 +202,6 @@ function Public.reset_map() Diff.difficulty_poll_closing_timeout = game.tick + 90000 Diff.difficulty_player_votes = {} - game.difficulty_settings.technology_price_multiplier = 0.6 - Collapse.set_kill_entities(false) Collapse.set_speed(8) Collapse.set_amount(1) @@ -239,30 +233,15 @@ function Public.reset_map() set_difficulty() - local surfaces = { - [surface.name] = shape - } - Generate.init({surfaces = surfaces, regen_decoratives = true, tiles_per_tick = 32}) Task.reset_queue() Task.start_queue() - Task.set_queue_speed(20) + Task.set_queue_speed(10) this.chunk_load_tick = game.tick + 500 end -local function on_load() - local this = WPT.get_table() - - local surfaces = { - [this.active_surface.name] = shape - } - Generate.init({surfaces = surfaces, regen_decoratives = true, tiles_per_tick = 32}) - Generate.register() - Task.start_queue() -end - local function on_player_changed_position(event) - local this = WPT.get_table() + local this = WPT.get() local player = game.players[event.player_index] local map_name = 'mountain_fortress_v3' @@ -272,21 +251,7 @@ local function on_player_changed_position(event) local position = player.position local surface = game.surfaces[this.active_surface_index] - if position.x >= Terrain.level_depth * 0.5 then - return - end - if position.x < Terrain.level_depth * -0.5 then - return - end - if - not this.train_reveal and not this.reveal_normally or - this.players[player.index].start_tick and game.tick - this.players[player.index].start_tick < 6400 - then - if position.y < 5 then - Terrain.reveal_player(player) - end - end if position.y >= 74 then player.teleport({position.x, position.y - 1}, surface) player.print('Forcefield does not approve.', {r = 0.98, g = 0.66, b = 0.22}) @@ -301,7 +266,7 @@ local function on_player_changed_position(event) end local function on_player_joined_game(event) - local this = WPT.get_table() + local this = WPT.get() local surface = game.surfaces[this.active_surface_index] local player = game.players[event.player_index] @@ -325,6 +290,9 @@ local function on_player_joined_game(event) end if player.surface.index ~= this.active_surface_index then + if not player.character then + player.create_character() + end player.teleport( surface.find_non_colliding_position('character', game.forces.player.get_spawn_position(surface), 3, 0, 5), surface @@ -340,7 +308,7 @@ local function on_player_left_game() end local function on_pre_player_left_game(event) - local this = WPT.get_table() + local this = WPT.get() local player = game.players[event.player_index] if player.controller_type == defines.controllers.editor then player.toggle_map_editor() @@ -351,7 +319,7 @@ local function on_pre_player_left_game(event) end local function offline_players() - local this = WPT.get_table() + local this = WPT.get() local players = this.offline_players local surface = game.surfaces[this.active_surface_index] if #players > 0 then @@ -437,83 +405,15 @@ local function on_research_finished(event) event.research.force.manual_mining_speed_modifier = mining_speed_bonus end -local function darkness(data) - local rnd = math.random - local this = data.this - local surface = data.surface - if rnd(1, 24) == 1 then - if not this.freeze_daytime then - return - end - game.print('Sunlight, finally!', {r = 0.98, g = 0.66, b = 0.22}) - surface.min_brightness = 1 - surface.brightness_visual_weights = {1, 0, 0, 0} - surface.daytime = 1 - surface.freeze_daytime = false - surface.solar_power_multiplier = 1 - this.freeze_daytime = false - return - elseif rnd(1, 64) == 1 then - if this.freeze_daytime then - return - end - game.print('Darkness has surrounded us!', {r = 0.98, g = 0.66, b = 0.22}) - game.print('Builds some lamps!', {r = 0.98, g = 0.66, b = 0.22}) - surface.min_brightness = 0 - surface.brightness_visual_weights = {0.90, 0.90, 0.90} - surface.daytime = 0.42 - surface.freeze_daytime = true - surface.solar_power_multiplier = 0 - this.freeze_daytime = true - return - end -end - -local function transfer_pollution(data) - local Diff = data.diff - local surface = data.loco_surface - local this = data.this - if not surface then - return - end - local pollution = surface.get_total_pollution() * (3 / (4 / 3 + 1)) * Diff.difficulty_vote_value - game.surfaces[this.active_surface_index].pollute(this.locomotive.position, pollution) - surface.clear_pollution() -end - -local tick_minute_functions = { - [300 * 3 + 30 * 6] = darkness, - [300 * 3 + 30 * 6] = transfer_pollution -} - -local function tick_functions() - local this = WPT.get_table() - local tick = game.tick - local key = tick % 3600 - local Diff = Difficulty.get() - local unit_surface = this.locomotive.unit_number - local icw_table = ICW.get_table() - local surface = game.surfaces[this.active_surface_index] - local data = { - this = this, - surface = surface, - diff = Diff, - loco_surface = game.surfaces[icw_table.wagons[unit_surface].surface.index] - } - if tick_minute_functions[key] then - tick_minute_functions[key](data) - end -end - local function is_locomotive_valid() - local this = WPT.get_table() + local this = WPT.get() if not this.locomotive.valid then Entities.loco_died() end end local function has_the_game_ended() - local this = WPT.get_table() + local this = WPT.get() if this.game_reset_tick then if this.game_reset_tick < game.tick then if not this.disable_reset then @@ -534,7 +434,7 @@ local function has_the_game_ended() end local function chunk_load() - local this = WPT.get_table() + local this = WPT.get() if this.chunk_load_tick then if this.chunk_load_tick < game.tick then this.chunk_load_tick = nil @@ -544,8 +444,8 @@ local function chunk_load() end local on_tick = function() - local this = WPT.get_table() - local surface = game.surfaces[this.active_surface_index] + local active_surface_index = WPT.get('active_surface_index') + local surface = game.surfaces[active_surface_index] local wave_defense_table = WD.get_table() if game.tick % 30 == 0 then @@ -562,14 +462,13 @@ local on_tick = function() Entities.set_scores() end is_locomotive_valid() - tick_functions() has_the_game_ended() chunk_load() end end local on_init = function() - local this = WPT.get_table() + local this = WPT.get() Public.reset_map() global.custom_highscore.description = 'Wagon distance reached:' @@ -584,25 +483,16 @@ local on_init = function() T.main_caption_color = {r = 150, g = 150, b = 0} T.sub_caption_color = {r = 0, g = 150, b = 0} - local mgs = game.surfaces['nauvis'].map_gen_settings - mgs.width = 16 - mgs.height = 16 - game.surfaces['nauvis'].map_gen_settings = mgs - game.surfaces['nauvis'].clear() - Explosives.set_destructible_tile('out-of-map', 1500) Explosives.set_destructible_tile('water', 1000) Explosives.set_destructible_tile('water-green', 1000) Explosives.set_destructible_tile('deepwater-green', 1000) Explosives.set_destructible_tile('deepwater', 1000) Explosives.set_destructible_tile('water-shallow', 1000) - - Generate.register() end Event.on_nth_tick(10, on_tick) Event.on_init(on_init) -Event.on_load(on_load) 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_changed_position, on_player_changed_position) diff --git a/maps/mountain_fortress_v3/mining.lua b/maps/mountain_fortress_v3/mining.lua index 4e03b879..20092420 100644 --- a/maps/mountain_fortress_v3/mining.lua +++ b/maps/mountain_fortress_v3/mining.lua @@ -175,7 +175,7 @@ function Public.on_player_mined_entity(event) end local player = game.players[event.player_index] - local this = WPT.get_table() + local this = WPT.get() if not player then return end diff --git a/maps/mountain_fortress_v3/power.lua b/maps/mountain_fortress_v3/power.lua index fef27767..6d48dddb 100644 --- a/maps/mountain_fortress_v3/power.lua +++ b/maps/mountain_fortress_v3/power.lua @@ -19,7 +19,7 @@ local function balance(t) end local function tick() - local this = WPT.get_table() + local this = WPT.get() if not this.energy['mountain_fortress_v3'] then this.energy['mountain_fortress_v3'] = this.ow_energy end diff --git a/maps/mountain_fortress_v3/rpg.lua b/maps/mountain_fortress_v3/rpg.lua index f35830dc..a8752825 100644 --- a/maps/mountain_fortress_v3/rpg.lua +++ b/maps/mountain_fortress_v3/rpg.lua @@ -18,6 +18,7 @@ local Global = require 'utils.global' local Tabs = require 'comfy_panel.main' local P = require 'player_modifiers' local Collapse = require 'modules.collapse' +local Terrain = require 'maps.mountain_fortress_v3.terrain' local math_floor = math.floor local math_random = math.random @@ -187,24 +188,24 @@ end local function update_player_stats(player) local player_modifiers = P.get_table() local strength = rpg_t[player.index].strength - 10 - player_modifiers[player.index].character_inventory_slots_bonus['rpg'] = math_round(strength * 0.2, 3) - player_modifiers[player.index].character_mining_speed_modifier['rpg'] = math_round(strength * 0.008, 3) + player_modifiers[player.index].character_inventory_slots_bonus['rpg'] = math.round(strength * 0.2, 3) + player_modifiers[player.index].character_mining_speed_modifier['rpg'] = math.round(strength * 0.008, 3) local magic = rpg_t[player.index].magic - 10 local v = magic * 0.22 - player_modifiers[player.index].character_build_distance_bonus['rpg'] = math_round(v, 3) - player_modifiers[player.index].character_item_drop_distance_bonus['rpg'] = math_round(v, 3) - player_modifiers[player.index].character_reach_distance_bonus['rpg'] = math_round(v, 3) - player_modifiers[player.index].character_loot_pickup_distance_bonus['rpg'] = math_round(v * 0.5, 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) + player_modifiers[player.index].character_build_distance_bonus['rpg'] = math.round(v, 3) + player_modifiers[player.index].character_item_drop_distance_bonus['rpg'] = math.round(v, 3) + player_modifiers[player.index].character_reach_distance_bonus['rpg'] = math.round(v, 3) + player_modifiers[player.index].character_loot_pickup_distance_bonus['rpg'] = math.round(v * 0.5, 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) local dexterity = rpg_t[player.index].dexterity - 10 - player_modifiers[player.index].character_running_speed_modifier['rpg'] = math_round(dexterity * 0.002, 3) - player_modifiers[player.index].character_crafting_speed_modifier['rpg'] = math_round(dexterity * 0.015, 3) + player_modifiers[player.index].character_running_speed_modifier['rpg'] = math.round(dexterity * 0.002, 3) + player_modifiers[player.index].character_crafting_speed_modifier['rpg'] = math.round(dexterity * 0.015, 3) player_modifiers[player.index].character_health_bonus['rpg'] = - math_round((rpg_t[player.index].vitality - 10) * 6, 3) + math.round((rpg_t[player.index].vitality - 10) * 6, 3) P.update_player_modifiers(player) end @@ -578,7 +579,7 @@ function Public.gain_xp(player, amount) fee = amount * 0.3 rpg_t.global_pool = rpg_t.global_pool + fee end - amount = math_floor(amount, 2) - fee + amount = math_floor(amount, 3) - fee rpg_t[player.index].xp = rpg_t[player.index].xp + amount rpg_t[player.index].xp_since_last_floaty_text = rpg_t[player.index].xp_since_last_floaty_text + amount if player.gui.left.rpg then @@ -678,7 +679,7 @@ function Public.rpg_reset_player(player, one_time_reset) magic = 10, dexterity = 10, vitality = 10, - points_to_distribute = 0, + points_to_distribute = 5, last_floaty_text = visuals_delay, xp_since_last_floaty_text = 0, reset = false, @@ -1109,11 +1110,11 @@ end local function distance(player) local distance_to_center = math_floor(math_sqrt(player.position.x ^ 2 + player.position.y ^ 2)) local location = distance_to_center - if location < 950 then + if location < Terrain.level_depth - 10 then return end - local min = 960 * rpg_t[player.index].bonus - local max = 965 * rpg_t[player.index].bonus + local min = Terrain.level_depth * rpg_t[player.index].bonus + local max = Terrain.level_depth + 5 * rpg_t[player.index].bonus local min_times = location >= min local max_times = location <= max if min_times and max_times then @@ -1184,7 +1185,7 @@ local function on_pre_player_mined_item(event) if entity.type == 'resource' then xp_amount = 0.5 * distance_multiplier else - xp_amount = (1.5 + event.entity.prototype.max_health * 0.0035) * distance_multiplier + xp_amount = (3 + event.entity.prototype.max_health * 0.0035) * distance_multiplier end Public.gain_xp(player, xp_amount) diff --git a/maps/mountain_fortress_v3/soft_reset.lua b/maps/mountain_fortress_v3/soft_reset.lua index ddb7b223..3ff00b69 100644 --- a/maps/mountain_fortress_v3/soft_reset.lua +++ b/maps/mountain_fortress_v3/soft_reset.lua @@ -18,7 +18,7 @@ local function reset_forces(new_surface, old_surface) end for _, tech in pairs(game.forces.player.technologies) do tech.researched = false - game.player.force.set_saved_technology_progress(tech, 0) + game.forces.player.set_saved_technology_progress(tech, 0) end end @@ -49,7 +49,7 @@ local function equip_players(player_starting_items) end function Public.soft_reset_map(old_surface, map_gen_settings, player_starting_items) - local this = WPT.get_table() + local this = WPT.get() if not this.soft_reset_counter then this.soft_reset_counter = 0 diff --git a/maps/mountain_fortress_v3/surface.lua b/maps/mountain_fortress_v3/surface.lua new file mode 100644 index 00000000..d63f0fe3 --- /dev/null +++ b/maps/mountain_fortress_v3/surface.lua @@ -0,0 +1,89 @@ +require 'util' +local Global = require 'utils.global' +local Event = require 'utils.event' +local surface_name = 'mountain_fortress_v3' +local level_width = require 'maps.mountain_fortress_v3.terrain'.level_width +local Reset = require 'maps.mountain_fortress_v3.soft_reset' + +local Public = {} + +local this = { + active_surface_index = nil, + surface_name = surface_name +} + +Global.register( + this, + function(tbl) + this = tbl + end +) + +local starting_items = {['pistol'] = 1, ['firearm-magazine'] = 16, ['rail'] = 16, ['wood'] = 16, ['explosives'] = 32} + +local function on_init() + local mgs = game.surfaces['nauvis'].map_gen_settings + mgs.width = 16 + mgs.height = 16 + game.surfaces['nauvis'].map_gen_settings = mgs + game.surfaces['nauvis'].clear() + + Public.create_surface() +end + +function Public.create_surface() + local map_gen_settings = { + ['seed'] = math.random(10000, 99999), + ['width'] = level_width, + ['water'] = 0.001, + ['starting_area'] = 1, + ['cliff_settings'] = {cliff_elevation_interval = 0, cliff_elevation_0 = 0}, + ['default_enable_all_autoplace_controls'] = true, + ['autoplace_settings'] = { + ['entity'] = {treat_missing_as_default = false}, + ['tile'] = {treat_missing_as_default = true}, + ['decorative'] = {treat_missing_as_default = true} + } + } + local mine = {} + mine['control-setting:moisture:bias'] = 0.33 + mine['control-setting:moisture:frequency:multiplier'] = 1 + + map_gen_settings.property_expression_names = mine + + if not this.active_surface_index then + this.active_surface_index = game.create_surface(surface_name, map_gen_settings).index + else + game.forces.player.set_spawn_position({-27, 40}, game.surfaces[this.active_surface_index]) + this.active_surface_index = + Reset.soft_reset_map(game.surfaces[this.active_surface_index], map_gen_settings, starting_items).index + end + + local surface = game.surfaces[this.active_surface_index] + + surface.request_to_generate_chunks({-17, 47}, 1) + surface.force_generate_chunk_requests() + + game.forces.player.set_spawn_position({-27, 40}, surface) + return this.active_surface_index +end + +function Public.get_active_surface() + return this.active_surface +end + +function Public.get_surface_name() + return this.surface_name +end + +function Public.get(key) + if key then + return this[key] + else + return this + end +end + +Event.on_init(on_init) + +return Public diff --git a/maps/mountain_fortress_v3/table.lua b/maps/mountain_fortress_v3/table.lua index c7840ce9..6180121d 100644 --- a/maps/mountain_fortress_v3/table.lua +++ b/maps/mountain_fortress_v3/table.lua @@ -3,10 +3,8 @@ local Global = require 'utils.global' local Event = require 'utils.event' local this = { - train_reveal = true, - energy_shared = true, - reveal_normally = false, - disable_reset = false + disable_reset = false, + players = {} } local Public = {} @@ -18,12 +16,6 @@ Global.register( ) function Public.reset_table() - --for k, _ in pairs(this) do - -- this[k] = nil - --end - this.lo_energy = nil - this.ow_energy = nil - this.dummy = nil this.locomotive_index = nil this.loco_surface = nil this.game_lost = false @@ -55,17 +47,11 @@ function Public.reset_table() this.threat_upgrades = 0 end -function Public.get_table() - return this -end - -function Public.init(args) - if args then - this.train_reveal = args.train_reveal - this.energy_shared = args.energy_shared - this.reveal_normally = args.reveal_normally +function Public.get(key) + if key then + return this[key] else - return error('Not a valid init argument', 2) + return this end end diff --git a/maps/mountain_fortress_v3/terrain.lua b/maps/mountain_fortress_v3/terrain.lua index c7ec0c5b..5fa79dbc 100644 --- a/maps/mountain_fortress_v3/terrain.lua +++ b/maps/mountain_fortress_v3/terrain.lua @@ -10,7 +10,8 @@ local Public = {} local math_random = math.random local math_floor = math.floor local math_abs = math.abs -Public.level_depth = 960 +Public.level_depth = 704 +Public.level_width = 400 local worm_level_modifier = 0.18 local average_number_of_wagons_per_level = 2 local chunks_per_level = ((Public.level_depth - 32) / 32) ^ 2 @@ -1171,7 +1172,7 @@ local function is_out_of_map(p) return true end -local function process_bits(_, _, data) +local function process_bits(data) local left_top_y = data.area.left_top.y local index = math_floor((math_abs(left_top_y / Public.level_depth)) % 11) + 1 local process_level = Public.levels[index] @@ -1179,9 +1180,7 @@ local function process_bits(_, _, data) process_level = Public.levels[#Public.levels] end - if not is_out_of_map({x = data.x, y = data.y}) then - process_level(data) - end + process_level(data) end local function border_chunk(data) @@ -1192,6 +1191,9 @@ local function border_chunk(data) for y = 0, 31, 1 do local pos = {x = left_top.x + x, y = left_top.y + y} local p = {x = left_top.x + x, y = left_top.y + y} + if surface.get_tile(p).name == 'out-of-map' then + return + end if math_random(1, math.ceil(p.y + p.y) + 64) == 1 then surface.create_entity({name = trees[math_random(1, #trees)], position = p}) end @@ -1235,6 +1237,9 @@ local function replace_water(data) for x = 0, 31, 1 do for y = 0, 31, 1 do local p = {x = left_top.x + x, y = left_top.y + y} + if surface.get_tile(p).name == 'out-of-map' then + return + end if surface.get_tile(p).collides_with('resource-layer') then surface.set_tiles({{name = 'dirt-' .. math_random(1, 5), position = p}}, true) end @@ -1292,9 +1297,12 @@ local function out_of_map(data) end end -function Public.heavy_functions(x, y, data) +function Public.heavy_functions(_, _, data) local area = data.area local top_y = area.left_top.y + local surface = data.surface + local p = {x = data.x, y = data.y} + local oom = surface.get_tile(p).name == 'out-of-map' data.seed = data.surface.map_gen_settings.seed @@ -1302,8 +1310,12 @@ function Public.heavy_functions(x, y, data) return end + if oom then + return + end + if top_y < 0 then - process_bits(x, y, data) + process_bits(data) end end @@ -1316,26 +1328,23 @@ local function on_chunk_generated(event) local surface = event.surface local seed = surface.map_gen_settings.seed - local position = WPT.get_table().locomotive.position local left_top = event.area.left_top + local p = {x = left_top.x, y = left_top.y} + local oom = surface.get_tile(p).name == 'out-of-map' local data = { surface = surface, seed = seed, - position = position, left_top = left_top } - if left_top.x >= Public.level_depth * 0.5 then - return - end - if left_top.x < Public.level_depth * -0.5 then + if left_top.y % Public.level_depth == 0 and left_top.y < 0 then + WPT.get().left_top = data.left_top + wall(data) return end - if left_top.y % Public.level_depth == 0 and left_top.y < 0 then - WPT.get_table().left_top = data.left_top - wall(data) + if oom then return end @@ -1360,9 +1369,11 @@ local function on_chunk_generated(event) end if left_top.y == -128 and left_top.x == -128 then - local p = WPT.get_table().locomotive.position + local pl = WPT.get().locomotive.position for _, entity in pairs( - surface.find_entities_filtered({area = {{p.x - 3, p.y - 4}, {p.x + 3, p.y + 10}}, type = 'simple-entity'}) + surface.find_entities_filtered( + {area = {{pl.x - 3, pl.y - 4}, {pl.x + 3, pl.y + 10}}, type = 'simple-entity'} + ) ) do entity.destroy() end @@ -1373,8 +1384,6 @@ local function on_chunk_generated(event) place_wagon(data) end end - - --out_of_map_area(data) end Event.add(defines.events.on_chunk_generated, on_chunk_generated)