diff options
Diffstat (limited to 'Data/BuiltIn/Libraries/lua-addons/addons/reive/reive.lua')
-rw-r--r-- | Data/BuiltIn/Libraries/lua-addons/addons/reive/reive.lua | 892 |
1 files changed, 892 insertions, 0 deletions
diff --git a/Data/BuiltIn/Libraries/lua-addons/addons/reive/reive.lua b/Data/BuiltIn/Libraries/lua-addons/addons/reive/reive.lua new file mode 100644 index 0000000..854ef29 --- /dev/null +++ b/Data/BuiltIn/Libraries/lua-addons/addons/reive/reive.lua @@ -0,0 +1,892 @@ +--[[ +reive v1.20131021 + +Copyright (c) 2013, Giuliano Riccio +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in the +documentation and/or other materials provided with the distribution. +* Neither the name of reive nor the +names of its contributors may be used to endorse or promote products +derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL Giuliano Riccio BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +]] + +require 'chat' +require 'logger' +require 'strings' + +local config = require 'config' + + +_addon.name = 'reive' +_addon.author = 'Zohno' +_addon.version = '1.20131221' +_addon.command = 'reive' + +tb_name = 'addon:gr:reive' +track = false +visible = false + +stats = T{} +stats.exp = 0 +stats.bayld = 0 +stats.tot_exp = 0 +stats.tot_bayld = 0 +stats.scores = T{} +stats.bonuses = T{} + +bonuses_map = { + ['HP recovery'] = 'hp_recovery', + ['MP recovery'] = 'mp_recovery', + ['TP recovery'] = 'tp_recovery', + ['Status ailment recovery'] = 'status_recovery', + ['Stoneskin'] = 'stoneskin', + ['Ability cast recovery'] = 'abilities_recovery', + ['Increased maximum MP and HP'] = 'hp_mp_boost' +} + +defaults = T{} +defaults.reset_on_start = false -- deprecated +defaults.max_scores = 5 +defaults.light = false + +defaults.track = T{} +defaults.track.hp_recovery = true +defaults.track.mp_recovery = true +defaults.track.tp_recovery = true +defaults.track.status_recovery = true +defaults.track.stoneskin = true +defaults.track.abilities_recovery = true +defaults.track.hp_mp_boost = true + +defaults.position = T{} +defaults.position.x = 0 +defaults.position.y = 350 + +defaults.font = T{} +defaults.font.family = 'Arial' +defaults.font.size = 10 +defaults.font.a = 255 +defaults.font.bold = false +defaults.font.italic = false + +defaults.colors = T{} +defaults.colors.background = T{} +defaults.colors.background.r = 0 +defaults.colors.background.g = 43 +defaults.colors.background.b = 54 +defaults.colors.background.a = 200 + +defaults.colors.reive = T{} +defaults.colors.reive.title = T{} +defaults.colors.reive.title.r = 220 +defaults.colors.reive.title.g = 50 +defaults.colors.reive.title.b = 47 + +defaults.colors.reive.label = T{} +defaults.colors.reive.label.r = 38 +defaults.colors.reive.label.g = 139 +defaults.colors.reive.label.b = 210 + +defaults.colors.reive.value = T{} +defaults.colors.reive.value.r = 147 +defaults.colors.reive.value.g = 161 +defaults.colors.reive.value.b = 161 + +defaults.colors.score = T{} +defaults.colors.score.title = T{} +defaults.colors.score.title.r = 220 +defaults.colors.score.title.g = 50 +defaults.colors.score.title.b = 47 + +defaults.colors.score.label = T{} +defaults.colors.score.label.r = 42 +defaults.colors.score.label.g = 161 +defaults.colors.score.label.b = 152 + +defaults.colors.bonus = T{} +defaults.colors.bonus.title = T{} +defaults.colors.bonus.title.r = 220 +defaults.colors.bonus.title.g = 50 +defaults.colors.bonus.title.b = 47 + +defaults.colors.bonus.label = T{} +defaults.colors.bonus.label.r = 133 +defaults.colors.bonus.label.g = 153 +defaults.colors.bonus.label.b = 0 + +defaults.colors.bonus.value = T{} +defaults.colors.bonus.value.r = 147 +defaults.colors.bonus.value.g = 161 +defaults.colors.bonus.value.b = 161 + +settings = config.load(defaults) + +-- plugin functions + +function parse_options(args) + local options = T{} + + while #args > 0 do + if not args[1]:match('^-%a') then + break + end + + local option = args:remove(1):sub(2) + + if type(args[1]) ~= 'nil' and not args[1]:match('^-%a') then + options[option] = args:remove(1) + else + options[option] = true + end + end + + return options +end + +function test() + start_tracking() + windower.add_to_chat(121, 'Reive momentum score: HP recovery.') + windower.add_to_chat(121, 'Momentum bonus: Ability cast recovery!') + windower.add_to_chat(121, 'Reive momentum score: Damage taken.') + windower.add_to_chat(121, 'Momentum bonus: Status ailment recovery!') + windower.add_to_chat(121, 'Reive momentum score: Physical attack.') + windower.add_to_chat(121, 'Momentum bonus: Stoneskin!') + windower.add_to_chat(121, 'Reive momentum score: Attack success.') + windower.add_to_chat(121, 'Momentum bonus: HP recovery!') + windower.add_to_chat(121, 'Reive momentum score: HP recovery.') + windower.add_to_chat(121, 'Momentum bonus: TP recovery!') + windower.add_to_chat(121, 'Reive momentum score: Damage taken.') + windower.add_to_chat(121, 'Momentum bonus: Increased maximum HP and MP!') + windower.add_to_chat(121, 'Reive momentum score: Physical attack.') + windower.add_to_chat(131, 'Player gains 408 limit points.') + windower.add_to_chat(121, 'Player obtained 291 bayld!') + windower.add_to_chat(121, 'Player obtained 329 bayld!') + windower.add_to_chat(121, 'Player obtained 405 bayld!') + windower.add_to_chat(131, 'Player gains 426 limit points.') + stop_tracking() + show_window() +end + +function start_tracking() + reset_stats() + log('The Reive has begun!') + + track = true + + if settings.light == false then + show_window() + end +end + +function stop_tracking() + stats.scores = T{} + stats.bonuses = T{} + track = false + + log('The Reive has ended.') + hide_window() + show_report() +end + +function refresh() + if visible == false then + return + end + + local reive_colors = settings.colors.reive + local text = + ' \\cs('..reive_colors.title.r..', '..reive_colors.title.g..', '..reive_colors.title.b..')--== REIVE ==--\\cr \n'.. + ' \\cs('..reive_colors.label.r..', '..reive_colors.label.g..', '..reive_colors.label.b..')Bayld:\\cr'.. + ' \\cs('..reive_colors.value.r..', '..reive_colors.value.g..', '..reive_colors.value.b..')'..stats.bayld..'/'..stats.tot_bayld..'\\cr \n'.. + ' \\cs('..reive_colors.label.r..', '..reive_colors.label.g..', '..reive_colors.label.b..')EXP:\\cr'.. + ' \\cs('..reive_colors.value.r..', '..reive_colors.value.g..', '..reive_colors.value.b..')'..stats.exp..'/'..stats.tot_exp..'\\cr ' + + local scores_colors = settings.colors.score + local scores = ''; + + if #stats.scores > 0 then + local base = math.max(0, #stats.scores - settings.max_scores) + + for index, score in pairs(stats.scores:slice(base + 1, #stats.scores)) do + scores = scores.. + '\n \\cs('..scores_colors.label.r..', '..scores_colors.label.g..', '..scores_colors.label.b..')'..(base + index)..'. '..score..'\\cr ' + end + + text = text..'\n \\cs('..scores_colors.title.r..', '..scores_colors.title.g..', '..scores_colors.title.b..')--== MOMENTUM SCORES ==--\\cr '..scores + end + + local bonuses_colors = settings.colors.bonus + local bonuses = ''; + + for index, bonus in ipairs(stats.bonuses:keyset():sort()) do + if type(bonuses_map[bonus]) == 'nil' or settings.track[bonuses_map[bonus]] == true then + local amount = stats.bonuses[bonus] + + bonuses = bonuses.. + '\n \\cs('..bonuses_colors.label.r..', '..bonuses_colors.label.g..', '..bonuses_colors.label.b..')'..bonus..':\\cr'.. + ' \\cs('..bonuses_colors.value.r..', '..bonuses_colors.value.g..', '..bonuses_colors.value.b..')'..amount..'\\cr ' + end + end + + if #bonuses > 0 then + text = text..'\n \\cs('..bonuses_colors.title.r..', '..bonuses_colors.title.g..', '..bonuses_colors.title.b..')--== MOMENTUM BONUSES ==--\\cr '..bonuses + end + + windower.text.set_text(tb_name, text) +end + +function reset_stats() + stats.exp = 0 + stats.bayld = 0 + refresh() +end + +function full_reset_stats() + stats.tot_exp = 0 + stats.tot_bayld = 0 + reset_stats() + refresh() +end + +function show_window() + visible = true + windower.text.set_visibility(tb_name, true) + refresh() +end + +function hide_window() + visible = false + windower.text.set_visibility(tb_name, false) +end + +function toggle_window() + if visible then + hide_window() + else + show_window() + end +end + +function show_report() + log('[EXP '..(stats.exp..'/'..stats.tot_exp):color(258)..'] [Bayld '..(stats.bayld..'/'..stats.tot_bayld):color(258)..']') +end + +-- windower events + +windower.register_event('load', function() + local background = settings.colors.background + + windower.text.create(tb_name) + windower.text.set_location(tb_name, settings.position.x, settings.position.y) + windower.text.set_bg_color(tb_name, background.a, background.r, background.g, background.b) + windower.text.set_color(tb_name, settings.font.a, 147, 161, 161) + windower.text.set_font(tb_name, settings.font.family) + windower.text.set_font_size(tb_name, settings.font.size) + windower.text.set_bold(tb_name, settings.font.bold) + windower.text.set_italic(tb_name, settings.font.italic) + windower.text.set_text(tb_name, '') + windower.text.set_bg_visibility(tb_name, true) + + local player = windower.ffxi.get_player() + if player and T(player['buffs']):contains(511) then + start_tracking() + end +end) + +windower.register_event('unload', function() + windower.text.delete(tb_name) +end) + +windower.register_event('gain buff', start_tracking:cond(function(id) return id == 511 end)) +windower.register_event('lose buff', stop_tracking:cond(function(id) return id == 511 end)) + +windower.register_event('incoming text', function(original, modified, mode) + local match + + if mode == 121 then + match = original:match('Reive momentum score: ([%s%w]+)%.') + + if match then + stats.scores:append(match) + refresh() + + return modified, mode + end + + match = original:match('Momentum bonus: ([%s%w]+)!') + + if match then + if type(stats.bonuses[match]) == 'nil' then + stats.bonuses[match] = 0 + end + + stats.bonuses[match] = stats.bonuses[match] + 1 + refresh() + + return modified, mode + end + + match = original:match('obtained (%d+) bayld!') + + if match and track then + stats.bayld = stats.bayld + match + stats.tot_bayld = stats.tot_bayld + match + refresh() + end + elseif mode == 131 and track then + match = original:match('gains (%d+) limit points%.') + + if match then + stats.exp = stats.exp + match + stats.tot_exp = stats.tot_exp + match + refresh() + + return modified, mode + end + + match = original:match('gains (%d+) experience points%.') + + + if match then + stats.exp = stats.exp + match + stats.tot_exp = stats.tot_exp + match + refresh() + + return modified, mode + end + end + + return modified, mode +end) + +windower.register_event('addon command', function(...) + local args = T({...}) + + if args[1] == nil then + windower.send_command('reive help') + return + end + + local cmd = args:remove(1):lower() + + if cmd == 'help' then + log(chat.chars.wsquare..' reive help -- shows the help text.') + log(chat.chars.wsquare..' reive test -- fills the chat log with some messages to show how the plugin will work.') + log(chat.chars.wsquare..' reive reset -- sets gained exp and bayld to 0.') + log(chat.chars.wsquare..' reive full-reset -- sets both current and total gained exp and bayld to 0.') + log(chat.chars.wsquare..' reive show -- shows the tracking window.') + log(chat.chars.wsquare..' reive hide -- hides the tracking window.') + log(chat.chars.wsquare..' reive toggle -- toggles the tracking window\'s visibility.') + log(chat.chars.wsquare..' reive light [<enabled>] -- enables or disabled light mode. When enabled, the addon will never show the window and just print a summary in the chat box at the end of the run. If the enabled parameter is not specified, the help text will be shown.') + log(chat.chars.wsquare..' reive max-scores <amount> -- sets the max amount of scores to show in the window. if the amount parameter is not specified, the help text will be shown.') + log(chat.chars.wsquare..' reive track <score> <visible> -- specifies the visibility of a bonus in the window.') + log(chat.chars.wsquare..' reive position [[-h]|[-x <x>] [-y <y>]] -- sets the horizontal and vertical position of the window relative to the upper-left corner. If the no parameter is specified, the help text will be shown.') + log(chat.chars.wsquare..' reive font [[-h]|[-f <font>] [-s <size>] [-a <alpha>] [-b [<bold>]] [-i [<italic>]]] -- sets the style of the font used in the window. if the no parameter is specified, the help text will be shown.') + log(chat.chars.wsquare..' reive color [[-h]|[-o <objects>] [-d] [-r <red>] [-g <green>] [-b <blue>] [-a <alpha>]] -- sets the colors of the various elements present in the addon\'s window. If the no parameter is specified, the help text will be shown.') + elseif cmd == 'test' then + test() + elseif cmd == 'reset' then + reset_stats() + elseif cmd == 'full-reset' then + full_reset_stats() + elseif cmd == 'show' then + show_window() + elseif cmd == 'hide' then + hide_window() + elseif cmd == 'toggle' then + toggle_window() + elseif cmd == 'light' then + if type(args[1]) == 'nil' then + log('Enables or disabled light mode. When enabled, the addon will never show the window and just print a summary in the chat box at the end of the run. Ff the enabled parameter is not specified, the help text will be shown.') + log('Usage: reive light <enabled>') + log('Positional arguments:') + log(chat.chars.wsquare..' <enabled> specifies the status of the light mode. "default", "false" or "0" mean disabled. "true" or "1" mean enabled.') + else + local light + + if args[1] == 'default' then + light = defaults.light + elseif args[1] == 'true' or args[1] == '1' then + light = true + elseif args[1] == 'false' or args[1] == '0' then + light = false + end + + if light == true then + hide_window() + elseif track == true then + show_window() + end + + if type(light) ~= "boolean" then + error('Please specify a valid status') + + return + end + + settings.light = light + + refresh() + settings:save('all') + log('The light mode has been set.') + end + elseif cmd == 'max-scores' then + local max_scores + + if type(args[1]) == 'nil' then + log('Sets the max amount of scores to show in the window. If the amount parameter is not specified, the help text will be shown.') + log('Usage: reive max-scores <amount>') + log('Positional arguments:') + log(chat.chars.wsquare..' <amount> specifies the max amount of status scores that will be show. By default this value is 5. Setting this value to 0 will hide the scores section.') + elseif args[1] == 'default' then + max_scores = defaults.max_scores + else + max_scores = tonumber(args[1]) + end + + if type(max_scores) ~= "number" then + error('Please specify a valid amount of scores.') + end + + if errors:length() == 0 then + settings.max_scores = max_scores + + refresh() + settings:save('all') + notice('The max amount of scores has been set.') + end + elseif cmd == 'track' then + local object + local visible + local validObjects = T{ + 'abilities-recovery', + 'hp-mp-boost', + 'hp-recovery', + 'mp-recovery', + 'status-recovery', + 'stoneskin', + 'tp-recovery' + } + + if type(args[1]) == 'nil' then + log('Specifies the visibility of a bonus in the window.') + log('Usage: reive track <bonus> <visible>') + log('Positional arguments:') + log(chat.chars.wsquare..' <bonus> specifies the item which will have its visibility changed. The accepted values are : '..validObjects:concat(', ')) + log(chat.chars.wsquare..' <visible> specifies the visibility of the bonus. "false" or "0" mean disabled. "default", "true" or "1" mean enabled.') + elseif validObjects:contains(args[1]) then + object = args[1]:gsub('-', '_') + + if args[2] == 'true' or args[2] == '1' or args[2] == 'default' then + visible = true + elseif args[2] == 'false' or args[2] == '0' then + visible = false + else + error('Please specify a valid visible status.') + + return + end + + settings.track[object] = visible + + refresh() + settings:save('all') + notice('The bonus\' visibility has been set.') + else + error('Please specify a valid bonus.') + + return + end + else + local options = parse_options(args) + + if cmd == 'position' then + if options:containskey('h') or options:length() == 0 then + log('Sets the horizontal and vertical position of the window relative to the upper-left corner. If no parameter is specified, the help text will be shown.') + log('Usage: reive position [[-h]|[-x <x>] [-y <y>]]') + log('Optional arguments:') + log(chat.chars.wsquare..' -h shows the help text.') + log(chat.chars.wsquare..' -x <x> specifies the horizontal position of the window.') + log(chat.chars.wsquare..' -y <y> specifies the vertical position of the window.') + elseif options:length() > 0 then + local x = settings.position.x + local y = settings.position.y + + for key, value in pairs(options) do + if key == 'x' then + if options['x'] == 'default' then + x = defaults.position.x + else + x = tonumber(options['x']) + + if type(x) ~= "number" then + error('Please specify a valid horizontal position.') + + return + end + end + elseif key == 'y' then + if options['y'] == 'default' then + y = defaults.position.y + else + y = tonumber(options['y']) + + if type(y) ~= "number" then + error('Please specify a valid vertical position.') + + return + end + end + + else + error('"'..key..'" is not a recognized parameter') + + return + end + end + + settings.position.x = x + settings.position.y = y + + windower.text.set_location(tb_name, x, y) + settings:save('all') + notice('The window\'s position has been set.') + end + elseif cmd == 'font' then + if options:containskey('h') or options:length() == 0 then + log('Sets the style of the font used in the window. if the no parameter is specified, the help text will be shown.') + log('Usage: reive font [[-h]|[-f <font>] [-s <size>] [-a <alpha>] [-b [<bold>]] [-i [<italic>]]]') + log('Optional arguments:') + log(chat.chars.wsquare..' -h shows the help text.') + log(chat.chars.wsquare..' -f <font> specifies the text\'s font.') + log(chat.chars.wsquare..' -s <size> specifies the text\'s size.') + log(chat.chars.wsquare..' -a <alpha> specifies the text\'s transparency. the value must be set between 0 (transparent) and 255 (opaque), inclusive.') + log(chat.chars.wsquare..' -b [<bold>] specifies if the text should be rendered bold. "default", "false" or "0" mean disabled. "true", "1" or no value mean enabled.') + log(chat.chars.wsquare..' -i [<italic>] specifies if the text should be rendered italic. "default", "false" or "0" mean disabled. "true", "1" or no value mean enabled.') + elseif options:length() > 0 then + local family = settings.font.family + local size = settings.font.size + local bold = settings.font.bold + local italic = settings.font.italic + local a = settings.font.a + + for key, value in pairs(options) do + if key == 'f' then + if options['f'] == 'default' then + family = defaults.font.family + else + family = options['f'] + end + elseif key == 's' then + if options['s'] == 'default' then + size = defaults.position.size + else + size = tonumber(options['s']) + + if type(size) ~= "number" then + error('Please specify a valid font size.') + + return + end + end + elseif key == 'b' then + if options['b'] == 'default' then + bold = defaults.position.bold + elseif options['b'] == true or options['b'] == '1' or options['b'] == 'true' or options['b'] == 'null' then + bold = true + elseif options['b'] == '0' or options['b'] == 'false' then + bold = false + else + error('Please specify a valid bold status.') + + return + end + elseif key == 'i' then + if options['i'] == 'default' then + italic = defaults.position.italic + elseif options['b'] == true or options['i'] == '1' or options['i'] == 'true' or options['i'] == 'null' then + italic = true + elseif options['i'] == '0' or options['i'] == 'false' then + italic = false + else + error('Please specify a valid italic status.') + + return + end + elseif key == 'a' then + if options['a'] == 'default' then + a = defaults.position.a + else + a = tonumber(options['a']) + + if type(a) ~= "number" then + error('Please specify a valid alpha value.') + + return + else + a = math.min(255, math.max(0, a)) + end + end + else + error('"'..key..'" is not a recognized parameter') + + return + end + end + + settings.font.family = family + settings.font.size = size + settings.font.bold = bold + settings.font.italic = italic + settings.font.a = a + + windower.text.set_color(tb_name, a, 147, 161, 161) + windower.text.set_font(tb_name, family, size) + windower.text.set_bold(tb_name, bold) + windower.text.set_italic(tb_name, italic) + settings:save('all') + log('The font\'s style has been set.') + end + elseif cmd == 'color' then + local validObjects = T{ + 'all', 'background', 'bg', 'title', 'label', 'value', + 'reive', 'reive.title', 'reive.label', 'reive.value', + 'score', 'score.title', 'score.label', + 'bonus', 'bonus.title', 'bonus.label', 'bonus.value' + } + + if options:containskey('h') or options:length() == 0 then + log('Sets the colors of the various elements present in the addon\'s window. If the no parameter is specified, the help text will be shown.') + log('Usage: reive color [[-h]|[-o <objects>] [-d] [-r <red>] [-g <green>] [-b <blue>] [-a <alpha>]]') + log('Optional arguments:') + log(chat.chars.wsquare..' -h shows the help text.') + log(chat.chars.wsquare..' -o <objects> specifies the item/s which will have its/their color changed. If this parameter is missing all the objects will be changed. The accepted values are: "'..validObjects:concat('", "')..'"') + log(chat.chars.wsquare..' -d sets the red, green, blue and alpha values of the specified objects to their default values.') + log(chat.chars.wsquare..' -r <red> specifies the intensity of the red color. The value must be set between 0 and 255, inclusive, where 0 is less intense and 255 is most intense.') + log(chat.chars.wsquare..' -g <green> specifies the intensity of the greencolor. The value must be set between 0 and 255, inclusive, where 0 is less intense and 255 is most intense.') + log(chat.chars.wsquare..' -b <blue> specifies the intensity of the blue color. The value must be set between 0 and 255, inclusive, where 0 is less intense and 255 is most intense.') + log(chat.chars.wsquare..' -a <alpha> specifies the text\'s transparency. The value must be set between 0 (transparent) and 255 (opaque), inclusive.') + elseif options:length() > 0 then + local r = -1 + local g = -1 + local b = -1 + local a = -1 + local objects + + if options:containskey('o') then + if validObjects:contains(options['o']) then + if options['o'] == 'background' or options['o'] == 'bg' then + objects = T{'background'} + elseif options['o'] == 'title' then + objects = T{ + 'reive.title', + 'score.title', + 'bonus.title' + } + elseif options['o'] == 'label' then + objects = T{ + 'reive.label', + 'score.label', + 'bonus.label' + } + elseif options['o'] == 'value' then + objects = T{ + 'reive.value', + 'bonus.value' + } + elseif options['o'] == 'reive' then + objects = T{ + 'reive.title', + 'reive.label', + 'reive.value' + } + elseif options['o'] == 'score' then + objects = T{ + 'score.title', + 'score.label' + } + elseif options['o'] == 'bonus' then + objects = T{ + 'bonus.title', + 'bonus.label', + 'bonus.value' + } + elseif options['o'] == 'reive.title' then + objects = T{'reive.title'} + elseif options['o'] == 'reive.label' then + objects = T{'reive.label'} + elseif options['o'] == 'reive.value' then + objects = T{'reive.value'} + elseif options['o'] == 'score.title' then + objects = T{'score.title'} + elseif options['o'] == 'score.label' then + objects = T{'score.label'} + elseif options['o'] == 'bonus.title' then + objects = T{'bonus.title'} + elseif options['o'] == 'bonus.label' then + objects = T{'bonus.label'} + elseif options['o'] == 'bonus.value' then + objects = T{'bonus.value'} + end + else + error('Please specify a valid object or set of objects.') + end + else + objects = T{ + 'background', + 'reive.title', 'reive.label', 'reive.value', + 'score.title', 'score.label', + 'bonus.title', 'bonus.label', 'bonus.value' + } + end + + if not options:containskey('d') then + for key, value in pairs(options) do + if key == 'r' then + if options['r'] == 'default' then + r = -1 + else + r = tonumber(options['r']) + + if type(r) ~= "number" then + error('Please specify a valid red value.') + + return + else + r = math.min(255, math.max(0, r)) + end + end + elseif key == 'g' then + if options['g'] == 'default' then + g = -1 + else + g = tonumber(options['g']) + + if type(g) ~= "number" then + error('Please specify a valid green value.') + + return + else + g = math.min(255, math.max(0, g)) + end + end + elseif key == 'b' then + if options['b'] == 'default' then + b = -1 + else + b = tonumber(options['b']) + + if type(b) ~= "number" then + error('Please specify a valid blue value.') + + return + else + b = math.min(255, math.max(0, b)) + end + end + elseif key == 'a' then + if options['a'] == 'default' then + a = -1 + else + a = tonumber(options['a']) + + if type(a) ~= "number" then + error('Please specify a valid alpha value.') + + return + else + a = math.min(255, math.max(0, a)) + end + end + elseif key == 'o' then + else + error('"'..key..'" is not a recognized parameter.') + + return + end + end + end + + for key, object in pairs(objects) do + local indexes = T(object:split('.')) + + if indexes:length() == 2 then + if r == -1 then + settings.colors[indexes[1]][indexes[2]].r = defaults.colors[indexes[1]][indexes[2]].r + else + settings.colors[indexes[1]][indexes[2]].r = r + end + + if g == -1 then + settings.colors[indexes[1]][indexes[2]].g = defaults.colors[indexes[1]][indexes[2]].g + else + settings.colors[indexes[1]][indexes[2]].g = g + end + + if b == -1 then + settings.colors[indexes[1]][indexes[2]].b = defaults.colors[indexes[1]][indexes[2]].b + else + settings.colors[indexes[1]][indexes[2]].b = b + end + elseif indexes:length() == 1 then + if r == -1 then + settings.colors[indexes[1]].r = defaults.colors[indexes[1]].r + else + settings.colors[indexes[1]].r = r + end + + if g == -1 then + settings.colors[indexes[1]].g = defaults.colors[indexes[1]].g + else + settings.colors[indexes[1]].g = g + end + + if b == -1 then + settings.colors[indexes[1]].b = defaults.colors[indexes[1]].b + else + settings.colors[indexes[1]].b = b + end + + if a == -1 then + settings.colors[indexes[1]].a = defaults.colors[indexes[1]].a + else + settings.colors[indexes[1]].a = a + end + + windower.text.set_bg_color( + tb_name, + settings.colors[indexes[1]].a, + settings.colors[indexes[1]].r, + settings.colors[indexes[1]].g, + settings.colors[indexes[1]].b + ) + end + end + + refresh() + settings:save('all') + log('The objects\' color has been set.') + end + else + windower.send_command('reive help') + end + end +end) |