@ -87,7 +87,7 @@ dbot.version : Module to track version and changelog information and update the
save_state="y"
save_state="y"
date_written="2017-08-12 08:45:15"
date_written="2017-08-12 08:45:15"
requires="4.98"
requires="4.98"
version="2.0008 "
version="2.0009 "
>
>
<description trim= "y" >
<description trim= "y" >
< ![CDATA[
< ![CDATA[
@ -166,16 +166,12 @@ Usage
Release Notes
Release Notes
=============
=============
1) There currently is no mechanism to change stat prioritization other than manually modifying the
1) If you give an item to an enchanter to boost the item's stats, you may pull the old stats from a
plugin. This is high on the list of new features and a GUI supporting this will hopefully be
coming in the future.
2) If you give an item to an enchanter to boost the item's stats, you may pull the old stats from a
cache instead of using the new enchantments when you get the item back. In this case, you may use
cache instead of using the new enchantments when you get the item back. In this case, you may use
the "dinv forget <query > " option to remove that item from your inventory table and its related caches.
the "dinv forget <query > " option to remove that item from your inventory table and its related caches.
The next inventory refresh will pick up the new stats for the item.
The next inventory refresh will pick up the new stats for the item.
3 ) Most aard operations that modify an item's stats are detected and automatically trigger a
2 ) Most aard operations that modify an item's stats are detected and automatically trigger a
re-identification. For example, enchantment spells, sharpening, reinforcing, tpenchanting, and wset
re-identification. For example, enchantment spells, sharpening, reinforcing, tpenchanting, and wset
all are handled transparently. The one known exception is the setweight command which is not
all are handled transparently. The one known exception is the setweight command which is not
currently handled by aard's invitem system. Until this is changed (or until we include a trigger
currently handled by aard's invitem system. Until this is changed (or until we include a trigger
@ -183,27 +179,27 @@ Release Notes
weight in order to "forget" the old stats and then pick up the correct weight (and other stats) on
weight in order to "forget" the old stats and then pick up the correct weight (and other stats) on
the next inventory refresh.
the next inventory refresh.
4 ) Wands and staves are not re-identified as they are used. As a result, the number of charges
3 ) Wands and staves are not re-identified as they are used. As a result, the number of charges
shown in the item's display may not match reality as the item is used. If this mode is not added
shown in the item's display may not match reality as the item is used. If this mode is not added
to the aard invitem system, we may need to add a trigger to watch for this and update charges
to the aard invitem system, we may need to add a trigger to watch for this and update charges
accordingly.
accordingly.
5 ) The plugin does not automatically open containers that are closed. As a result, you won't be able
4 ) The plugin does not automatically open containers that are closed. As a result, you won't be able
to get/put items in a closed container. Keep your containers open! :)
to get/put items in a closed container. Keep your containers open! :)
6 ) If you add a keyword to an item, drop it, and then pick it back up, the new keyword will still
5 ) If you add a keyword to an item, drop it, and then pick it back up, the new keyword will still
be available on the item if it is still in your cache. However, this is not the case for common
be available on the item if it is still in your cache. However, this is not the case for common
consumable items. For example, we treat all duff beer potions as being identical so that you don't
consumable items. For example, we treat all duff beer potions as being identical so that you don't
need to individually identify each potion. As a result, the cached versions of those common items
need to individually identify each potion. As a result, the cached versions of those common items
won't maintain custom keywords.
won't maintain custom keywords.
7 ) If the plugin tags are enabled, they will echo an end tag at the conclusion of an operation. However,
6 ) If the plugin tags are enabled, they will echo an end tag at the conclusion of an operation. However,
if the user goes into a state that doesn't allow echoing (e.g., AFK) then the plugin cannot report the
if the user goes into a state that doesn't allow echoing (e.g., AFK) then the plugin cannot report the
end tag. In this scenario, the plugin will notify the user about the end tag via a warning notification
end tag. In this scenario, the plugin will notify the user about the end tag via a warning notification
instead of an echo. Triggers cannot catch notifications though so any code relying on end tags should
instead of an echo. Triggers cannot catch notifications though so any code relying on end tags should
either detect when you go AFK or cleanly time out after a reasonable amount of time.
either detect when you go AFK or cleanly time out after a reasonable amount of time.
8 ) If you add the portal wish after you have built your inventory table, you will need to either rebuild
7 ) If you add the portal wish after you have built your inventory table, you will need to either rebuild
the table (dinv build confirm) or forget/re-identify your portals (dinv forget type portal) and
the table (dinv build confirm) or forget/re-identify your portals (dinv forget type portal) and
(dinv refresh all).
(dinv refresh all).
@ -211,17 +207,16 @@ Release Notes
Feature Wishlist
Feature Wishlist
================
================
1) Add a way to create and update stat prioritizations. A GUI would be a very convenient way
1) Support masking out specific wearable locations for a set (e.g., dinv set wear psi ~hold)
to handle this.
2) Implement a configuration option so that you can explicitly allow dinv operations to take
place even during combat. By default, most operations are blocked during combat.
2) Implement a mechanism to (more) fully identify items if the identify wish is not available.
3 ) Implement a mechanism to (more) fully identify items if the identify wish is not available.
For example, we could use lore, the identify or object read spells, or Hester's identify
For example, we could use lore, the identify or object read spells, or Hester's identify
service found at "runto identify". This would be a manual process to "clean up" partially
service found at "runto identify". This would be a manual process to "clean up" partially
identified items.
identified items.
3) Add a display option to de-duplicate potions and pills in search results
]]>
]]>
</description>
</description>
@ -541,7 +536,17 @@ Feature Wishlist
<alias
<alias
script="inv.cli.priority.fn"
script="inv.cli.priority.fn"
match="^[ ]*dinv[ ]+priority[ ]+(list|display|compare)[ ]*([^ ]*)?[ ]*([^ ]*)?$"
match="^[ ]*dinv[ ]+priority[ ]+(list|display|create|delete|clone|compare)([ ]+[^ ]+)?([ ]+[^ ]+)?[ ]*$"
enabled="y"
regexp="y"
send_to="12"
sequence="100"
>
</alias>
<alias
script="inv.cli.priority.fn2"
match="^[ ]*dinv[ ]+priority[ ]+(edit|split|join)([ ]+[^ ]+)?([ ]+[^ ]+)?[ ]*$"
enabled="y"
enabled="y"
regexp="y"
regexp="y"
send_to="12"
send_to="12"
@ -1424,6 +1429,7 @@ end -- inv.config.new
-- inv.cli.set.usage()
-- inv.cli.set.usage()
-- inv.cli.set.examples()
-- inv.cli.set.examples()
-- inv.cli.priority.fn(name, line, wildcards)
-- inv.cli.priority.fn(name, line, wildcards)
-- inv.cli.priority.fn2(name, line, wildcards)
-- inv.cli.priority.usage()
-- inv.cli.priority.usage()
-- inv.cli.priority.examples()
-- inv.cli.priority.examples()
-- inv.cli.snapshot.fn(name, line, wildcards)
-- inv.cli.snapshot.fn(name, line, wildcards)
@ -2369,11 +2375,11 @@ end -- inv.cli.set.examples
inv.cli.priority = {}
inv.cli.priority = {}
function inv.cli.priority.fn(name, line, wildcards)
function inv.cli.priority.fn(name, line, wildcards)
local command = wildcards[1] or ""
local command = Trim( wildcards[1] or "")
local priorityName1 = wildcards[2] or ""
local priorityName1 = Trim( wildcards[2] or "")
local priorityName2 = wildcards[3] or ""
local priorityName2 = Trim( wildcards[3] or "")
dbot.debug("inv.cli.priority: command=\"" .. command .. "\", name1=\"" .. priorityName1 ..
dbot.debug("inv.cli.priority.fn : command=\"" .. command .. "\", name1=\"" .. priorityName1 ..
"\", name2=\"" .. priorityName2 .. "\"")
"\", name2=\"" .. priorityName2 .. "\"")
if (not inv.init.initializedActive) then
if (not inv.init.initializedActive) then
@ -2390,6 +2396,15 @@ function inv.cli.priority.fn(name, line, wildcards)
elseif (command == "compare") then
elseif (command == "compare") then
inv.priority.compare(priorityName1, priorityName2, line)
inv.priority.compare(priorityName1, priorityName2, line)
elseif (command == "create") then
inv.priority.create(priorityName1, line)
elseif (command == "delete") then
inv.priority.delete(priorityName1, line)
elseif (command == "clone") then
inv.priority.clone(priorityName1, priorityName2, line)
else
else
inv.cli.priority.usage()
inv.cli.priority.usage()
return inv.tags.stop(invTagsPriority, line, DRL_RET_INVALID_PARAM)
return inv.tags.stop(invTagsPriority, line, DRL_RET_INVALID_PARAM)
@ -2398,9 +2413,52 @@ function inv.cli.priority.fn(name, line, wildcards)
end -- inv.cli.priority.fn
end -- inv.cli.priority.fn
function inv.cli.priority.fn2(name, line, wildcards)
local command = Trim(wildcards[1] or "")
local priorityName = Trim(wildcards[2] or "")
local editFields = Trim(wildcards[3] or "")
local level = tonumber(wildcards[3] or "")
dbot.debug("inv.cli.priority.fn2: command=\"" .. command .. "\", priority=\"" .. priorityName ..
"\", level=\"" .. (level or "nil") .. "\"")
if (not inv.init.initializedActive) then
dbot.info("Skipping priority request: plugin is not yet initialized (are you AFK or sleeping?)")
return inv.tags.stop(invTagsPriority, line, DRL_RET_UNINITIALIZED)
end -- if
if (command == "edit") then
local useAllFields
if (editFields == "full") then
useAllFields = true
elseif (editFields == "") then
useAllFields = false
else
inv.cli.priority.usage()
return inv.tags.stop(invTagsPriority, line, DRL_RET_INVALID_PARAM)
end -- if
inv.priority.edit(priorityName, useAllFields, false, line)
elseif (command == "split") then
inv.priority.split(priorityName, level, line)
elseif (command == "join") then
inv.priority.join(priorityName, level, line)
else
inv.cli.priority.usage()
return inv.tags.stop(invTagsPriority, line, DRL_RET_INVALID_PARAM)
end -- if
end -- inv.cli.priority.fn2
function inv.cli.priority.usage()
function inv.cli.priority.usage()
dbot.print("@W " .. pluginNameCmd ..
dbot.print("@W " .. pluginNameCmd ..
" priority @G[list | display | compare] @Y<priority n a m e 1 > <priority n a m e 2 > @w")
" priority @G[list | display | create | clone | delete | edit | compare] " ..
"@Y<name 1 > <name 2 > @w")
end -- inv.cli.priority.usage
end -- inv.cli.priority.usage
@ -2459,14 +2517,14 @@ Examples:
1) List all existing priorities defined for the plugin
1) List all existing priorities defined for the plugin
"@Gdinv priority list@W"
"@Gdinv priority list@W"
2) Compare the stat differences for all levels for the equipment sets generated by two
2) Clone an existing priority. In this example we make a copy of the default "warrior" priority
different priorities. This will generate a big report that I didn't include here because
and name it "myAwesomeWarrior".
this helpfile is already enormous :)
"@Gdinv priority clone warrior myAwesomeWarrior@W"
"@Gdinv priority compare myPriority1 myPriority2@W"
3) Display the "psi-melee" priority bundled with the plugin. This is intended for a primary
3) Display the "psi-melee" priority bundled with the plugin. This is intended for a primary
psi with at least one melee class. You may or may not agree with these priorities. That's
psi with at least one melee class. You may or may not agree with these priorities. That's
why this plugin gives you the ability to tweak things to your heart's content :)
why this plugin gives you the ability to tweak things to your heart's content :) This
priority defines 6 different level ranges with different priorities at each range.
"@Gdinv priority display psi-melee@W"
"@Gdinv priority display psi-melee@W"
@WPriority: "@Cpsi-melee@W"
@WPriority: "@Cpsi-melee@W"
@ -2501,77 +2559,51 @@ Examples:
@C allmagic@r 0.03 0.03 0.05 0.05 0.05 0.05@W : @cValue of 1 point in each magical resist type
@C allmagic@r 0.03 0.03 0.05 0.05 0.05 0.05@W : @cValue of 1 point in each magical resist type
@C allphys@r 0.03 0.05 0.10 0.10 0.10 0.10@W : @cValue of 1 point in each physical resist type
@C allphys@r 0.03 0.05 0.10 0.10 0.10 0.10@W : @cValue of 1 point in each physical resist type
@W
@W
At the present time, the plugin does not have a GUI component so priority customization must be
4) Create a new priority from scratch. This will pop up a window populated with a single level
done by manually editing the plugin file directly. Adding a GUI is very high on the priority list
range (1 - 291) and values of 0 for each possible priority field. You can break the level
(pun intended) for a future release of the plugin. In the meantime, you can open the plugin in an
range into multiple ranges by adding additional columns and ensuring that each column's min
editor, search for the inv.priority.addDefault function, and add or modify one of the example
and max level fields do not overlap with another column. Once you enter values for each
default priorities. Once you have made your modifications, run "@Gdinv reset confirm priority@W"
field, hit the "Done!" button to save your work. The plugin does not currently save your
to reset your priorities to the new default values.
priority if it is malformed (that would be a nice feature!) so you may want to copy your work
into another file before you hit "Done!".
This is an example where int, luck, and wis are equally weighted and no other stats are scored.
"@Gdinv priority create sillyTankMage@W"
It gives the highest possible stats for an enchanter wanting to enchant something. The group of
priorities is the same from level 1 - 291.
5) Yeah, that tank mage thing was probably too silly. Let's delete it.
@G
"@Gdinv priority delete sillyTankMage@W"
retval = inv.priority.add(
"enchanter", -- Equipment priorities for an enchanter (only care about int, luck, wis)
6) Edit an existing priority. This could be something that you cloned, something you made from
{
scratch, or even a modified default priority. This example does not use the "full" mode and
{ -- Priorities for levels 1 - 291
only lists fields that have a non-zero value. It also does not include descriptions for each
minLevel = 1,
priority field. That makes things more compact and easier to see.
maxLevel = 291,
"@Gdinv priority edit psi-no-melee@W"
priorities = { int = 1,
luck = 1,
7) Edit a priority with the "full" mode. This shows everything -- including fields that only
wis = 1
have a priority of zero. It also shows a description for each field. If you use the "full"
}
mode on a large priority, you may need to resize your edit window to see everything.
}
"@Gdinv priority edit mage full@W"
})
@W
8) Compare the stat differences at all levels for the equipment sets generated by two different
Here is a snippet showing how things are prioritized from levels 1 - 50 for a psi with at
priorities. This will generate a big report that I didn't include here because this helpfile
least one melee class (you may want different priorities -- that's just fine!)
is already enormous :) If you have not already performed a full analysis of both priorities
@G
you will be prompted to do so before the comparison can execute. The output shown below is
retval = inv.priority.add(
just a snippet. For my equipment at level 11, switching from the "psi" to the "psi-melee"
"psi-melee", -- Equipment priorities for a psi with at least one melee class
priority loses my shield and a little hitroll, con, and resists. However, it gives me a lot
{
more weapon damage and damroll, a little more int, and the regeneration effect (it must use a
{ -- Priorities for levels 1 - 50
ring of regen while the "psi" priority doesn't.)
minLevel = 1,
"@Gdinv priority compare psi psi-melee@W"
maxLevel = 50,
priorities = { int = 0.8,
@WSwitching from priority "@Gpsi@W" to priority "@Gpsi-melee@W" would result in these changes:
luck = 1,
wis = 0.7,
@W Ave Sec HR DR Int Wis Lck Str Dex Con Res HitP Mana Move Effects
str = 1,
@WLevel 11: @G 23@W @G 4@W @R -6@W @G 26@W @G 2@W 0 0 0 0 @R -4@W @R -2@W 0 0 0 @Gregeneration@W @Rshield@W
dex = 0.8,
@WLevel 12: @G 23@W @G 4@W @R -6@W @G 26@W @G 2@W 0 0 0 0 @R -4@W @R -2@W 0 0 0 @Gregeneration@W @Rshield@W
con = 0.2,
@WLevel 13: @G 23@W @G 4@W @R -6@W @G 26@W @G 2@W 0 0 0 0 @R -4@W @R -2@W 0 0 0 @Gregeneration@W @Rshield@W
dam = 0.9,
@WLevel 14: @G 23@W @G 4@W @R -6@W @G 26@W @G 2@W 0 0 0 0 @R -4@W @R -2@W 0 0 0 @Gregeneration@W @Rshield@W
hit = 0.85,
@WLevel 15: @G 23@W @G 4@W @R -3@W @G 22@W 0 0 0 0 0 @R -4@W @R -2@W 0 0 0 @Gregeneration@W @Rshield@W
hp = 0.02,
@WLevel 16: @G 23@W @G 4@W @R -9@W @G 32@W 0 0 0 0 0 @R -4@W 0 0 0 0 @Gregeneration@W @Rshield@W
mana = 0.01,
@WLevel 17: @G 23@W @G 4@W @R -9@W @G 32@W 0 0 0 0 0 @R -4@W 0 0 0 0 @Gregeneration@W @Rshield@W
moves = 0,
@WLevel 18: @G 23@W @G 4@W @R -9@W @G 32@W 0 0 0 0 0 @R -4@W 0 0 0 0 @Gregeneration@W @Rshield@W
allphys = 0.03,
@WLevel 19: @G 23@W @G 4@W @R -9@W @G 32@W 0 0 0 0 0 @R -3@W 0 0 0 0 @Gregeneration@W @Rshield@W
allmagic = 0.03,
avedam = 1,
offhandDam = 0.33,
regeneration = 5,
sanctuary = 50,
haste = 20,
detectgood = 2,
detectevil = 2,
detecthidden = 3,
detectinvis = 4,
detectmagic = 0, -- I don't care if we can detect magic
shield = 5,
dualwield = 20,
irongrip = 2,
invis = 10,
flying = 5,
maxint = 0,
maxluck = 0,
maxwis = 0,
maxstr = 0,
maxdex = 0,
maxcon = 0
}
},
@W
... This is just a snippet. You can look at the plugin file for more details
]])
]])
end -- inv.cli.priority.examples
end -- inv.cli.priority.examples
@ -10213,13 +10245,13 @@ end -- inv.cache.clearOld
-- inv.priority.reset()
-- inv.priority.reset()
--
--
-- inv.priority.create(priorityName, endTag)
-- inv.priority.create(priorityName, endTag)
-- inv.priority.clone(clonedPriorityName, orig PriorityName, endTag)
-- inv.priority.clone(origPriorityName, cloned PriorityName, endTag)
-- inv.priority.delete(priorityName, endTag)
-- inv.priority.delete(priorityName, endTag)
--
--
-- inv.priority.list(endTag)
-- inv.priority.list(endTag)
-- inv.priority.display(priorityName, endTag)
-- inv.priority.display(priorityName, endTag)
--
--
-- inv.priority.edit(priorityName, level , endTag)
-- inv.priority.edit(priorityName, useAllFields, isQuiet , endTag)
-- inv.priority.split(priorityName, level, endTag)
-- inv.priority.split(priorityName, level, endTag)
-- inv.priority.join(priorityName, level, endTag)
-- inv.priority.join(priorityName, level, endTag)
--
--
@ -10352,10 +10384,12 @@ function inv.priority.create(priorityName, endTag)
dbot.warn("inv.priority.create: Failed to add new priority \"@C" .. priorityName .. "@W\": " ..
dbot.warn("inv.priority.create: Failed to add new priority \"@C" .. priorityName .. "@W\": " ..
dbot.retval.getString(retval))
dbot.retval.getString(retval))
else
else
retval = inv.priority.edit(priorityName)
retval = inv.priority.edit(priorityName, true, true, endTag )
if (retval ~= DRL_RET_SUCCESS) then
if (retval ~= DRL_RET_SUCCESS) then
dbot.warn("inv.priority.create: Failed to edit priority \"@C" .. priorityName .. "@W\": " ..
dbot.warn("inv.priority.create: Failed to edit priority \"@C" .. priorityName .. "@W\": " ..
dbot.retval.getString(retval))
dbot.retval.getString(retval))
else
dbot.info("Created priority \"@C" .. priorityName .. "@W\"")
end -- if
end -- if
end -- if
end -- if
@ -10364,7 +10398,7 @@ function inv.priority.create(priorityName, endTag)
end -- inv.priority.create
end -- inv.priority.create
function inv.priority.clone(clonedPriorityName, orig PriorityName, endTag)
function inv.priority.clone(origPriorityName, cloned PriorityName, endTag)
local retval
local retval
if (clonedPriorityName == nil) or (clonedPriorityName == "") then
if (clonedPriorityName == nil) or (clonedPriorityName == "") then
@ -10384,11 +10418,15 @@ function inv.priority.clone(clonedPriorityName, origPriorityName, endTag)
if (inv.priority.table[clonedPriorityName] ~= nil) then
if (inv.priority.table[clonedPriorityName] ~= nil) then
dbot.warn("inv.priority.clone: cloned priority \"@C" .. clonedPriorityName .. "@W\" already exists")
dbot.warn("inv.priority.clone: cloned priority \"@C" .. clonedPriorityName .. "@W\" already exists")
return inv.tags.stop(invTagsPriority, endTag, DRL_RET_BUSY)
end -- if
end -- if
-- Copy the priority into a new table entry
-- Copy the priority into a new table entry
inv.priority.table[clonedPriorityName] = dbot.table.getCopy(inv.priority.table[origPriorityName])
inv.priority.table[clonedPriorityName] = dbot.table.getCopy(inv.priority.table[origPriorityName])
dbot.info("Cloned priority \"@C" .. clonedPriorityName .. "@W\" from priority \"@C" ..
origPriorityName .."@W\"")
-- Save the table with the new priority. We're done! :)
-- Save the table with the new priority. We're done! :)
retval = inv.priority.save()
retval = inv.priority.save()
@ -10411,6 +10449,12 @@ function inv.priority.delete(priorityName, endTag)
end -- if
end -- if
retval = inv.priority.remove(priorityName)
retval = inv.priority.remove(priorityName)
if (retval ~= DRL_RET_SUCCESS) then
dbot.warn("inv.priority.delete: Failed to remove priority \"@C" .. priorityName .. "@W\": " ..
dbot.retval.getString(retval))
else
dbot.info("Deleted priority \"@C" .. priorityName .. "@W\"")
end -- if
return inv.tags.stop(invTagsPriority, endTag, retval)
return inv.tags.stop(invTagsPriority, endTag, retval)
end -- inv.priority.delete
end -- inv.priority.delete
@ -10468,8 +10512,9 @@ function inv.priority.display(priorityName, endTag)
end -- inv.priority.display
end -- inv.priority.display
function inv.priority.edit(priorityName, level , endTag)
function inv.priority.edit(priorityName, useAllFields, isQuiet , endTag)
local retval = DRL_RET_SUCCESS
local retval = DRL_RET_SUCCESS
local priorityEntry, priorityString = nil, ""
if (priorityName == nil) or (priorityName == "") then
if (priorityName == nil) or (priorityName == "") then
dbot.warn("inv.priority.edit: priority name is missing!")
dbot.warn("inv.priority.edit: priority name is missing!")
@ -10481,21 +10526,78 @@ function inv.priority.edit(priorityName, level, endTag)
return inv.tags.stop(invTagsPriority, endTag, DRL_RET_MISSING_ENTRY)
return inv.tags.stop(invTagsPriority, endTag, DRL_RET_MISSING_ENTRY)
end -- if
end -- if
--FIXME: add the utils call here
-- Get a string representation of the priority we want to edit
priorityString, retval = inv.priority.tableToString(inv.priority.table[priorityName],
useAllFields, false, useAllFields)
if (retval ~= DRL_RET_SUCCESS) then
dbot.warn("inv.priority.edit: Failed to get string representation of priority \"@C" ..
priorityName .. "@W\": " .. dbot.retval.getString(retval))
return inv.tags.stop(invTagsPriority, endTag, retval)
end -- if
local instructions =
[[Edit your priority!
return retval
The first column lists the names of each available priority field. Subsequent columns specify the numeric values of that field for a level range. You may have as many level ranges as you wish, but ranges should not overlap.
]]
local fontName = GetAlphaOption("output_font_name")
if (fontName == nil) then
fontName = "Consolas"
end -- if
-- Use a slightly smaller font if there is lots of info to display
local fontSize = 12
if useAllFields then
fontSize = 10
end -- if
repeat
priorityString = utils.editbox(instructions,
"DINV: Editing priority \"" .. priorityName .. "\"",
priorityString, -- default text
fontName, -- font
fontSize, -- font size
{ ok_button = "Done!" }) -- extras
if (priorityString == nil) then
dbot.info("Cancelled request to edit priority \"@C" .. priorityName .. "@W\"")
break
else
priorityEntry, retval = inv.priority.stringToTable(priorityString)
if (retval ~= DRL_RET_SUCCESS) then
dbot.warn("inv.priority.edit: Failed to convert priority string into priority: " ..
dbot.retval.getString(retval))
else
inv.priority.table[priorityName] = priorityEntry
if (not isQuiet) then
dbot.info("Updated priority \"@C" .. priorityName .. "@W\"")
end -- if
inv.priority.save()
end -- if
end -- if
until (retval == DRL_RET_SUCCESS)
return inv.tags.stop(invTagsPriority, endTag, retval)
end -- inv.priority.edit
end -- inv.priority.edit
function inv.priority.split(priorityName, level, endTag)
function inv.priority.split(priorityName, level, endTag)
--FIXME: add this!
local retval = DRL_RET_SUCCESS
dbot.note("FIXME: split -- do we want/need this?")
return inv.tags.stop(invTagsPriority, endTag, retval)
end -- inv.priority.split
end -- inv.priority.split
function inv.priority.join(priorityName, level, endTag)
function inv.priority.join(priorityName, level, endTag)
--FIXME: add this!
local retval = DRL_RET_SUCCESS
dbot.note("FIXME: join -- do we want/need this?")
return inv.tags.stop(invTagsPriority, endTag, retval)
end -- inv.priority.join
end -- inv.priority.join
@ -10526,8 +10628,8 @@ function inv.priority.compare(priorityName1, priorityName2, endTag)
local endLevel = startLevel + 200
local endLevel = startLevel + 200
local doPrintHeader = true
local doPrintHeader = true
dbot.print("@WDifference between optimal sets for \"@G" .. priorityName1 ..
dbot.print("@WSwitching from priority \"@G" .. priorityName1 .. "@W\" to priority \"@G" ..
"@W\" and \"@G" .. priorityName2 .. "@W\"\n@w")
priorityName2 .. "@W\" would result in these changes: \n@w")
for level = startLevel, endLevel do
for level = startLevel, endLevel do
local set1 = inv.set.get(priorityName1, level)
local set1 = inv.set.get(priorityName1, level)
@ -10703,15 +10805,15 @@ function inv.priority.tableToString(priorityTable, doDisplayUnused, doDisplayCol
end -- if
end -- if
-- Create the first line of the header
-- Create the first line of the header
local priString = generalPrefix .. string.format("%12s", "Field ")
local priString = generalPrefix .. string.format("%12s", "MinLevel ")
for _, blockEntry in ipairs(priorityTable) do
for _, blockEntry in ipairs(priorityTable) do
priString = priString .. string.format(" %sL %0 3d- %s", levelPrefix, blockEntry.minLevel, levelSuffix)
priString = priString .. string.format(" %s%3d%s", levelPrefix, blockEntry.minLevel, levelSuffix)
end -- for
end -- for
-- Create the second line of the header
-- Create the second line of the header
priString = priString .. string.format("\n%12s", "Name ")
priString = priString .. string.format("\n%12s", "MaxLevel ")
for _, blockEntry in ipairs(priorityTable) do
for _, blockEntry in ipairs(priorityTable) do
priString = priString .. string.format(" %sL %0 3d%s ", levelPrefix, blockEntry.maxLevel, levelSuffix)
priString = priString .. string.format(" %s%3d%s", levelPrefix, blockEntry.maxLevel, levelSuffix)
end -- for
end -- for
priString = priString .. "\n" .. generalSuffix
priString = priString .. "\n" .. generalSuffix
@ -10778,7 +10880,128 @@ function inv.priority.stringToTable(priorityString)
local retval = DRL_RET_SUCCESS
local retval = DRL_RET_SUCCESS
local priEntry = {}
local priEntry = {}
--FIXME: add this!
if (priorityString == nil) or (priorityString == "") then
dbot.warn("inv.priority.stringToTable: Missing priority string parameter")
return priEntry, DRL_RET_INVALID_ENTRY
end -- if
local lines = utils.split(priorityString, "\n")
-- Remove any color codes and comments. This makes parsing everything much simpler.
for i, line in ipairs(lines) do
lines[i] = string.gsub(strip_colours(line), ":.*$", "")
end -- for
-- Verify the integrity of the string table. Each line should have the same number
-- of columns.
local numColumns = nil
for i, line in ipairs(lines) do
local words, retval = dbot.wordsToArray(line)
if (retval ~= DRL_RET_SUCCESS) then
dbot.warn("inv.priority.stringToTable: Failed to convert line into array: " ..
dbot.retval.getString(retval))
return priEntry, retval
end -- if
-- Remove any lines containing only white space. Those just complicate things...
if (#words == 0) then
table.remove(lines, i)
elseif (numColumns == nil) then
numColumns = #words
elseif (numColumns ~= #words) then
dbot.warn("inv.priority.stringToTable: Malformed line has wrong number of columns: ")
dbot.warn(" \"" .. line .. "\"")
return priEntry, DRL_RET_INVALID_PARAM
end -- if
end -- for
if (numColumns == nil) then
dbot.warn("inv.priority.stringToTable: No valid lines were detected")
return priEntry, DRL_RET_INVALID_PARAM
elseif (numColumns < 2 ) t h e n
dbot.warn("inv.priority.stringToTable: Missing priority block column(s)")
return priEntry, DRL_RET_INVALID_PARAM
end -- if
-- Parse the header lines
if (#lines < 2 ) t h e n
dbot.warn("inv.priority.stringToTable: Missing header lines")
return priEntry, DRL_RET_INVALID_PARAM
end -- if
local header1, retval = dbot.wordsToArray(lines[1])
if (retval ~= DRL_RET_SUCCESS) then
dbot.warn("inv.priority.stringToTable: Failed to convert header1 into array: " ..
dbot.retval.getString(retval))
return priEntry, retval
end -- if
if (header1[1] ~= "MinLevel") then
dbot.warn("inv.priority.stringToTable: Missing Field header")
return priEntry, DRL_RET_INVALID_PARAM
end -- if
local header2, retval = dbot.wordsToArray(lines[2])
if (retval ~= DRL_RET_SUCCESS) then
dbot.warn("inv.priority.stringToTable: Failed to convert header2 into array: " ..
dbot.retval.getString(retval))
return priEntry, retval
end -- if
if (header2[1] ~= "MaxLevel") then
dbot.warn("inv.priority.stringToTable: Missing field name header")
return priEntry, DRL_RET_INVALID_PARAM
end -- if
-- Set up the initial block entries and level ranges
for i = 2, numColumns do -- Skip the first column (min/max levels and the field names)
local _, _, minLevel = string.find(header1[i], "(%d+)")
local _, _, maxLevel = string.find(header2[i], "(%d+)")
minLevel = tonumber(minLevel or "") or 0
maxLevel = tonumber(maxLevel or "") or 0
table.insert(priEntry, { minLevel = minLevel, maxLevel = maxLevel, priorities = {} })
end -- for
-- For each priority field, add the field's value to each block entry
for i = 3, #lines do
local fieldLine, retval = dbot.wordsToArray(lines[i])
if (retval ~= DRL_RET_SUCCESS) then
dbot.warn("inv.priority.stringToTable: Failed to parse line \"" .. lines[i] .. "\"")
return priEntry, DRL_RET_INVALID_PARAM
end -- if
if (#fieldLine > 0) then
-- Verify that the field name is valid
local fieldName = fieldLine[1]
local fieldIsValid = false
for _, entry in ipairs(inv.priority.fieldTable) do
if (entry[1] == fieldName) then
fieldIsValid = true
break
end -- if
end -- if
if (not fieldIsValid) then
dbot.warn("Unsupported priority field \"" .. (fieldName or "nil") .. "\" in line\n \"" ..
(lines[i] or "nil") .. "\"")
return priEntry, DRL_RET_INVALID_PARAM
end -- if
for blockIdx, priorityBlock in ipairs(priEntry) do
local fieldValue = tonumber(fieldLine[blockIdx + 1] or "") -- add one to skip over the field name
if (fieldValue == nil) then
dbot.warn("inv.priority.stringToTable: Invalid field value at column " .. blockIdx + 1 ..
" in line \"" .. lines[i] .. "\"")
return priEntry, DRL_RET_INVALID_PARAM
end -- if
priorityBlock.priorities[fieldName] = fieldValue
end -- for
end -- if
end -- for
return priEntry, retval
return priEntry, retval
end -- inv.priority.stringToTable
end -- inv.priority.stringToTable
@ -10826,16 +11049,16 @@ function inv.priority.addDefault()
minLevel = 1,
minLevel = 1,
maxLevel = 291,
maxLevel = 291,
priorities = {
priorities = {
str = 10,
str = 1. 0,
int = 15,
int = 1. 5,
wis = 15,
wis = 1. 5,
dex = 10,
dex = 1. 0,
con = 10,
con = 1. 0,
luck = 12,
luck = 1. 2,
hit = 5,
hit = 0. 5,
dam = 5,
dam = 0. 5,
avedam = 4,
avedam = 0. 4,
offhandDam = 4,
offhandDam = 0. 4,
}
}
}
}
})
})
@ -10878,16 +11101,16 @@ function inv.priority.addDefault()
minLevel = 1,
minLevel = 1,
maxLevel = 291,
maxLevel = 291,
priorities = {
priorities = {
str = 15,
str = 1. 5,
int = 10,
int = 1. 0,
wis = 10,
wis = 1. 0,
dex = 15,
dex = 1. 5,
con = 10,
con = 1. 0,
luck = 10,
luck = 1. 0,
hit = 5,
hit = 0. 5,
dam = 5,
dam = 0. 5,
avedam = 4,
avedam = 0. 4,
offhandDam = 4,
offhandDam = 0. 4,
}
}
}
}
})
})
@ -10930,16 +11153,16 @@ function inv.priority.addDefault()
minLevel = 1,
minLevel = 1,
maxLevel = 291,
maxLevel = 291,
priorities = {
priorities = {
str = 10,
str = 1. 0,
int = 15,
int = 1. 5,
wis = 10,
wis = 1. 0,
dex = 10,
dex = 1. 0,
con = 10,
con = 1. 0,
luck = 10,
luck = 1. 0,
hit = 5,
hit = 0. 5,
dam = 5,
dam = 0. 5,
avedam = 4,
avedam = 0. 4,
offhandDam = 4,
offhandDam = 0. 4,
}
}
}
}
})
})
@ -10982,16 +11205,16 @@ function inv.priority.addDefault()
minLevel = 1,
minLevel = 1,
maxLevel = 291,
maxLevel = 291,
priorities = {
priorities = {
str = 12,
str = 1. 2,
int = 10,
int = 1. 0,
wis = 10,
wis = 1. 0,
dex = 15,
dex = 1. 5,
con = 10,
con = 1. 0,
luck = 10,
luck = 1. 0,
hit = 5,
hit = 0. 5,
dam = 5,
dam = 0. 5,
avedam = 4,
avedam = 0. 4,
offhandDam = 4,
offhandDam = 0. 4,
}
}
}
}
})
})
@ -11034,16 +11257,16 @@ function inv.priority.addDefault()
minLevel = 1,
minLevel = 1,
maxLevel = 291,
maxLevel = 291,
priorities = {
priorities = {
str = 10,
str = 1. 0,
int = 10,
int = 1. 0,
wis = 15,
wis = 1. 5,
dex = 10,
dex = 1. 0,
con = 15,
con = 1. 5,
luck = 10,
luck = 1. 0,
hit = 5,
hit = 0. 5,
dam = 5,
dam = 0. 5,
avedam = 4,
avedam = 0. 4,
offhandDam = 4,
offhandDam = 0. 4,
}
}
}
}
})
})
@ -11086,16 +11309,16 @@ function inv.priority.addDefault()
minLevel = 1,
minLevel = 1,
maxLevel = 291,
maxLevel = 291,
priorities = {
priorities = {
str = 10,
str = 1. 0,
int = 15,
int = 1. 5,
wis = 10,
wis = 1. 0,
dex = 10,
dex = 1. 0,
con = 15,
con = 1. 5,
luck = 10,
luck = 1. 0,
hit = 5,
hit = 0. 5,
dam = 5,
dam = 0. 5,
avedam = 4,
avedam = 0. 4,
offhandDam = 4,
offhandDam = 0. 4,
}
}
}
}
})
})
@ -11138,16 +11361,16 @@ function inv.priority.addDefault()
minLevel = 1,
minLevel = 1,
maxLevel = 291,
maxLevel = 291,
priorities = {
priorities = {
str = 10,
str = 1. 0,
int = 10,
int = 1. 0,
wis = 15,
wis = 1. 5,
dex = 10,
dex = 1. 0,
con = 10,
con = 1. 0,
luck = 10,
luck = 1. 0,
hit = 5,
hit = 0. 5,
dam = 5,
dam = 0. 5,
avedam = 4,
avedam = 0. 4,
offhandDam = 4,
offhandDam = 0. 4,
}
}
}
}
})
})
@ -11162,16 +11385,16 @@ function inv.priority.addDefault()
minLevel = 1,
minLevel = 1,
maxLevel = 291,
maxLevel = 291,
priorities = {
priorities = {
str = 12,
str = 1. 2,
int = 12,
int = 1. 2,
wis = 15,
wis = 1. 5,
dex = 13,
dex = 1. 3,
con = 15,
con = 1. 5,
luck = 13,
luck = 1. 3,
hit = 5,
hit = 0. 5,
dam = 5,
dam = 0. 5,
avedam = 4,
avedam = 0. 4,
offhandDam = 4,
offhandDam = 0. 4,
}
}
}
}
})
})
@ -16455,6 +16678,28 @@ function dbot.isWordInString(word, field)
end -- dbot.isWordInString
end -- dbot.isWordInString
----------------------------------------------------------------------------------------------------
-- dbot.wordsToArray: converts a string into an array of individual white-space separated words
--
-- Returns array, retval
----------------------------------------------------------------------------------------------------
function dbot.wordsToArray(myString)
local wordTable = {}
if (myString == nil) then
dbot.warn("dbot.wordsToArray: Missing string parameter")
return wordTable, DRL_RET_INVALID_PARAM
end -- if
for word in string.gmatch(myString, "%S+") do
table.insert(wordTable, word)
end -- for
return wordTable, DRL_RET_SUCCESS
end -- dbot.wordsToArray
----------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------
-- dbot.mergeFields: Returns a string containing all of the unique words in the two input parameters
-- dbot.mergeFields: Returns a string containing all of the unique words in the two input parameters
--
--