Add auto personal battery recharge (#327)

* Update bonus.lua

* Update vlayer.lua

* Update roles.lua

* Update gui.cfg

* Update gui.cfg

* Update gui.cfg

* Update bonus.lua

* Update bonus.lua

* Update bonus.lua

* Update bonus.lua

* Update vlayer.lua

* Update bonus.lua

* Update bonus.lua

* Update bonus.lua
This commit is contained in:
2024-09-21 06:34:24 +09:00
committed by GitHub
parent 5135ef9bd9
commit a1ffe3f4c8
7 changed files with 73 additions and 32 deletions

View File

@@ -5,20 +5,19 @@ return {
--[[ --[[
TODO TODO
force bonus force bonus
vlayer battery recharge (auto)
quick health regeneration quick health regeneration
Base point is equal to the amount of standard value in each parameter. Base point is equal to the amount of standard value in each parameter.
CMMS CRS CCS CISB CHB CRDB CMMS CRS CCS CISB CHB CRDB PBR
STD 30 90 32 20 16 12 STD 30 90 32 20 16 12 60
= 200 = 260
MAX 60 180 64 40 32 24 MAX 60 180 64 40 32 24 120
= 400 = 480
]] ]]
pts = { pts = {
base = 200 base = 260
}, },
gui_display_width = { gui_display_width = {
half = 150, half = 150,
@@ -32,11 +31,23 @@ return {
['ccs'] = 'character_crafting_speed_modifier', ['ccs'] = 'character_crafting_speed_modifier',
['cisb'] = 'character_inventory_slots_bonus', ['cisb'] = 'character_inventory_slots_bonus',
['chb'] = 'character_health_bonus', ['chb'] = 'character_health_bonus',
['crdb'] = 'character_reach_distance_bonus' ['crdb'] = 'character_reach_distance_bonus',
--[[ --[[
['cpdb'] = 'character_item_pickup_distance_bonus' ['cpdb'] = 'character_item_pickup_distance_bonus'
]] ]]
}, },
player_special_bonus_rate = 300,
player_special_bonus = {
['personal_battery_recharge'] = {
-- 1 MW
value = 6,
max = 12,
scale = 1,
cost_scale = 4,
cost = 40,
is_percentage = false
}
},
player_bonus = { player_bonus = {
['character_mining_speed_modifier'] = { ['character_mining_speed_modifier'] = {
value = 3, value = 3,

View File

@@ -141,7 +141,6 @@ Roles.new_role('Board Member','Board')
'command/repair', 'command/repair',
'command/spectate', 'command/spectate',
'command/follow', 'command/follow',
'command/personal-battery-recharge',
'gui/playerdata' 'gui/playerdata'
} }

View File

@@ -229,6 +229,8 @@ display-chb=Health
display-chb-tooltip=Character health bonus display-chb-tooltip=Character health bonus
display-crdb=Reach display-crdb=Reach
display-crdb-tooltip=Character reach distance bonus display-crdb-tooltip=Character reach distance bonus
display-personal-battery-recharge=Battery
display-personal-battery-recharge-tooltip=Player battery recharge
display-fmms=Mining display-fmms=Mining
display-fmms-tooltip=Force manual mining speed display-fmms-tooltip=Force manual mining speed
display-frs=Running display-frs=Running

View File

@@ -233,6 +233,8 @@ display-chb=生命
display-chb-tooltip=個人生命 display-chb-tooltip=個人生命
display-crdb=到達距離 display-crdb=到達距離
display-crdb-tooltip=個人到達距離 display-crdb-tooltip=個人到達距離
display-personal-battery-recharge=電池充電
display-personal-battery-recharge-tooltip=為玩家電池充電
display-fmms=挖掘速度 display-fmms=挖掘速度
display-fmms-tooltip=勢力挖掘速度 display-fmms-tooltip=勢力挖掘速度
display-frs=跑步速度 display-frs=跑步速度

View File

@@ -233,6 +233,8 @@ display-chb=生命
display-chb-tooltip=個人生命 display-chb-tooltip=個人生命
display-crdb=到達距離 display-crdb=到達距離
display-crdb-tooltip=個人到達距離 display-crdb-tooltip=個人到達距離
display-personal-battery-recharge=電池充電
display-personal-battery-recharge-tooltip=為玩家電池充電
display-fmms=挖掘速度 display-fmms=挖掘速度
display-fmms-tooltip=勢力挖掘速度 display-fmms-tooltip=勢力挖掘速度
display-frs=跑步速度 display-frs=跑步速度

View File

@@ -5,28 +5,6 @@ local Commands = require 'expcore.commands' --- @dep expcore.commands
require 'config.expcore.command_general_parse' require 'config.expcore.command_general_parse'
local vlayer = require 'modules.control.vlayer' local vlayer = require 'modules.control.vlayer'
Commands.new_command('personal-battery-recharge', {'vlayer.description-pbr'}, 'Recharge Player Battery upto a portion with vlayer')
:add_param('amount', 'number-range', 0.2, 1)
:register(function(player, amount)
if vlayer.get_statistics()['energy_sustained'] == 0 then
return Commands.error({'vlayer.pbr-not-running'})
end
local armor = player.get_inventory(defines.inventory.character_armor)[1].grid
for i=1, #armor.equipment do
local target = math.floor(armor.equipment[i].max_energy * amount)
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.description-vi'}, 'Vlayer Info') Commands.new_command('vlayer-info', {'vlayer.description-vi'}, 'Vlayer Info')
:register(function(_) :register(function(_)
local c = vlayer.get_circuits() local c = vlayer.get_circuits()

View File

@@ -7,6 +7,8 @@ local Gui = require 'expcore.gui' --- @dep expcore.gui
local Roles = require 'expcore.roles' --- @dep expcore.roles local Roles = require 'expcore.roles' --- @dep expcore.roles
local Event = require 'utils.event' --- @dep utils.event local Event = require 'utils.event' --- @dep utils.event
local config = require 'config.bonus' --- @dep config.bonus local config = require 'config.bonus' --- @dep config.bonus
local vlayer = require 'modules.control.vlayer'
local format_number = require('util').format_number --- @dep util local format_number = require('util').format_number --- @dep util
local bonus_container local bonus_container
@@ -19,6 +21,8 @@ local function bonus_gui_pts_needed(player)
total = total + (disp['bonus_display_' .. k .. '_slider'].slider_value / config.player_bonus[v].cost_scale * config.player_bonus[v].cost) total = total + (disp['bonus_display_' .. k .. '_slider'].slider_value / config.player_bonus[v].cost_scale * config.player_bonus[v].cost)
end end
total = total + (disp['bonus_display_personal_battery_recharge_slider'].slider_value / config.player_special_bonus['personal_battery_recharge'].cost_scale * config.player_special_bonus['personal_battery_recharge'].cost)
return total return total
end end
@@ -49,7 +53,38 @@ local function apply_bonus(player)
if config.player_bonus[v].combined_bonus then if config.player_bonus[v].combined_bonus then
for i=1, #config.player_bonus[v].combined_bonus do for i=1, #config.player_bonus[v].combined_bonus do
player[config.player_bonus[v].combined_bonus[i]] = 0 player[config.player_bonus[v].combined_bonus[i]] = disp['bonus_display_' .. k .. '_slider'].slider_value
end
end
end
end
local function apply_periodic_bonus(player)
if not Roles.player_allowed(player, 'gui/bonus') then
return
end
if not player.character then
return
end
local frame = Gui.get_left_element(player, bonus_container)
local disp = frame.container['bonus_st_2'].disp.table
if vlayer.get_statistics()['energy_sustained'] > 0 then
local armor = player.get_inventory(defines.inventory.character_armor)[1].grid
if armor then
local slider = disp['bonus_display_personal_battery_recharge_slider'].slider_value * 100000 * config.player_special_bonus_rate / 6
for i=1, #armor.equipment do
if armor.equipment[i].energy < armor.equipment[i].max_energy then
local energy_required = math.min(math.floor(armor.equipment[i].max_energy - armor.equipment[i].energy), vlayer.get_statistics()['energy_storage'], slider)
armor.equipment[i].energy = armor.equipment[i].energy + energy_required
vlayer.energy_changed(- energy_required)
slider = slider - energy_required
end
end end
end end
end end
@@ -146,6 +181,10 @@ Gui.element{
end end
end end
local slider = disp['bonus_display_personal_battery_recharge_slider']
slider.slider_value = config.player_special_bonus['personal_battery_recharge'].value
disp[slider.tags.counter].caption = format_number(slider.slider_value)
local r = bonus_gui_pts_needed(player) local r = bonus_gui_pts_needed(player)
element.parent[bonus_gui_control_pts_n_count.name].caption = r element.parent[bonus_gui_control_pts_n_count.name].caption = r
element.parent[bonus_gui_control_pts_r_count.name].caption = tonumber(element.parent[bonus_gui_control_pts_a_count.name].caption) - r element.parent[bonus_gui_control_pts_r_count.name].caption = tonumber(element.parent[bonus_gui_control_pts_a_count.name].caption) - r
@@ -266,6 +305,8 @@ Gui.element(function(_, parent, name)
bonus_gui_slider(disp, 'bonus_display_' .. k, {'bonus.display-' .. k}, {'bonus.display-' .. k .. '-tooltip'}, config.player_bonus[v]) bonus_gui_slider(disp, 'bonus_display_' .. k, {'bonus.display-' .. k}, {'bonus.display-' .. k .. '-tooltip'}, config.player_bonus[v])
end end
bonus_gui_slider(disp, 'bonus_display_personal_battery_recharge', {'bonus.display-personal-battery-recharge'}, {'bonus.display-personal-battery-recharge-tooltip'}, config.player_special_bonus['personal_battery_recharge'])
return bonus_set return bonus_set
end) end)
@@ -343,3 +384,9 @@ Event.add(defines.events.on_player_died, function(event)
player.ticks_to_respawn = 120 player.ticks_to_respawn = 120
end end
end) end)
Event.on_nth_tick(config.player_special_bonus_rate, function(_)
for _, player in pairs(game.connected_players) do
apply_periodic_bonus(player)
end
end)