From a1ffe3f4c82f40eced626613b4bd4041b9a7269c Mon Sep 17 00:00:00 2001 From: PHIDIAS Date: Sat, 21 Sep 2024 06:34:24 +0900 Subject: [PATCH] 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 --- config/bonus.lua | 27 ++++++++++++++------ config/expcore/roles.lua | 1 - locale/en/gui.cfg | 2 ++ locale/zh-CN/gui.cfg | 2 ++ locale/zh-TW/gui.cfg | 2 ++ modules/commands/vlayer.lua | 22 ----------------- modules/gui/bonus.lua | 49 ++++++++++++++++++++++++++++++++++++- 7 files changed, 73 insertions(+), 32 deletions(-) diff --git a/config/bonus.lua b/config/bonus.lua index c009aa0f..ff665d4c 100644 --- a/config/bonus.lua +++ b/config/bonus.lua @@ -5,20 +5,19 @@ return { --[[ TODO force bonus - vlayer battery recharge (auto) quick health regeneration Base point is equal to the amount of standard value in each parameter. - CMMS CRS CCS CISB CHB CRDB - STD 30 90 32 20 16 12 - = 200 + CMMS CRS CCS CISB CHB CRDB PBR + STD 30 90 32 20 16 12 60 + = 260 - MAX 60 180 64 40 32 24 - = 400 + MAX 60 180 64 40 32 24 120 + = 480 ]] pts = { - base = 200 + base = 260 }, gui_display_width = { half = 150, @@ -32,11 +31,23 @@ return { ['ccs'] = 'character_crafting_speed_modifier', ['cisb'] = 'character_inventory_slots_bonus', ['chb'] = 'character_health_bonus', - ['crdb'] = 'character_reach_distance_bonus' + ['crdb'] = 'character_reach_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 = { ['character_mining_speed_modifier'] = { value = 3, diff --git a/config/expcore/roles.lua b/config/expcore/roles.lua index 15acdf83..0befe067 100644 --- a/config/expcore/roles.lua +++ b/config/expcore/roles.lua @@ -141,7 +141,6 @@ Roles.new_role('Board Member','Board') 'command/repair', 'command/spectate', 'command/follow', - 'command/personal-battery-recharge', 'gui/playerdata' } diff --git a/locale/en/gui.cfg b/locale/en/gui.cfg index 77ea9fdc..cd5a0dbd 100644 --- a/locale/en/gui.cfg +++ b/locale/en/gui.cfg @@ -229,6 +229,8 @@ display-chb=Health display-chb-tooltip=Character health bonus display-crdb=Reach 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-tooltip=Force manual mining speed display-frs=Running diff --git a/locale/zh-CN/gui.cfg b/locale/zh-CN/gui.cfg index 16421849..1358ebfe 100644 --- a/locale/zh-CN/gui.cfg +++ b/locale/zh-CN/gui.cfg @@ -233,6 +233,8 @@ display-chb=生命 display-chb-tooltip=個人生命 display-crdb=到達距離 display-crdb-tooltip=個人到達距離 +display-personal-battery-recharge=電池充電 +display-personal-battery-recharge-tooltip=為玩家電池充電 display-fmms=挖掘速度 display-fmms-tooltip=勢力挖掘速度 display-frs=跑步速度 diff --git a/locale/zh-TW/gui.cfg b/locale/zh-TW/gui.cfg index 16421849..1358ebfe 100644 --- a/locale/zh-TW/gui.cfg +++ b/locale/zh-TW/gui.cfg @@ -233,6 +233,8 @@ display-chb=生命 display-chb-tooltip=個人生命 display-crdb=到達距離 display-crdb-tooltip=個人到達距離 +display-personal-battery-recharge=電池充電 +display-personal-battery-recharge-tooltip=為玩家電池充電 display-fmms=挖掘速度 display-fmms-tooltip=勢力挖掘速度 display-frs=跑步速度 diff --git a/modules/commands/vlayer.lua b/modules/commands/vlayer.lua index ec25fe3e..36d919f2 100644 --- a/modules/commands/vlayer.lua +++ b/modules/commands/vlayer.lua @@ -5,28 +5,6 @@ local Commands = require 'expcore.commands' --- @dep expcore.commands require 'config.expcore.command_general_parse' 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') :register(function(_) local c = vlayer.get_circuits() diff --git a/modules/gui/bonus.lua b/modules/gui/bonus.lua index 3d3c1fe4..9d210049 100644 --- a/modules/gui/bonus.lua +++ b/modules/gui/bonus.lua @@ -7,6 +7,8 @@ local Gui = require 'expcore.gui' --- @dep expcore.gui local Roles = require 'expcore.roles' --- @dep expcore.roles local Event = require 'utils.event' --- @dep utils.event local config = require 'config.bonus' --- @dep config.bonus +local vlayer = require 'modules.control.vlayer' + local format_number = require('util').format_number --- @dep util 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) 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 end @@ -49,7 +53,38 @@ local function apply_bonus(player) if config.player_bonus[v].combined_bonus then 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 @@ -146,6 +181,10 @@ Gui.element{ 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) 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 @@ -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]) 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 end) @@ -343,3 +384,9 @@ Event.add(defines.events.on_player_died, function(event) player.ticks_to_respawn = 120 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)