diff --git a/RangeReticle.lua b/RangeReticle.lua
index 6a941a0..645b6b8 100755
--- a/RangeReticle.lua
+++ b/RangeReticle.lua
@@ -1,148 +1,99 @@
--- Load the addon menu library
-local LAM = LibStub("LibAddonMenu-2.0")
-local db
-local hostileOORColorHex, hostileIRColorHex, hostileIMRColorHex
-local alliesOORColorHex, alliesIRColorHex, alliesIMRColorHex
-local neutralOORColorHex, neutralIRColorHex, neutralIMRColorHex
-local npcsOORColorHex, npcsIRColorHex, npcsIMRColorHex
-local previousDimensionsX, previousDimensionsY
+-- Global Initalizations
+RR = {}
+RR.addonName = 'RangeReticle'
+RR.version = '0.6'
--- Defaults for settings
-local defaults = {
+-- Addon Setup
+function RR.Initialize(eventCode, addOnName)
+ if (addOnName ~= RR.addonName) then return end
- hostileNameEnabled = true,
- hostileLevelEnabled = true,
- hostileRangeEnabled = true,
- hostileDifficultyEnabled = true,
- hostileReticleColoringEnabled = true,
- hostileRangeColoringEnabled = true,
- hostileNameLevelColoringEnabled = true,
- hostileOutOfRangeEnabled = true,
- hostileOORColor = {r=1, g=1, b=0},
- hostileInRangeEnabled = true,
- hostileInRangeDistance = 28,
- hostileIRColor = {r=1, g=0.65, b=0},
- hostileInMeleeRangeEnabled = true,
- hostileInMeleeRangeDistance = 5,
- hostileIMRColor = {r=1, g=0, b=0},
+ RR.LoadSettings()
+ RR.RegisterCommands()
+ --RR.CreateSettingsUI()
+ RR.RegisterEvents()
- alliesNameEnabled = true,
- alliesLevelEnabled = true,
- alliesRangeEnabled = true,
- alliesReticleColoringEnabled = true,
- alliesRangeColoringEnabled = true,
- alliesNameLevelColoringEnabled = true,
- alliesOutOfRangeEnabled = true,
- alliesOORColor = {r=0, g=1, b=1},
- alliesInRangeEnabled = true,
- alliesInRangeDistance = 28,
- alliesIRColor = {r=0, g=0, b=1},
- alliesInMeleeRangeEnabled = true,
- alliesInMeleeRangeDistance = 5,
- alliesIMRColor = {r=0, g=1, b=0},
+ EVENT_MANAGER:UnregisterForEvent(RR.addonName, EVENT_ADD_ON_LOADED)
+end
- neutralNameEnabled = false,
- neutralLevelEnabled = false,
- neutralRangeEnabled = false,
- neutralDifficultyEnabled = false,
- neutralReticleColoringEnabled = false,
- neutralRangeColoringEnabled = false,
- neutralNameLevelColoringEnabled = false,
- neutralOutOfRangeEnabled = false,
- neutralOORColor = {r=1, g=1, b=0},
- neutralInRangeEnabled = false,
- neutralInRangeDistance = 28,
- neutralIRColor = {r=1, g=0.65, b=0},
- neutralInMeleeRangeEnabled = false,
- neutralInMeleeRangeDistance = 5,
- neutralIMRColor = {r=1, g=0, b=0},
+-- Load Addon Settings
+function RR.LoadSettings()
+ RR.SavedVars = ZO_SavedVars:NewAccountWide('RRSavedVariables' , 1, nil, RR.SavedVarsDefaults, nil)
- npcsNameEnabled = false,
- npcsLevelEnabled = false,
- npcsRangeEnabled = false,
- npcsReticleColoringEnabled = false,
- npcsRangeColoringEnabled = false,
- npcsNameLevelColoringEnabled = false,
- npcsOutOfRangeEnabled = false,
- npcsOORColor = {r=0, g=1, b=1},
- npcsInRangeEnabled = false,
- npcsInRangeDistance = 28,
- npcsIRColor = {r=0, g=0, b=1},
- npcsInMeleeRangeEnabled = false,
- npcsInMeleeRangeDistance = 5,
- npcsIMRColor = {r=0, g=1, b=0},
-}
+ RR.targetDebubInfo = false
--- Convert an RGB color percentage 0 to 1 to Hex
-local function RGBPercToHex(r, g, b)
- r = r <= 1 and r >= 0 and r or 0
- g = g <= 1 and g >= 0 and g or 0
- b = b <= 1 and b >= 0 and b or 0
- return string.format("%02x%02x%02x", r*255, g*255, b*255)
-end
+ -- Convert colors to hex
+ RR.hostileIRColorHex = RR.RGBPercToHex(RR.SavedVars.hostileOORColor.r,RR.SavedVars.hostileOORColor.g,RR.SavedVars.hostileOORColor.b)
+ RR.hostileOORColorHex = RR.RGBPercToHex(RR.SavedVars.hostileIRColor.r,RR.SavedVars.hostileIRColor.g,RR.SavedVars.hostileIRColor.b)
+ RR.hostileIMRColorHex = RR.RGBPercToHex(RR.SavedVars.hostileIMRColor.r,RR.SavedVars.hostileIMRColor.g,RR.SavedVars.hostileIMRColor.b)
-local function tprint(tbl, indent)
- if not indent then indent = 0 end
- for k, v in pairs(tbl) do
- formatting = string.rep(" ", indent) .. k .. ": "
- if type(v) == "table" then
- CHAT_SYSTEM:AddMessage(formatting)
- tprint(v, indent+1)
- elseif type(v) == 'boolean' then
- CHAT_SYSTEM:AddMessage(formatting .. tostring(v))
- else
- CHAT_SYSTEM:AddMessage(formatting .. tostring(v))
- end
- end
-end
+ RR.alliesIRColorHex = RR.RGBPercToHex(RR.SavedVars.alliesOORColor.r,RR.SavedVars.alliesOORColor.g,RR.SavedVars.alliesOORColor.b)
+ RR.alliesOORColorHex = RR.RGBPercToHex(RR.SavedVars.alliesIRColor.r,RR.SavedVars.alliesIRColor.g,RR.SavedVars.alliesIRColor.b)
+ RR.alliesIMRColorHex = RR.RGBPercToHex(RR.SavedVars.alliesIMRColor.r,RR.SavedVars.alliesIMRColor.g,RR.SavedVars.alliesIMRColor.b)
--- Setup the addon when it loads
-local function AddonSetup()
- -- Populate the settings DB
- Range_ReticleDB = Range_ReticleDB or {}
- for k,v in pairs(defaults) do
- if type(Range_ReticleDB[k]) == "nil" then
- Range_ReticleDB[k] = v
- end
- end
- db = Range_ReticleDB
+ RR.neutralIRColorHex = RR.RGBPercToHex(RR.SavedVars.neutralOORColor.r,RR.SavedVars.neutralOORColor.g,RR.SavedVars.neutralOORColor.b)
+ RR.neutralOORColorHex = RR.RGBPercToHex(RR.SavedVars.neutralIRColor.r,RR.SavedVars.neutralIRColor.g,RR.SavedVars.neutralIRColor.b)
+ RR.neutralIMRColorHex = RR.RGBPercToHex(RR.SavedVars.neutralIMRColor.r,RR.SavedVars.neutralIMRColor.g,RR.SavedVars.neutralIMRColor.b)
- -- Convert colors to hex
- hostileIRColorHex = RGBPercToHex(db.hostileOORColor.r,db.hostileOORColor.g,db.hostileOORColor.b)
- hostileOORColorHex = RGBPercToHex(db.hostileIRColor.r,db.hostileIRColor.g,db.hostileIRColor.b)
- hostileIMRColorHex = RGBPercToHex(db.hostileIMRColor.r,db.hostileIMRColor.g,db.hostileIMRColor.b)
+ RR.npcsIRColorHex = RR.RGBPercToHex(RR.SavedVars.npcsOORColor.r,RR.SavedVars.npcsOORColor.g,RR.SavedVars.npcsOORColor.b)
+ RR.npcsOORColorHex = RR.RGBPercToHex(RR.SavedVars.npcsIRColor.r,RR.SavedVars.npcsIRColor.g,RR.SavedVars.npcsIRColor.b)
+ RR.npcsIMRColorHex = RR.RGBPercToHex(RR.SavedVars.npcsIMRColor.r,RR.SavedVars.npcsIMRColor.g,RR.SavedVars.npcsIMRColor.b)
- alliesIRColorHex = RGBPercToHex(db.alliesOORColor.r,db.alliesOORColor.g,db.alliesOORColor.b)
- alliesOORColorHex = RGBPercToHex(db.alliesIRColor.r,db.alliesIRColor.g,db.alliesIRColor.b)
- alliesIMRColorHex = RGBPercToHex(db.alliesIMRColor.r,db.alliesIMRColor.g,db.alliesIMRColor.b)
+ RR.previousDimensionsX = 10000
+ RR.previousDimensionsY = 10000
+end
- neutralIRColorHex = RGBPercToHex(db.neutralOORColor.r,db.neutralOORColor.g,db.neutralOORColor.b)
- neutralOORColorHex = RGBPercToHex(db.neutralIRColor.r,db.neutralIRColor.g,db.neutralIRColor.b)
- neutralIMRColorHex = RGBPercToHex(db.neutralIMRColor.r,db.neutralIMRColor.g,db.neutralIMRColor.b)
+-- Register slash commands
+function RR.RegisterCommands()
+ SLASH_COMMANDS['/rret'] = function(text)
+ if text == nil or string.len(text) <= 0 or text == 'help' then
+ d("RangeReticle Help:")
+ d("/rret : display help.")
+ d("/rret map : dump map debug information to chat")
+ d("rret dbg : toggle target debug info mode")
+ elseif text == 'map' then
+ RR.Debug()
+ elseif text == 'dbg' then
+ RR.targetDebubInfo = not RR.targetDebubInfo
+ end
+ end
+end
- npcsIRColorHex = RGBPercToHex(db.npcsOORColor.r,db.npcsOORColor.g,db.npcsOORColor.b)
- npcsOORColorHex = RGBPercToHex(db.npcsIRColor.r,db.npcsIRColor.g,db.npcsIRColor.b)
- npcsIMRColorHex = RGBPercToHex(db.npcsIMRColor.r,db.npcsIMRColor.g,db.npcsIMRColor.b)
+-- Register for events
+function RR.RegisterEvents()
+ EVENT_MANAGER:RegisterForEvent(RR.addonName, EVENT_RETICLE_HIDDEN_UPDATE, RR.OnReticleHiddenUpdate)
+end
- previousDimensionsX = 10000
- previousDimensionsY = 10000
+-- Reticle hidden update
+function RR.OnReticleHiddenUpdate(event)
+ local reticleHidden = IsReticleHidden()
+ RangeReticleRange:SetHidden(reticleHidden)
+ RangeReticleName:SetHidden(reticleHidden)
+end
- SLASH_COMMANDS["/rret"] = CommandHandler
+-- Convert an RGB color percentage 0 to 1 to Hex
+function RR.RGBPercToHex(r, g, b)
+ r = r <= 1 and r >= 0 and r or 0
+ g = g <= 1 and g >= 0 and g or 0
+ b = b <= 1 and b >= 0 and b or 0
+ return string.format("%02x%02x%02x", r*255, g*255, b*255)
end
-- Create the settings in the control panel
-local function CreateSettings()
+function RR.CreateSettingsUI()
+ RR.LAM = LibStub("LibAddonMenu-2.0")
+
local panelData = {
type = "panel",
- name = "RangeReticle",
- displayName = "RangeReticle",
+ name = RR.addonName,
+ displayName = RR.addonName .. " by Adein",
author = "Adein",
- version = "0.6",
- slashCommand = "/rret", --(optional) will register a keybind to open to this panel
+ version = RR.version,
registerForRefresh = true, --boolean (optional) (will refresh all options controls when a setting is changed and when the panel is shown)
registerForDefaults = true, --boolean (optional) (will set all options controls back to default values)
}
+ RR.LAM:RegisterAddonPanel(RR.addonName, panelData)
+
local optionsTable = {
[1] = {
type = "header",
@@ -158,76 +109,76 @@ local function CreateSettings()
type = "checkbox",
name = "Show Name",
tooltip = "If enabled, the target name is shown above the reticle",
- getFunc = function() return db.hostileNameEnabled end,
- setFunc = function() db.hostileNameEnabled = not db.hostileNameEnabled end,
+ getFunc = function() return RR.SavedVars.hostileNameEnabled end,
+ setFunc = function() RR.SavedVars.hostileNameEnabled = not RR.SavedVars.hostileNameEnabled end,
width = "half", --or "half" (optional)
},
[2] = {
type = "checkbox",
name = "Show Level",
tooltip = "If enabled, the target level is shown above the reticle",
- getFunc = function() return db.hostileLevelEnabled end,
- setFunc = function() db.hostileLevelEnabled = not db.hostileLevelEnabled end,
+ getFunc = function() return RR.SavedVars.hostileLevelEnabled end,
+ setFunc = function() RR.SavedVars.hostileLevelEnabled = not RR.SavedVars.hostileLevelEnabled end,
width = "half", --or "half" (optional)
},
[3] = {
type = "checkbox",
name = "Show Range",
tooltip = "If enabled, the target range is shown at the top-right of the reticle",
- getFunc = function() return db.hostileRangeEnabled end,
- setFunc = function() db.hostileRangeEnabled = not db.hostileRangeEnabled end,
+ getFunc = function() return RR.SavedVars.hostileRangeEnabled end,
+ setFunc = function() RR.SavedVars.hostileRangeEnabled = not RR.SavedVars.hostileRangeEnabled end,
width = "half", --or "half" (optional)
},
[4] = {
type = "checkbox",
name = "Show Target Difficulty",
tooltip = "If enabled, the target difficulty is shown as *'s above the reticle",
- getFunc = function() return db.hostileDifficultyEnabled end,
- setFunc = function() db.hostileDifficultyEnabled = not db.hostileDifficultyEnabled end,
+ getFunc = function() return RR.SavedVars.hostileDifficultyEnabled end,
+ setFunc = function() RR.SavedVars.hostileDifficultyEnabled = not RR.SavedVars.hostileDifficultyEnabled end,
width = "half", --or "half" (optional)
},
[5] = {
type = "checkbox",
name = "Colorize Reticle",
tooltip = "If enabled, the color of the target reticle is colorized to reflect range status",
- getFunc = function() return db.hostileReticleColoringEnabled end,
- setFunc = function() db.hostileReticleColoringEnabled = not db.hostileReticleColoringEnabled end,
+ getFunc = function() return RR.SavedVars.hostileReticleColoringEnabled end,
+ setFunc = function() RR.SavedVars.hostileReticleColoringEnabled = not RR.SavedVars.hostileReticleColoringEnabled end,
width = "half", --or "half" (optional)
},
[6] = {
type = "checkbox",
name = "Colorize Range",
tooltip = "If enabled, the color of the target range is colorized to reflect range status",
- getFunc = function() return db.hostileRangeColoringEnabled end,
- setFunc = function() db.hostileRangeColoringEnabled = not db.hostileRangeColoringEnabled end,
+ getFunc = function() return RR.SavedVars.hostileRangeColoringEnabled end,
+ setFunc = function() RR.SavedVars.hostileRangeColoringEnabled = not RR.SavedVars.hostileRangeColoringEnabled end,
width = "half", --or "half" (optional)
},
[7] = {
type = "checkbox",
name = "Colorize Name and Level",
tooltip = "If enabled, the color of the name and level is colorized to reflect range status",
- getFunc = function() return db.hostileNameLevelColoringEnabled end,
- setFunc = function() db.hostileNameLevelColoringEnabled = not db.hostileNameLevelColoringEnabled end,
+ getFunc = function() return RR.SavedVars.hostileNameLevelColoringEnabled end,
+ setFunc = function() RR.SavedVars.hostileNameLevelColoringEnabled = not RR.SavedVars.hostileNameLevelColoringEnabled end,
width = "half", --or "half" (optional)
},
[8] = {
type = "checkbox",
name = "Out Of Range",
tooltip = "If enabled, the reticle color will change when the target is out of range",
- getFunc = function() return db.hostileOutOfRangeEnabled end,
- setFunc = function() db.hostileOutOfRangeEnabled = not db.hostileOutOfRangeEnabled end,
+ getFunc = function() return RR.SavedVars.hostileOutOfRangeEnabled end,
+ setFunc = function() RR.SavedVars.hostileOutOfRangeEnabled = not RR.SavedVars.hostileOutOfRangeEnabled end,
width = "half", --or "half" (optional)
},
[9] = {
type = "colorpicker",
name = "Out Of Range Color",
tooltip = "The reticle color when the target is out of range",
- getFunc = function() return db.hostileOORColor.r, db.hostileOORColor.g, db.hostileOORColor.b end,
+ getFunc = function() return RR.SavedVars.hostileOORColor.r, RR.SavedVars.hostileOORColor.g, RR.SavedVars.hostileOORColor.b end,
setFunc = function(r,g,b,a)
- db.hostileOORColor.r = r
- db.hostileOORColor.g = g
- db.hostileOORColor.b = b
- hostileOORColorHex = RGBPercToHex(r,g,b)
+ RR.SavedVars.hostileOORColor.r = r
+ RR.SavedVars.hostileOORColor.g = g
+ RR.SavedVars.hostileOORColor.b = b
+ hostileOORColorHex = RR.RGBPercToHex(r,g,b)
end,
width = "half", --or "half" (optional)
},
@@ -235,8 +186,8 @@ local function CreateSettings()
type = "checkbox",
name = "In Range",
tooltip = "If enabled, the reticle color will change when the target is in range",
- getFunc = function() return db.hostileInRangeEnabled end,
- setFunc = function() db.hostileInRangeEnabled = not db.hostileInRangeEnabled end,
+ getFunc = function() return RR.SavedVars.hostileInRangeEnabled end,
+ setFunc = function() RR.SavedVars.hostileInRangeEnabled = not RR.SavedVars.hostileInRangeEnabled end,
width = "half", --or "half" (optional)
},
[11] = {
@@ -246,20 +197,20 @@ local function CreateSettings()
min = 0,
max = 60,
step = 1, --(optional)
- getFunc = function() return db.hostileInRangeDistance end,
- setFunc = function(value) db.hostileInRangeDistance = value end,
+ getFunc = function() return RR.SavedVars.hostileInRangeDistance end,
+ setFunc = function(value) RR.SavedVars.hostileInRangeDistance = value end,
width = "half", --or "half" (optional)
},
[12] = {
type = "colorpicker",
name = "In Range Color",
tooltip = "The reticle color when the target is in range",
- getFunc = function() return db.hostileIRColor.r, db.hostileIRColor.g, db.hostileIRColor.b end,
+ getFunc = function() return RR.SavedVars.hostileIRColor.r, RR.SavedVars.hostileIRColor.g, RR.SavedVars.hostileIRColor.b end,
setFunc = function(r,g,b,a)
- db.hostileIRColor.r = r
- db.hostileIRColor.g = g
- db.hostileIRColor.b = b
- hostileIRColorHex = RGBPercToHex(r,g,b)
+ RR.SavedVars.hostileIRColor.r = r
+ RR.SavedVars.hostileIRColor.g = g
+ RR.SavedVars.hostileIRColor.b = b
+ hostileIRColorHex = RR.RGBPercToHex(r,g,b)
end,
width = "half", --or "half" (optional)
},
@@ -267,8 +218,8 @@ local function CreateSettings()
type = "checkbox",
name = "In Melee Range",
tooltip = "If enabled, the reticle color will change when the target is in melee range",
- getFunc = function() return db.hostileInMeleeRangeEnabled end,
- setFunc = function() db.hostileInMeleeRangeEnabled = not db.hostileInMeleeRangeEnabled end,
+ getFunc = function() return RR.SavedVars.hostileInMeleeRangeEnabled end,
+ setFunc = function() RR.SavedVars.hostileInMeleeRangeEnabled = not RR.SavedVars.hostileInMeleeRangeEnabled end,
width = "half", --or "half" (optional)
},
[14] = {
@@ -278,20 +229,20 @@ local function CreateSettings()
min = 0,
max = 60,
step = 1, --(optional)
- getFunc = function() return db.hostileInMeleeRangeDistance end,
- setFunc = function(value) db.hostileInMeleeRangeDistance = value end,
+ getFunc = function() return RR.SavedVars.hostileInMeleeRangeDistance end,
+ setFunc = function(value) RR.SavedVars.hostileInMeleeRangeDistance = value end,
width = "half", --or "half" (optional)
},
[15] = {
type = "colorpicker",
name = "In Melee Range Color",
tooltip = "The reticle color when the target is in melee range",
- getFunc = function() return db.hostileIMRColor.r, db.hostileIMRColor.g, db.hostileIMRColor.b end,
+ getFunc = function() return RR.SavedVars.hostileIMRColor.r, RR.SavedVars.hostileIMRColor.g, RR.SavedVars.hostileIMRColor.b end,
setFunc = function(r,g,b,a)
- db.hostileIMRColor.r = r
- db.hostileIMRColor.g = g
- db.hostileIMRColor.b = b
- hostileIMRColorHex = RGBPercToHex(r,g,b)
+ RR.SavedVars.hostileIMRColor.r = r
+ RR.SavedVars.hostileIMRColor.g = g
+ RR.SavedVars.hostileIMRColor.b = b
+ hostileIMRColorHex = RR.RGBPercToHex(r,g,b)
end,
width = "half", --or "half" (optional)
},
@@ -306,76 +257,76 @@ local function CreateSettings()
type = "checkbox",
name = "Show Name",
tooltip = "If enabled, the target name is shown above the reticle",
- getFunc = function() return db.alliesNameEnabled end,
- setFunc = function() db.alliesNameEnabled = not db.alliesNameEnabled end,
+ getFunc = function() return RR.SavedVars.alliesNameEnabled end,
+ setFunc = function() RR.SavedVars.alliesNameEnabled = not RR.SavedVars.alliesNameEnabled end,
width = "half", --or "half" (optional)
},
[2] = {
type = "checkbox",
name = "Show Level",
tooltip = "If enabled, the target level is shown above the reticle",
- getFunc = function() return db.alliesLevelEnabled end,
- setFunc = function() db.alliesLevelEnabled = not db.alliesLevelEnabled end,
+ getFunc = function() return RR.SavedVars.alliesLevelEnabled end,
+ setFunc = function() RR.SavedVars.alliesLevelEnabled = not RR.SavedVars.alliesLevelEnabled end,
width = "half", --or "half" (optional)
},
[3] = {
type = "checkbox",
name = "Show Range",
tooltip = "If enabled, the target range is shown at the top-right of the reticle",
- getFunc = function() return db.alliesRangeEnabled end,
- setFunc = function() db.alliesRangeEnabled = not db.alliesRangeEnabled end,
+ getFunc = function() return RR.SavedVars.alliesRangeEnabled end,
+ setFunc = function() RR.SavedVars.alliesRangeEnabled = not RR.SavedVars.alliesRangeEnabled end,
width = "half", --or "half" (optional)
},
[4] = {
type = "checkbox",
name = "Show Target Difficulty",
tooltip = "If enabled, the target difficulty is shown as *'s above the reticle",
- getFunc = function() return db.alliesDifficultyEnabled end,
- setFunc = function() db.alliesDifficultyEnabled = not db.alliesDifficultyEnabled end,
+ getFunc = function() return RR.SavedVars.alliesDifficultyEnabled end,
+ setFunc = function() RR.SavedVars.alliesDifficultyEnabled = not RR.SavedVars.alliesDifficultyEnabled end,
width = "half", --or "half" (optional)
},
[5] = {
type = "checkbox",
name = "Colorize Reticle",
tooltip = "If enabled, the color of the target reticle is colorized to reflect range status",
- getFunc = function() return db.alliesReticleColoringEnabled end,
- setFunc = function() db.alliesReticleColoringEnabled = not db.alliesReticleColoringEnabled end,
+ getFunc = function() return RR.SavedVars.alliesReticleColoringEnabled end,
+ setFunc = function() RR.SavedVars.alliesReticleColoringEnabled = not RR.SavedVars.alliesReticleColoringEnabled end,
width = "half", --or "half" (optional)
},
[6] = {
type = "checkbox",
name = "Colorize Range",
tooltip = "If enabled, the color of the target range is colorized to reflect range status",
- getFunc = function() return db.alliesRangeColoringEnabled end,
- setFunc = function() db.alliesRangeColoringEnabled = not db.alliesRangeColoringEnabled end,
+ getFunc = function() return RR.SavedVars.alliesRangeColoringEnabled end,
+ setFunc = function() RR.SavedVars.alliesRangeColoringEnabled = not RR.SavedVars.alliesRangeColoringEnabled end,
width = "half", --or "half" (optional)
},
[7] = {
type = "checkbox",
name = "Colorize Name and Level",
tooltip = "If enabled, the color of the name and level is colorized to reflect range status",
- getFunc = function() return db.alliesNameLevelColoringEnabled end,
- setFunc = function() db.alliesNameLevelColoringEnabled = not db.alliesNameLevelColoringEnabled end,
+ getFunc = function() return RR.SavedVars.alliesNameLevelColoringEnabled end,
+ setFunc = function() RR.SavedVars.alliesNameLevelColoringEnabled = not RR.SavedVars.alliesNameLevelColoringEnabled end,
width = "half", --or "half" (optional)
},
[8] = {
type = "checkbox",
name = "Out Of Range",
tooltip = "If enabled, the reticle color will change when the target is out of range",
- getFunc = function() return db.alliesOutOfRangeEnabled end,
- setFunc = function() db.alliesOutOfRangeEnabled = not db.alliesOutOfRangeEnabled end,
+ getFunc = function() return RR.SavedVars.alliesOutOfRangeEnabled end,
+ setFunc = function() RR.SavedVars.alliesOutOfRangeEnabled = not RR.SavedVars.alliesOutOfRangeEnabled end,
width = "half", --or "half" (optional)
},
[9] = {
type = "colorpicker",
name = "Out Of Range Color",
tooltip = "The reticle color when the target is out of range",
- getFunc = function() return db.alliesOORColor.r, db.alliesOORColor.g, db.alliesOORColor.b end,
+ getFunc = function() return RR.SavedVars.alliesOORColor.r, RR.SavedVars.alliesOORColor.g, RR.SavedVars.alliesOORColor.b end,
setFunc = function(r,g,b,a)
- db.alliesOORColor.r = r
- db.alliesOORColor.g = g
- db.alliesOORColor.b = b
- alliesOORColorHex = RGBPercToHex(r,g,b)
+ RR.SavedVars.alliesOORColor.r = r
+ RR.SavedVars.alliesOORColor.g = g
+ RR.SavedVars.alliesOORColor.b = b
+ alliesOORColorHex = RR.RGBPercToHex(r,g,b)
end,
width = "half", --or "half" (optional)
},
@@ -383,8 +334,8 @@ local function CreateSettings()
type = "checkbox",
name = "In Range",
tooltip = "If enabled, the reticle color will change when the target is in range",
- getFunc = function() return db.alliesInRangeEnabled end,
- setFunc = function() db.alliesInRangeEnabled = not db.alliesInRangeEnabled end,
+ getFunc = function() return RR.SavedVars.alliesInRangeEnabled end,
+ setFunc = function() RR.SavedVars.alliesInRangeEnabled = not RR.SavedVars.alliesInRangeEnabled end,
width = "half", --or "half" (optional)
},
[11] = {
@@ -394,20 +345,20 @@ local function CreateSettings()
min = 0,
max = 60,
step = 1, --(optional)
- getFunc = function() return db.alliesInRangeDistance end,
- setFunc = function(value) db.alliesInRangeDistance = value end,
+ getFunc = function() return RR.SavedVars.alliesInRangeDistance end,
+ setFunc = function(value) RR.SavedVars.alliesInRangeDistance = value end,
width = "half", --or "half" (optional)
},
[12] = {
type = "colorpicker",
name = "In Range Color",
tooltip = "The reticle color when the target is in range",
- getFunc = function() return db.alliesIRColor.r, db.alliesIRColor.g, db.alliesIRColor.b end,
+ getFunc = function() return RR.SavedVars.alliesIRColor.r, RR.SavedVars.alliesIRColor.g, RR.SavedVars.alliesIRColor.b end,
setFunc = function(r,g,b,a)
- db.alliesIRColor.r = r
- db.alliesIRColor.g = g
- db.alliesIRColor.b = b
- alliesIRColorHex = RGBPercToHex(r,g,b)
+ RR.SavedVars.alliesIRColor.r = r
+ RR.SavedVars.alliesIRColor.g = g
+ RR.SavedVars.alliesIRColor.b = b
+ alliesIRColorHex = RR.RGBPercToHex(r,g,b)
end,
width = "half", --or "half" (optional)
},
@@ -415,8 +366,8 @@ local function CreateSettings()
type = "checkbox",
name = "In Melee Range",
tooltip = "If enabled, the reticle color will change when the target is in melee range",
- getFunc = function() return db.alliesInMeleeRangeEnabled end,
- setFunc = function() db.alliesInMeleeRangeEnabled = not db.alliesInMeleeRangeEnabled end,
+ getFunc = function() return RR.SavedVars.alliesInMeleeRangeEnabled end,
+ setFunc = function() RR.SavedVars.alliesInMeleeRangeEnabled = not RR.SavedVars.alliesInMeleeRangeEnabled end,
width = "half", --or "half" (optional)
},
[14] = {
@@ -426,20 +377,20 @@ local function CreateSettings()
min = 0,
max = 60,
step = 1, --(optional)
- getFunc = function() return db.alliesInMeleeRangeDistance end,
- setFunc = function(value) db.alliesInMeleeRangeDistance = value end,
+ getFunc = function() return RR.SavedVars.alliesInMeleeRangeDistance end,
+ setFunc = function(value) RR.SavedVars.alliesInMeleeRangeDistance = value end,
width = "half", --or "half" (optional)
},
[15] = {
type = "colorpicker",
name = "In Melee Range Color",
tooltip = "The reticle color when the target is in melee range",
- getFunc = function() return db.alliesIMRColor.r, db.alliesIMRColor.g, db.alliesIMRColor.b end,
+ getFunc = function() return RR.SavedVars.alliesIMRColor.r, RR.SavedVars.alliesIMRColor.g, RR.SavedVars.alliesIMRColor.b end,
setFunc = function(r,g,b,a)
- db.alliesIMRColor.r = r
- db.alliesIMRColor.g = g
- db.alliesIMRColor.b = b
- alliesIMRColorHex = RGBPercToHex(r,g,b)
+ RR.SavedVars.alliesIMRColor.r = r
+ RR.SavedVars.alliesIMRColor.g = g
+ RR.SavedVars.alliesIMRColor.b = b
+ alliesIMRColorHex = RR.RGBPercToHex(r,g,b)
end,
width = "half", --or "half" (optional)
},
@@ -454,76 +405,76 @@ local function CreateSettings()
type = "checkbox",
name = "Show Name",
tooltip = "If enabled, the target name is shown above the reticle",
- getFunc = function() return db.neutralNameEnabled end,
- setFunc = function() db.neutralNameEnabled = not db.neutralNameEnabled end,
+ getFunc = function() return RR.SavedVars.neutralNameEnabled end,
+ setFunc = function() RR.SavedVars.neutralNameEnabled = not RR.SavedVars.neutralNameEnabled end,
width = "half", --or "half" (optional)
},
[2] = {
type = "checkbox",
name = "Show Level",
tooltip = "If enabled, the target level is shown above the reticle",
- getFunc = function() return db.neutralLevelEnabled end,
- setFunc = function() db.neutralLevelEnabled = not db.neutralLevelEnabled end,
+ getFunc = function() return RR.SavedVars.neutralLevelEnabled end,
+ setFunc = function() RR.SavedVars.neutralLevelEnabled = not RR.SavedVars.neutralLevelEnabled end,
width = "half", --or "half" (optional)
},
[3] = {
type = "checkbox",
name = "Show Range",
tooltip = "If enabled, the target range is shown at the top-right of the reticle",
- getFunc = function() return db.neutralRangeEnabled end,
- setFunc = function() db.neutralRangeEnabled = not db.neutralRangeEnabled end,
+ getFunc = function() return RR.SavedVars.neutralRangeEnabled end,
+ setFunc = function() RR.SavedVars.neutralRangeEnabled = not RR.SavedVars.neutralRangeEnabled end,
width = "half", --or "half" (optional)
},
[4] = {
type = "checkbox",
name = "Show Target Difficulty",
tooltip = "If enabled, the target difficulty is shown as *'s above the reticle",
- getFunc = function() return db.neutralDifficultyEnabled end,
- setFunc = function() db.neutralDifficultyEnabled = not db.neutralDifficultyEnabled end,
+ getFunc = function() return RR.SavedVars.neutralDifficultyEnabled end,
+ setFunc = function() RR.SavedVars.neutralDifficultyEnabled = not RR.SavedVars.neutralDifficultyEnabled end,
width = "half", --or "half" (optional)
},
[5] = {
type = "checkbox",
name = "Colorize Reticle",
tooltip = "If enabled, the color of the target reticle is colorized to reflect range status",
- getFunc = function() return db.neutralReticleColoringEnabled end,
- setFunc = function() db.neutralReticleColoringEnabled = not db.neutralReticleColoringEnabled end,
+ getFunc = function() return RR.SavedVars.neutralReticleColoringEnabled end,
+ setFunc = function() RR.SavedVars.neutralReticleColoringEnabled = not RR.SavedVars.neutralReticleColoringEnabled end,
width = "half", --or "half" (optional)
},
[6] = {
type = "checkbox",
name = "Colorize Range",
tooltip = "If enabled, the color of the target range is colorized to reflect range status",
- getFunc = function() return db.neutralRangeColoringEnabled end,
- setFunc = function() db.neutralRangeColoringEnabled = not db.neutralRangeColoringEnabled end,
+ getFunc = function() return RR.SavedVars.neutralRangeColoringEnabled end,
+ setFunc = function() RR.SavedVars.neutralRangeColoringEnabled = not RR.SavedVars.neutralRangeColoringEnabled end,
width = "half", --or "half" (optional)
},
[7] = {
type = "checkbox",
name = "Colorize Name and Level",
tooltip = "If enabled, the color of the name and level is colorized to reflect range status",
- getFunc = function() return db.neutralNameLevelColoringEnabled end,
- setFunc = function() db.neutralNameLevelColoringEnabled = not db.neutralNameLevelColoringEnabled end,
+ getFunc = function() return RR.SavedVars.neutralNameLevelColoringEnabled end,
+ setFunc = function() RR.SavedVars.neutralNameLevelColoringEnabled = not RR.SavedVars.neutralNameLevelColoringEnabled end,
width = "half", --or "half" (optional)
},
[8] = {
type = "checkbox",
name = "Out Of Range",
tooltip = "If enabled, the reticle color will change when the target is out of range",
- getFunc = function() return db.neutralOutOfRangeEnabled end,
- setFunc = function() db.neutralOutOfRangeEnabled = not db.neutralOutOfRangeEnabled end,
+ getFunc = function() return RR.SavedVars.neutralOutOfRangeEnabled end,
+ setFunc = function() RR.SavedVars.neutralOutOfRangeEnabled = not RR.SavedVars.neutralOutOfRangeEnabled end,
width = "half", --or "half" (optional)
},
[9] = {
type = "colorpicker",
name = "Out Of Range Color",
tooltip = "The reticle color when the target is out of range",
- getFunc = function() return db.neutralOORColor.r, db.neutralOORColor.g, db.neutralOORColor.b end,
+ getFunc = function() return RR.SavedVars.neutralOORColor.r, RR.SavedVars.neutralOORColor.g, RR.SavedVars.neutralOORColor.b end,
setFunc = function(r,g,b,a)
- db.neutralOORColor.r = r
- db.neutralOORColor.g = g
- db.neutralOORColor.b = b
- neutralOORColorHex = RGBPercToHex(r,g,b)
+ RR.SavedVars.neutralOORColor.r = r
+ RR.SavedVars.neutralOORColor.g = g
+ RR.SavedVars.neutralOORColor.b = b
+ neutralOORColorHex = RR.RGBPercToHex(r,g,b)
end,
width = "half", --or "half" (optional)
},
@@ -531,8 +482,8 @@ local function CreateSettings()
type = "checkbox",
name = "In Range",
tooltip = "If enabled, the reticle color will change when the target is in range",
- getFunc = function() return db.neutralInRangeEnabled end,
- setFunc = function() db.neutralInRangeEnabled = not db.neutralInRangeEnabled end,
+ getFunc = function() return RR.SavedVars.neutralInRangeEnabled end,
+ setFunc = function() RR.SavedVars.neutralInRangeEnabled = not RR.SavedVars.neutralInRangeEnabled end,
width = "half", --or "half" (optional)
},
[11] = {
@@ -542,20 +493,20 @@ local function CreateSettings()
min = 0,
max = 60,
step = 1, --(optional)
- getFunc = function() return db.neutralInRangeDistance end,
- setFunc = function(value) db.neutralInRangeDistance = value end,
+ getFunc = function() return RR.SavedVars.neutralInRangeDistance end,
+ setFunc = function(value) RR.SavedVars.neutralInRangeDistance = value end,
width = "half", --or "half" (optional)
},
[12] = {
type = "colorpicker",
name = "In Range Color",
tooltip = "The reticle color when the target is in range",
- getFunc = function() return db.neutralIRColor.r, db.neutralIRColor.g, db.neutralIRColor.b end,
+ getFunc = function() return RR.SavedVars.neutralIRColor.r, RR.SavedVars.neutralIRColor.g, RR.SavedVars.neutralIRColor.b end,
setFunc = function(r,g,b,a)
- db.neutralIRColor.r = r
- db.neutralIRColor.g = g
- db.neutralIRColor.b = b
- neutralIRColorHex = RGBPercToHex(r,g,b)
+ RR.SavedVars.neutralIRColor.r = r
+ RR.SavedVars.neutralIRColor.g = g
+ RR.SavedVars.neutralIRColor.b = b
+ neutralIRColorHex = RR.RGBPercToHex(r,g,b)
end,
width = "half", --or "half" (optional)
},
@@ -563,8 +514,8 @@ local function CreateSettings()
type = "checkbox",
name = "In Melee Range",
tooltip = "If enabled, the reticle color will change when the target is in melee range",
- getFunc = function() return db.neutralInMeleeRangeEnabled end,
- setFunc = function() db.neutralInMeleeRangeEnabled = not db.neutralInMeleeRangeEnabled end,
+ getFunc = function() return RR.SavedVars.neutralInMeleeRangeEnabled end,
+ setFunc = function() RR.SavedVars.neutralInMeleeRangeEnabled = not RR.SavedVars.neutralInMeleeRangeEnabled end,
width = "half", --or "half" (optional)
},
[14] = {
@@ -574,20 +525,20 @@ local function CreateSettings()
min = 0,
max = 60,
step = 1, --(optional)
- getFunc = function() return db.neutralInMeleeRangeDistance end,
- setFunc = function(value) db.neutralInMeleeRangeDistance = value end,
+ getFunc = function() return RR.SavedVars.neutralInMeleeRangeDistance end,
+ setFunc = function(value) RR.SavedVars.neutralInMeleeRangeDistance = value end,
width = "half", --or "half" (optional)
},
[15] = {
type = "colorpicker",
name = "In Melee Range Color",
tooltip = "The reticle color when the target is in melee range",
- getFunc = function() return db.neutralIMRColor.r, db.neutralIMRColor.g, db.neutralIMRColor.b end,
+ getFunc = function() return RR.SavedVars.neutralIMRColor.r, RR.SavedVars.neutralIMRColor.g, RR.SavedVars.neutralIMRColor.b end,
setFunc = function(r,g,b,a)
- db.neutralIMRColor.r = r
- db.neutralIMRColor.g = g
- db.neutralIMRColor.b = b
- neutralIMRColorHex = RGBPercToHex(r,g,b)
+ RR.SavedVars.neutralIMRColor.r = r
+ RR.SavedVars.neutralIMRColor.g = g
+ RR.SavedVars.neutralIMRColor.b = b
+ neutralIMRColorHex = RR.RGBPercToHex(r,g,b)
end,
width = "half", --or "half" (optional)
},
@@ -602,76 +553,76 @@ local function CreateSettings()
type = "checkbox",
name = "Show Name",
tooltip = "If enabled, the target name is shown above the reticle",
- getFunc = function() return db.npcsNameEnabled end,
- setFunc = function() db.npcsNameEnabled = not db.npcsNameEnabled end,
+ getFunc = function() return RR.SavedVars.npcsNameEnabled end,
+ setFunc = function() RR.SavedVars.npcsNameEnabled = not RR.SavedVars.npcsNameEnabled end,
width = "half", --or "half" (optional)
},
[2] = {
type = "checkbox",
name = "Show Level",
tooltip = "If enabled, the target level is shown above the reticle",
- getFunc = function() return db.npcsLevelEnabled end,
- setFunc = function() db.npcsLevelEnabled = not db.npcsLevelEnabled end,
+ getFunc = function() return RR.SavedVars.npcsLevelEnabled end,
+ setFunc = function() RR.SavedVars.npcsLevelEnabled = not RR.SavedVars.npcsLevelEnabled end,
width = "half", --or "half" (optional)
},
[3] = {
type = "checkbox",
name = "Show Range",
tooltip = "If enabled, the target range is shown at the top-right of the reticle",
- getFunc = function() return db.npcsRangeEnabled end,
- setFunc = function() db.npcsRangeEnabled = not db.npcsRangeEnabled end,
+ getFunc = function() return RR.SavedVars.npcsRangeEnabled end,
+ setFunc = function() RR.SavedVars.npcsRangeEnabled = not RR.SavedVars.npcsRangeEnabled end,
width = "half", --or "half" (optional)
},
[4] = {
type = "checkbox",
name = "Show Target Difficulty",
tooltip = "If enabled, the target difficulty is shown as *'s above the reticle",
- getFunc = function() return db.npcsDifficultyEnabled end,
- setFunc = function() db.npcsDifficultyEnabled = not db.npcsDifficultyEnabled end,
+ getFunc = function() return RR.SavedVars.npcsDifficultyEnabled end,
+ setFunc = function() RR.SavedVars.npcsDifficultyEnabled = not RR.SavedVars.npcsDifficultyEnabled end,
width = "half", --or "half" (optional)
},
[5] = {
type = "checkbox",
name = "Colorize Reticle",
tooltip = "If enabled, the color of the target reticle is colorized to reflect range status",
- getFunc = function() return db.npcsReticleColoringEnabled end,
- setFunc = function() db.npcsReticleColoringEnabled = not db.npcsReticleColoringEnabled end,
+ getFunc = function() return RR.SavedVars.npcsReticleColoringEnabled end,
+ setFunc = function() RR.SavedVars.npcsReticleColoringEnabled = not RR.SavedVars.npcsReticleColoringEnabled end,
width = "half", --or "half" (optional)
},
[6] = {
type = "checkbox",
name = "Colorize Range",
tooltip = "If enabled, the color of the target range is colorized to reflect range status",
- getFunc = function() return db.npcsRangeColoringEnabled end,
- setFunc = function() db.npcsRangeColoringEnabled = not db.npcsRangeColoringEnabled end,
+ getFunc = function() return RR.SavedVars.npcsRangeColoringEnabled end,
+ setFunc = function() RR.SavedVars.npcsRangeColoringEnabled = not RR.SavedVars.npcsRangeColoringEnabled end,
width = "half", --or "half" (optional)
},
[7] = {
type = "checkbox",
name = "Colorize Name and Level",
tooltip = "If enabled, the color of the name and level is colorized to reflect range status",
- getFunc = function() return db.npcsNameLevelColoringEnabled end,
- setFunc = function() db.npcsNameLevelColoringEnabled = not db.npcsNameLevelColoringEnabled end,
+ getFunc = function() return RR.SavedVars.npcsNameLevelColoringEnabled end,
+ setFunc = function() RR.SavedVars.npcsNameLevelColoringEnabled = not RR.SavedVars.npcsNameLevelColoringEnabled end,
width = "half", --or "half" (optional)
},
[8] = {
type = "checkbox",
name = "Out Of Range",
tooltip = "If enabled, the reticle color will change when the target is out of range",
- getFunc = function() return db.npcsOutOfRangeEnabled end,
- setFunc = function() db.npcsOutOfRangeEnabled = not db.npcsOutOfRangeEnabled end,
+ getFunc = function() return RR.SavedVars.npcsOutOfRangeEnabled end,
+ setFunc = function() RR.SavedVars.npcsOutOfRangeEnabled = not RR.SavedVars.npcsOutOfRangeEnabled end,
width = "half", --or "half" (optional)
},
[9] = {
type = "colorpicker",
name = "Out Of Range Color",
tooltip = "The reticle color when the target is out of range",
- getFunc = function() return db.npcsOORColor.r, db.npcsOORColor.g, db.npcsOORColor.b end,
+ getFunc = function() return RR.SavedVars.npcsOORColor.r, RR.SavedVars.npcsOORColor.g, RR.SavedVars.npcsOORColor.b end,
setFunc = function(r,g,b,a)
- db.npcsOORColor.r = r
- db.npcsOORColor.g = g
- db.npcsOORColor.b = b
- npcsOORColorHex = RGBPercToHex(r,g,b)
+ RR.SavedVars.npcsOORColor.r = r
+ RR.SavedVars.npcsOORColor.g = g
+ RR.SavedVars.npcsOORColor.b = b
+ npcsOORColorHex = RR.RGBPercToHex(r,g,b)
end,
width = "half", --or "half" (optional)
},
@@ -679,8 +630,8 @@ local function CreateSettings()
type = "checkbox",
name = "In Range",
tooltip = "If enabled, the reticle color will change when the target is in range",
- getFunc = function() return db.npcsInRangeEnabled end,
- setFunc = function() db.npcsInRangeEnabled = not db.npcsInRangeEnabled end,
+ getFunc = function() return RR.SavedVars.npcsInRangeEnabled end,
+ setFunc = function() RR.SavedVars.npcsInRangeEnabled = not RR.SavedVars.npcsInRangeEnabled end,
width = "half", --or "half" (optional)
},
[11] = {
@@ -690,20 +641,20 @@ local function CreateSettings()
min = 0,
max = 60,
step = 1, --(optional)
- getFunc = function() return db.npcsInRangeDistance end,
- setFunc = function(value) db.npcsInRangeDistance = value end,
+ getFunc = function() return RR.SavedVars.npcsInRangeDistance end,
+ setFunc = function(value) RR.SavedVars.npcsInRangeDistance = value end,
width = "half", --or "half" (optional)
},
[12] = {
type = "colorpicker",
name = "In Range Color",
tooltip = "The reticle color when the target is in range",
- getFunc = function() return db.npcsIRColor.r, db.npcsIRColor.g, db.npcsIRColor.b end,
+ getFunc = function() return RR.SavedVars.npcsIRColor.r, RR.SavedVars.npcsIRColor.g, RR.SavedVars.npcsIRColor.b end,
setFunc = function(r,g,b,a)
- db.npcsIRColor.r = r
- db.npcsIRColor.g = g
- db.npcsIRColor.b = b
- npcsIRColorHex = RGBPercToHex(r,g,b)
+ RR.SavedVars.npcsIRColor.r = r
+ RR.SavedVars.npcsIRColor.g = g
+ RR.SavedVars.npcsIRColor.b = b
+ npcsIRColorHex = RR.RGBPercToHex(r,g,b)
end,
width = "half", --or "half" (optional)
},
@@ -711,8 +662,8 @@ local function CreateSettings()
type = "checkbox",
name = "In Melee Range",
tooltip = "If enabled, the reticle color will change when the target is in melee range",
- getFunc = function() return db.npcsInMeleeRangeEnabled end,
- setFunc = function() db.npcsInMeleeRangeEnabled = not db.npcsInMeleeRangeEnabled end,
+ getFunc = function() return RR.SavedVars.npcsInMeleeRangeEnabled end,
+ setFunc = function() RR.SavedVars.npcsInMeleeRangeEnabled = not RR.SavedVars.npcsInMeleeRangeEnabled end,
width = "half", --or "half" (optional)
},
[14] = {
@@ -722,20 +673,20 @@ local function CreateSettings()
min = 0,
max = 60,
step = 1, --(optional)
- getFunc = function() return db.npcsInMeleeRangeDistance end,
- setFunc = function(value) db.npcsInMeleeRangeDistance = value end,
+ getFunc = function() return RR.SavedVars.npcsInMeleeRangeDistance end,
+ setFunc = function(value) RR.SavedVars.npcsInMeleeRangeDistance = value end,
width = "half", --or "half" (optional)
},
[15] = {
type = "colorpicker",
name = "In Melee Range Color",
tooltip = "The reticle color when the target is in melee range",
- getFunc = function() return db.npcsIMRColor.r, db.npcsIMRColor.g, db.npcsIMRColor.b end,
+ getFunc = function() return RR.SavedVars.npcsIMRColor.r, RR.SavedVars.npcsIMRColor.g, RR.SavedVars.npcsIMRColor.b end,
setFunc = function(r,g,b,a)
- db.npcsIMRColor.r = r
- db.npcsIMRColor.g = g
- db.npcsIMRColor.b = b
- npcsIMRColorHex = RGBPercToHex(r,g,b)
+ RR.SavedVars.npcsIMRColor.r = r
+ RR.SavedVars.npcsIMRColor.g = g
+ RR.SavedVars.npcsIMRColor.b = b
+ npcsIMRColorHex = RR.RGBPercToHex(r,g,b)
end,
width = "half", --or "half" (optional)
},
@@ -743,11 +694,10 @@ local function CreateSettings()
},
}
- LAM:RegisterAddonPanel("RangeReticle", panelData)
- LAM:RegisterOptionControls("RangeReticle", optionsTable)
+ LAM:RegisterOptionControls(RR.addonName, optionsTable)
end
-function GetColor(imrColor, irColor, oorColor, inMeleeRangeEnabled, inRangeEnabled, outOfRangeEnabled, targetInMeleeRange, targetInRange)
+function RR.GetColor(imrColor, irColor, oorColor, inMeleeRangeEnabled, inRangeEnabled, outOfRangeEnabled, targetInMeleeRange, targetInRange)
local colorRed = 1
local colorGreen = 1
local colorBlue = 1
@@ -768,7 +718,7 @@ function GetColor(imrColor, irColor, oorColor, inMeleeRangeEnabled, inRangeEnabl
return colorRed, colorGreen, colorBlue
end
-function OnRangeUpdate()
+function RR.OnRangeUpdate()
-- Determine if reticle is hidden
local reticleHidden = IsReticleHidden()
if reticleHidden then
@@ -781,6 +731,8 @@ function OnRangeUpdate()
local targetClass = GetUnitClass('reticleover') -- TODO
local targetRank, targetSubRank = GetUnitAvARank('reticleover') -- TODO
local targetGrouped = IsUnitGrouped('reticleover') -- TODO
+ local targetX, targetY, targetH = GetMapPlayerPosition('reticleover')
+ local selfX, selfY, selfH = GetMapPlayerPosition('player')
-- Local variables to store what needs to be done
local nameEnabled = false
@@ -806,79 +758,85 @@ function OnRangeUpdate()
-- Determine target type and if we need to do anything
if targetReaction and targetName and string.len(targetName) > 0 then
+
+ if RR.targetDebubInfo then
+ d("Target X/Y/H: " .. tostring(targetX) .. ', ' .. tostring(targetY) .. ', ' .. tostring(targetH))
+ d("Self X/Y/H: " .. tostring(selfX) .. ', ' .. tostring(selfY) .. ', ' .. tostring(selfH))
+
+ d("Target Name: " .. tostring(targetName))
+ d("Target Reaction: " .. tostring(targetReaction))
+ d("Target Class: " .. tostring(targetClass))
+ d("Rank R/SR: " .. tostring(targetRank) .. ', ' .. tostring(targetSubRank))
+ d("Target Grouped: " .. tostring(targetGrouped))
+ end
+
if targetReaction == UNIT_REACTION_HOSTILE then
- nameEnabled = db.hostileNameEnabled
- levelEnabled = db.hostileLevelEnabled
- rangeEnabled = db.hostileRangeEnabled
- difficultyEnabled = db.hostileDifficultyEnabled
- reticleColoringEnabled = db.hostileReticleColoringEnabled
- rangeColoringEnabled = db.hostileRangeColoringEnabled
- nameLevelColoringEnabled = db.hostileNameLevelColoringEnabled
- outOfRangeEnabled = db.hostileOutOfRangeEnabled
- inRangeEnabled = db.hostileInRangeEnabled
- inMeleeRangeEnabled = db.hostileInMeleeRangeEnabled
- oorColor = db.hostileOORColor
- inRangeDistance = db.hostileInRangeDistance
- irColor = db.hostileIRColor
- inMeleeRangeDistance = db.hostileInMeleeRangeDistance
- imrColor = db.hostileIMRColor
+ nameEnabled = RR.SavedVars.hostileNameEnabled
+ levelEnabled = RR.SavedVars.hostileLevelEnabled
+ rangeEnabled = RR.SavedVars.hostileRangeEnabled
+ difficultyEnabled = RR.SavedVars.hostileDifficultyEnabled
+ reticleColoringEnabled = RR.SavedVars.hostileReticleColoringEnabled
+ rangeColoringEnabled = RR.SavedVars.hostileRangeColoringEnabled
+ nameLevelColoringEnabled = RR.SavedVars.hostileNameLevelColoringEnabled
+ outOfRangeEnabled = RR.SavedVars.hostileOutOfRangeEnabled
+ inRangeEnabled = RR.SavedVars.hostileInRangeEnabled
+ inMeleeRangeEnabled = RR.SavedVars.hostileInMeleeRangeEnabled
+ oorColor = RR.SavedVars.hostileOORColor
+ inRangeDistance = RR.SavedVars.hostileInRangeDistance
+ irColor = RR.SavedVars.hostileIRColor
+ inMeleeRangeDistance = RR.SavedVars.hostileInMeleeRangeDistance
+ imrColor = RR.SavedVars.hostileIMRColor
elseif targetReaction == UNIT_REACTION_PLAYER_ALLY then
- nameEnabled = db.alliesNameEnabled
- levelEnabled = db.alliesLevelEnabled
- rangeEnabled = db.alliesRangeEnabled
- reticleColoringEnabled = db.alliesReticleColoringEnabled
- rangeColoringEnabled = db.alliesRangeColoringEnabled
- nameLevelColoringEnabled = db.alliesNameLevelColoringEnabled
- outOfRangeEnabled = db.alliesOutOfRangeEnabled
- inRangeEnabled = db.alliesInRangeEnabled
- inMeleeRangeEnabled = db.alliesInMeleeRangeEnabled
- oorColor = db.alliesOORColor
- inRangeDistance = db.alliesInRangeDistance
- irColor = db.alliesIRColor
- inMeleeRangeDistance = db.alliesInMeleeRangeDistance
- imrColor = db.alliesIMRColor
+ nameEnabled = RR.SavedVars.alliesNameEnabled
+ levelEnabled = RR.SavedVars.alliesLevelEnabled
+ rangeEnabled = RR.SavedVars.alliesRangeEnabled
+ reticleColoringEnabled = RR.SavedVars.alliesReticleColoringEnabled
+ rangeColoringEnabled = RR.SavedVars.alliesRangeColoringEnabled
+ nameLevelColoringEnabled = RR.SavedVars.alliesNameLevelColoringEnabled
+ outOfRangeEnabled = RR.SavedVars.alliesOutOfRangeEnabled
+ inRangeEnabled = RR.SavedVars.alliesInRangeEnabled
+ inMeleeRangeEnabled = RR.SavedVars.alliesInMeleeRangeEnabled
+ oorColor = RR.SavedVars.alliesOORColor
+ inRangeDistance = RR.SavedVars.alliesInRangeDistance
+ irColor = RR.SavedVars.alliesIRColor
+ inMeleeRangeDistance = RR.SavedVars.alliesInMeleeRangeDistance
+ imrColor = RR.SavedVars.alliesIMRColor
elseif targetReaction == UNIT_REACTION_NEUTRAL then
- nameEnabled = db.neutralNameEnabled
- levelEnabled = db.neutralLevelEnabled
- rangeEnabled = db.neutralRangeEnabled
- difficultyEnabled = db.neutralDifficultyEnabled
- reticleColoringEnabled = db.neutralReticleColoringEnabled
- rangeColoringEnabled = db.neutralRangeColoringEnabled
- nameLevelColoringEnabled = db.neutralNameLevelColoringEnabled
- outOfRangeEnabled = db.neutralOutOfRangeEnabled
- inRangeEnabled = db.neutralInRangeEnabled
- inMeleeRangeEnabled = db.neutralInMeleeRangeEnabled
- oorColor = db.neutralOORColor
- inRangeDistance = db.neutralInRangeDistance
- irColor = db.neutralIRColor
- inMeleeRangeDistance = db.neutralInMeleeRangeDistance
- imrColor = db.neutralIMRColor
+ nameEnabled = RR.SavedVars.neutralNameEnabled
+ levelEnabled = RR.SavedVars.neutralLevelEnabled
+ rangeEnabled = RR.SavedVars.neutralRangeEnabled
+ difficultyEnabled = RR.SavedVars.neutralDifficultyEnabled
+ reticleColoringEnabled = RR.SavedVars.neutralReticleColoringEnabled
+ rangeColoringEnabled = RR.SavedVars.neutralRangeColoringEnabled
+ nameLevelColoringEnabled = RR.SavedVars.neutralNameLevelColoringEnabled
+ outOfRangeEnabled = RR.SavedVars.neutralOutOfRangeEnabled
+ inRangeEnabled = RR.SavedVars.neutralInRangeEnabled
+ inMeleeRangeEnabled = RR.SavedVars.neutralInMeleeRangeEnabled
+ oorColor = RR.SavedVars.neutralOORColor
+ inRangeDistance = RR.SavedVars.neutralInRangeDistance
+ irColor = RR.SavedVars.neutralIRColor
+ inMeleeRangeDistance = RR.SavedVars.neutralInMeleeRangeDistance
+ imrColor = RR.SavedVars.neutralIMRColor
elseif targetReaction == UNIT_REACTION_NPC_ALLY or UNIT_REACTION_FRIENDLY then
- nameEnabled = db.npcsNameEnabled
- levelEnabled = db.npcsLevelEnabled
- rangeEnabled = db.npcsRangeEnabled
- reticleColoringEnabled = db.npcsReticleColoringEnabled
- rangeColoringEnabled = db.npcsRangeColoringEnabled
- nameLevelColoringEnabled = db.npcsNameLevelColoringEnabled
- outOfRangeEnabled = db.npcsOutOfRangeEnabled
- inRangeEnabled = db.npcsInRangeEnabled
- inMeleeRangeEnabled = db.npcsInMeleeRangeEnabled
- oorColor = db.npcsOORColor
- inRangeDistance = db.npcsInRangeDistance
- irColor = db.npcsIRColor
- inMeleeRangeDistance = db.npcsInMeleeRangeDistance
- imrColor = db.npcsIMRColor
+ nameEnabled = RR.SavedVars.npcsNameEnabled
+ levelEnabled = RR.SavedVars.npcsLevelEnabled
+ rangeEnabled = RR.SavedVars.npcsRangeEnabled
+ reticleColoringEnabled = RR.SavedVars.npcsReticleColoringEnabled
+ rangeColoringEnabled = RR.SavedVars.npcsRangeColoringEnabled
+ nameLevelColoringEnabled = RR.SavedVars.npcsNameLevelColoringEnabled
+ outOfRangeEnabled = RR.SavedVars.npcsOutOfRangeEnabled
+ inRangeEnabled = RR.SavedVars.npcsInRangeEnabled
+ inMeleeRangeEnabled = RR.SavedVars.npcsInMeleeRangeEnabled
+ oorColor = RR.SavedVars.npcsOORColor
+ inRangeDistance = RR.SavedVars.npcsInRangeDistance
+ irColor = RR.SavedVars.npcsIRColor
+ inMeleeRangeDistance = RR.SavedVars.npcsInMeleeRangeDistance
+ imrColor = RR.SavedVars.npcsIMRColor
end
end
RangeReticleRange:SetText('')
if rangeEnabled or nameLevelColoringEnabled or reticleColoringEnabled then
- -- Get details of what's under the reticle
- local targetX, targetY, targetH = GetMapPlayerPosition('reticleover')
-
- -- Get details of the player
- local selfX, selfY, selfH = GetMapPlayerPosition('player')
-
-- Get map details
local mapType = GetMapType()
local mapContentType = GetMapContentType()
@@ -945,8 +903,8 @@ function OnRangeUpdate()
RangeReticleRange:SetText(tostring(distance) .. 'm')
elseif rangeEnabled then
RangeReticleRange:SetText('e')
- --CHAT_SYSTEM:AddMessage("Dimensions: " .. tostring(dimensionsX) .. ', ' .. tostring(dimensionsY))
- --CHAT_SYSTEM:AddMessage("Multiplier: " .. tostring(multiplier))
+ --d("Dimensions: " .. tostring(dimensionsX) .. ', ' .. tostring(dimensionsY))
+ --d("Multiplier: " .. tostring(multiplier))
end
end
end
@@ -985,7 +943,7 @@ function OnRangeUpdate()
local colorGreen = 1
local colorBlue = 1
if nameLevelColoringEnabled then
- colorRed, colorGreen, colorBlue = GetColor(imrColor, irColor, oorColor, inMeleeRangeEnabled, inRangeEnabled, outOfRangeEnabled, targetInMeleeRange, targetInRange)
+ colorRed, colorGreen, colorBlue = RR.GetColor(imrColor, irColor, oorColor, inMeleeRangeEnabled, inRangeEnabled, outOfRangeEnabled, targetInMeleeRange, targetInRange)
end
RangeReticleName:SetColor(colorRed, colorGreen, colorBlue)
@@ -993,7 +951,7 @@ function OnRangeUpdate()
colorGreen = 1
colorBlue = 1
if reticleColoringEnabled then
- colorRed, colorGreen, colorBlue = GetColor(imrColor, irColor, oorColor, inMeleeRangeEnabled, inRangeEnabled, outOfRangeEnabled, targetInMeleeRange, targetInRange)
+ colorRed, colorGreen, colorBlue = RR.GetColor(imrColor, irColor, oorColor, inMeleeRangeEnabled, inRangeEnabled, outOfRangeEnabled, targetInMeleeRange, targetInRange)
end
-- Set reticle color
ZO_ReticleContainerReticle:SetColor(colorRed, colorGreen, colorBlue)
@@ -1004,7 +962,7 @@ function OnRangeUpdate()
colorGreen = 1
colorBlue = 1
if rangeColoringEnabled then
- colorRed, colorGreen, colorBlue = GetColor(imrColor, irColor, oorColor, inMeleeRangeEnabled, inRangeEnabled, outOfRangeEnabled, targetInMeleeRange, targetInRange)
+ colorRed, colorGreen, colorBlue = RR.GetColor(imrColor, irColor, oorColor, inMeleeRangeEnabled, inRangeEnabled, outOfRangeEnabled, targetInMeleeRange, targetInRange)
end
RangeReticleRange:SetColor(colorRed, colorGreen, colorBlue)
else
@@ -1017,19 +975,8 @@ function OnRangeUpdate()
end
end
--- Slash command handlers
-local function CommandHandler(text)
- -- Display help
- if text == nil or string.len(text) <= 0 or string.lower(text) == "help" then
- ChatMessage("RangeReticle Help:")
- ChatMessage("/rret : display help.")
- ChatMessage("/rret dbg : dump debug information to chat")
- elseif text ~= nil and string.lower(text) == "dbg" then
- end
-end
-
-- Debug info to chat window
-local function Debug()
+function RR.Debug()
-- Get details of what's under the reticle
local targetX, targetY, targetH = GetMapPlayerPosition('reticleover')
@@ -1045,6 +992,13 @@ local function Debug()
local mapCurrentFloor, mapNumFloors = GetMapFloorInfo()
local mapName = GetMapName()
+ -- Get target details
+ local targetReaction = GetUnitReaction('reticleover')
+ local targetName = GetUnitName('reticleover')
+ local targetClass = GetUnitClass('reticleover') -- TODO
+ local targetRank, targetSubRank = GetUnitAvARank('reticleover') -- TODO
+ local targetGrouped = IsUnitGrouped('reticleover') -- TODO
+
--MAPTYPE_NONE: 0
--MAPTYPE_SUBZONE: 1
--MAPTYPE_ZONE: 2
@@ -1056,34 +1010,18 @@ local function Debug()
--MAP_CONTENT_AVA: 1
--MAP_CONTENT_DUNGEON: 2
- CHAT_SYSTEM:AddMessage("Map Index: " .. tostring(mapIndex))
- CHAT_SYSTEM:AddMessage("Map Zone Index: " .. tostring(mapZoneIndex))
- CHAT_SYSTEM:AddMessage("Map W/H: " .. tostring(mapWidth) .. ', ' .. tostring(mapHeight))
- CHAT_SYSTEM:AddMessage("Map Type: " .. tostring(mapType))
- CHAT_SYSTEM:AddMessage("Map Content Type: " .. tostring(mapContentType))
- CHAT_SYSTEM:AddMessage("Floor Cur/Num: " .. tostring(mapCurrentFloor) .. ', ' .. tostring(mapNumFloors))
- CHAT_SYSTEM:AddMessage("Map Name: " .. tostring(mapName))
- CHAT_SYSTEM:AddMessage("Target X/Y/H: " .. tostring(targetX) .. ', ' .. tostring(targetY) .. ', ' .. tostring(targetH))
- CHAT_SYSTEM:AddMessage("Target X/Y/H: " .. tostring(selfX) .. ', ' .. tostring(selfY) .. ', ' .. tostring(selfH))
-
+ d("Map Index: " .. tostring(mapIndex))
+ d("Map Zone Index: " .. tostring(mapZoneIndex))
+ d("Map W/H: " .. tostring(mapWidth) .. ', ' .. tostring(mapHeight))
+ d("Map Type: " .. tostring(mapType))
+ d("Map Content Type: " .. tostring(mapContentType))
+ d("Floor Cur/Num: " .. tostring(mapCurrentFloor) .. ', ' .. tostring(mapNumFloors))
+ d("Map Name: " .. tostring(mapName))
local dimensionsX, dimensionsY = ZO_WorldMapContainer:GetDimensions()
- CHAT_SYSTEM:AddMessage("WMDimensions: " .. tostring(dimensionsX) .. ', ' .. tostring(dimensionsY))
+ d("WMDimensions: " .. tostring(dimensionsX) .. ', ' .. tostring(dimensionsY))
local dimensionsX1, dimensionsY1 = ZO_WorldMapContainer1:GetDimensions()
- CHAT_SYSTEM:AddMessage("1Dimensions: " .. tostring(dimensionsX1) .. ', ' .. tostring(dimensionsY1))
+ d("1Dimensions: " .. tostring(dimensionsX1) .. ', ' .. tostring(dimensionsY1))
end
--- Reticle hidden update
-local function OnReticleHiddenUpdate(event)
- local reticleHidden = IsReticleHidden()
- RangeReticleRange:SetHidden(reticleHidden)
- RangeReticleName:SetHidden(reticleHidden)
-end
--- Register event callbacks
-EVENT_MANAGER:RegisterForEvent("RangeReticleHidden", EVENT_RETICLE_HIDDEN_UPDATE, OnReticleHiddenUpdate)
-EVENT_MANAGER:RegisterForEvent("RangeReticleLoaded", EVENT_ADD_ON_LOADED, function(event, addon)
- if addon == "RangeReticle" then
- AddonSetup()
- CreateSettings()
- end
- end)
+EVENT_MANAGER:RegisterForEvent(RR.addonName, EVENT_ADD_ON_LOADED , RR.Initialize)
diff --git a/RangeReticle.txt b/RangeReticle.txt
index f4e3ed0..beb3704 100755
--- a/RangeReticle.txt
+++ b/RangeReticle.txt
@@ -1,12 +1,26 @@
-## Title: Range Reticle - by Adein
-## APIVersion: 100005
-## Version: @project-version@
+## Title: RangeReticle
+## APIVersion: 100010
+## Version: 0.6
## Author: Adein
-## OptionalDependsOn: LibAddonMenu-2.0
-## SavedVariables: Range_ReticleDB
+## OptionalDependsOn: LibAddonMenu-2.0, LibStub
+## SavedVariables: RRSavedVariables
-libs\LibStub\LibStub.lua
+## Libraries:
+Libs\LibStub\LibStub.lua
libs\LibAddonMenu-2.0\LibAddonMenu-2.0.lua
+libs\LibAddonMenu-2.0\controls\panel.lua
+libs\LibAddonMenu-2.0\controls\submenu.lua
+libs\LibAddonMenu-2.0\controls\button.lua
+libs\LibAddonMenu-2.0\controls\checkbox.lua
+libs\LibAddonMenu-2.0\controls\colorpicker.lua
+libs\LibAddonMenu-2.0\controls\custom.lua
+libs\LibAddonMenu-2.0\controls\description.lua
+libs\LibAddonMenu-2.0\controls\dropdown.lua
+libs\LibAddonMenu-2.0\controls\editbox.lua
+libs\LibAddonMenu-2.0\controls\header.lua
+libs\LibAddonMenu-2.0\controls\slider.lua
+libs\LibAddonMenu-2.0\controls\texture.lua
RangeReticle.lua
+rrSavedVarsDefaults.lua
RangeReticle.xml
diff --git a/RangeReticle.xml b/RangeReticle.xml
index 37d1a51..6995d0b 100755
--- a/RangeReticle.xml
+++ b/RangeReticle.xml
@@ -2,7 +2,7 @@
<Controls>
<TopLevelControl name="RangeReticle" movable="false">
<OnUpdate>
- OnRangeUpdate()
+ RR.OnRangeUpdate()
</OnUpdate>
<Controls>
<Label name="$(parent)Name" font="ZoFontChat" color="FFFFFF" wrapMode="ELLIPSIS" horizontalAlignment="CENTER" verticalAlignment="BOTTOM" text="">
diff --git a/libs/LibAddonMenu-2.0.txt b/libs/LibAddonMenu-2.0.txt
new file mode 100644
index 0000000..cbb0978
--- /dev/null
+++ b/libs/LibAddonMenu-2.0.txt
@@ -0,0 +1,23 @@
+## APIVersion: 100010
+## Title: LibAddonMenu-2.0
+## Version: 2.0 r16
+## Author: Seerah
+## Description: A library to aid in the creation of option panels.
+
+
+LibStub\LibStub.lua
+
+LibAddonMenu-2.0\LibAddonMenu-2.0.lua
+
+LibAddonMenu-2.0\controls\panel.lua
+LibAddonMenu-2.0\controls\submenu.lua
+LibAddonMenu-2.0\controls\button.lua
+LibAddonMenu-2.0\controls\checkbox.lua
+LibAddonMenu-2.0\controls\colorpicker.lua
+LibAddonMenu-2.0\controls\custom.lua
+LibAddonMenu-2.0\controls\description.lua
+LibAddonMenu-2.0\controls\dropdown.lua
+LibAddonMenu-2.0\controls\editbox.lua
+LibAddonMenu-2.0\controls\header.lua
+LibAddonMenu-2.0\controls\slider.lua
+LibAddonMenu-2.0\controls\texture.lua
diff --git a/libs/LibAnimation-1.0/LibAnimation.lua b/libs/LibAnimation-1.0/LibAnimation.lua
new file mode 100644
index 0000000..16323dd
--- /dev/null
+++ b/libs/LibAnimation-1.0/LibAnimation.lua
@@ -0,0 +1,248 @@
+----------------------------------------------------
+-- Lib Animation - for all your animation needs
+--
+-- @classmod LibAnimation
+-- @author Pawkette ( pawkette.heals@gmail.com )
+-- @copyright 2014 Pawkette
+--[[
+The MIT License (MIT)
+
+Copyright (c) <year> <copyright holders>
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+]]
+----------------------------------------------------
+if ( not LibStub ) then return end
+
+local kName, kVersion = 'LibAnimation-1.0', 2.1
+local LibAnimation = LibStub:NewLibrary( kName, kVersion )
+if ( not LibAnimation ) then return end
+
+local AnimationMgr = ANIMATION_MANAGER
+local defaultEase = ZO_LinearEase
+
+local ANIMATION_SIZE = ANIMATION_SIZE
+local ANIMATION_TRANSLATE = ANIMATION_TRANSLATE
+local ANIMATION_SCALE = ANIMATION_SCALE
+local ANIMATION_ALPHA = ANIMATION_ALPHA
+local _
+
+--- Create a new animation for control
+-- @tparam table control (optional)
+-- @tparam number playbackType (optional)
+-- @tparam number loopCount (optional)
+-- @treturn LibAnimation object
+function LibAnimation:New( control, playbackType, loopCount )
+ local result = setmetatable( {}, self )
+ local mt = getmetatable( result )
+ mt.__index = self
+
+ if ( not playbackType ) then
+ playbackType = 0
+ end
+
+ if ( not loopCount ) then
+ loopCount = 0
+ end
+
+ result:Initialize( control, playbackType, loopCount )
+ return result
+end
+
+--- Animation Constructor
+-- @tparam table control (optional)
+-- @tparam number playbackType (optional)
+-- @tparam number loopCount (optional)
+function LibAnimation:Initialize( control, playbackType, loopCount )
+ self.control = control
+ self.timeline = AnimationMgr:CreateTimeline()
+ self.timeline:SetPlaybackType( playbackType, loopCount )
+end
+
+function LibAnimation:Apply( control )
+ self.timeline:ApplyAllAnimationsToControl( control )
+end
+
+function LibAnimation:SetHandler( ... )
+ self.timeline:SetHandler( ... )
+end
+
+--- Allows you to add a callback at a certain point in the timeline
+-- @tparam function fn
+-- @tparam number delay how long to wait before calling
+function LibAnimation:InsertCallback( fn, delay )
+ if ( self.timeline ) then
+ self.timeline:InsertCallback( fn, delay )
+ end
+end
+
+--- Stop the animation
+function LibAnimation:Stop()
+ self.timeline:Stop()
+end
+
+--- Play the animation from the begining
+function LibAnimation:Play()
+ self.timeline:PlayFromStart()
+end
+
+--- Play the animation from the end
+function LibAnimation:PlayBackward()
+ self.timeline:PlayFromEnd()
+end
+
+--- Play the animation forward from where it was stopped
+function LibAnimation:Forward()
+ self.timeline:PlayForward()
+end
+
+--- Play the animation backward from where it was stopped
+function LibAnimation:Backward()
+ self.timeline:PlayBackward()
+end
+
+function LibAnimation:SetUserData( data )
+ self._udata = data
+end
+
+function LibAnimation:GetUserData()
+ return self._udata
+end
+
+--- Get's the existing animation or creates a new one
+-- @tparam number animType
+-- @tparam number delay (optional)
+-- @tresult animation
+function LibAnimation:Insert( animType, duration, delay, anchorIndex, fn )
+ local anim = self.timeline:InsertAnimation( animType, self.control, delay or 0 )
+
+ anim:SetDuration( duration or 1 )
+ anim:SetEasingFunction( fn or defaultEase )
+
+ if ( animType == ANIMATION_TRANSLATE ) then
+ anim:SetAnchorIndex( anchorIndex or 0 )
+ end
+ return anim
+end
+
+--- Create new translate animation
+-- @tparam number xorigin
+-- @tparam number yorigin
+-- @tparam number xoffset
+-- @tparam number yoffset
+-- @tparam number duration
+-- @tparam number delay (optional)
+-- @tparam number anchorIndex (optional)
+-- @tparam function fn easing function (optional)
+function LibAnimation:TranslateToFrom( xorigin, yorigin, xoffset, yoffset, duration, delay, anchorIndex, fn )
+ self:Stop()
+ local anim = self:Insert( ANIMATION_TRANSLATE, duration, delay, anchorIndex, fn )
+ anim:SetStartOffsetX( xorigin )
+ anim:SetStartOffsetY( yorigin )
+ anim:SetEndOffsetX( xoffset )
+ anim:SetEndOffsetY( yoffset )
+end
+
+--- Create new translate animation
+-- @tparam number xoffset
+-- @tparam number yoffset
+-- @tparam number duration
+-- @tparam number delay (optional)
+-- @tparam number anchorIndex (optional)
+-- @tparam function fn easing function (optional)
+function LibAnimation:TranslateTo( xoffset, yoffset, duration, delay, anchorIndex, fn )
+ local _, _, _, _, offsX, offsY = self.control:GetAnchor( anchorIndex or 0 )
+ self:TranslateToFrom( offsX, offsY, xoffset, yoffset, duration, delay, anchorIndex, fn )
+end
+
+--- Create a new size animation
+-- @tparam number startWidth
+-- @tparam number startHeight
+-- @tparam number width target width
+-- @tparam number height target height
+-- @tparam number duration
+-- @tparam number delay (optional)
+-- @tparam function fn easing function (optional)
+function LibAnimation:ResizeToFrom( startWidth, startHeight, width, height, duration, delay, fn )
+ self:Stop()
+ local anim = self:Insert( ANIMATION_SIZE, duration, delay, nil, fn )
+ anim:SetHeightStartAndEnd( startHeight, height )
+ anim:SetWidthStartAndEnd( startWidth, width )
+end
+
+--- Create a new size animation
+-- @tparam number width target width
+-- @tparam number height target height
+-- @tparam number duration
+-- @tparam number delay (optional)
+-- @tparam function fn easing function (optional)
+function LibAnimation:ResizeTo( width, height, duration, delay, fn )
+ self:ResizeToFrom( self.control:GetWidth(), self.control:GetHeight(), width, height, duration, delay, fn )
+end
+
+
+--- Create a new scale animation
+-- @tparam number startScale
+-- @tparam number scale
+-- @tparam number duration
+-- @tparam number delay (optional)
+-- @tparam function fn easing function (optional)
+function LibAnimation:ScaleToFrom( startScale, scale, duration, delay, fn )
+ self:Stop()
+ local anim = self:Insert( ANIMATION_SCALE, duration, delay, nil, fn )
+ anim:SetScaleValues( startScale, scale )
+end
+
+--- Create a new scale animation
+-- @tparam number scale
+-- @tparam number duration
+-- @tparam number delay (optional)
+-- @tparam function fn easing function (optional)
+function LibAnimation:ScaleTo( scale, duration, delay, fn )
+ self:ScaleToFrom( self.control:GetScale(), scale, duration, delay, fn )
+end
+
+
+function LibAnimation:AlphaToFrom( startAlpha, alpha, duration, delay, fn )
+ self:Stop()
+ local anim = self:Insert( ANIMATION_ALPHA, duration, delay, nil, fn )
+ anim:SetAlphaValues( startAlpha, alpha )
+end
+
+--- Create a new alpha animation
+-- @tparam number alpha
+-- @tparam number duration
+-- @tparam number delay (optional)
+-- @tparam function fn easing function (optional)
+function LibAnimation:AlphaTo( alpha, duration, delay, fn )
+ self:AlphaToFrom( self.control:GetAlpha(), alpha, duration, delay, fn )
+end
+
+--- Create a new scroll animation
+-- @tparam number x
+-- @tparam number y
+-- @tparam number duration
+-- @tparam number delay (optional)
+-- @tparam function fn easing function (optional)
+--[[function LibAnimation:ScrollTo( x, y, duration, delay, fn )
+ local anim = self:GetOrCreate( ANIMATION_SCROLL, delay )
+
+ anim:SetDuration( duration or 1 )
+ anim:SetEasingFunction( fn or defaultEase )
+end]]
\ No newline at end of file
diff --git a/libs/UTF8/utf8.lua b/libs/UTF8/utf8.lua
new file mode 100644
index 0000000..d6b015f
--- /dev/null
+++ b/libs/UTF8/utf8.lua
@@ -0,0 +1,321 @@
+-- $Id: utf8.lua 179 2009-04-03 18:10:03Z pasta $
+--
+-- Provides UTF-8 aware string functions implemented in pure lua:
+-- * string.utf8len(s)
+-- * string.utf8sub(s, i, j)
+-- * string.utf8reverse(s)
+--
+-- If utf8data.lua (containing the lower<->upper case mappings) is loaded, these
+-- additional functions are available:
+-- * string.utf8upper(s)
+-- * string.utf8lower(s)
+--
+-- All functions behave as their non UTF-8 aware counterparts with the exception
+-- that UTF-8 characters are used instead of bytes for all units.
+
+--[[
+Copyright (c) 2006-2007, Kyle Smith
+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 the author 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 THE COPYRIGHT OWNER OR CONTRIBUTORS 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.
+--]]
+
+-- ABNF from RFC 3629
+--
+-- UTF8-octets = *( UTF8-char )
+-- UTF8-char = UTF8-1 / UTF8-2 / UTF8-3 / UTF8-4
+-- UTF8-1 = %x00-7F
+-- UTF8-2 = %xC2-DF UTF8-tail
+-- UTF8-3 = %xE0 %xA0-BF UTF8-tail / %xE1-EC 2( UTF8-tail ) /
+-- %xED %x80-9F UTF8-tail / %xEE-EF 2( UTF8-tail )
+-- UTF8-4 = %xF0 %x90-BF 2( UTF8-tail ) / %xF1-F3 3( UTF8-tail ) /
+-- %xF4 %x80-8F 2( UTF8-tail )
+-- UTF8-tail = %x80-BF
+--
+
+-- returns the number of bytes used by the UTF-8 character at byte i in s
+-- also doubles as a UTF-8 character validator
+local function utf8charbytes (s, i)
+ -- argument defaults
+ i = i or 1
+
+ -- argument checking
+ if type(s) ~= "string" then
+ error("bad argument #1 to 'utf8charbytes' (string expected, got ".. type(s).. ")")
+ end
+ if type(i) ~= "number" then
+ error("bad argument #2 to 'utf8charbytes' (number expected, got ".. type(i).. ")")
+ end
+
+ local c = s:byte(i)
+
+ -- determine bytes needed for character, based on RFC 3629
+ -- validate byte 1
+ if c > 0 and c <= 127 then
+ -- UTF8-1
+ return 1
+
+ elseif c >= 194 and c <= 223 then
+ -- UTF8-2
+ local c2 = s:byte(i + 1)
+
+ if not c2 then
+ error("UTF-8 string terminated early")
+ end
+
+ -- validate byte 2
+ if c2 < 128 or c2 > 191 then
+ error("Invalid UTF-8 character")
+ end
+
+ return 2
+
+ elseif c >= 224 and c <= 239 then
+ -- UTF8-3
+ local c2 = s:byte(i + 1)
+ local c3 = s:byte(i + 2)
+
+ if not c2 or not c3 then
+ error("UTF-8 string terminated early")
+ end
+
+ -- validate byte 2
+ if c == 224 and (c2 < 160 or c2 > 191) then
+ error("Invalid UTF-8 character")
+ elseif c == 237 and (c2 < 128 or c2 > 159) then
+ error("Invalid UTF-8 character")
+ elseif c2 < 128 or c2 > 191 then
+ error("Invalid UTF-8 character")
+ end
+
+ -- validate byte 3
+ if c3 < 128 or c3 > 191 then
+ error("Invalid UTF-8 character")
+ end
+
+ return 3
+
+ elseif c >= 240 and c <= 244 then
+ -- UTF8-4
+ local c2 = s:byte(i + 1)
+ local c3 = s:byte(i + 2)
+ local c4 = s:byte(i + 3)
+
+ if not c2 or not c3 or not c4 then
+ error("UTF-8 string terminated early")
+ end
+
+ -- validate byte 2
+ if c == 240 and (c2 < 144 or c2 > 191) then
+ error("Invalid UTF-8 character")
+ elseif c == 244 and (c2 < 128 or c2 > 143) then
+ error("Invalid UTF-8 character")
+ elseif c2 < 128 or c2 > 191 then
+ error("Invalid UTF-8 character")
+ end
+
+ -- validate byte 3
+ if c3 < 128 or c3 > 191 then
+ error("Invalid UTF-8 character")
+ end
+
+ -- validate byte 4
+ if c4 < 128 or c4 > 191 then
+ error("Invalid UTF-8 character")
+ end
+
+ return 4
+
+ else
+ error("Invalid UTF-8 character")
+ end
+end
+
+
+-- returns the number of characters in a UTF-8 string
+local function utf8len (s)
+ -- argument checking
+ if type(s) ~= "string" then
+ error("bad argument #1 to 'utf8len' (string expected, got ".. type(s).. ")")
+ end
+
+ local pos = 1
+ local bytes = s:len()
+ local len = 0
+
+ while pos <= bytes do
+ len = len + 1
+ pos = pos + utf8charbytes(s, pos)
+ end
+
+ return len
+end
+
+-- install in the string library
+if not string.utf8len then
+ string.utf8len = utf8len
+end
+
+
+-- functions identically to string.sub except that i and j are UTF-8 characters
+-- instead of bytes
+local function utf8sub (s, i, j)
+ -- argument defaults
+ j = j or -1
+
+ -- argument checking
+ if type(s) ~= "string" then
+ error("bad argument #1 to 'utf8sub' (string expected, got ".. type(s).. ")")
+ end
+ if type(i) ~= "number" then
+ error("bad argument #2 to 'utf8sub' (number expected, got ".. type(i).. ")")
+ end
+ if type(j) ~= "number" then
+ error("bad argument #3 to 'utf8sub' (number expected, got ".. type(j).. ")")
+ end
+
+ local pos = 1
+ local bytes = s:len()
+ local len = 0
+
+ -- only set l if i or j is negative
+ local l = (i >= 0 and j >= 0) or s:utf8len()
+ local startChar = (i >= 0) and i or l + i + 1
+ local endChar = (j >= 0) and j or l + j + 1
+
+ -- can't have start before end!
+ if startChar > endChar then
+ return ""
+ end
+
+ -- byte offsets to pass to string.sub
+ local startByte, endByte = 1, bytes
+
+ while pos <= bytes do
+ len = len + 1
+
+ if len == startChar then
+ startByte = pos
+ end
+
+ pos = pos + utf8charbytes(s, pos)
+
+ if len == endChar then
+ endByte = pos - 1
+ break
+ end
+ end
+
+ return s:sub(startByte, endByte)
+end
+
+-- install in the string library
+if not string.utf8sub then
+ string.utf8sub = utf8sub
+end
+
+
+-- replace UTF-8 characters based on a mapping table
+local function utf8replace (s, mapping)
+ -- argument checking
+ if type(s) ~= "string" then
+ error("bad argument #1 to 'utf8replace' (string expected, got ".. type(s).. ")")
+ end
+ if type(mapping) ~= "table" then
+ error("bad argument #2 to 'utf8replace' (table expected, got ".. type(mapping).. ")")
+ end
+
+ local pos = 1
+ local bytes = s:len()
+ local charbytes
+ local newstr = ""
+
+ while pos <= bytes do
+ charbytes = utf8charbytes(s, pos)
+ local c = s:sub(pos, pos + charbytes - 1)
+
+ newstr = newstr .. (mapping[c] or c)
+
+ pos = pos + charbytes
+ end
+
+ return newstr
+end
+
+
+-- identical to string.upper except it knows about unicode simple case conversions
+local function utf8upper (s)
+ return utf8replace(s, utf8_lc_uc)
+end
+
+-- install in the string library
+if not string.utf8upper and utf8_lc_uc then
+ string.utf8upper = utf8upper
+end
+
+
+-- identical to string.lower except it knows about unicode simple case conversions
+local function utf8lower (s)
+ return utf8replace(s, utf8_uc_lc)
+end
+
+-- install in the string library
+if not string.utf8lower and utf8_uc_lc then
+ string.utf8lower = utf8lower
+end
+
+
+-- identical to string.reverse except that it supports UTF-8
+local function utf8reverse (s)
+ -- argument checking
+ if type(s) ~= "string" then
+ error("bad argument #1 to 'utf8reverse' (string expected, got ".. type(s).. ")")
+ end
+
+ local bytes = s:len()
+ local pos = bytes
+ local charbytes
+ local newstr = ""
+
+ while pos > 0 do
+ c = s:byte(pos)
+ while c >= 128 and c <= 191 do
+ pos = pos - 1
+ c = s:byte(pos)
+ end
+
+ charbytes = utf8charbytes(s, pos)
+
+ newstr = newstr .. s:sub(pos, pos + charbytes - 1)
+
+ pos = pos - 1
+ end
+
+ return newstr
+end
+
+-- install in the string library
+if not string.utf8reverse then
+ string.utf8reverse = utf8reverse
+end
diff --git a/libs/UTF8/utf8data.lua b/libs/UTF8/utf8data.lua
new file mode 100644
index 0000000..655f719
--- /dev/null
+++ b/libs/UTF8/utf8data.lua
@@ -0,0 +1,1860 @@
+utf8_lc_uc = {
+ ["a"] = "A",
+ ["b"] = "B",
+ ["c"] = "C",
+ ["d"] = "D",
+ ["e"] = "E",
+ ["f"] = "F",
+ ["g"] = "G",
+ ["h"] = "H",
+ ["i"] = "I",
+ ["j"] = "J",
+ ["k"] = "K",
+ ["l"] = "L",
+ ["m"] = "M",
+ ["n"] = "N",
+ ["o"] = "O",
+ ["p"] = "P",
+ ["q"] = "Q",
+ ["r"] = "R",
+ ["s"] = "S",
+ ["t"] = "T",
+ ["u"] = "U",
+ ["v"] = "V",
+ ["w"] = "W",
+ ["x"] = "X",
+ ["y"] = "Y",
+ ["z"] = "Z",
+ ["µ"] = "Μ",
+ ["à"] = "À",
+ ["á"] = "Á",
+ ["â"] = "Â",
+ ["ã"] = "Ã",
+ ["ä"] = "Ä",
+ ["å"] = "Å",
+ ["æ"] = "Æ",
+ ["ç"] = "Ç",
+ ["è"] = "È",
+ ["é"] = "É",
+ ["ê"] = "Ê",
+ ["ë"] = "Ë",
+ ["ì"] = "Ì",
+ ["í"] = "Í",
+ ["î"] = "Î",
+ ["ï"] = "Ï",
+ ["ð"] = "Ð",
+ ["ñ"] = "Ñ",
+ ["ò"] = "Ò",
+ ["ó"] = "Ó",
+ ["ô"] = "Ô",
+ ["õ"] = "Õ",
+ ["ö"] = "Ö",
+ ["ø"] = "Ø",
+ ["ù"] = "Ù",
+ ["ú"] = "Ú",
+ ["û"] = "Û",
+ ["ü"] = "Ü",
+ ["ý"] = "Ý",
+ ["þ"] = "Þ",
+ ["ÿ"] = "Ÿ",
+ ["ā"] = "Ā",
+ ["ă"] = "Ă",
+ ["ą"] = "Ą",
+ ["ć"] = "Ć",
+ ["ĉ"] = "Ĉ",
+ ["ċ"] = "Ċ",
+ ["č"] = "Č",
+ ["ď"] = "Ď",
+ ["đ"] = "Đ",
+ ["ē"] = "Ē",
+ ["ĕ"] = "Ĕ",
+ ["ė"] = "Ė",
+ ["ę"] = "Ę",
+ ["ě"] = "Ě",
+ ["ĝ"] = "Ĝ",
+ ["ğ"] = "Ğ",
+ ["ġ"] = "Ġ",
+ ["ģ"] = "Ģ",
+ ["ĥ"] = "Ĥ",
+ ["ħ"] = "Ħ",
+ ["ĩ"] = "Ĩ",
+ ["ī"] = "Ī",
+ ["ĭ"] = "Ĭ",
+ ["į"] = "Į",
+ ["ı"] = "I",
+ ["ij"] = "IJ",
+ ["ĵ"] = "Ĵ",
+ ["ķ"] = "Ķ",
+ ["ĺ"] = "Ĺ",
+ ["ļ"] = "Ļ",
+ ["ľ"] = "Ľ",
+ ["ŀ"] = "Ŀ",
+ ["ł"] = "Ł",
+ ["ń"] = "Ń",
+ ["ņ"] = "Ņ",
+ ["ň"] = "Ň",
+ ["ŋ"] = "Ŋ",
+ ["ō"] = "Ō",
+ ["ŏ"] = "Ŏ",
+ ["ő"] = "Ő",
+ ["œ"] = "Œ",
+ ["ŕ"] = "Ŕ",
+ ["ŗ"] = "Ŗ",
+ ["ř"] = "Ř",
+ ["ś"] = "Ś",
+ ["ŝ"] = "Ŝ",
+ ["ş"] = "Ş",
+ ["š"] = "Š",
+ ["ţ"] = "Ţ",
+ ["ť"] = "Ť",
+ ["ŧ"] = "Ŧ",
+ ["ũ"] = "Ũ",
+ ["ū"] = "Ū",
+ ["ŭ"] = "Ŭ",
+ ["ů"] = "Ů",
+ ["ű"] = "Ű",
+ ["ų"] = "Ų",
+ ["ŵ"] = "Ŵ",
+ ["ŷ"] = "Ŷ",
+ ["ź"] = "Ź",
+ ["ż"] = "Ż",
+ ["ž"] = "Ž",
+ ["ſ"] = "S",
+ ["ƀ"] = "Ƀ",
+ ["ƃ"] = "Ƃ",
+ ["ƅ"] = "Ƅ",
+ ["ƈ"] = "Ƈ",
+ ["ƌ"] = "Ƌ",
+ ["ƒ"] = "Ƒ",
+ ["ƕ"] = "Ƕ",
+ ["ƙ"] = "Ƙ",
+ ["ƚ"] = "Ƚ",
+ ["ƞ"] = "Ƞ",
+ ["ơ"] = "Ơ",
+ ["ƣ"] = "Ƣ",
+ ["ƥ"] = "Ƥ",
+ ["ƨ"] = "Ƨ",
+ ["ƭ"] = "Ƭ",
+ ["ư"] = "Ư",
+ ["ƴ"] = "Ƴ",
+ ["ƶ"] = "Ƶ",
+ ["ƹ"] = "Ƹ",
+ ["ƽ"] = "Ƽ",
+ ["ƿ"] = "Ƿ",
+ ["Dž"] = "DŽ",
+ ["dž"] = "DŽ",
+ ["Lj"] = "LJ",
+ ["lj"] = "LJ",
+ ["Nj"] = "NJ",
+ ["nj"] = "NJ",
+ ["ǎ"] = "Ǎ",
+ ["ǐ"] = "Ǐ",
+ ["ǒ"] = "Ǒ",
+ ["ǔ"] = "Ǔ",
+ ["ǖ"] = "Ǖ",
+ ["ǘ"] = "Ǘ",
+ ["ǚ"] = "Ǚ",
+ ["ǜ"] = "Ǜ",
+ ["ǝ"] = "Ǝ",
+ ["ǟ"] = "Ǟ",
+ ["ǡ"] = "Ǡ",
+ ["ǣ"] = "Ǣ",
+ ["ǥ"] = "Ǥ",
+ ["ǧ"] = "Ǧ",
+ ["ǩ"] = "Ǩ",
+ ["ǫ"] = "Ǫ",
+ ["ǭ"] = "Ǭ",
+ ["ǯ"] = "Ǯ",
+ ["Dz"] = "DZ",
+ ["dz"] = "DZ",
+ ["ǵ"] = "Ǵ",
+ ["ǹ"] = "Ǹ",
+ ["ǻ"] = "Ǻ",
+ ["ǽ"] = "Ǽ",
+ ["ǿ"] = "Ǿ",
+ ["ȁ"] = "Ȁ",
+ ["ȃ"] = "Ȃ",
+ ["ȅ"] = "Ȅ",
+ ["ȇ"] = "Ȇ",
+ ["ȉ"] = "Ȉ",
+ ["ȋ"] = "Ȋ",
+ ["ȍ"] = "Ȍ",
+ ["ȏ"] = "Ȏ",
+ ["ȑ"] = "Ȑ",
+ ["ȓ"] = "Ȓ",
+ ["ȕ"] = "Ȕ",
+ ["ȗ"] = "Ȗ",
+ ["ș"] = "Ș",
+ ["ț"] = "Ț",
+ ["ȝ"] = "Ȝ",
+ ["ȟ"] = "Ȟ",
+ ["ȣ"] = "Ȣ",
+ ["ȥ"] = "Ȥ",
+ ["ȧ"] = "Ȧ",
+ ["ȩ"] = "Ȩ",
+ ["ȫ"] = "Ȫ",
+ ["ȭ"] = "Ȭ",
+ ["ȯ"] = "Ȯ",
+ ["ȱ"] = "Ȱ",
+ ["ȳ"] = "Ȳ",
+ ["ȼ"] = "Ȼ",
+ ["ɂ"] = "Ɂ",
+ ["ɇ"] = "Ɇ",
+ ["ɉ"] = "Ɉ",
+ ["ɋ"] = "Ɋ",
+ ["ɍ"] = "Ɍ",
+ ["ɏ"] = "Ɏ",
+ ["ɓ"] = "Ɓ",
+ ["ɔ"] = "Ɔ",
+ ["ɖ"] = "Ɖ",
+ ["ɗ"] = "Ɗ",
+ ["ə"] = "Ə",
+ ["ɛ"] = "Ɛ",
+ ["ɠ"] = "Ɠ",
+ ["ɣ"] = "Ɣ",
+ ["ɨ"] = "Ɨ",
+ ["ɩ"] = "Ɩ",
+ ["ɫ"] = "Ɫ",
+ ["ɯ"] = "Ɯ",
+ ["ɲ"] = "Ɲ",
+ ["ɵ"] = "Ɵ",
+ ["ɽ"] = "Ɽ",
+ ["ʀ"] = "Ʀ",
+ ["ʃ"] = "Ʃ",
+ ["ʈ"] = "Ʈ",
+ ["ʉ"] = "Ʉ",
+ ["ʊ"] = "Ʊ",
+ ["ʋ"] = "Ʋ",
+ ["ʌ"] = "Ʌ",
+ ["ʒ"] = "Ʒ",
+ ["ͅ"] = "Ι",
+ ["ͻ"] = "Ͻ",
+ ["ͼ"] = "Ͼ",
+ ["ͽ"] = "Ͽ",
+ ["ά"] = "Ά",
+ ["έ"] = "Έ",
+ ["ή"] = "Ή",
+ ["ί"] = "Ί",
+ ["α"] = "Α",
+ ["β"] = "Β",
+ ["γ"] = "Γ",
+ ["δ"] = "Δ",
+ ["ε"] = "Ε",
+ ["ζ"] = "Ζ",
+ ["η"] = "Η",
+ ["θ"] = "Θ",
+ ["ι"] = "Ι",
+ ["κ"] = "Κ",
+ ["λ"] = "Λ",
+ ["μ"] = "Μ",
+ ["ν"] = "Ν",
+ ["ξ"] = "Ξ",
+ ["ο"] = "Ο",
+ ["π"] = "Π",
+ ["ρ"] = "Ρ",
+ ["ς"] = "Σ",
+ ["σ"] = "Σ",
+ ["τ"] = "Τ",
+ ["υ"] = "Υ",
+ ["φ"] = "Φ",
+ ["χ"] = "Χ",
+ ["ψ"] = "Ψ",
+ ["ω"] = "Ω",
+ ["ϊ"] = "Ϊ",
+ ["ϋ"] = "Ϋ",
+ ["ό"] = "Ό",
+ ["ύ"] = "Ύ",
+ ["ώ"] = "Ώ",
+ ["ϐ"] = "Β",
+ ["ϑ"] = "Θ",
+ ["ϕ"] = "Φ",
+ ["ϖ"] = "Π",
+ ["ϙ"] = "Ϙ",
+ ["ϛ"] = "Ϛ",
+ ["ϝ"] = "Ϝ",
+ ["ϟ"] = "Ϟ",
+ ["ϡ"] = "Ϡ",
+ ["ϣ"] = "Ϣ",
+ ["ϥ"] = "Ϥ",
+ ["ϧ"] = "Ϧ",
+ ["ϩ"] = "Ϩ",
+ ["ϫ"] = "Ϫ",
+ ["ϭ"] = "Ϭ",
+ ["ϯ"] = "Ϯ",
+ ["ϰ"] = "Κ",
+ ["ϱ"] = "Ρ",
+ ["ϲ"] = "Ϲ",
+ ["ϵ"] = "Ε",
+ ["ϸ"] = "Ϸ",
+ ["ϻ"] = "Ϻ",
+ ["а"] = "А",
+ ["б"] = "Б",
+ ["в"] = "В",
+ ["г"] = "Г",
+ ["д"] = "Д",
+ ["е"] = "Е",
+ ["ж"] = "Ж",
+ ["з"] = "З",
+ ["и"] = "И",
+ ["й"] = "Й",
+ ["к"] = "К",
+ ["л"] = "Л",
+ ["м"] = "М",
+ ["н"] = "Н",
+ ["о"] = "О",
+ ["п"] = "П",
+ ["р"] = "Р",
+ ["с"] = "С",
+ ["т"] = "Т",
+ ["у"] = "У",
+ ["ф"] = "Ф",
+ ["х"] = "Х",
+ ["ц"] = "Ц",
+ ["ч"] = "Ч",
+ ["ш"] = "Ш",
+ ["щ"] = "Щ",
+ ["ъ"] = "Ъ",
+ ["ы"] = "Ы",
+ ["ь"] = "Ь",
+ ["э"] = "Э",
+ ["ю"] = "Ю",
+ ["я"] = "Я",
+ ["ѐ"] = "Ѐ",
+ ["ё"] = "Ё",
+ ["ђ"] = "Ђ",
+ ["ѓ"] = "Ѓ",
+ ["є"] = "Є",
+ ["ѕ"] = "Ѕ",
+ ["і"] = "І",
+ ["ї"] = "Ї",
+ ["ј"] = "Ј",
+ ["љ"] = "Љ",
+ ["њ"] = "Њ",
+ ["ћ"] = "Ћ",
+ ["ќ"] = "Ќ",
+ ["ѝ"] = "Ѝ",
+ ["ў"] = "Ў",
+ ["џ"] = "Џ",
+ ["ѡ"] = "Ѡ",
+ ["ѣ"] = "Ѣ",
+ ["ѥ"] = "Ѥ",
+ ["ѧ"] = "Ѧ",
+ ["ѩ"] = "Ѩ",
+ ["ѫ"] = "Ѫ",
+ ["ѭ"] = "Ѭ",
+ ["ѯ"] = "Ѯ",
+ ["ѱ"] = "Ѱ",
+ ["ѳ"] = "Ѳ",
+ ["ѵ"] = "Ѵ",
+ ["ѷ"] = "Ѷ",
+ ["ѹ"] = "Ѹ",
+ ["ѻ"] = "Ѻ",
+ ["ѽ"] = "Ѽ",
+ ["ѿ"] = "Ѿ",
+ ["ҁ"] = "Ҁ",
+ ["ҋ"] = "Ҋ",
+ ["ҍ"] = "Ҍ",
+ ["ҏ"] = "Ҏ",
+ ["ґ"] = "Ґ",
+ ["ғ"] = "Ғ",
+ ["ҕ"] = "Ҕ",
+ ["җ"] = "Җ",
+ ["ҙ"] = "Ҙ",
+ ["қ"] = "Қ",
+ ["ҝ"] = "Ҝ",
+ ["ҟ"] = "Ҟ",
+ ["ҡ"] = "Ҡ",
+ ["ң"] = "Ң",
+ ["ҥ"] = "Ҥ",
+ ["ҧ"] = "Ҧ",
+ ["ҩ"] = "Ҩ",
+ ["ҫ"] = "Ҫ",
+ ["ҭ"] = "Ҭ",
+ ["ү"] = "Ү",
+ ["ұ"] = "Ұ",
+ ["ҳ"] = "Ҳ",
+ ["ҵ"] = "Ҵ",
+ ["ҷ"] = "Ҷ",
+ ["ҹ"] = "Ҹ",
+ ["һ"] = "Һ",
+ ["ҽ"] = "Ҽ",
+ ["ҿ"] = "Ҿ",
+ ["ӂ"] = "Ӂ",
+ ["ӄ"] = "Ӄ",
+ ["ӆ"] = "Ӆ",
+ ["ӈ"] = "Ӈ",
+ ["ӊ"] = "Ӊ",
+ ["ӌ"] = "Ӌ",
+ ["ӎ"] = "Ӎ",
+ ["ӏ"] = "Ӏ",
+ ["ӑ"] = "Ӑ",
+ ["ӓ"] = "Ӓ",
+ ["ӕ"] = "Ӕ",
+ ["ӗ"] = "Ӗ",
+ ["ә"] = "Ә",
+ ["ӛ"] = "Ӛ",
+ ["ӝ"] = "Ӝ",
+ ["ӟ"] = "Ӟ",
+ ["ӡ"] = "Ӡ",
+ ["ӣ"] = "Ӣ",
+ ["ӥ"] = "Ӥ",
+ ["ӧ"] = "Ӧ",
+ ["ө"] = "Ө",
+ ["ӫ"] = "Ӫ",
+ ["ӭ"] = "Ӭ",
+ ["ӯ"] = "Ӯ",
+ ["ӱ"] = "Ӱ",
+ ["ӳ"] = "Ӳ",
+ ["ӵ"] = "Ӵ",
+ ["ӷ"] = "Ӷ",
+ ["ӹ"] = "Ӹ",
+ ["ӻ"] = "Ӻ",
+ ["ӽ"] = "Ӽ",
+ ["ӿ"] = "Ӿ",
+ ["ԁ"] = "Ԁ",
+ ["ԃ"] = "Ԃ",
+ ["ԅ"] = "Ԅ",
+ ["ԇ"] = "Ԇ",
+ ["ԉ"] = "Ԉ",
+ ["ԋ"] = "Ԋ",
+ ["ԍ"] = "Ԍ",
+ ["ԏ"] = "Ԏ",
+ ["ԑ"] = "Ԑ",
+ ["ԓ"] = "Ԓ",
+ ["ա"] = "Ա",
+ ["բ"] = "Բ",
+ ["գ"] = "Գ",
+ ["դ"] = "Դ",
+ ["ե"] = "Ե",
+ ["զ"] = "Զ",
+ ["է"] = "Է",
+ ["ը"] = "Ը",
+ ["թ"] = "Թ",
+ ["ժ"] = "Ժ",
+ ["ի"] = "Ի",
+ ["լ"] = "Լ",
+ ["խ"] = "Խ",
+ ["ծ"] = "Ծ",
+ ["կ"] = "Կ",
+ ["հ"] = "Հ",
+ ["ձ"] = "Ձ",
+ ["ղ"] = "Ղ",
+ ["ճ"] = "Ճ",
+ ["մ"] = "Մ",
+ ["յ"] = "Յ",
+ ["ն"] = "Ն",
+ ["շ"] = "Շ",
+ ["ո"] = "Ո",
+ ["չ"] = "Չ",
+ ["պ"] = "Պ",
+ ["ջ"] = "Ջ",
+ ["ռ"] = "Ռ",
+ ["ս"] = "Ս",
+ ["վ"] = "Վ",
+ ["տ"] = "Տ",
+ ["ր"] = "Ր",
+ ["ց"] = "Ց",
+ ["ւ"] = "Ւ",
+ ["փ"] = "Փ",
+ ["ք"] = "Ք",
+ ["օ"] = "Օ",
+ ["ֆ"] = "Ֆ",
+ ["ᵽ"] = "Ᵽ",
+ ["ḁ"] = "Ḁ",
+ ["ḃ"] = "Ḃ",
+ ["ḅ"] = "Ḅ",
+ ["ḇ"] = "Ḇ",
+ ["ḉ"] = "Ḉ",
+ ["ḋ"] = "Ḋ",
+ ["ḍ"] = "Ḍ",
+ ["ḏ"] = "Ḏ",
+ ["ḑ"] = "Ḑ",
+ ["ḓ"] = "Ḓ",
+ ["ḕ"] = "Ḕ",
+ ["ḗ"] = "Ḗ",
+ ["ḙ"] = "Ḙ",
+ ["ḛ"] = "Ḛ",
+ ["ḝ"] = "Ḝ",
+ ["ḟ"] = "Ḟ",
+ ["ḡ"] = "Ḡ",
+ ["ḣ"] = "Ḣ",
+ ["ḥ"] = "Ḥ",
+ ["ḧ"] = "Ḧ",
+ ["ḩ"] = "Ḩ",
+ ["ḫ"] = "Ḫ",
+ ["ḭ"] = "Ḭ",
+ ["ḯ"] = "Ḯ",
+ ["ḱ"] = "Ḱ",
+ ["ḳ"] = "Ḳ",
+ ["ḵ"] = "Ḵ",
+ ["ḷ"] = "Ḷ",
+ ["ḹ"] = "Ḹ",
+ ["ḻ"] = "Ḻ",
+ ["ḽ"] = "Ḽ",
+ ["ḿ"] = "Ḿ",
+ ["ṁ"] = "Ṁ",
+ ["ṃ"] = "Ṃ",
+ ["ṅ"] = "Ṅ",
+ ["ṇ"] = "Ṇ",
+ ["ṉ"] = "Ṉ",
+ ["ṋ"] = "Ṋ",
+ ["ṍ"] = "Ṍ",
+ ["ṏ"] = "Ṏ",
+ ["ṑ"] = "Ṑ",
+ ["ṓ"] = "Ṓ",
+ ["ṕ"] = "Ṕ",
+ ["ṗ"] = "Ṗ",
+ ["ṙ"] = "Ṙ",
+ ["ṛ"] = "Ṛ",
+ ["ṝ"] = "Ṝ",
+ ["ṟ"] = "Ṟ",
+ ["ṡ"] = "Ṡ",
+ ["ṣ"] = "Ṣ",
+ ["ṥ"] = "Ṥ",
+ ["ṧ"] = "Ṧ",
+ ["ṩ"] = "Ṩ",
+ ["ṫ"] = "Ṫ",
+ ["ṭ"] = "Ṭ",
+ ["ṯ"] = "Ṯ",
+ ["ṱ"] = "Ṱ",
+ ["ṳ"] = "Ṳ",
+ ["ṵ"] = "Ṵ",
+ ["ṷ"] = "Ṷ",
+ ["ṹ"] = "Ṹ",
+ ["ṻ"] = "Ṻ",
+ ["ṽ"] = "Ṽ",
+ ["ṿ"] = "Ṿ",
+ ["ẁ"] = "Ẁ",
+ ["ẃ"] = "Ẃ",
+ ["ẅ"] = "Ẅ",
+ ["ẇ"] = "Ẇ",
+ ["ẉ"] = "Ẉ",
+ ["ẋ"] = "Ẋ",
+ ["ẍ"] = "Ẍ",
+ ["ẏ"] = "Ẏ",
+ ["ẑ"] = "Ẑ",
+ ["ẓ"] = "Ẓ",
+ ["ẕ"] = "Ẕ",
+ ["ẛ"] = "Ṡ",
+ ["ạ"] = "Ạ",
+ ["ả"] = "Ả",
+ ["ấ"] = "Ấ",
+ ["ầ"] = "Ầ",
+ ["ẩ"] = "Ẩ",
+ ["ẫ"] = "Ẫ",
+ ["ậ"] = "Ậ",
+ ["ắ"] = "Ắ",
+ ["ằ"] = "Ằ",
+ ["ẳ"] = "Ẳ",
+ ["ẵ"] = "Ẵ",
+ ["ặ"] = "Ặ",
+ ["ẹ"] = "Ẹ",
+ ["ẻ"] = "Ẻ",
+ ["ẽ"] = "Ẽ",
+ ["ế"] = "Ế",
+ ["ề"] = "Ề",
+ ["ể"] = "Ể",
+ ["ễ"] = "Ễ",
+ ["ệ"] = "Ệ",
+ ["ỉ"] = "Ỉ",
+ ["ị"] = "Ị",
+ ["ọ"] = "Ọ",
+ ["ỏ"] = "Ỏ",
+ ["ố"] = "Ố",
+ ["ồ"] = "Ồ",
+ ["ổ"] = "Ổ",
+ ["ỗ"] = "Ỗ",
+ ["ộ"] = "Ộ",
+ ["ớ"] = "Ớ",
+ ["ờ"] = "Ờ",
+ ["ở"] = "Ở",
+ ["ỡ"] = "Ỡ",
+ ["ợ"] = "Ợ",
+ ["ụ"] = "Ụ",
+ ["ủ"] = "Ủ",
+ ["ứ"] = "Ứ",
+ ["ừ"] = "Ừ",
+ ["ử"] = "Ử",
+ ["ữ"] = "Ữ",
+ ["ự"] = "Ự",
+ ["ỳ"] = "Ỳ",
+ ["ỵ"] = "Ỵ",
+ ["ỷ"] = "Ỷ",
+ ["ỹ"] = "Ỹ",
+ ["ἀ"] = "Ἀ",
+ ["ἁ"] = "Ἁ",
+ ["ἂ"] = "Ἂ",
+ ["ἃ"] = "Ἃ",
+ ["ἄ"] = "Ἄ",
+ ["ἅ"] = "Ἅ",
+ ["ἆ"] = "Ἆ",
+ ["ἇ"] = "Ἇ",
+ ["ἐ"] = "Ἐ",
+ ["ἑ"] = "Ἑ",
+ ["ἒ"] = "Ἒ",
+ ["ἓ"] = "Ἓ",
+ ["ἔ"] = "Ἔ",
+ ["ἕ"] = "Ἕ",
+ ["ἠ"] = "Ἠ",
+ ["ἡ"] = "Ἡ",
+ ["ἢ"] = "Ἢ",
+ ["ἣ"] = "Ἣ",
+ ["ἤ"] = "Ἤ",
+ ["ἥ"] = "Ἥ",
+ ["ἦ"] = "Ἦ",
+ ["ἧ"] = "Ἧ",
+ ["ἰ"] = "Ἰ",
+ ["ἱ"] = "Ἱ",
+ ["ἲ"] = "Ἲ",
+ ["ἳ"] = "Ἳ",
+ ["ἴ"] = "Ἴ",
+ ["ἵ"] = "Ἵ",
+ ["ἶ"] = "Ἶ",
+ ["ἷ"] = "Ἷ",
+ ["ὀ"] = "Ὀ",
+ ["ὁ"] = "Ὁ",
+ ["ὂ"] = "Ὂ",
+ ["ὃ"] = "Ὃ",
+ ["ὄ"] = "Ὄ",
+ ["ὅ"] = "Ὅ",
+ ["ὑ"] = "Ὑ",
+ ["ὓ"] = "Ὓ",
+ ["ὕ"] = "Ὕ",
+ ["ὗ"] = "Ὗ",
+ ["ὠ"] = "Ὠ",
+ ["ὡ"] = "Ὡ",
+ ["ὢ"] = "Ὢ",
+ ["ὣ"] = "Ὣ",
+ ["ὤ"] = "Ὤ",
+ ["ὥ"] = "Ὥ",
+ ["ὦ"] = "Ὦ",
+ ["ὧ"] = "Ὧ",
+ ["ὰ"] = "Ὰ",
+ ["ά"] = "Ά",
+ ["ὲ"] = "Ὲ",
+ ["έ"] = "Έ",
+ ["ὴ"] = "Ὴ",
+ ["ή"] = "Ή",
+ ["ὶ"] = "Ὶ",
+ ["ί"] = "Ί",
+ ["ὸ"] = "Ὸ",
+ ["ό"] = "Ό",
+ ["ὺ"] = "Ὺ",
+ ["ύ"] = "Ύ",
+ ["ὼ"] = "Ὼ",
+ ["ώ"] = "Ώ",
+ ["ᾀ"] = "ᾈ",
+ ["ᾁ"] = "ᾉ",
+ ["ᾂ"] = "ᾊ",
+ ["ᾃ"] = "ᾋ",
+ ["ᾄ"] = "ᾌ",
+ ["ᾅ"] = "ᾍ",
+ ["ᾆ"] = "ᾎ",
+ ["ᾇ"] = "ᾏ",
+ ["ᾐ"] = "ᾘ",
+ ["ᾑ"] = "ᾙ",
+ ["ᾒ"] = "ᾚ",
+ ["ᾓ"] = "ᾛ",
+ ["ᾔ"] = "ᾜ",
+ ["ᾕ"] = "ᾝ",
+ ["ᾖ"] = "ᾞ",
+ ["ᾗ"] = "ᾟ",
+ ["ᾠ"] = "ᾨ",
+ ["ᾡ"] = "ᾩ",
+ ["ᾢ"] = "ᾪ",
+ ["ᾣ"] = "ᾫ",
+ ["ᾤ"] = "ᾬ",
+ ["ᾥ"] = "ᾭ",
+ ["ᾦ"] = "ᾮ",
+ ["ᾧ"] = "ᾯ",
+ ["ᾰ"] = "Ᾰ",
+ ["ᾱ"] = "Ᾱ",
+ ["ᾳ"] = "ᾼ",
+ ["ι"] = "Ι",
+ ["ῃ"] = "ῌ",
+ ["ῐ"] = "Ῐ",
+ ["ῑ"] = "Ῑ",
+ ["ῠ"] = "Ῠ",
+ ["ῡ"] = "Ῡ",
+ ["ῥ"] = "Ῥ",
+ ["ῳ"] = "ῼ",
+ ["ⅎ"] = "Ⅎ",
+ ["ⅰ"] = "Ⅰ",
+ ["ⅱ"] = "Ⅱ",
+ ["ⅲ"] = "Ⅲ",
+ ["ⅳ"] = "Ⅳ",
+ ["ⅴ"] = "Ⅴ",
+ ["ⅵ"] = "Ⅵ",
+ ["ⅶ"] = "Ⅶ",
+ ["ⅷ"] = "Ⅷ",
+ ["ⅸ"] = "Ⅸ",
+ ["ⅹ"] = "Ⅹ",
+ ["ⅺ"] = "Ⅺ",
+ ["ⅻ"] = "Ⅻ",
+ ["ⅼ"] = "Ⅼ",
+ ["ⅽ"] = "Ⅽ",
+ ["ⅾ"] = "Ⅾ",
+ ["ⅿ"] = "Ⅿ",
+ ["ↄ"] = "Ↄ",
+ ["ⓐ"] = "Ⓐ",
+ ["ⓑ"] = "Ⓑ",
+ ["ⓒ"] = "Ⓒ",
+ ["ⓓ"] = "Ⓓ",
+ ["ⓔ"] = "Ⓔ",
+ ["ⓕ"] = "Ⓕ",
+ ["ⓖ"] = "Ⓖ",
+ ["ⓗ"] = "Ⓗ",
+ ["ⓘ"] = "Ⓘ",
+ ["ⓙ"] = "Ⓙ",
+ ["ⓚ"] = "Ⓚ",
+ ["ⓛ"] = "Ⓛ",
+ ["ⓜ"] = "Ⓜ",
+ ["ⓝ"] = "Ⓝ",
+ ["ⓞ"] = "Ⓞ",
+ ["ⓟ"] = "Ⓟ",
+ ["ⓠ"] = "Ⓠ",
+ ["ⓡ"] = "Ⓡ",
+ ["ⓢ"] = "Ⓢ",
+ ["ⓣ"] = "Ⓣ",
+ ["ⓤ"] = "Ⓤ",
+ ["ⓥ"] = "Ⓥ",
+ ["ⓦ"] = "Ⓦ",
+ ["ⓧ"] = "Ⓧ",
+ ["ⓨ"] = "Ⓨ",
+ ["ⓩ"] = "Ⓩ",
+ ["ⰰ"] = "Ⰰ",
+ ["ⰱ"] = "Ⰱ",
+ ["ⰲ"] = "Ⰲ",
+ ["ⰳ"] = "Ⰳ",
+ ["ⰴ"] = "Ⰴ",
+ ["ⰵ"] = "Ⰵ",
+ ["ⰶ"] = "Ⰶ",
+ ["ⰷ"] = "Ⰷ",
+ ["ⰸ"] = "Ⰸ",
+ ["ⰹ"] = "Ⰹ",
+ ["ⰺ"] = "Ⰺ",
+ ["ⰻ"] = "Ⰻ",
+ ["ⰼ"] = "Ⰼ",
+ ["ⰽ"] = "Ⰽ",
+ ["ⰾ"] = "Ⰾ",
+ ["ⰿ"] = "Ⰿ",
+ ["ⱀ"] = "Ⱀ",
+ ["ⱁ"] = "Ⱁ",
+ ["ⱂ"] = "Ⱂ",
+ ["ⱃ"] = "Ⱃ",
+ ["ⱄ"] = "Ⱄ",
+ ["ⱅ"] = "Ⱅ",
+ ["ⱆ"] = "Ⱆ",
+ ["ⱇ"] = "Ⱇ",
+ ["ⱈ"] = "Ⱈ",
+ ["ⱉ"] = "Ⱉ",
+ ["ⱊ"] = "Ⱊ",
+ ["ⱋ"] = "Ⱋ",
+ ["ⱌ"] = "Ⱌ",
+ ["ⱍ"] = "Ⱍ",
+ ["ⱎ"] = "Ⱎ",
+ ["ⱏ"] = "Ⱏ",
+ ["ⱐ"] = "Ⱐ",
+ ["ⱑ"] = "Ⱑ",
+ ["ⱒ"] = "Ⱒ",
+ ["ⱓ"] = "Ⱓ",
+ ["ⱔ"] = "Ⱔ",
+ ["ⱕ"] = "Ⱕ",
+ ["ⱖ"] = "Ⱖ",
+ ["ⱗ"] = "Ⱗ",
+ ["ⱘ"] = "Ⱘ",
+ ["ⱙ"] = "Ⱙ",
+ ["ⱚ"] = "Ⱚ",
+ ["ⱛ"] = "Ⱛ",
+ ["ⱜ"] = "Ⱜ",
+ ["ⱝ"] = "Ⱝ",
+ ["ⱞ"] = "Ⱞ",
+ ["ⱡ"] = "Ⱡ",
+ ["ⱥ"] = "Ⱥ",
+ ["ⱦ"] = "Ⱦ",
+ ["ⱨ"] = "Ⱨ",
+ ["ⱪ"] = "Ⱪ",
+ ["ⱬ"] = "Ⱬ",
+ ["ⱶ"] = "Ⱶ",
+ ["ⲁ"] = "Ⲁ",
+ ["ⲃ"] = "Ⲃ",
+ ["ⲅ"] = "Ⲅ",
+ ["ⲇ"] = "Ⲇ",
+ ["ⲉ"] = "Ⲉ",
+ ["ⲋ"] = "Ⲋ",
+ ["ⲍ"] = "Ⲍ",
+ ["ⲏ"] = "Ⲏ",
+ ["ⲑ"] = "Ⲑ",
+ ["ⲓ"] = "Ⲓ",
+ ["ⲕ"] = "Ⲕ",
+ ["ⲗ"] = "Ⲗ",
+ ["ⲙ"] = "Ⲙ",
+ ["ⲛ"] = "Ⲛ",
+ ["ⲝ"] = "Ⲝ",
+ ["ⲟ"] = "Ⲟ",
+ ["ⲡ"] = "Ⲡ",
+ ["ⲣ"] = "Ⲣ",
+ ["ⲥ"] = "Ⲥ",
+ ["ⲧ"] = "Ⲧ",
+ ["ⲩ"] = "Ⲩ",
+ ["ⲫ"] = "Ⲫ",
+ ["ⲭ"] = "Ⲭ",
+ ["ⲯ"] = "Ⲯ",
+ ["ⲱ"] = "Ⲱ",
+ ["ⲳ"] = "Ⲳ",
+ ["ⲵ"] = "Ⲵ",
+ ["ⲷ"] = "Ⲷ",
+ ["ⲹ"] = "Ⲹ",
+ ["ⲻ"] = "Ⲻ",
+ ["ⲽ"] = "Ⲽ",
+ ["ⲿ"] = "Ⲿ",
+ ["ⳁ"] = "Ⳁ",
+ ["ⳃ"] = "Ⳃ",
+ ["ⳅ"] = "Ⳅ",
+ ["ⳇ"] = "Ⳇ",
+ ["ⳉ"] = "Ⳉ",
+ ["ⳋ"] = "Ⳋ",
+ ["ⳍ"] = "Ⳍ",
+ ["ⳏ"] = "Ⳏ",
+ ["ⳑ"] = "Ⳑ",
+ ["ⳓ"] = "Ⳓ",
+ ["ⳕ"] = "Ⳕ",
+ ["ⳗ"] = "Ⳗ",
+ ["ⳙ"] = "Ⳙ",
+ ["ⳛ"] = "Ⳛ",
+ ["ⳝ"] = "Ⳝ",
+ ["ⳟ"] = "Ⳟ",
+ ["ⳡ"] = "Ⳡ",
+ ["ⳣ"] = "Ⳣ",
+ ["ⴀ"] = "Ⴀ",
+ ["ⴁ"] = "Ⴁ",
+ ["ⴂ"] = "Ⴂ",
+ ["ⴃ"] = "Ⴃ",
+ ["ⴄ"] = "Ⴄ",
+ ["ⴅ"] = "Ⴅ",
+ ["ⴆ"] = "Ⴆ",
+ ["ⴇ"] = "Ⴇ",
+ ["ⴈ"] = "Ⴈ",
+ ["ⴉ"] = "Ⴉ",
+ ["ⴊ"] = "Ⴊ",
+ ["ⴋ"] = "Ⴋ",
+ ["ⴌ"] = "Ⴌ",
+ ["ⴍ"] = "Ⴍ",
+ ["ⴎ"] = "Ⴎ",
+ ["ⴏ"] = "Ⴏ",
+ ["ⴐ"] = "Ⴐ",
+ ["ⴑ"] = "Ⴑ",
+ ["ⴒ"] = "Ⴒ",
+ ["ⴓ"] = "Ⴓ",
+ ["ⴔ"] = "Ⴔ",
+ ["ⴕ"] = "Ⴕ",
+ ["ⴖ"] = "Ⴖ",
+ ["ⴗ"] = "Ⴗ",
+ ["ⴘ"] = "Ⴘ",
+ ["ⴙ"] = "Ⴙ",
+ ["ⴚ"] = "Ⴚ",
+ ["ⴛ"] = "Ⴛ",
+ ["ⴜ"] = "Ⴜ",
+ ["ⴝ"] = "Ⴝ",
+ ["ⴞ"] = "Ⴞ",
+ ["ⴟ"] = "Ⴟ",
+ ["ⴠ"] = "Ⴠ",
+ ["ⴡ"] = "Ⴡ",
+ ["ⴢ"] = "Ⴢ",
+ ["ⴣ"] = "Ⴣ",
+ ["ⴤ"] = "Ⴤ",
+ ["ⴥ"] = "Ⴥ",
+ ["a"] = "A",
+ ["b"] = "B",
+ ["c"] = "C",
+ ["d"] = "D",
+ ["e"] = "E",
+ ["f"] = "F",
+ ["g"] = "G",
+ ["h"] = "H",
+ ["i"] = "I",
+ ["j"] = "J",
+ ["k"] = "K",
+ ["l"] = "L",
+ ["m"] = "M",
+ ["n"] = "N",
+ ["o"] = "O",
+ ["p"] = "P",
+ ["q"] = "Q",
+ ["r"] = "R",
+ ["s"] = "S",
+ ["t"] = "T",
+ ["u"] = "U",
+ ["v"] = "V",
+ ["w"] = "W",
+ ["x"] = "X",
+ ["y"] = "Y",
+ ["z"] = "Z",
+ ["𐐨"] = "𐐀",
+ ["𐐩"] = "𐐁",
+ ["𐐪"] = "𐐂",
+ ["𐐫"] = "𐐃",
+ ["𐐬"] = "𐐄",
+ ["𐐭"] = "𐐅",
+ ["𐐮"] = "𐐆",
+ ["𐐯"] = "𐐇",
+ ["𐐰"] = "𐐈",
+ ["𐐱"] = "𐐉",
+ ["𐐲"] = "𐐊",
+ ["𐐳"] = "𐐋",
+ ["𐐴"] = "𐐌",
+ ["𐐵"] = "𐐍",
+ ["𐐶"] = "𐐎",
+ ["𐐷"] = "𐐏",
+ ["𐐸"] = "𐐐",
+ ["𐐹"] = "𐐑",
+ ["𐐺"] = "𐐒",
+ ["𐐻"] = "𐐓",
+ ["𐐼"] = "𐐔",
+ ["𐐽"] = "𐐕",
+ ["𐐾"] = "𐐖",
+ ["𐐿"] = "𐐗",
+ ["𐑀"] = "𐐘",
+ ["𐑁"] = "𐐙",
+ ["𐑂"] = "𐐚",
+ ["𐑃"] = "𐐛",
+ ["𐑄"] = "𐐜",
+ ["𐑅"] = "𐐝",
+ ["𐑆"] = "𐐞",
+ ["𐑇"] = "𐐟",
+ ["𐑈"] = "𐐠",
+ ["𐑉"] = "𐐡",
+ ["𐑊"] = "𐐢",
+ ["𐑋"] = "𐐣",
+ ["𐑌"] = "𐐤",
+ ["𐑍"] = "𐐥",
+ ["𐑎"] = "𐐦",
+ ["𐑏"] = "𐐧",
+}
+
+
+utf8_uc_lc = {
+ ["A"] = "a",
+ ["B"] = "b",
+ ["C"] = "c",
+ ["D"] = "d",
+ ["E"] = "e",
+ ["F"] = "f",
+ ["G"] = "g",
+ ["H"] = "h",
+ ["I"] = "i",
+ ["J"] = "j",
+ ["K"] = "k",
+ ["L"] = "l",
+ ["M"] = "m",
+ ["N"] = "n",
+ ["O"] = "o",
+ ["P"] = "p",
+ ["Q"] = "q",
+ ["R"] = "r",
+ ["S"] = "s",
+ ["T"] = "t",
+ ["U"] = "u",
+ ["V"] = "v",
+ ["W"] = "w",
+ ["X"] = "x",
+ ["Y"] = "y",
+ ["Z"] = "z",
+ ["À"] = "à",
+ ["Á"] = "á",
+ ["Â"] = "â",
+ ["Ã"] = "ã",
+ ["Ä"] = "ä",
+ ["Å"] = "å",
+ ["Æ"] = "æ",
+ ["Ç"] = "ç",
+ ["È"] = "è",
+ ["É"] = "é",
+ ["Ê"] = "ê",
+ ["Ë"] = "ë",
+ ["Ì"] = "ì",
+ ["Í"] = "í",
+ ["Î"] = "î",
+ ["Ï"] = "ï",
+ ["Ð"] = "ð",
+ ["Ñ"] = "ñ",
+ ["Ò"] = "ò",
+ ["Ó"] = "ó",
+ ["Ô"] = "ô",
+ ["Õ"] = "õ",
+ ["Ö"] = "ö",
+ ["Ø"] = "ø",
+ ["Ù"] = "ù",
+ ["Ú"] = "ú",
+ ["Û"] = "û",
+ ["Ü"] = "ü",
+ ["Ý"] = "ý",
+ ["Þ"] = "þ",
+ ["Ā"] = "ā",
+ ["Ă"] = "ă",
+ ["Ą"] = "ą",
+ ["Ć"] = "ć",
+ ["Ĉ"] = "ĉ",
+ ["Ċ"] = "ċ",
+ ["Č"] = "č",
+ ["Ď"] = "ď",
+ ["Đ"] = "đ",
+ ["Ē"] = "ē",
+ ["Ĕ"] = "ĕ",
+ ["Ė"] = "ė",
+ ["Ę"] = "ę",
+ ["Ě"] = "ě",
+ ["Ĝ"] = "ĝ",
+ ["Ğ"] = "ğ",
+ ["Ġ"] = "ġ",
+ ["Ģ"] = "ģ",
+ ["Ĥ"] = "ĥ",
+ ["Ħ"] = "ħ",
+ ["Ĩ"] = "ĩ",
+ ["Ī"] = "ī",
+ ["Ĭ"] = "ĭ",
+ ["Į"] = "į",
+ ["İ"] = "i",
+ ["IJ"] = "ij",
+ ["Ĵ"] = "ĵ",
+ ["Ķ"] = "ķ",
+ ["Ĺ"] = "ĺ",
+ ["Ļ"] = "ļ",
+ ["Ľ"] = "ľ",
+ ["Ŀ"] = "ŀ",
+ ["Ł"] = "ł",
+ ["Ń"] = "ń",
+ ["Ņ"] = "ņ",
+ ["Ň"] = "ň",
+ ["Ŋ"] = "ŋ",
+ ["Ō"] = "ō",
+ ["Ŏ"] = "ŏ",
+ ["Ő"] = "ő",
+ ["Œ"] = "œ",
+ ["Ŕ"] = "ŕ",
+ ["Ŗ"] = "ŗ",
+ ["Ř"] = "ř",
+ ["Ś"] = "ś",
+ ["Ŝ"] = "ŝ",
+ ["Ş"] = "ş",
+ ["Š"] = "š",
+ ["Ţ"] = "ţ",
+ ["Ť"] = "ť",
+ ["Ŧ"] = "ŧ",
+ ["Ũ"] = "ũ",
+ ["Ū"] = "ū",
+ ["Ŭ"] = "ŭ",
+ ["Ů"] = "ů",
+ ["Ű"] = "ű",
+ ["Ų"] = "ų",
+ ["Ŵ"] = "ŵ",
+ ["Ŷ"] = "ŷ",
+ ["Ÿ"] = "ÿ",
+ ["Ź"] = "ź",
+ ["Ż"] = "ż",
+ ["Ž"] = "ž",
+ ["Ɓ"] = "ɓ",
+ ["Ƃ"] = "ƃ",
+ ["Ƅ"] = "ƅ",
+ ["Ɔ"] = "ɔ",
+ ["Ƈ"] = "ƈ",
+ ["Ɖ"] = "ɖ",
+ ["Ɗ"] = "ɗ",
+ ["Ƌ"] = "ƌ",
+ ["Ǝ"] = "ǝ",
+ ["Ə"] = "ə",
+ ["Ɛ"] = "ɛ",
+ ["Ƒ"] = "ƒ",
+ ["Ɠ"] = "ɠ",
+ ["Ɣ"] = "ɣ",
+ ["Ɩ"] = "ɩ",
+ ["Ɨ"] = "ɨ",
+ ["Ƙ"] = "ƙ",
+ ["Ɯ"] = "ɯ",
+ ["Ɲ"] = "ɲ",
+ ["Ɵ"] = "ɵ",
+ ["Ơ"] = "ơ",
+ ["Ƣ"] = "ƣ",
+ ["Ƥ"] = "ƥ",
+ ["Ʀ"] = "ʀ",
+ ["Ƨ"] = "ƨ",
+ ["Ʃ"] = "ʃ",
+ ["Ƭ"] = "ƭ",
+ ["Ʈ"] = "ʈ",
+ ["Ư"] = "ư",
+ ["Ʊ"] = "ʊ",
+ ["Ʋ"] = "ʋ",
+ ["Ƴ"] = "ƴ",
+ ["Ƶ"] = "ƶ",
+ ["Ʒ"] = "ʒ",
+ ["Ƹ"] = "ƹ",
+ ["Ƽ"] = "ƽ",
+ ["DŽ"] = "dž",
+ ["Dž"] = "dž",
+ ["LJ"] = "lj",
+ ["Lj"] = "lj",
+ ["NJ"] = "nj",
+ ["Nj"] = "nj",
+ ["Ǎ"] = "ǎ",
+ ["Ǐ"] = "ǐ",
+ ["Ǒ"] = "ǒ",
+ ["Ǔ"] = "ǔ",
+ ["Ǖ"] = "ǖ",
+ ["Ǘ"] = "ǘ",
+ ["Ǚ"] = "ǚ",
+ ["Ǜ"] = "ǜ",
+ ["Ǟ"] = "ǟ",
+ ["Ǡ"] = "ǡ",
+ ["Ǣ"] = "ǣ",
+ ["Ǥ"] = "ǥ",
+ ["Ǧ"] = "ǧ",
+ ["Ǩ"] = "ǩ",
+ ["Ǫ"] = "ǫ",
+ ["Ǭ"] = "ǭ",
+ ["Ǯ"] = "ǯ",
+ ["DZ"] = "dz",
+ ["Dz"] = "dz",
+ ["Ǵ"] = "ǵ",
+ ["Ƕ"] = "ƕ",
+ ["Ƿ"] = "ƿ",
+ ["Ǹ"] = "ǹ",
+ ["Ǻ"] = "ǻ",
+ ["Ǽ"] = "ǽ",
+ ["Ǿ"] = "ǿ",
+ ["Ȁ"] = "ȁ",
+ ["Ȃ"] = "ȃ",
+ ["Ȅ"] = "ȅ",
+ ["Ȇ"] = "ȇ",
+ ["Ȉ"] = "ȉ",
+ ["Ȋ"] = "ȋ",
+ ["Ȍ"] = "ȍ",
+ ["Ȏ"] = "ȏ",
+ ["Ȑ"] = "ȑ",
+ ["Ȓ"] = "ȓ",
+ ["Ȕ"] = "ȕ",
+ ["Ȗ"] = "ȗ",
+ ["Ș"] = "ș",
+ ["Ț"] = "ț",
+ ["Ȝ"] = "ȝ",
+ ["Ȟ"] = "ȟ",
+ ["Ƞ"] = "ƞ",
+ ["Ȣ"] = "ȣ",
+ ["Ȥ"] = "ȥ",
+ ["Ȧ"] = "ȧ",
+ ["Ȩ"] = "ȩ",
+ ["Ȫ"] = "ȫ",
+ ["Ȭ"] = "ȭ",
+ ["Ȯ"] = "ȯ",
+ ["Ȱ"] = "ȱ",
+ ["Ȳ"] = "ȳ",
+ ["Ⱥ"] = "ⱥ",
+ ["Ȼ"] = "ȼ",
+ ["Ƚ"] = "ƚ",
+ ["Ⱦ"] = "ⱦ",
+ ["Ɂ"] = "ɂ",
+ ["Ƀ"] = "ƀ",
+ ["Ʉ"] = "ʉ",
+ ["Ʌ"] = "ʌ",
+ ["Ɇ"] = "ɇ",
+ ["Ɉ"] = "ɉ",
+ ["Ɋ"] = "ɋ",
+ ["Ɍ"] = "ɍ",
+ ["Ɏ"] = "ɏ",
+ ["Ά"] = "ά",
+ ["Έ"] = "έ",
+ ["Ή"] = "ή",
+ ["Ί"] = "ί",
+ ["Ό"] = "ό",
+ ["Ύ"] = "ύ",
+ ["Ώ"] = "ώ",
+ ["Α"] = "α",
+ ["Β"] = "β",
+ ["Γ"] = "γ",
+ ["Δ"] = "δ",
+ ["Ε"] = "ε",
+ ["Ζ"] = "ζ",
+ ["Η"] = "η",
+ ["Θ"] = "θ",
+ ["Ι"] = "ι",
+ ["Κ"] = "κ",
+ ["Λ"] = "λ",
+ ["Μ"] = "μ",
+ ["Ν"] = "ν",
+ ["Ξ"] = "ξ",
+ ["Ο"] = "ο",
+ ["Π"] = "π",
+ ["Ρ"] = "ρ",
+ ["Σ"] = "σ",
+ ["Τ"] = "τ",
+ ["Υ"] = "υ",
+ ["Φ"] = "φ",
+ ["Χ"] = "χ",
+ ["Ψ"] = "ψ",
+ ["Ω"] = "ω",
+ ["Ϊ"] = "ϊ",
+ ["Ϋ"] = "ϋ",
+ ["Ϙ"] = "ϙ",
+ ["Ϛ"] = "ϛ",
+ ["Ϝ"] = "ϝ",
+ ["Ϟ"] = "ϟ",
+ ["Ϡ"] = "ϡ",
+ ["Ϣ"] = "ϣ",
+ ["Ϥ"] = "ϥ",
+ ["Ϧ"] = "ϧ",
+ ["Ϩ"] = "ϩ",
+ ["Ϫ"] = "ϫ",
+ ["Ϭ"] = "ϭ",
+ ["Ϯ"] = "ϯ",
+ ["ϴ"] = "θ",
+ ["Ϸ"] = "ϸ",
+ ["Ϲ"] = "ϲ",
+ ["Ϻ"] = "ϻ",
+ ["Ͻ"] = "ͻ",
+ ["Ͼ"] = "ͼ",
+ ["Ͽ"] = "ͽ",
+ ["Ѐ"] = "ѐ",
+ ["Ё"] = "ё",
+ ["Ђ"] = "ђ",
+ ["Ѓ"] = "ѓ",
+ ["Є"] = "є",
+ ["Ѕ"] = "ѕ",
+ ["І"] = "і",
+ ["Ї"] = "ї",
+ ["Ј"] = "ј",
+ ["Љ"] = "љ",
+ ["Њ"] = "њ",
+ ["Ћ"] = "ћ",
+ ["Ќ"] = "ќ",
+ ["Ѝ"] = "ѝ",
+ ["Ў"] = "ў",
+ ["Џ"] = "џ",
+ ["А"] = "а",
+ ["Б"] = "б",
+ ["В"] = "в",
+ ["Г"] = "г",
+ ["Д"] = "д",
+ ["Е"] = "е",
+ ["Ж"] = "ж",
+ ["З"] = "з",
+ ["И"] = "и",
+ ["Й"] = "й",
+ ["К"] = "к",
+ ["Л"] = "л",
+ ["М"] = "м",
+ ["Н"] = "н",
+ ["О"] = "о",
+ ["П"] = "п",
+ ["Р"] = "р",
+ ["С"] = "с",
+ ["Т"] = "т",
+ ["У"] = "у",
+ ["Ф"] = "ф",
+ ["Х"] = "х",
+ ["Ц"] = "ц",
+ ["Ч"] = "ч",
+ ["Ш"] = "ш",
+ ["Щ"] = "щ",
+ ["Ъ"] = "ъ",
+ ["Ы"] = "ы",
+ ["Ь"] = "ь",
+ ["Э"] = "э",
+ ["Ю"] = "ю",
+ ["Я"] = "я",
+ ["Ѡ"] = "ѡ",
+ ["Ѣ"] = "ѣ",
+ ["Ѥ"] = "ѥ",
+ ["Ѧ"] = "ѧ",
+ ["Ѩ"] = "ѩ",
+ ["Ѫ"] = "ѫ",
+ ["Ѭ"] = "ѭ",
+ ["Ѯ"] = "ѯ",
+ ["Ѱ"] = "ѱ",
+ ["Ѳ"] = "ѳ",
+ ["Ѵ"] = "ѵ",
+ ["Ѷ"] = "ѷ",
+ ["Ѹ"] = "ѹ",
+ ["Ѻ"] = "ѻ",
+ ["Ѽ"] = "ѽ",
+ ["Ѿ"] = "ѿ",
+ ["Ҁ"] = "ҁ",
+ ["Ҋ"] = "ҋ",
+ ["Ҍ"] = "ҍ",
+ ["Ҏ"] = "ҏ",
+ ["Ґ"] = "ґ",
+ ["Ғ"] = "ғ",
+ ["Ҕ"] = "ҕ",
+ ["Җ"] = "җ",
+ ["Ҙ"] = "ҙ",
+ ["Қ"] = "қ",
+ ["Ҝ"] = "ҝ",
+ ["Ҟ"] = "ҟ",
+ ["Ҡ"] = "ҡ",
+ ["Ң"] = "ң",
+ ["Ҥ"] = "ҥ",
+ ["Ҧ"] = "ҧ",
+ ["Ҩ"] = "ҩ",
+ ["Ҫ"] = "ҫ",
+ ["Ҭ"] = "ҭ",
+ ["Ү"] = "ү",
+ ["Ұ"] = "ұ",
+ ["Ҳ"] = "ҳ",
+ ["Ҵ"] = "ҵ",
+ ["Ҷ"] = "ҷ",
+ ["Ҹ"] = "ҹ",
+ ["Һ"] = "һ",
+ ["Ҽ"] = "ҽ",
+ ["Ҿ"] = "ҿ",
+ ["Ӏ"] = "ӏ",
+ ["Ӂ"] = "ӂ",
+ ["Ӄ"] = "ӄ",
+ ["Ӆ"] = "ӆ",
+ ["Ӈ"] = "ӈ",
+ ["Ӊ"] = "ӊ",
+ ["Ӌ"] = "ӌ",
+ ["Ӎ"] = "ӎ",
+ ["Ӑ"] = "ӑ",
+ ["Ӓ"] = "ӓ",
+ ["Ӕ"] = "ӕ",
+ ["Ӗ"] = "ӗ",
+ ["Ә"] = "ә",
+ ["Ӛ"] = "ӛ",
+ ["Ӝ"] = "ӝ",
+ ["Ӟ"] = "ӟ",
+ ["Ӡ"] = "ӡ",
+ ["Ӣ"] = "ӣ",
+ ["Ӥ"] = "ӥ",
+ ["Ӧ"] = "ӧ",
+ ["Ө"] = "ө",
+ ["Ӫ"] = "ӫ",
+ ["Ӭ"] = "ӭ",
+ ["Ӯ"] = "ӯ",
+ ["Ӱ"] = "ӱ",
+ ["Ӳ"] = "ӳ",
+ ["Ӵ"] = "ӵ",
+ ["Ӷ"] = "ӷ",
+ ["Ӹ"] = "ӹ",
+ ["Ӻ"] = "ӻ",
+ ["Ӽ"] = "ӽ",
+ ["Ӿ"] = "ӿ",
+ ["Ԁ"] = "ԁ",
+ ["Ԃ"] = "ԃ",
+ ["Ԅ"] = "ԅ",
+ ["Ԇ"] = "ԇ",
+ ["Ԉ"] = "ԉ",
+ ["Ԋ"] = "ԋ",
+ ["Ԍ"] = "ԍ",
+ ["Ԏ"] = "ԏ",
+ ["Ԑ"] = "ԑ",
+ ["Ԓ"] = "ԓ",
+ ["Ա"] = "ա",
+ ["Բ"] = "բ",
+ ["Գ"] = "գ",
+ ["Դ"] = "դ",
+ ["Ե"] = "ե",
+ ["Զ"] = "զ",
+ ["Է"] = "է",
+ ["Ը"] = "ը",
+ ["Թ"] = "թ",
+ ["Ժ"] = "ժ",
+ ["Ի"] = "ի",
+ ["Լ"] = "լ",
+ ["Խ"] = "խ",
+ ["Ծ"] = "ծ",
+ ["Կ"] = "կ",
+ ["Հ"] = "հ",
+ ["Ձ"] = "ձ",
+ ["Ղ"] = "ղ",
+ ["Ճ"] = "ճ",
+ ["Մ"] = "մ",
+ ["Յ"] = "յ",
+ ["Ն"] = "ն",
+ ["Շ"] = "շ",
+ ["Ո"] = "ո",
+ ["Չ"] = "չ",
+ ["Պ"] = "պ",
+ ["Ջ"] = "ջ",
+ ["Ռ"] = "ռ",
+ ["Ս"] = "ս",
+ ["Վ"] = "վ",
+ ["Տ"] = "տ",
+ ["Ր"] = "ր",
+ ["Ց"] = "ց",
+ ["Ւ"] = "ւ",
+ ["Փ"] = "փ",
+ ["Ք"] = "ք",
+ ["Օ"] = "օ",
+ ["Ֆ"] = "ֆ",
+ ["Ⴀ"] = "ⴀ",
+ ["Ⴁ"] = "ⴁ",
+ ["Ⴂ"] = "ⴂ",
+ ["Ⴃ"] = "ⴃ",
+ ["Ⴄ"] = "ⴄ",
+ ["Ⴅ"] = "ⴅ",
+ ["Ⴆ"] = "ⴆ",
+ ["Ⴇ"] = "ⴇ",
+ ["Ⴈ"] = "ⴈ",
+ ["Ⴉ"] = "ⴉ",
+ ["Ⴊ"] = "ⴊ",
+ ["Ⴋ"] = "ⴋ",
+ ["Ⴌ"] = "ⴌ",
+ ["Ⴍ"] = "ⴍ",
+ ["Ⴎ"] = "ⴎ",
+ ["Ⴏ"] = "ⴏ",
+ ["Ⴐ"] = "ⴐ",
+ ["Ⴑ"] = "ⴑ",
+ ["Ⴒ"] = "ⴒ",
+ ["Ⴓ"] = "ⴓ",
+ ["Ⴔ"] = "ⴔ",
+ ["Ⴕ"] = "ⴕ",
+ ["Ⴖ"] = "ⴖ",
+ ["Ⴗ"] = "ⴗ",
+ ["Ⴘ"] = "ⴘ",
+ ["Ⴙ"] = "ⴙ",
+ ["Ⴚ"] = "ⴚ",
+ ["Ⴛ"] = "ⴛ",
+ ["Ⴜ"] = "ⴜ",
+ ["Ⴝ"] = "ⴝ",
+ ["Ⴞ"] = "ⴞ",
+ ["Ⴟ"] = "ⴟ",
+ ["Ⴠ"] = "ⴠ",
+ ["Ⴡ"] = "ⴡ",
+ ["Ⴢ"] = "ⴢ",
+ ["Ⴣ"] = "ⴣ",
+ ["Ⴤ"] = "ⴤ",
+ ["Ⴥ"] = "ⴥ",
+ ["Ḁ"] = "ḁ",
+ ["Ḃ"] = "ḃ",
+ ["Ḅ"] = "ḅ",
+ ["Ḇ"] = "ḇ",
+ ["Ḉ"] = "ḉ",
+ ["Ḋ"] = "ḋ",
+ ["Ḍ"] = "ḍ",
+ ["Ḏ"] = "ḏ",
+ ["Ḑ"] = "ḑ",
+ ["Ḓ"] = "ḓ",
+ ["Ḕ"] = "ḕ",
+ ["Ḗ"] = "ḗ",
+ ["Ḙ"] = "ḙ",
+ ["Ḛ"] = "ḛ",
+ ["Ḝ"] = "ḝ",
+ ["Ḟ"] = "ḟ",
+ ["Ḡ"] = "ḡ",
+ ["Ḣ"] = "ḣ",
+ ["Ḥ"] = "ḥ",
+ ["Ḧ"] = "ḧ",
+ ["Ḩ"] = "ḩ",
+ ["Ḫ"] = "ḫ",
+ ["Ḭ"] = "ḭ",
+ ["Ḯ"] = "ḯ",
+ ["Ḱ"] = "ḱ",
+ ["Ḳ"] = "ḳ",
+ ["Ḵ"] = "ḵ",
+ ["Ḷ"] = "ḷ",
+ ["Ḹ"] = "ḹ",
+ ["Ḻ"] = "ḻ",
+ ["Ḽ"] = "ḽ",
+ ["Ḿ"] = "ḿ",
+ ["Ṁ"] = "ṁ",
+ ["Ṃ"] = "ṃ",
+ ["Ṅ"] = "ṅ",
+ ["Ṇ"] = "ṇ",
+ ["Ṉ"] = "ṉ",
+ ["Ṋ"] = "ṋ",
+ ["Ṍ"] = "ṍ",
+ ["Ṏ"] = "ṏ",
+ ["Ṑ"] = "ṑ",
+ ["Ṓ"] = "ṓ",
+ ["Ṕ"] = "ṕ",
+ ["Ṗ"] = "ṗ",
+ ["Ṙ"] = "ṙ",
+ ["Ṛ"] = "ṛ",
+ ["Ṝ"] = "ṝ",
+ ["Ṟ"] = "ṟ",
+ ["Ṡ"] = "ṡ",
+ ["Ṣ"] = "ṣ",
+ ["Ṥ"] = "ṥ",
+ ["Ṧ"] = "ṧ",
+ ["Ṩ"] = "ṩ",
+ ["Ṫ"] = "ṫ",
+ ["Ṭ"] = "ṭ",
+ ["Ṯ"] = "ṯ",
+ ["Ṱ"] = "ṱ",
+ ["Ṳ"] = "ṳ",
+ ["Ṵ"] = "ṵ",
+ ["Ṷ"] = "ṷ",
+ ["Ṹ"] = "ṹ",
+ ["Ṻ"] = "ṻ",
+ ["Ṽ"] = "ṽ",
+ ["Ṿ"] = "ṿ",
+ ["Ẁ"] = "ẁ",
+ ["Ẃ"] = "ẃ",
+ ["Ẅ"] = "ẅ",
+ ["Ẇ"] = "ẇ",
+ ["Ẉ"] = "ẉ",
+ ["Ẋ"] = "ẋ",
+ ["Ẍ"] = "ẍ",
+ ["Ẏ"] = "ẏ",
+ ["Ẑ"] = "ẑ",
+ ["Ẓ"] = "ẓ",
+ ["Ẕ"] = "ẕ",
+ ["Ạ"] = "ạ",
+ ["Ả"] = "ả",
+ ["Ấ"] = "ấ",
+ ["Ầ"] = "ầ",
+ ["Ẩ"] = "ẩ",
+ ["Ẫ"] = "ẫ",
+ ["Ậ"] = "ậ",
+ ["Ắ"] = "ắ",
+ ["Ằ"] = "ằ",
+ ["Ẳ"] = "ẳ",
+ ["Ẵ"] = "ẵ",
+ ["Ặ"] = "ặ",
+ ["Ẹ"] = "ẹ",
+ ["Ẻ"] = "ẻ",
+ ["Ẽ"] = "ẽ",
+ ["Ế"] = "ế",
+ ["Ề"] = "ề",
+ ["Ể"] = "ể",
+ ["Ễ"] = "ễ",
+ ["Ệ"] = "ệ",
+ ["Ỉ"] = "ỉ",
+ ["Ị"] = "ị",
+ ["Ọ"] = "ọ",
+ ["Ỏ"] = "ỏ",
+ ["Ố"] = "ố",
+ ["Ồ"] = "ồ",
+ ["Ổ"] = "ổ",
+ ["Ỗ"] = "ỗ",
+ ["Ộ"] = "ộ",
+ ["Ớ"] = "ớ",
+ ["Ờ"] = "ờ",
+ ["Ở"] = "ở",
+ ["Ỡ"] = "ỡ",
+ ["Ợ"] = "ợ",
+ ["Ụ"] = "ụ",
+ ["Ủ"] = "ủ",
+ ["Ứ"] = "ứ",
+ ["Ừ"] = "ừ",
+ ["Ử"] = "ử",
+ ["Ữ"] = "ữ",
+ ["Ự"] = "ự",
+ ["Ỳ"] = "ỳ",
+ ["Ỵ"] = "ỵ",
+ ["Ỷ"] = "ỷ",
+ ["Ỹ"] = "ỹ",
+ ["Ἀ"] = "ἀ",
+ ["Ἁ"] = "ἁ",
+ ["Ἂ"] = "ἂ",
+ ["Ἃ"] = "ἃ",
+ ["Ἄ"] = "ἄ",
+ ["Ἅ"] = "ἅ",
+ ["Ἆ"] = "ἆ",
+ ["Ἇ"] = "ἇ",
+ ["Ἐ"] = "ἐ",
+ ["Ἑ"] = "ἑ",
+ ["Ἒ"] = "ἒ",
+ ["Ἓ"] = "ἓ",
+ ["Ἔ"] = "ἔ",
+ ["Ἕ"] = "ἕ",
+ ["Ἠ"] = "ἠ",
+ ["Ἡ"] = "ἡ",
+ ["Ἢ"] = "ἢ",
+ ["Ἣ"] = "ἣ",
+ ["Ἤ"] = "ἤ",
+ ["Ἥ"] = "ἥ",
+ ["Ἦ"] = "ἦ",
+ ["Ἧ"] = "ἧ",
+ ["Ἰ"] = "ἰ",
+ ["Ἱ"] = "ἱ",
+ ["Ἲ"] = "ἲ",
+ ["Ἳ"] = "ἳ",
+ ["Ἴ"] = "ἴ",
+ ["Ἵ"] = "ἵ",
+ ["Ἶ"] = "ἶ",
+ ["Ἷ"] = "ἷ",
+ ["Ὀ"] = "ὀ",
+ ["Ὁ"] = "ὁ",
+ ["Ὂ"] = "ὂ",
+ ["Ὃ"] = "ὃ",
+ ["Ὄ"] = "ὄ",
+ ["Ὅ"] = "ὅ",
+ ["Ὑ"] = "ὑ",
+ ["Ὓ"] = "ὓ",
+ ["Ὕ"] = "ὕ",
+ ["Ὗ"] = "ὗ",
+ ["Ὠ"] = "ὠ",
+ ["Ὡ"] = "ὡ",
+ ["Ὢ"] = "ὢ",
+ ["Ὣ"] = "ὣ",
+ ["Ὤ"] = "ὤ",
+ ["Ὥ"] = "ὥ",
+ ["Ὦ"] = "ὦ",
+ ["Ὧ"] = "ὧ",
+ ["ᾈ"] = "ᾀ",
+ ["ᾉ"] = "ᾁ",
+ ["ᾊ"] = "ᾂ",
+ ["ᾋ"] = "ᾃ",
+ ["ᾌ"] = "ᾄ",
+ ["ᾍ"] = "ᾅ",
+ ["ᾎ"] = "ᾆ",
+ ["ᾏ"] = "ᾇ",
+ ["ᾘ"] = "ᾐ",
+ ["ᾙ"] = "ᾑ",
+ ["ᾚ"] = "ᾒ",
+ ["ᾛ"] = "ᾓ",
+ ["ᾜ"] = "ᾔ",
+ ["ᾝ"] = "ᾕ",
+ ["ᾞ"] = "ᾖ",
+ ["ᾟ"] = "ᾗ",
+ ["ᾨ"] = "ᾠ",
+ ["ᾩ"] = "ᾡ",
+ ["ᾪ"] = "ᾢ",
+ ["ᾫ"] = "ᾣ",
+ ["ᾬ"] = "ᾤ",
+ ["ᾭ"] = "ᾥ",
+ ["ᾮ"] = "ᾦ",
+ ["ᾯ"] = "ᾧ",
+ ["Ᾰ"] = "ᾰ",
+ ["Ᾱ"] = "ᾱ",
+ ["Ὰ"] = "ὰ",
+ ["Ά"] = "ά",
+ ["ᾼ"] = "ᾳ",
+ ["Ὲ"] = "ὲ",
+ ["Έ"] = "έ",
+ ["Ὴ"] = "ὴ",
+ ["Ή"] = "ή",
+ ["ῌ"] = "ῃ",
+ ["Ῐ"] = "ῐ",
+ ["Ῑ"] = "ῑ",
+ ["Ὶ"] = "ὶ",
+ ["Ί"] = "ί",
+ ["Ῠ"] = "ῠ",
+ ["Ῡ"] = "ῡ",
+ ["Ὺ"] = "ὺ",
+ ["Ύ"] = "ύ",
+ ["Ῥ"] = "ῥ",
+ ["Ὸ"] = "ὸ",
+ ["Ό"] = "ό",
+ ["Ὼ"] = "ὼ",
+ ["Ώ"] = "ώ",
+ ["ῼ"] = "ῳ",
+ ["Ω"] = "ω",
+ ["K"] = "k",
+ ["Å"] = "å",
+ ["Ⅎ"] = "ⅎ",
+ ["Ⅰ"] = "ⅰ",
+ ["Ⅱ"] = "ⅱ",
+ ["Ⅲ"] = "ⅲ",
+ ["Ⅳ"] = "ⅳ",
+ ["Ⅴ"] = "ⅴ",
+ ["Ⅵ"] = "ⅵ",
+ ["Ⅶ"] = "ⅶ",
+ ["Ⅷ"] = "ⅷ",
+ ["Ⅸ"] = "ⅸ",
+ ["Ⅹ"] = "ⅹ",
+ ["Ⅺ"] = "ⅺ",
+ ["Ⅻ"] = "ⅻ",
+ ["Ⅼ"] = "ⅼ",
+ ["Ⅽ"] = "ⅽ",
+ ["Ⅾ"] = "ⅾ",
+ ["Ⅿ"] = "ⅿ",
+ ["Ↄ"] = "ↄ",
+ ["Ⓐ"] = "ⓐ",
+ ["Ⓑ"] = "ⓑ",
+ ["Ⓒ"] = "ⓒ",
+ ["Ⓓ"] = "ⓓ",
+ ["Ⓔ"] = "ⓔ",
+ ["Ⓕ"] = "ⓕ",
+ ["Ⓖ"] = "ⓖ",
+ ["Ⓗ"] = "ⓗ",
+ ["Ⓘ"] = "ⓘ",
+ ["Ⓙ"] = "ⓙ",
+ ["Ⓚ"] = "ⓚ",
+ ["Ⓛ"] = "ⓛ",
+ ["Ⓜ"] = "ⓜ",
+ ["Ⓝ"] = "ⓝ",
+ ["Ⓞ"] = "ⓞ",
+ ["Ⓟ"] = "ⓟ",
+ ["Ⓠ"] = "ⓠ",
+ ["Ⓡ"] = "ⓡ",
+ ["Ⓢ"] = "ⓢ",
+ ["Ⓣ"] = "ⓣ",
+ ["Ⓤ"] = "ⓤ",
+ ["Ⓥ"] = "ⓥ",
+ ["Ⓦ"] = "ⓦ",
+ ["Ⓧ"] = "ⓧ",
+ ["Ⓨ"] = "ⓨ",
+ ["Ⓩ"] = "ⓩ",
+ ["Ⰰ"] = "ⰰ",
+ ["Ⰱ"] = "ⰱ",
+ ["Ⰲ"] = "ⰲ",
+ ["Ⰳ"] = "ⰳ",
+ ["Ⰴ"] = "ⰴ",
+ ["Ⰵ"] = "ⰵ",
+ ["Ⰶ"] = "ⰶ",
+ ["Ⰷ"] = "ⰷ",
+ ["Ⰸ"] = "ⰸ",
+ ["Ⰹ"] = "ⰹ",
+ ["Ⰺ"] = "ⰺ",
+ ["Ⰻ"] = "ⰻ",
+ ["Ⰼ"] = "ⰼ",
+ ["Ⰽ"] = "ⰽ",
+ ["Ⰾ"] = "ⰾ",
+ ["Ⰿ"] = "ⰿ",
+ ["Ⱀ"] = "ⱀ",
+ ["Ⱁ"] = "ⱁ",
+ ["Ⱂ"] = "ⱂ",
+ ["Ⱃ"] = "ⱃ",
+ ["Ⱄ"] = "ⱄ",
+ ["Ⱅ"] = "ⱅ",
+ ["Ⱆ"] = "ⱆ",
+ ["Ⱇ"] = "ⱇ",
+ ["Ⱈ"] = "ⱈ",
+ ["Ⱉ"] = "ⱉ",
+ ["Ⱊ"] = "ⱊ",
+ ["Ⱋ"] = "ⱋ",
+ ["Ⱌ"] = "ⱌ",
+ ["Ⱍ"] = "ⱍ",
+ ["Ⱎ"] = "ⱎ",
+ ["Ⱏ"] = "ⱏ",
+ ["Ⱐ"] = "ⱐ",
+ ["Ⱑ"] = "ⱑ",
+ ["Ⱒ"] = "ⱒ",
+ ["Ⱓ"] = "ⱓ",
+ ["Ⱔ"] = "ⱔ",
+ ["Ⱕ"] = "ⱕ",
+ ["Ⱖ"] = "ⱖ",
+ ["Ⱗ"] = "ⱗ",
+ ["Ⱘ"] = "ⱘ",
+ ["Ⱙ"] = "ⱙ",
+ ["Ⱚ"] = "ⱚ",
+ ["Ⱛ"] = "ⱛ",
+ ["Ⱜ"] = "ⱜ",
+ ["Ⱝ"] = "ⱝ",
+ ["Ⱞ"] = "ⱞ",
+ ["Ⱡ"] = "ⱡ",
+ ["Ɫ"] = "ɫ",
+ ["Ᵽ"] = "ᵽ",
+ ["Ɽ"] = "ɽ",
+ ["Ⱨ"] = "ⱨ",
+ ["Ⱪ"] = "ⱪ",
+ ["Ⱬ"] = "ⱬ",
+ ["Ⱶ"] = "ⱶ",
+ ["Ⲁ"] = "ⲁ",
+ ["Ⲃ"] = "ⲃ",
+ ["Ⲅ"] = "ⲅ",
+ ["Ⲇ"] = "ⲇ",
+ ["Ⲉ"] = "ⲉ",
+ ["Ⲋ"] = "ⲋ",
+ ["Ⲍ"] = "ⲍ",
+ ["Ⲏ"] = "ⲏ",
+ ["Ⲑ"] = "ⲑ",
+ ["Ⲓ"] = "ⲓ",
+ ["Ⲕ"] = "ⲕ",
+ ["Ⲗ"] = "ⲗ",
+ ["Ⲙ"] = "ⲙ",
+ ["Ⲛ"] = "ⲛ",
+ ["Ⲝ"] = "ⲝ",
+ ["Ⲟ"] = "ⲟ",
+ ["Ⲡ"] = "ⲡ",
+ ["Ⲣ"] = "ⲣ",
+ ["Ⲥ"] = "ⲥ",
+ ["Ⲧ"] = "ⲧ",
+ ["Ⲩ"] = "ⲩ",
+ ["Ⲫ"] = "ⲫ",
+ ["Ⲭ"] = "ⲭ",
+ ["Ⲯ"] = "ⲯ",
+ ["Ⲱ"] = "ⲱ",
+ ["Ⲳ"] = "ⲳ",
+ ["Ⲵ"] = "ⲵ",
+ ["Ⲷ"] = "ⲷ",
+ ["Ⲹ"] = "ⲹ",
+ ["Ⲻ"] = "ⲻ",
+ ["Ⲽ"] = "ⲽ",
+ ["Ⲿ"] = "ⲿ",
+ ["Ⳁ"] = "ⳁ",
+ ["Ⳃ"] = "ⳃ",
+ ["Ⳅ"] = "ⳅ",
+ ["Ⳇ"] = "ⳇ",
+ ["Ⳉ"] = "ⳉ",
+ ["Ⳋ"] = "ⳋ",
+ ["Ⳍ"] = "ⳍ",
+ ["Ⳏ"] = "ⳏ",
+ ["Ⳑ"] = "ⳑ",
+ ["Ⳓ"] = "ⳓ",
+ ["Ⳕ"] = "ⳕ",
+ ["Ⳗ"] = "ⳗ",
+ ["Ⳙ"] = "ⳙ",
+ ["Ⳛ"] = "ⳛ",
+ ["Ⳝ"] = "ⳝ",
+ ["Ⳟ"] = "ⳟ",
+ ["Ⳡ"] = "ⳡ",
+ ["Ⳣ"] = "ⳣ",
+ ["A"] = "a",
+ ["B"] = "b",
+ ["C"] = "c",
+ ["D"] = "d",
+ ["E"] = "e",
+ ["F"] = "f",
+ ["G"] = "g",
+ ["H"] = "h",
+ ["I"] = "i",
+ ["J"] = "j",
+ ["K"] = "k",
+ ["L"] = "l",
+ ["M"] = "m",
+ ["N"] = "n",
+ ["O"] = "o",
+ ["P"] = "p",
+ ["Q"] = "q",
+ ["R"] = "r",
+ ["S"] = "s",
+ ["T"] = "t",
+ ["U"] = "u",
+ ["V"] = "v",
+ ["W"] = "w",
+ ["X"] = "x",
+ ["Y"] = "y",
+ ["Z"] = "z",
+ ["𐐀"] = "𐐨",
+ ["𐐁"] = "𐐩",
+ ["𐐂"] = "𐐪",
+ ["𐐃"] = "𐐫",
+ ["𐐄"] = "𐐬",
+ ["𐐅"] = "𐐭",
+ ["𐐆"] = "𐐮",
+ ["𐐇"] = "𐐯",
+ ["𐐈"] = "𐐰",
+ ["𐐉"] = "𐐱",
+ ["𐐊"] = "𐐲",
+ ["𐐋"] = "𐐳",
+ ["𐐌"] = "𐐴",
+ ["𐐍"] = "𐐵",
+ ["𐐎"] = "𐐶",
+ ["𐐏"] = "𐐷",
+ ["𐐐"] = "𐐸",
+ ["𐐑"] = "𐐹",
+ ["𐐒"] = "𐐺",
+ ["𐐓"] = "𐐻",
+ ["𐐔"] = "𐐼",
+ ["𐐕"] = "𐐽",
+ ["𐐖"] = "𐐾",
+ ["𐐗"] = "𐐿",
+ ["𐐘"] = "𐑀",
+ ["𐐙"] = "𐑁",
+ ["𐐚"] = "𐑂",
+ ["𐐛"] = "𐑃",
+ ["𐐜"] = "𐑄",
+ ["𐐝"] = "𐑅",
+ ["𐐞"] = "𐑆",
+ ["𐐟"] = "𐑇",
+ ["𐐠"] = "𐑈",
+ ["𐐡"] = "𐑉",
+ ["𐐢"] = "𐑊",
+ ["𐐣"] = "𐑋",
+ ["𐐤"] = "𐑌",
+ ["𐐥"] = "𐑍",
+ ["𐐦"] = "𐑎",
+ ["𐐧"] = "𐑏",
+}
+
diff --git a/rrSavedVarsDefaults.lua b/rrSavedVarsDefaults.lua
new file mode 100644
index 0000000..422bdcf
--- /dev/null
+++ b/rrSavedVarsDefaults.lua
@@ -0,0 +1,63 @@
+RR.SavedVarsDefaults = {
+ ['hostileNameEnabled'] = true,
+ ['hostileLevelEnabled'] = true,
+ ['hostileRangeEnabled'] = true,
+ ['hostileDifficultyEnabled'] = true,
+ ['hostileReticleColoringEnabled'] = true,
+ ['hostileRangeColoringEnabled'] = true,
+ ['hostileNameLevelColoringEnabled'] = true,
+ ['hostileOutOfRangeEnabled'] = true,
+ ['hostileOORColor'] = {r=1, g=1, b=0},
+ ['hostileInRangeEnabled'] = true,
+ ['hostileInRangeDistance'] = 28,
+ ['hostileIRColor'] = {r=1, g=0.65, b=0},
+ ['hostileInMeleeRangeEnabled'] = true,
+ ['hostileInMeleeRangeDistance'] = 5,
+ ['hostileIMRColor'] = {r=1, g=0, b=0},
+
+ ['alliesNameEnabled'] = true,
+ ['alliesLevelEnabled'] = true,
+ ['alliesRangeEnabled'] = true,
+ ['alliesReticleColoringEnabled'] = true,
+ ['alliesRangeColoringEnabled'] = true,
+ ['alliesNameLevelColoringEnabled'] = true,
+ ['alliesOutOfRangeEnabled'] = true,
+ ['alliesOORColor'] = {r=0, g=1, b=1},
+ ['alliesInRangeEnabled'] = true,
+ ['alliesInRangeDistance'] = 28,
+ ['alliesIRColor'] = {r=0, g=0, b=1},
+ ['alliesInMeleeRangeEnabled'] = true,
+ ['alliesInMeleeRangeDistance'] = 5,
+ ['alliesIMRColor'] = {r=0, g=1, b=0},
+
+ ['neutralNameEnabled'] = false,
+ ['neutralLevelEnabled'] = false,
+ ['neutralRangeEnabled'] = false,
+ ['neutralDifficultyEnabled'] = false,
+ ['neutralReticleColoringEnabled'] = false,
+ ['neutralRangeColoringEnabled'] = false,
+ ['neutralNameLevelColoringEnabled'] = false,
+ ['neutralOutOfRangeEnabled'] = false,
+ ['neutralOORColor'] = {r=1, g=1, b=0},
+ ['neutralInRangeEnabled'] = false,
+ ['neutralInRangeDistance'] = 28,
+ ['neutralIRColor'] = {r=1, g=0.65, b=0},
+ ['neutralInMeleeRangeEnabled'] = false,
+ ['neutralInMeleeRangeDistance'] = 5,
+ ['neutralIMRColor'] = {r=1, g=0, b=0},
+
+ ['npcsNameEnabled'] = false,
+ ['npcsLevelEnabled'] = false,
+ ['npcsRangeEnabled'] = false,
+ ['npcsReticleColoringEnabled'] = false,
+ ['npcsRangeColoringEnabled'] = false,
+ ['npcsNameLevelColoringEnabled'] = false,
+ ['npcsOutOfRangeEnabled'] = false,
+ ['npcsOORColor'] = {r=0, g=1, b=1},
+ ['npcsInRangeEnabled'] = false,
+ ['npcsInRangeDistance'] = 28,
+ ['npcsIRColor'] = {r=0, g=0, b=1},
+ ['npcsInMeleeRangeEnabled'] = false,
+ ['npcsInMeleeRangeDistance'] = 5,
+ ['npcsIMRColor'] = {r=0, g=1, b=0},
+}
\ No newline at end of file