diff --git a/config/expcore/roles.lua b/config/expcore/roles.lua index d7b94dd0..53ff5cf2 100644 --- a/config/expcore/roles.lua +++ b/config/expcore/roles.lua @@ -229,6 +229,7 @@ Roles.new_role('Member','Mem') 'gui/warp-list/edit', 'command/save-quickbar', 'gui/vlayer-edit', + 'command/vlayer-info', 'command/personal-logistic', 'command/auto-research', 'command/set-trains-to-automatic', diff --git a/config/vlayer.lua b/config/vlayer.lua index dc7cf58d..59aa6ea5 100644 --- a/config/vlayer.lua +++ b/config/vlayer.lua @@ -46,7 +46,7 @@ return { production = 0.06 -- MW }, ['accumulator'] = { - starting_value = 2, + starting_value = 0, required_area = 4, discharge = 0.3, -- MW capacity = 5 -- MJ @@ -54,7 +54,7 @@ return { ['landfill'] = { starting_value = 0, required_area = 0, - surface_area = 4 -- Tiles + surface_area = 6 -- Tiles } -- TODO: Can convert wood directly to energy to reduce trash --[[ diff --git a/modules/commands/vlayer.lua b/modules/commands/vlayer.lua index 63dab231..be42827d 100644 --- a/modules/commands/vlayer.lua +++ b/modules/commands/vlayer.lua @@ -11,18 +11,23 @@ Commands.new_command('personal-battery-recharge', 'Recharge Player Battery upto local armor = player.get_inventory(defines.inventory.character_armor)[1].grid for i=1, #armor.equipment do - if armor.equipment[i].energy < (armor.equipment[i].max_energy * amount) then - local energy_required = (armor.equipment[i].max_energy * amount) - armor.equipment[i].energy + local target = math.floor(armor.equipment[i].max_energy * amount) - if vlayer.power.energy >= energy_required then - armor.equipment[i].energy = armor.equipment[i].max_energy * amount - vlayer.power.energy = vlayer.power.energy - energy_required - else - armor.equipment[i].energy = armor.equipment[i].energy + vlayer.power.energy - vlayer.power.energy = 0 - end + if armor.equipment[i].energy < target then + local energy_required = math.min(math.floor(target - armor.equipment[i].energy), vlayer.get_statistics()['energy_storage']) + armor.equipment[i].energy = armor.equipment[i].energy + energy_required + vlayer.energy_changed(- energy_required) end end return Commands.success end) + +Commands.new_command('vlayer-info', 'Vlayer Info') +:register(function(_) + local c = vlayer.get_circuits() + + for k, v in pairs(c) do + Commands.print(v .. ' : ' .. k) + end +end) diff --git a/modules/control/vlayer.lua b/modules/control/vlayer.lua index b710c007..ef2026d1 100644 --- a/modules/control/vlayer.lua +++ b/modules/control/vlayer.lua @@ -148,6 +148,7 @@ local function get_sustained_multiplier() local day_duration = 1 - surface.dawn + surface.dusk local sunset_duration = surface.evening - surface.dusk local sunrise_duration = surface.dawn - surface.morning + return mul * (day_duration + (0.5 * (sunset_duration + sunrise_duration))) end @@ -300,6 +301,7 @@ local function handle_input_interfaces() else vlayer.insert_item(name, count) end + else vlayer.insert_item(name, count) end @@ -395,26 +397,35 @@ function vlayer.get_statistics() return { total_surface_area = vlayer_data.properties.total_surface_area, used_surface_area = vlayer_data.properties.used_surface_area, + remaining_surface_area = math.max(vlayer_data.properties.total_surface_area - vlayer_data.properties.used_surface_area, 0), energy_production = vlayer_data.properties.production * mega * get_production_multiplier(), energy_sustained = vlayer_data.properties.production * mega * get_sustained_multiplier(), energy_capacity = vlayer_data.properties.capacity * mega, energy_storage = vlayer_data.storage.energy, day = math.floor(game.tick / vlayer_data.surface.ticks_per_day), - time =math.floor(vlayer_data.surface.daytime * vlayer_data.surface.ticks_per_day) + time = math.floor(vlayer_data.surface.daytime * vlayer_data.surface.ticks_per_day) } end +--- add or reduce vlayer power +function vlayer.energy_changed(power) + vlayer_data.storage.energy = vlayer_data.storage.energy + power +end + --- Circuit signals used for the statistics -local circuit_signals = { - total_surface_area = 'signal-A', - used_surface_area = 'signal-B', - energy_production = 'signal-P', - energy_sustained = 'signal-S', - energy_capacity = 'signal-C', - energy_storage = 'signal-E', - day = 'signal-D', - time = 'signal-T', -} +function vlayer.get_circuits() + return { + total_surface_area = 'signal-A', + used_surface_area = 'signal-U', + remaining_surface_area = 'signal-R', + energy_production = 'signal-P', + energy_sustained = 'signal-S', + energy_capacity = 'signal-C', + energy_storage = 'signal-E', + day = 'signal-D', + time = 'signal-T', + } +end --- Create a new circuit interface -- @tparam LuaSurface surface The surface to place the interface onto @@ -447,9 +458,10 @@ local function handle_circuit_interfaces() local circuit_oc = interface.get_or_create_control_behavior() local max_signals = circuit_oc.signals_count local signal_index = 1 + local circuit = vlayer.get_circuits() -- Set the virtual signals based on the vlayer stats - for stat_name, signal_name in pairs(circuit_signals) do + for stat_name, signal_name in pairs(circuit) do if stat_name:find('energy') then circuit_oc.set_signal(signal_index, {signal={type='virtual', name=signal_name}, count=math.floor(stats[stat_name] / mega)}) @@ -476,6 +488,7 @@ local function handle_circuit_interfaces() if not circuit_oc.get_signal(clear_index).signal then break -- There are no more signals to clear end + circuit_oc.set_signal(clear_index, nil) end end