<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE MudletPackage>
<MudletPackage version="1.0">
    <AliasPackage>
        <AliasGroup isActive="yes" isFolder="yes">
            <name>Demonnic</name>
            <script></script>
            <command></command>
            <packageName></packageName>
            <regex></regex>
            <AliasGroup isActive="yes" isFolder="yes">
                <name>Shared</name>
                <script></script>
                <command></command>
                <packageName></packageName>
                <regex></regex>
                <Alias isActive="yes" isFolder="no">
                    <name>Reset chasing</name>
                    <script>demonnic.chaser:reset()</script>
                    <command></command>
                    <packageName></packageName>
                    <regex>^chaseres$</regex>
                </Alias>
                <Alias isActive="yes" isFolder="no">
                    <name>Debug</name>
                    <script>if matches[2] then
  demonnic:listCategories()
else
  demonnic:toggleDebug()
end</script>
                    <command></command>
                    <packageName></packageName>
                    <regex>^debug(?: (list))?$</regex>
                </Alias>
                <Alias isActive="yes" isFolder="no">
                    <name>debug categories</name>
                    <script>if matches[2] then
  demonnic:watchCategory( matches[2] )
else
  demonnic:listCategories()
end</script>
                    <command></command>
                    <packageName></packageName>
                    <regex>^debugc(?: (.*))?$</regex>
                </Alias>
            </AliasGroup>
            <AliasGroup isActive="yes" isFolder="yes">
                <name>Tabbed Chat</name>
                <script></script>
                <command></command>
                <packageName></packageName>
                <regex></regex>
                <Alias isActive="yes" isFolder="no">
                    <name>Toggle blinking (temporary change)</name>
                    <script>if demonnic.chat.config.blink then
  demonnic.chat.config.blink = false
  demonnic.chat.tabsToBlink = {}
  demonnic:echo(&quot;Blinking temporarily turned &lt;red&gt;off&lt;grey&gt;. It will reset if you edit your tabbed chat configuration, or close and reopen mudlet. To make it permanent, change demonnic.chat.config.blink to false in \&quot;Demonnic-&gt;Tabbed Chat-&gt;Configuration options\&quot; under scripts\n&quot;)
else
  demonnic.chat.config.blink = true
  demonnic.chat:blink()
  demonnic:echo(&quot;Blinking temporarily turned &lt;red&gt;on&lt;grey&gt;. It will reset if you edit your tabbed chat configuration, or close and reopen mudlet. To make it permanent, change demonnic.chat.config.blink to true in \&quot;Demonnic-&gt;Tabbed Chat-&gt;Configuration options\&quot; under scripts\n&quot;)
end</script>
                    <command></command>
                    <packageName></packageName>
                    <regex>^dblink$</regex>
                </Alias>
            </AliasGroup>
            <AliasGroup isActive="yes" isFolder="yes">
                <name>Calendar</name>
                <script></script>
                <command></command>
                <packageName></packageName>
                <regex></regex>
                <Alias isActive="yes" isFolder="no">
                    <name>toggle herb window</name>
                    <script>if demonnic.calendar.config.herbs == true then 
  demonnic.calendar.config.herbs = false
  demonnic.calendar.herbWindow:hide()
else
  demonnic.calendar.config.herbs = true
  demonnic.calendar:create()
  demonnic.calendar.herbWindow:show()
end</script>
                    <command></command>
                    <packageName></packageName>
                    <regex>^herbcal$</regex>
                </Alias>
            </AliasGroup>
            <AliasGroup isActive="yes" isFolder="yes">
                <name>Influencer</name>
                <script></script>
                <command></command>
                <packageName></packageName>
                <regex></regex>
                <Alias isActive="yes" isFolder="no">
                    <name>mass influence (minf &lt;typeofinfluence&gt; &lt;direction to run to&gt;)</name>
                    <script>demonnic.influencer.massInfluence = true
demonnic.influencer.actionNext = 1
demonnic.influencer.actionCancelled = false
demonnic.influencer.targetList = {}
demonnic.influencer.mobtype = &quot;all&quot;
local inftype = matches[2]:lower()
local escape = matches[3]

if table.contains(demonnic.influencer.types, inftype) then
  demonnic.influencer.actionList = demonnic.influencer[inftype]
else
  demonnic:echo(&quot;The syntax for this command is:&quot;)
  demonnic:echo(&quot;  minf &lt;red&gt;&lt;type of influencing&gt; &lt;green&gt;&lt;direction to flee&gt;&quot;)
  demonnic:echo(&quot;&quot;)
  demonnic:echo([[So &quot;minf empower e&quot; will attempt to empower everything in the room&quot;]])
  demonnic:echo(&quot;And will escape to the east if your ego gets below 1/4th max&quot;)
end

if escape then 
  demonnic.influencer.exit = escape
else
  local directions = {}
  for dir,_ in pairs(gmcp.Room.Info.exits) do
    table.insert(directions, dir)
  end
  local dirindex = math.random(#directions)
  demonnic.influencer.exit = directions[dirindex]
end

for name,ids in pairs(demonnic.roomItems) do
  if not table.contains(demonnic.influencer.exceptions, name) then
    for _,id in ipairs(ids) do
      table.insert(demonnic.influencer.targetList, id)
    end
  end
end
demonnic.influencer:complete()
demonnic.influencer:continue()</script>
                    <command></command>
                    <packageName></packageName>
                    <regex>^minf (\w+) ?(\w+)?$</regex>
                </Alias>
                <Alias isActive="yes" isFolder="no">
                    <name>next target ( infnext )</name>
                    <script>demonnic.influencer:complete()</script>
                    <command></command>
                    <packageName></packageName>
                    <regex>^infnext$</regex>
                </Alias>
                <Alias isActive="yes" isFolder="no">
                    <name>single influence (inf &lt;target&gt; &lt;type&gt; &lt;escape exit&gt;</name>
                    <script>demonnic.influencer.massInfluence = false
demonnic.influencer.actionNext = 1
demonnic.influencer.actionCancelled = false
demonnic.influencer.target = matches[2]
demonnic.influencer.targetList = {}
local inftype = matches[3]:lower()
local escape = matches[4]
if table.contains(demonnic.influencer.types, inftype) then
  demonnic.influencer.actionList = demonnic.influencer[inftype]
else
  demonnic:echo(&quot;The syntax for this command is:&quot;)
  demonnic:echo(&quot;  inf &lt;red&gt;&lt;target&gt; &lt;red&gt;&lt;type of influencing&gt; &lt;green&gt;&lt;direction to flee&gt;&quot;)
  demonnic:echo(&quot;&quot;)
  demonnic:echo([[So &quot;inf widowrider empower e&quot; will attempt to empower a single widowrider&quot;]])
  demonnic:echo(&quot;And will escape to the east if your ego gets below 1/4th max&quot;)
end

if escape then 
  demonnic.influencer.exit = escape
else
  local directions = {}
  for dir,_ in pairs(gmcp.Room.Info.exits) do
    table.insert(directions, dir)
  end
  local dirindex = math.random(#directions)
  demonnic.influencer.exit = directions[dirindex]
end

demonnic.influencer:continue()</script>
                    <command></command>
                    <packageName></packageName>
                    <regex>^inf (\w+) (\w+) ?(\w+)?$</regex>
                </Alias>
                <Alias isActive="yes" isFolder="no">
                    <name>influence one type (tinf &lt;typeofmob&gt; &lt;typeofinfluence&gt; &lt;escapedirection&gt;)</name>
                    <script>demonnic.influencer.massInfluence = true
demonnic.influencer.actionNext = 1
demonnic.influencer.actionCancelled = false
demonnic.influencer.targetList = {}
demonnic.influencer.target = &quot;&quot;
local mobtype = matches[2]
local inftype = matches[3]:lower()
local escape = matches[4]
local typesofmob = &quot;&quot;

demonnic.influencer.mobtype = mobtype
if table.contains(demonnic.influencer.types, inftype) then
  demonnic.influencer.actionList = demonnic.influencer[inftype]
else
  demonnic:echo(&quot;The syntax for this command is:&quot;)
  demonnic:echo(&quot;  tinf &lt;red&gt;&lt;typeofmobe&gt; &lt;red&gt;&lt;type of influencing&gt; &lt;green&gt;&lt;direction to flee&gt;&quot;)
  demonnic:echo(&quot;&quot;)
  demonnic:echo([[So &quot;tinf empower e&quot; will attempt to empower everything in the room&quot;]])
  demonnic:echo(&quot;And will escape to the east if your ego gets below 1/4th max&quot;)
end

if escape then 
  demonnic.influencer.exit = escape
else
  local directions = {}
  for dir,_ in pairs(gmcp.Room.Info.exits) do
    table.insert(directions, dir)
  end
  local dirindex = math.random(#directions)
  demonnic.influencer.exit = directions[dirindex]
end

for name,ids in pairs(demonnic.roomItems) do
  if typesofmob == &quot;&quot; then 
    typesofmob = name
  else
    typesofmob = string.format(&quot;%s, %s&quot;, typesofmob, name)
  end
  if string.find(name:lower(), mobtype:lower()) then
    for _,id in ipairs(ids) do
      table.insert(demonnic.influencer.targetList, id)
    end
  end
end

if #demonnic.influencer.targetList &lt; 1 then
  demonnic:echo(string.format(&quot;It seems there isn't anything in the room which matches: %s&quot;, mobtype))
  demonnic:echo(string.format(&quot;Available options are: %s&quot;, typesofmob))
else
  demonnic.influencer:complete()
  demonnic.influencer:continue()
end</script>
                    <command></command>
                    <packageName></packageName>
                    <regex>^tinf (\w+) (\w+) ?(\w+)?$</regex>
                </Alias>
                <Alias isActive="yes" isFolder="no">
                    <name>show influence list (inflist)</name>
                    <script>if demonnic.influencer.massInfluence then
  demonnic:echo(&quot;Future targets list is:&quot;)
  for i,v in ipairs(demonnic.influencer.targetList) do
    if i &lt; 10 then i = &quot;0&quot; .. tostring(i) else i = tostring(i) end
    demonnic:echo(string.format(&quot;%s: %s&quot;,i,v))
  end
end
if demonnic.influencer.target == &quot;&quot; then 
  demonnic:echo(&quot;Not currently influencing anything&quot;)
  return 
end
demonnic:echo(string.format(&quot;The current influence target: %s&quot;, demonnic.influencer.target))</script>
                    <command></command>
                    <packageName></packageName>
                    <regex>^inflist$</regex>
                </Alias>
                <Alias isActive="yes" isFolder="no">
                    <name>stop! (cinf)</name>
                    <script>demonnic:echo(&quot;Ok, we'll quit influencing!&quot;)
demonnic.influencer.actionCancelled = true
demonnic.influencer.massInfluence = false
demonnic.influencer.targetList = {}
demonnic.influencer.target = &quot;&quot;
</script>
                    <command></command>
                    <packageName></packageName>
                    <regex>^cinf$</regex>
                </Alias>
            </AliasGroup>
            <AliasGroup isActive="yes" isFolder="yes">
                <name>Harvester</name>
                <script></script>
                <command></command>
                <packageName></packageName>
                <regex></regex>
                <Alias isActive="yes" isFolder="no">
                    <name>harvest</name>
                    <script>demonnic.harvester.toHarvest = matches[2]
demonnic.harvester.harvesting = true
send(&quot;plants&quot;)
tempTimer(5, function() demonnic.chaser:add([[send(&quot;nature growth&quot;)]], {consumesEq=false}) end )</script>
                    <command></command>
                    <packageName></packageName>
                    <regex>^har(?:\s)?(\w+)?$</regex>
                </Alias>
            </AliasGroup>
        </AliasGroup>
    </AliasPackage>
    <ScriptPackage>
        <ScriptGroup isActive="yes" isFolder="yes">
            <name>Demonnic</name>
            <packageName></packageName>
            <script></script>
            <eventHandlerList/>
            <ScriptGroup isActive="yes" isFolder="yes">
                <name>Shared</name>
                <packageName></packageName>
                <script>--Bootstrapping variables/etc. Don't touch this unless you really know what you're doing

--I mean it. I'll point. AND laugh. loudly. 
demonnic = demonnic or {}
demonnic.config = demonnic.config or {}
demonnic.balances = demonnic.balances or {}
demonnic.balances.balance = demonnic.balances.balance or 1
demonnic.balances.equilibrium = demonnic.balances.equilibrium or 1
demonnic.debug = demonnic.debug or {}
demonnic.debug.active = demonnic.debug.active or nil
demonnic.debug.categories = demonnic.debug.categories or { }


function demonnic:echo(msg)
 cecho(string.format(&quot;\n&lt;blue&gt;(&lt;green&gt;Demonnic&lt;blue&gt;):&lt;white&gt; %s&quot;, msg))
end</script>
                <eventHandlerList/>
                <Script isActive="yes" isFolder="no">
                    <name>Debugging</name>
                    <packageName></packageName>
                    <script>--Adds debugging functionality 

function demonnic:Debug(category,debugData)
   if category then
      if table.contains(demonnic.debug.categories, category) then
         if type(debugData) == &quot;table&quot; then
            demonnic:echo(&quot;&lt;red&gt;DEBUG &quot; .. category .. &quot;:&lt;white&gt;&quot;)
            display(debugData)
         elseif type(debugData) == &quot;string&quot; or type(debugData) == &quot;number&quot; then
            demonnic:echo(&quot;&lt;red&gt;DEBUG &quot; .. category .. &quot;:&lt;white&gt; &quot; .. debugData .. &quot;\n&quot; )
         else
            demonnic:echo(&quot;&lt;red&gt;DEBUG &quot; .. category .. &quot;:&lt;white&gt; &quot; .. tostring(debugData) .. &quot;\n&quot; )
         end
      end
   else
      if type(debugData) == &quot;table&quot; then
         demonnic:echo(&quot;&lt;red&gt;DEBUG:&lt;white&gt;&quot;)
         display(debugData)
      elseif type(debugData) == &quot;string&quot; or type(debugData) == &quot;number&quot; then
         demonnic:echo(&quot;&lt;red&gt;DEBUG:&lt;white&gt; &quot; .. debugData)
      else
         demonnic:echo(&quot;&lt;red&gt;DEBUG:&lt;white&gt; &quot; .. tostring(debugData))
      end
   end
end

function demonnic:printDebug(category, debugData)
   if not demonnic.debug.active then return end
   demonnic:Debug(category, debugData)
end

function demonnic:toggleDebug()
   if demonnic.debug.active then demonnic.debug.active = nil
   else demonnic.debug.active = true
   end
   demonnic:echo(&quot;Debugging is currently &quot; .. (( demonnic.debug.active and &quot;&lt;green&gt;ON&lt;white&gt;&quot;) or &quot;&lt;red&gt;OFF&lt;white&gt;&quot;))
end

function demonnic:watchCategory( category )
   if table.contains(demonnic.debug.categories, category) then
      for i,v in ipairs(demonnic.debug.categories) do
         if v == category then
            table.remove(demonnic.debug.categories, i)
         end
      end
      demonnic:echo(&quot;No longer watching the '&lt;red&gt;&quot;..category..&quot;&lt;white&gt;' category.&quot;) 
   else
      table.insert(demonnic.debug.categories, category)
      demonnic:echo(&quot;Now watching the '&lt;red&gt;&quot;..category..&quot;&lt;white&gt;' category.&quot;)
   end
   demonnic:echo(&quot;Debugging is currently &quot; .. (( demonnic.debug.active and &quot;&lt;green&gt;ON&lt;white&gt;&quot;) or &quot;&lt;red&gt;OFF&lt;white&gt;&quot;))
end

function demonnic:listCategories()
   if #demonnic.debug.categories &gt; 0 then
      demonnic:echo(&quot;You are currently watching the following categories:\n&quot; .. table.concat(demonnic.debug.categories,&quot;, &quot;) )
   else
      demonnic:echo(&quot;You are not watching any debugs.&quot;)
   end
end
</script>
                    <eventHandlerList/>
                </Script>
                <Script isActive="yes" isFolder="no">
                    <name>demonnicVitals</name>
                    <packageName></packageName>
                    <script>--Set some vital statistics. Will work with both ATCP and GMCP. 

function demonnicVitals( msg, arg )
  demonnic.nextLevel = tonumber(gmcp.Char.Vitals.nl)
  demonnic.curHealth = tonumber(gmcp.Char.Vitals.hp)    
  demonnic.maxHealth = tonumber(gmcp.Char.Vitals.maxhp)
  demonnic.curMana = tonumber(gmcp.Char.Vitals.mp)
  demonnic.maxMana = tonumber(gmcp.Char.Vitals.maxmp)
  demonnic.curEgo = tonumber(gmcp.Char.Vitals.ego)
  demonnic.maxEgo = tonumber(gmcp.Char.Vitals.maxego)
  demonnic.curPower = tonumber(gmcp.Char.Vitals.pow)
  demonnic.maxPower = tonumber(gmcp.Char.Vitals.maxpow)
  demonnic.curWillpower = tonumber(gmcp.Char.Vitals.wp)
  demonnic.maxWillpower = tonumber(gmcp.Char.Vitals.maxwp)
  demonnic.curEndurance = tonumber(gmcp.Char.Vitals.ep)
  demonnic.maxEndurance = tonumber(gmcp.Char.Vitals.maxep)
end</script>
                    <eventHandlerList>
                        <string>gmcp.Char</string>
                    </eventHandlerList>
                </Script>
                <Script isActive="yes" isFolder="no">
                    <name>Align</name>
                    <packageName></packageName>
                    <script>
function align(str,options) --str is a string, options is a table
--[[ If they sent anything but a table as the second argument, return useful
info. But if they didn't send a second argument then that's ok, the defaults
will be enough to get by and just center the txt
]]--
  if (type(options) ~= &quot;table&quot;) and (options ~= nil) then return &quot;You call this with align(\&quot;some text to format\&quot;, &lt;table of options&gt;. Pls check comments for what options and usage information&quot; end
  options = options or {} --if they sent options, don't overwrite them
  options.width = options.width or 80 --default line length of 80
  options.alignment = options.alignment or &quot;center&quot; --if we don't specify, it's centered
  options.cap = options.cap or &quot;&quot; --default endcap of nothing (an empty string, technically)
  options.spacer = options.spacer or &quot; &quot; --default spacer is.. well.. space
  options.inside = options.inside or false --by default, when centering, formation as spacers|cap|text|cap|spacers
  if not options.mirror == false then options.mirror = options.mirror or true end--by default, we do want to use mirroring for the caps
  local strLen = string.len(str)
  local leftCap = options.cap
  local rightCap = options.cap
  local leftPadLen = math.floor((options.width - strLen)/2,1) - 1
  local rightPadLen = leftPadLen + ((options.width - strLen)%2)
  local maxPad = 0
  local capLen = string.len(options.cap)
  if capLen &gt; leftPadLen then --if the cap is bigger than the left total padding
    options.cap = options.cap:sub(1, leftPadLen) -- trim it up right!
    capLen = string.len(options.cap)
  end --otherwise, don't mess with it

 
  if options.alignment == &quot;center&quot; then --we're going to center something
    leftPadLen = math.floor((options.width - strLen)/2,1) - 1 --get the padding needed on the left
    rightPadLen = leftPadLen + ((options.width - strLen)%2) --and on the right
    if options.mirror then --if we're reversing the left cap and the right cap (IE {{[[ turns into ]]}} )
      rightCap = string.gsub(rightCap, &quot;&lt;&quot;, &quot;&gt;&quot;)
      rightCap = string.gsub(rightCap, &quot;%[&quot;, &quot;%]&quot;)
      rightCap = string.gsub(rightCap, &quot;{&quot;, &quot;}&quot;)
      rightCap = string.gsub(rightCap, &quot;%(&quot;, &quot;%)&quot;)
      rightCap = string.reverse(rightCap)
    end --otherwise, they'll be the same, so don't do anything
    str = string.format(&quot; %s &quot;, str)
   
  elseif options.alignment == &quot;right&quot; then --we'll right-align the text
    leftPadLen = options.width - strLen - 1
    rightPadLen = 0
    rightCap = &quot;&quot;
    str = string.format(&quot; %s&quot;, str)
   
  else --Ok, so if it's not center or right, we assume it's left. We don't do justified. Sorry.
    leftPadLen = 0
    rightPadLen = options.width - strLen -1
    leftCap = &quot;&quot;
    str = string.format(&quot;%s &quot;, str)
  end--that's it, took care of both left, right, and center formattings, now to output the durn thing.
 
  if options.inside then
  --if we're placing the repated spacer inside
  --&quot;=====endcap some text endcap=====&quot;
  --&quot;=====endcap some text pacdne=====&quot;
  --&quot;=================endcap some text&quot;
  --&quot;some text endcap=================&quot;
    return leftCap .. string.rep(options.spacer, (leftPadLen - capLen)) .. str ..string.rep(options.spacer, (rightPadLen - capLen)).. rightCap
  else
  --otherwise, it''s be the spaces on the 'inside'
  -- &quot;endcap===== some text =====endcap&quot;
  -- &quot;endcap===== some text =====pacdne&quot;
  -- &quot;endcap================= some text&quot;
  -- &quot;some text =================endcap&quot;
    return string.rep(options.spacer, (leftPadLen - capLen)) .. leftCap .. str .. rightCap .. string.rep(options.spacer, (rightPadLen - capLen))
  end
end


function calign(str,options) --str is a string, options is a table
--[[ If they sent anything but a table as the second argument, return useful 
info. But if they didn't send a second argument then that's ok, the defaults 
will be enough to get by and just center the txt
]]--
  if (not type(options) == &quot;table&quot;) and (not options == nil) then return &quot;You call this with align(\&quot;some text to format\&quot;, &lt;table of options&gt;. Pls check comments for what options and usage information&quot; end 
  options = options or {} --if they sent options, don't overwrite them
  options.width = options.width or 80 --default line length of 80
  options.alignment = options.alignment or &quot;center&quot; --if we don't specify, it's centered
  options.cap = options.cap or &quot;&quot; --default endcap of nothing (an empty string, technically)
  options.spacer = options.spacer or &quot; &quot; --default spacer is.. well.. space
  options.inside = options.inside or false --by default, when centering, formation as spacers|cap|text|cap|spacers
  options.capColor = options.capColor or &quot;&lt;white&gt;&quot;--by default, don't change the color of the caps
  options.spacerColor = options.spacerColor or &quot;&lt;white&gt;&quot;
  options.textColor = options.textColor or &quot;&lt;white&gt;&quot;--or the text
  if not options.mirror == false then options.mirror = options.mirror or true end--by default, we do want to use mirroring for the caps
  local strLen = string.len(str)
  local leftCap = options.cap
  local rightCap = options.cap
  local leftPadLen = math.floor((options.width - strLen)/2,1) - 1
  local rightPadLen = leftPadLen + ((options.width - strLen)%2)
  local maxPad = 0
  local capLen = string.len(options.cap)
  if capLen &gt; leftPadLen then --if the cap is bigger than the left total padding
    options.cap = options.cap:sub(1, leftPadLen) -- trim it up right!
    capLen = string.len(options.cap)
  end --otherwise, don't mess with it

  
  if options.alignment == &quot;center&quot; then --we're going to center something
    leftPadLen = math.floor((options.width - strLen)/2,1) - 1 --get the padding needed on the left
    rightPadLen = leftPadLen + ((options.width - strLen)%2) --and on the right
    if options.mirror then --if we're reversing the left cap and the right cap (IE {{[[ turns into ]]}} )
      rightCap = string.gsub(rightCap, &quot;&lt;&quot;, &quot;&gt;&quot;)
      rightCap = string.gsub(rightCap, &quot;%[&quot;, &quot;%]&quot;)
      rightCap = string.gsub(rightCap, &quot;{&quot;, &quot;}&quot;)
      rightCap = string.gsub(rightCap, &quot;%(&quot;, &quot;%)&quot;)
      rightCap = string.reverse(rightCap)
    end --otherwise, they'll be the same, so don't do anything
    str = string.format(&quot; %s &quot;, str)
    
  elseif options.alignment == &quot;right&quot; then --we'll right-align the text
    leftPadLen = options.width - strLen - 1
    rightPadLen = 0
    rightCap = &quot;&quot;
    str = string.format(&quot; %s&quot;, str)
    
  else --Ok, so if it's not center or right, we assume it's left. We don't do justified. Sorry.
    leftPadLen = 0
    rightPadLen = options.width - strLen -1
    leftCap = &quot;&quot;
    str = string.format(&quot;%s &quot;, str)
  end--that's it, took care of both left, right, and center formattings, now to output the durn thing. 
  
  if options.inside then 
  --if we're placing the repated spacer inside
  --&quot;=====endcap some text endcap=====&quot; 
  --&quot;=====endcap some text pacdne=====&quot;
  --&quot;=================endcap some text&quot; 
  --&quot;some text endcap=================&quot;
    return options.capColor .. leftCap .. options.spacerColor.. string.rep(options.spacer, (leftPadLen - capLen)) .. options.textColor .. str .. options.spacerColor ..string.rep(options.spacer, (rightPadLen - capLen)) .. options.capColor .. rightCap
  else 
  --otherwise, it''s be the spaces on the 'inside'
  -- &quot;endcap===== some text =====endcap&quot;
  -- &quot;endcap===== some text =====pacdne&quot; 
  -- &quot;endcap================= some text&quot; 
  -- &quot;some text =================endcap&quot;
    return options.spacerColor .. string.rep(options.spacer, (leftPadLen - capLen)) .. options.capColor .. leftCap .. options.textColor .. str .. options.capColor .. rightCap .. options.spacerColor .. string.rep(options.spacer, (rightPadLen - capLen))
  end
end

function dalign(str,options) --str is a string, options is a table
--[[ If they sent anything but a table as the second argument, return useful 
info. But if they didn't send a second argument then that's ok, the defaults 
will be enough to get by and just center the txt
]]--
  if (not type(options) == &quot;table&quot;) and (not options == nil) then return &quot;You call this with align(\&quot;some text to format\&quot;, &lt;table of options&gt;. Pls check comments for what options and usage information&quot; end 
  options = options or {} --if they sent options, don't overwrite them
  options.width = options.width or 80 --default line length of 80
  options.alignment = options.alignment or &quot;center&quot; --if we don't specify, it's centered
  options.cap = options.cap or &quot;&quot; --default endcap of nothing (an empty string, technically)
  options.spacer = options.spacer or &quot; &quot; --default spacer is.. well.. space
  options.inside = options.inside or false --by default, when centering, formation as spacers|cap|text|cap|spacers
  options.capColor = options.capColor or &quot;&lt;255,255,255&gt;&quot;--by default, don't change the color of the caps
  options.spacerColor = options.spacerColor or &quot;&lt;255,255,255&gt;&quot; 
  options.textColor = options.textColor or &quot;&lt;255,255,255&gt;&quot;--or the text
  if not options.mirror == false then options.mirror = options.mirror or true end--by default, we do want to use mirroring for the caps
  local strLen = string.len(str)
  local leftCap = options.cap
  local rightCap = options.cap
  local leftPadLen = math.floor((options.width - strLen)/2,1) - 1
  local rightPadLen = leftPadLen + ((options.width - strLen)%2)
  local maxPad = 0
  local capLen = string.len(options.cap)
  if capLen &gt; leftPadLen then --if the cap is bigger than the left total padding
    options.cap = options.cap:sub(1, leftPadLen) -- trim it up right!
    capLen = string.len(options.cap)
  end --otherwise, don't mess with it

  
  if options.alignment == &quot;center&quot; then --we're going to center something
    leftPadLen = math.floor((options.width - strLen)/2,1) - 1 --get the padding needed on the left
    rightPadLen = leftPadLen + ((options.width - strLen)%2) --and on the right
    if options.mirror then --if we're reversing the left cap and the right cap (IE {{[[ turns into ]]}} )
      rightCap = string.gsub(rightCap, &quot;&lt;&quot;, &quot;&gt;&quot;)
      rightCap = string.gsub(rightCap, &quot;%[&quot;, &quot;%]&quot;)
      rightCap = string.gsub(rightCap, &quot;{&quot;, &quot;}&quot;)
      rightCap = string.gsub(rightCap, &quot;%(&quot;, &quot;%)&quot;)
      rightCap = string.reverse(rightCap)
    end --otherwise, they'll be the same, so don't do anything
    str = string.format(&quot; %s &quot;, str)
    
  elseif options.alignment == &quot;right&quot; then --we'll right-align the text
    leftPadLen = options.width - strLen - 1
    rightPadLen = 0
    rightCap = &quot;&quot;
    str = string.format(&quot; %s&quot;, str)
    
  else --Ok, so if it's not center or right, we assume it's left. We don't do justified. Sorry.
    leftPadLen = 0
    rightPadLen = options.width - strLen -1
    leftCap = &quot;&quot;
    str = string.format(&quot;%s &quot;, str)
  end--that's it, took care of both left, right, and center formattings, now to output the durn thing. 
  
  if options.inside then 
  --if we're placing the repated spacer inside
  --&quot;=====endcap some text endcap=====&quot; 
  --&quot;=====endcap some text pacdne=====&quot;
  --&quot;=================endcap some text&quot; 
  --&quot;some text endcap=================&quot;
    return options.capColor .. leftCap .. options.spacerColor.. string.rep(options.spacer, (leftPadLen - capLen)) .. options.textColor .. str .. options.spacerColor ..string.rep(options.spacer, (rightPadLen - capLen)) .. options.capColor .. rightCap
  else 
  --otherwise, it''s be the spaces on the 'inside'
  -- &quot;endcap===== some text =====endcap&quot;
  -- &quot;endcap===== some text =====pacdne&quot; 
  -- &quot;endcap================= some text&quot; 
  -- &quot;some text =================endcap&quot;
    return options.spacerColor .. string.rep(options.spacer, (leftPadLen - capLen)) .. options.capColor .. leftCap .. options.textColor .. str .. options.capColor .. rightCap .. options.spacerColor .. string.rep(options.spacer, (rightPadLen - capLen))
  end
end

function halign(str,options) --str is a string, options is a table
--[[ If they sent anything but a table as the second argument, return useful 
info. But if they didn't send a second argument then that's ok, the defaults 
will be enough to get by and just center the txt
]]--
  if (not type(options) == &quot;table&quot;) and (not options == nil) then return &quot;You call this with align(\&quot;some text to format\&quot;, &lt;table of options&gt;. Pls check comments for what options and usage information&quot; end 
  options = options or {} --if they sent options, don't overwrite them
  options.width = options.width or 80 --default line length of 80
  options.alignment = options.alignment or &quot;center&quot; --if we don't specify, it's centered
  options.cap = options.cap or &quot;&quot; --default endcap of nothing (an empty string, technically)
  options.spacer = options.spacer or &quot; &quot; --default spacer is.. well.. space
  options.inside = options.inside or false --by default, when centering, formation as spacers|cap|text|cap|spacers
  options.capColor = options.capColor or &quot;|cFFFFFF&quot;--by default, don't change the color of the caps
  options.spacerColor = options.spacerColor or &quot;|cFFFFFF&quot; 
  options.textColor = options.textColor or &quot;|cFFFFFF&quot;--or the text
  if not options.mirror == false then options.mirror = options.mirror or true end--by default, we do want to use mirroring for the caps
  local strLen = string.len(str)
  local leftCap = options.cap
  local rightCap = options.cap
  local leftPadLen = math.floor((options.width - strLen)/2,1) - 1
  local rightPadLen = leftPadLen + ((options.width - strLen)%2)
  local maxPad = 0
  local capLen = string.len(options.cap)
  if capLen &gt; leftPadLen then --if the cap is bigger than the left total padding
    options.cap = options.cap:sub(1, leftPadLen) -- trim it up right!
    capLen = string.len(options.cap)
  end --otherwise, don't mess with it

  
  if options.alignment == &quot;center&quot; then --we're going to center something
    leftPadLen = math.floor((options.width - strLen)/2,1) - 1 --get the padding needed on the left
    rightPadLen = leftPadLen + ((options.width - strLen)%2) --and on the right
    if options.mirror then --if we're reversing the left cap and the right cap (IE {{[[ turns into ]]}} )
      rightCap = string.gsub(rightCap, &quot;&lt;&quot;, &quot;&gt;&quot;)
      rightCap = string.gsub(rightCap, &quot;%[&quot;, &quot;%]&quot;)
      rightCap = string.gsub(rightCap, &quot;{&quot;, &quot;}&quot;)
      rightCap = string.gsub(rightCap, &quot;%(&quot;, &quot;%)&quot;)
      rightCap = string.reverse(rightCap)
    end --otherwise, they'll be the same, so don't do anything
    str = string.format(&quot; %s &quot;, str)
    
  elseif options.alignment == &quot;right&quot; then --we'll right-align the text
    leftPadLen = options.width - strLen - 1
    rightPadLen = 0
    rightCap = &quot;&quot;
    str = string.format(&quot; %s&quot;, str)
    
  else --Ok, so if it's not center or right, we assume it's left. We don't do justified. Sorry.
    leftPadLen = 0
    rightPadLen = options.width - strLen -1
    leftCap = &quot;&quot;
    str = string.format(&quot;%s &quot;, str)
  end--that's it, took care of both left, right, and center formattings, now to output the durn thing. 
  
  if options.inside then 
  --if we're placing the repated spacer inside
  --&quot;=====endcap some text endcap=====&quot; 
  --&quot;=====endcap some text pacdne=====&quot;
  --&quot;=================endcap some text&quot; 
  --&quot;some text endcap=================&quot;
    return options.capColor .. leftCap .. options.spacerColor.. string.rep(options.spacer, (leftPadLen - capLen)) .. options.textColor .. str .. options.spacerColor ..string.rep(options.spacer, (rightPadLen - capLen)) .. options.capColor .. rightCap
  else 
  --otherwise, it''s be the spaces on the 'inside'
  -- &quot;endcap===== some text =====endcap&quot;
  -- &quot;endcap===== some text =====pacdne&quot; 
  -- &quot;endcap================= some text&quot; 
  -- &quot;some text =================endcap&quot;
    return options.spacerColor .. string.rep(options.spacer, (leftPadLen - capLen)) .. options.capColor .. leftCap .. options.textColor .. str .. options.capColor .. rightCap .. options.spacerColor .. string.rep(options.spacer, (rightPadLen - capLen))
  end
end
 </script>
                    <eventHandlerList/>
                </Script>
                <Script isActive="yes" isFolder="no">
                    <name>Geyser Additions</name>
                    <packageName></packageName>
                    <script>function Geyser.MiniConsole:clear()
   clearWindow(self.name)
end

function Geyser.MiniConsole:append()
  appendBuffer(self.name)
end</script>
                    <eventHandlerList/>
                </Script>
                <ScriptGroup isActive="yes" isFolder="yes">
                    <name>GMCP Events</name>
                    <packageName></packageName>
                    <script></script>
                    <eventHandlerList/>
                    <ScriptGroup isActive="yes" isFolder="yes">
                        <name>Room Items</name>
                        <packageName></packageName>
                        <script>--[[
The events kept within this folder will populate demonnic.roomItems on entering a room or doing 'look'
It also adds items to the list as they enter the room (or get dropped)
And removes them when they get picked up
you can do display(demonnic.roomItems) to see the format to work with
]]</script>
                        <eventHandlerList/>
                        <ScriptGroup isActive="yes" isFolder="yes">
                            <name>Populate on look</name>
                            <packageName></packageName>
                            <script>--[[
This event resets demonnic.roomItems, since it gives the complete list of items
It fires when you move, or LOOK.
]]</script>
                            <eventHandlerList/>
                            <Script isActive="yes" isFolder="no">
                                <name>demonnic_rilist</name>
                                <packageName></packageName>
                                <script>function demonnic_rilist()
  local list = gmcp.Char.Items.List
  if list.location == &quot;room&quot; then
    demonnic.roomItems = {}
    for _,v in ipairs(list.items) do
      if not demonnic.roomItems[v.name] then demonnic.roomItems[v.name] = {} end
      table.insert(demonnic.roomItems[v.name], v.id)
    end
  end
  if list.location == &quot;inv&quot; then
    return
  end
end</script>
                                <eventHandlerList>
                                    <string>gmcp.Char.Items.List</string>
                                </eventHandlerList>
                            </Script>
                        </ScriptGroup>
                        <ScriptGroup isActive="yes" isFolder="yes">
                            <name>Add items when they enter</name>
                            <packageName></packageName>
                            <script>--[[
This event adds items when gmcp tells you items have been added to the room
IE a creature enters, someone drops something, etc.
]]</script>
                            <eventHandlerList/>
                            <Script isActive="yes" isFolder="no">
                                <name>demonnic_riadd</name>
                                <packageName></packageName>
                                <script>function demonnic_riadd()
  local item = gmcp.Char.Items.Add
  if item.location == &quot;room&quot; then 
    item = item.item 
    if not demonnic.roomItems[item.name] then demonnic.roomItems[item.name] = {} end
    table.insert(demonnic.roomItems[item.name], item.id)
  end
end</script>
                                <eventHandlerList>
                                    <string>gmcp.Char.Items.Add</string>
                                </eventHandlerList>
                            </Script>
                        </ScriptGroup>
                        <ScriptGroup isActive="yes" isFolder="yes">
                            <name>Remove items when they leave</name>
                            <packageName></packageName>
                            <script>--[[
This event fires when gmcp says an item leaves the room
IE someone picks it up, it's a mob and it moves out of the room, etc.
]]</script>
                            <eventHandlerList/>
                            <Script isActive="yes" isFolder="no">
                                <name>demonnic_rileave</name>
                                <packageName></packageName>
                                <script>function demonnic_rileave()
  local item = gmcp.Char.Items.Remove
  if item.location == &quot;room&quot; then
    for name,items in pairs(demonnic.roomItems) do
      for i,id in ipairs(items) do
        if id == tostring(item.item) then
          table.remove(demonnic.roomItems[name],i) 
          if #demonnic.roomItems[name] == 0 then
            demonnic.roomItems[name] = nil
          end
        end
      end
    end
  end
end</script>
                                <eventHandlerList>
                                    <string>gmcp.Char.Items.Remove</string>
                                </eventHandlerList>
                            </Script>
                        </ScriptGroup>
                    </ScriptGroup>
                    <ScriptGroup isActive="yes" isFolder="yes">
                        <name>Skill Events</name>
                        <packageName></packageName>
                        <script>--[[
set of events which will autopopulate a skills table called demonnic.skills
You can use this to determine what skills are available to your char
and adjust other variables accordingly
display(demonnic.skills) to see the format
]]</script>
                        <eventHandlerList/>
                        <ScriptGroup isActive="yes" isFolder="yes">
                            <name>Get list of groups</name>
                            <packageName></packageName>
                            <script>--[[
This will create demonnic.skills.skillgroup as a table, and send a GMCP request for the list of skills in each skillgroup
IOW, this tells us what skills we can lookup (like AB with no argument)
It also sends a newline, so that we get all the returns from the gmcp requests
]]</script>
                            <eventHandlerList/>
                            <Script isActive="yes" isFolder="no">
                                <name>demonnic_skillGroups</name>
                                <packageName></packageName>
                                <script>function demonnic_skillGroups()
  demonnic.skills = {}
  for _,extra in ipairs(gmcp.Char.Skills.Groups) do
    skillstring = string.format(&quot;Char.Skills.Get %s&quot;, yajl.to_string({group=extra.name}))
    sendGMCP(skillstring)
  end
  send(&quot;\n&quot;)
end</script>
                                <eventHandlerList>
                                    <string>gmcp.Char.Skills.Groups</string>
                                </eventHandlerList>
                            </Script>
                        </ScriptGroup>
                        <ScriptGroup isActive="yes" isFolder="yes">
                            <name>Get skills in group</name>
                            <packageName></packageName>
                            <script>--[[
This populates the subtable for each skill group. It is recieved for an individual skillgroup, and will fire once for each one
demonnic.skills.skillgroup will be the name (IE demonnic.skills.environment will hold the list of all the skills you've learned in environment
Because when we get the list of groups it sends a request for each group of skills we know, it will populate the whole table.
]]</script>
                            <eventHandlerList/>
                            <Script isActive="yes" isFolder="no">
                                <name>demonnic_skillsList</name>
                                <packageName></packageName>
                                <script>function demonnic_skillsList()
  local group = gmcp.Char.Skills.List.group
  local list = gmcp.Char.Skills.List.list
  if group then
    if not demonnic.skills then demonnic.skills = {} end
    demonnic.skills[group] = list
    raiseEvent(&quot;demonnicSkillFilled&quot;, group)
  end
end</script>
                                <eventHandlerList>
                                    <string>gmcp.Char.Skills.List</string>
                                </eventHandlerList>
                            </Script>
                        </ScriptGroup>
                    </ScriptGroup>
                    <Script isActive="yes" isFolder="no">
                        <name>EnableIRE.Rift</name>
                        <packageName></packageName>
                        <script>gmod.registerUser(&quot;Demonnic&quot;)
gmod.enableModule(&quot;Demonnic&quot;, &quot;IRE.Rift&quot;)</script>
                        <eventHandlerList/>
                    </Script>
                </ScriptGroup>
            </ScriptGroup>
            <ScriptGroup isActive="yes" isFolder="yes">
                <name>Chaser</name>
                <packageName></packageName>
                <script>--Don't change this stuff, yo.

demonnic = demonnic or {}
demonnic.chaser = demonnic.chaser or {}
demonnic.chaser.config = demonnic.chaser.config or {}
if demonnic.chaser.config.ChaseEqFirst == nil then demonnic.chaser.config.ChaseEqFirst = true end
demonnic.chaser.balances = demonnic.chaser.balances or {}
demonnic.chaser.balances.balance = demonnic.chaser.balances.balance or 1
demonnic.chaser.balances.equilibrium = demonnic.chaser.balances.equilibrium or 1
demonnic.chaser.NeedsEqAndBal = demonnic.chaser.NeedsEqAndBal or {}
demonnic.chaser.NeedsEqAndBal.ConsumesEqAndBal = demonnic.chaser.NeedsEqAndBal.ConsumesEqAndBal or {}
demonnic.chaser.NeedsEqAndBal.ConsumesEq = demonnic.chaser.NeedsEqAndBal.ConsumesEq or {}
demonnic.chaser.NeedsEqAndBal.ConsumesBal = demonnic.chaser.NeedsEqAndBal.ConsumesBal or {}
demonnic.chaser.NeedsEqAndBal.ConsumesNeither = demonnic.chaser.NeedsEqAndBal.ConsumesNeither or {}
demonnic.chaser.NeedsEq = demonnic.chaser.NeedsEq or {}
demonnic.chaser.NeedsEq.ConsumesEq = demonnic.chaser.NeedsEq.ConsumesEq or {}
demonnic.chaser.NeedsEq.ConsumesNothing = demonnic.chaser.NeedsEq.ConsumesNothing or {}
demonnic.chaser.NeedsBal = demonnic.chaser.NeedsBal or {}
demonnic.chaser.NeedsBal.ConsumesBal = demonnic.chaser.NeedsBal.ConsumesBal or {}
demonnic.chaser.NeedsBal.ConsumesNothing = demonnic.chaser.NeedsBal.ConsumesNothing or {}
demonnic.chaser.chasingEq = demonnic.chaser.chasingEq or false
demonnic.chaser.chasingBal = demonnic.chaser.chasingBal or false
demonnic.chaser.currentlyChasingEq = demonnic.chaser.currentlyChasingEq or &quot;&quot;
demonnic.chaser.currentlyChasingBal = demonnic.chaser.currentlyChasingBal or &quot;&quot;
</script>
                <eventHandlerList/>
                <Script isActive="yes" isFolder="no">
                    <name>Configuration Options</name>
                    <packageName></packageName>
                    <script>--Change to 'false' below if you would rather do balance things before eq things.
if demonnic.chaser.config.ChaseEqFirst == nil then 
  demonnic.chaser.config.ChaseEqFirst = true 
end</script>
                    <eventHandlerList/>
                </Script>
                <Script isActive="yes" isFolder="no">
                    <name>Code</name>
                    <packageName></packageName>
                    <script>function demonnic.chaser:reset()
  demonnic.chaser.NeedsEqAndBal = {}
  demonnic.chaser.NeedsEqAndBal.ConsumesEqAndBal = {}
  demonnic.chaser.NeedsEqAndBal.ConsumesEq = {}
  demonnic.chaser.NeedsEqAndBal.ConsumesBal = {}
  demonnic.chaser.NeedsEqAndBal.ConsumesNeither = {}
  demonnic.chaser.NeedsEq = {}
  demonnic.chaser.NeedsEq.ConsumesEq = {}
  demonnic.chaser.NeedsEq.ConsumesNothing = {}
  demonnic.chaser.NeedsBal = {}
  demonnic.chaser.NeedsBal.ConsumesBal = {}
  demonnic.chaser.NeedsBal.ConsumesNothing = {}
  demonnic.chaser.chasingEq = false
  demonnic.chaser.chasingBal = false
  demonnic.chaser.currentlyChasingEq = &quot;&quot;
  demonnic.chaser.currentlyChasingBal = &quot;&quot;
end

function demonnic.chaser:add(code, optiontable)
  demonnic:printDebug(&quot;chaser&quot;, &quot;ok, adding something to the chaser&quot;)
  if not code then --If they don't give us code to send, print some usage information
  demonnic:printDebug(&quot;chaser&quot;, &quot;About to print usage information, no codestring was passed&quot;)
    cecho(string.format(&quot;%s\n&quot;, calign(&quot;You should at least tell us what to do.&quot;, {cap = &quot;--=={{&quot;, capColor = &quot;&lt;green&gt;&quot;, inside = false, textColor = &quot;&lt;purple&gt;&quot;, mirror = true,})))
    cecho(&quot;&lt;purple&gt;Usage is:\n  demonnic.chaser:add([[lua code to execute]], {table of options})\n\nMinimum usage is demonnic.chaser:add([[send(\&quot;command\&quot;)]]) which will send \&quot;command\&quot; to the mud, minus the quotes, when you have EQ and Balance, and expect it to consume both&quot;)
  end
  local options = {}
  if type(code) ~= &quot;string&quot; then code = tostring(code) end --ensure the code they're sending is a string

--if they send a table as the second argument, copy it into our options. If they send anything else, or nothing at all, options remains an empty table
  if type(optiontable) == &quot;table&quot; then options = optiontable end 

--initialize all options to true, but only if the user hasn't specified false. (this way if they specify something other than false, like &quot;banana&quot;, it'll default to true. This keeps my code from breaking later, and what the options are is pretty clearly laid out.
  if options.needsEq ~= false then options.needsEq = true end
  if options.needsBal ~= false then options.needsBal = true end
  if options.consumesEq ~= false then options.consumesEq = options.needsEq end --We can't consume EQ if we don't need EQ
  if options.consumesBal ~= false then options.consumesBal = options.needsBal end --Same for balance... if we're not requiring balance, we cannot consume
  demonnic:printDebug(&quot;chaser&quot;, options)
  
--a bunch of messy if/elseif logic to build the tables we'll be using (ok, not that messy, but ugly)
  if options.needsEq and options.needsBal then
    if options.consumesEq and options.consumesBal then
      table.insert(demonnic.chaser.NeedsEqAndBal.ConsumesEqAndBal, code)
    elseif options.consumesEq and not options.consumesBal then 
      table.insert(demonnic.chaser.NeedsEqAndBal.ConsumesEq, code)
    elseif not options.consumesEq and options.consumesBal then
      table.insert(demonnic.chaser.NeedsEqAndBal.ConsumesBal, code)
    elseif not options.consumesEq and not options.consumesBal then
      table.insert(demonnic.chaser.NeedsEqAndBal.ConsumesNeither, code)
    end
  elseif options.needsEq and not options.needsBal then
    if options.consumesEq then
      table.insert(demonnic.chaser.NeedsEq.ConsumesEq, code)
    else
      table.insert(demonnic.chaser.NeedsEq.ConsumesNothing, code)
    end
  elseif not options.needsEq and options.needsBal then
    if options.consumesBal then
      table.insert(demonnic.chaser.NeedsBal.ConsumesBal, code)
    else
      table.insert(demonnic.chaser.NeedsBal.ConsumesNothing, code)
    end
  end
end

--a function to do maintenance stuff for chasing EQ
function demonnic.chaser.chaseEq()
  demonnic.chaser.chasingEq = true
  tempTimer(0.5, function () demonnic.chaser.chasingEq = false;demonnic.chaser.currentlyChasingEq = &quot;&quot; end) 
end


--a function to do maintenance stuff for chasing BAL
function demonnic.chaser.chaseBal()
  demonnic.chaser.chasingBal = true
  tempTimer(0.5, function() demonnic.chaser.chasingBal = false ; demonnic.chaser.currentlyChasingBal = &quot;&quot; end)
end

--the function to do the chasing! Should be fired by either the prompt, or by events for regaining Eq and Bal.
function demonnic.chaser:doChase()
--  if demonnic.writhing &gt; 0 then return end
  if demonnic.chaser.balances.balance == 1 and demonnic.chaser.balances.equilibrium == 1 then  --we have both EQ and balance
    if #demonnic.chaser.NeedsEqAndBal.ConsumesNeither &gt; 0 then --so do the things which need both but consume nothing
      for i=1,#demonnic.chaser.NeedsEqAndBal.ConsumesNeither do
        assert(loadstring(table.remove(demonnic.chaser.NeedsEqAndBal.ConsumesNeither,1))) ()
      end
    end
    if #demonnic.chaser.NeedsEq.ConsumesNothing &gt; 0 then -- and the things which require only eq but consume nothing
      for i=1,#demonnic.chaser.NeedsEq.ConsumesNothing do 
        assert(loadstring(table.remove(demonnic.chaser.NeedsEq.ConsumesNothing,1))) ()
      end
    end
    if #demonnic.chaser.NeedsBal.ConsumesNothing &gt; 0 then -- and the things which require balance but consume nothing
      for i=1, #demonnic.chaser.NeedsBal.ConsumesNothing do
        assert(loadstring(table.remove(demonnic.chaser.NeedsBal.ConsumesNothing,1))) ()
      end
    end
    if #demonnic.chaser.NeedsEqAndBal.ConsumesEqAndBal &gt; 0 and not demonnic.chaser.chasingEq and not demonnic.chaser.chasingBal then -- then if we have anything which requires both and consumes both, do that.
      demonnic.chaser.currentlyChasingEq = table.remove(demonnic.chaser.NeedsEqAndBal.ConsumesEqAndBal,1)
      demonnic.chaser.currentlyChasingBal = _G[demonnic.chaser.currentlyChasingEq]
      demonnic.chaser.chaseBal()
      demonnic.chaser.chaseEq()
      assert(loadstring(demonnic.chaser.currentlyChasingEq)) ()
      return
    end
    if demonnic.chaser.config.ChaseEqFirst == true then --then, we check if we're configured to chase equilibrium before balance. If so
      if #demonnic.chaser.NeedsEqAndBal.ConsumesEq &gt; 0 and not demonnic.chaser.chasingEq and not demonnic.chaser.chasingBal then -- Check if we have something which requires Eq and Bal, but consumes only Eq. Use failsafe to be sure we're not in the process of trying to use up one or both
        demonnic.chaser.currentlyChasingEq = table.remove(demonnic.chaser.NeedsEqAndBal.ConsumesEq,1)
        demonnic.chaser.chaseEq()
        assert(loadstring(demonnic.chaser.currentlyChasingEq)) ()
      end
      if #demonnic.chaser.NeedsEqAndBal.ConsumesBal &gt; 0 and not demonnic.chaser.chasingEq and not demonnic.chaser.chasingBal then --then check if we have something which needs both eq and bal, but consumes only Bal. Same failsafe, so if the previous if fires off an action, this one won't eval true, even if we haven't lost EQ yet.
        demonnic.chaser.currentlyChasingBal = table.remove(demonnic.chaser.NeedsEqAndBal.ConsumesBal,1)
        demonnic.chaser.chaseBal()
        assert(loadstring(demonnic.chaser.currentlyChasingBal)) ()
      end
      if #demonnic.chaser.NeedsEq.ConsumesEq &gt; 0 and not demonnic.chaser.chasingEq then
        demonnic.chaser.currentlyChasingEq = table.remove(demonnic.chaser.NeedsEq.ConsumesEq,1)
        demonnic.chaser.chaseEq()
        assert(loadstring(demonnic.chaser.currentlyChasingEq)) ()
      end
      if #demonnic.chaser.NeedsBal.ConsumesBal &gt; 0 and not demonnic.chaser.chasingBal then
        demonnic.chaser.currentlyChasingBal = table.remove(demonnic.chaser.NeedsBal.ConsumesBal,1)
        demonnic.chaser.chaseBal()
        assert(loadstring(demonnic.chaser.currentlyChasingBal)) ()
      end
    else
      if #demonnic.chaser.NeedsEqAndBal.ConsumesBal &gt; 0 and not demonnic.chaser.chasingBal then
        demonnic.chaser.currentlyChasingBal = table.remove(demonnic.chaser.NeedsEqAndBal.ConsumesBal,1)
        demonnic.chaser.chaseBal()
        assert(loadstring(demonnic.chaser.currentlyChasingBal)) ()
      end
      if #demonnic.chaser.NeedsEqAndBal.ConsumesEq &gt; 0 and not demonnic.chaser.chasingEq then
        demonnic.chaser.currentlyChasingEq = table.remove(demonnic.chaser.NeedsEqAndBal.ConsumesEq,1)
        demonnic.chaser.chaseEq()
        assert(loadstring(demonnic.chaser.currentlyChasingEq)) ()
      end
      if #demonnic.chaser.NeedsBal.ConsumesBal &gt; 0 and not demonnic.chaser.chasingBal then
        demonnic.chaser.currentlyChasingBal = table.remove(demonnic.chaser.NeedsBal.ConsumesBal,1)
        demonnic.chaser.chaseBal()
        assert(loadstring(demonnic.chaser.currentlyChasingBal)) ()
      end
      if #demonnic.chaser.NeedsEq.ConsumesEq &gt; 0 and not demonnic.chaser.chasingEq then
        demonnic.chaser.currentlyChasingEq = table.remove(demonnic.chaser.NeedsEq.ConsumesEq,1)
        demonnic.chaser.chaseEq()
        assert(loadstring(demonnic.chaser.currentlyChasingEq)) ()
      end
    end
    return
  elseif demonnic.chaser.balances.balance &lt; 1 and demonnic.chaser.balances.equilibrium == 1 then
    if #demonnic.chaser.NeedsEq.ConsumesNothing &gt; 0 then
      for i=1,#demonnic.chaser.NeedsEq.ConsumesNothing do 
        assert(loadstring(table.remove(demonnic.chaser.NeedsEq.ConsumesNothing,1))) ()
      end
    end
    if #demonnic.chaser.NeedsEq.ConsumesEq &gt; 0 and not demonnic.chaser.chasingEq then
      demonnic.chaser.currentlyChasingEq = table.remove(demonnic.chaser.NeedsEq.ConsumesEq,1)
      demonnic.chaser.chaseEq()
      assert(loadstring(demonnic.chaser.currentlyChasingEq)) ()
    end
    return
  elseif demonnic.chaser.balances.balance == 1 and demonnic.chaser.balances.equilibrium ~= 1 then 
    if #demonnic.chaser.NeedsBal.ConsumesNothing &gt; 0 then
      for i=1,#demonnic.chaser.NeedsBal.ConsumesNothing do
        assert(loadstring(table.remove(demonnic.needsEq.ConsumesNothing,1))) ()
      end
    end
    if #demonnic.chaser.NeedsBal.ConsumesBal &gt; 0 and not demonnic.chaser.chasingBal then
      demonnic.chaser.currentlyChasingBal = table.remove(demonnic.chaser.NeedsBal.ConsumesBal,1)
      demonnic.chaser.chaseBal()
      assert(loadstring(demonnic.chaser.currentlyChasingBal)) ()
    end
    return
  else 
    return
  end      
end


</script>
                    <eventHandlerList/>
                </Script>
            </ScriptGroup>
            <ScriptGroup isActive="yes" isFolder="yes">
                <name>Tabbed Chat</name>
                <packageName></packageName>
                <script>--Do not remove the following lines. Or change them.
demonnic = demonnic or {}
demonnic.chat = demonnic.chat or {}
demonnic.chat.tabsToBlink = demonnic.chat.tabsToBlink or {}
demonnic.chat.config = demonnic.chat.config or {}
demonnic.chat.tabs = demonnic.chat.tabs or {}
demonnic.chat.windows = demonnic.chat.windows or {}
demonnic.chat.config.activeColors = demonnic.chat.config.activeColors or {}
demonnic.chat.config.inactiveColors = demonnic.chat.config.inactiveColors or {}</script>
                <eventHandlerList/>
                <Script isActive="yes" isFolder="no">
                    <name>Configuration Options</name>
                    <packageName></packageName>
                    <script>--[[
This is where all of the configuration options can be set. 
Anything I've put in this script object can be changed, but please do pay attention to what you're doing.
If you change one of the values to something it shouldn't be, you could break it. 
]]

--This is where you tell it to use tabbed chat.
demonnic.chat.use = true

--[[
This is where you say what corner of the screen you want the tabbed chat on
Valid settings are &quot;topright&quot;, &quot;topleft&quot;, &quot;bottomright&quot;, &quot;bottomleft&quot;
]]--
demonnic.chat.config.location = &quot;topright&quot;

--[[
This is a table of channels you would like.
AKA the place you tell the script what tabs you want.
Each entry must be a string. The defaults should be a pretty effective guide.
]]

demonnic.chat.config.channels = {
  &quot;All&quot;,
  &quot;Org&quot;,
  &quot;Guild&quot;,
  &quot;Clans&quot;,
  &quot;Tells&quot;,
  &quot;Says&quot;,
  &quot;Misc&quot;,
}


--Set this to the name of the channel you want to have everything sent to. 
--Per the default, this would be the &quot;All&quot; channel. If you have a different name for it:
--
--demonnic.chat.config.Alltab = &quot;Bucket&quot;  
--
--And if you don't want it turned on at all:
--
--demonnic.chat.config.Alltab = false

demonnic.chat.config.Alltab = &quot;All&quot;



---------------------------------------------------------------------------------
--                                                                             --
--The infamous blinking stuff!!!                                               --
--                                                                             --
---------------------------------------------------------------------------------

--[[
Do you want tabs to blink when you get new messages, until you click on the tab?
True if yes, false if no.
]]
demonnic.chat.config.blink = true

--How long (in seconds) between blinks? For example, 1 would mean a 1 second pause in between blinks.
demonnic.chat.config.blinkTime = 3

--Blink if the bucket tab (&quot;All&quot; by default, but configured above) is in focus?
demonnic.chat.config.blinkFromAll = false




--Font size for the chat messages

demonnic.chat.config.fontSize = 8

--[[
Should we preserve the formatting of the text. 
Or should we set the background of it to match the window color?
Set this to false if you want the background for all chat to match the background of the window.
Useful if you change the background from black, and don't like the way the pasted chat makes blocks in it
]]

demonnic.chat.config.preserveBackground = false

--[[
Gag the chat lines in the main window?
defaults to false, set to true if you want to gag.
]]

demonnic.chat.config.gag = false

--[[
Number of lines of chat visible at once. 
Will determine how tall the window for the chats is.
]]

demonnic.chat.config.lines = 50

--[[
Number of characters to wrap the chatlines at.
This will also determine how wide the chat windows are.
]]

demonnic.chat.config.width = 60

--[[
Set the color for the active tab. R,G,B format.
The default here is a brightish green
]]

demonnic.chat.config.activeColors = {
  r = 0,
  g = 180,
  b = 0,
}

--[[
Set the color for the inactive tab. R,G,B format.
The default here is a drab grey
]]

demonnic.chat.config.inactiveColors = {
  r = 60,
  g = 60,
  b = 60,
}

--[[
Set the color for the chat window itself. R,G,B format.
Defaulted to the black of my twisted hardened soul. Or something.
]]

demonnic.chat.config.windowColors = {
  r = 0,
  g = 0,
  b = 0,
}

--[[
Set the color for the text on the active tab. Uses color names.
Set the default to purple. So the tab you're looking at, by default will be purple on bright green. 
Did I mention I'm a bit colorblind?
]]

demonnic.chat.config.activeTabText = &quot;purple&quot;

--[[
Set the color for the text on the inactive tabs. Uses color names.
Defaulted this to white. So the tabs you're not looking at will be white text on boring grey background.
]]

demonnic.chat.config.inactiveTabText = &quot;white&quot;

--[[
have to make sure a currentTab is set... 
so we'll use the one for the bucket, or the first one in the channels table
Or, you know... what it's currently set to, if it's already set.
]]
demonnic.chat.currentTab = demonnic.chat.currentTab or demonnic.chat.config.Alltab or demonnic.chat.config.channels[1]
</script>
                    <eventHandlerList/>
                </Script>
                <Script isActive="yes" isFolder="no">
                    <name>Code</name>
                    <packageName></packageName>
                    <script>--[[
If the label callbacks ever decide to start taking a function which is part of a table, 0then this will change.
Or if it's modified to take actual functions. Anonymouse function clickcallback would be awfully nice.
]]

function demonnicChatSwitch(chat)
  local r = demonnic.chat.config.inactiveColors.r
  local g = demonnic.chat.config.inactiveColors.g
  local b = demonnic.chat.config.inactiveColors.b
  local newr = demonnic.chat.config.activeColors.r
  local newg = demonnic.chat.config.activeColors.g
  local newb = demonnic.chat.config.activeColors.b
  local oldchat = demonnic.chat.currentTab
  if demonnic.chat.currentTab ~= chat then
    demonnic.chat.windows[oldchat]:hide()
    demonnic.chat.tabs[oldchat]:setColor(r,g,b)
    demonnic.chat.tabs[oldchat]:echo(oldchat, demonnic.chat.config.inactiveTabText, &quot;c&quot;)
    if demonnic.chat.config.blink and demonnic.chat.tabsToBlink[chat] then
      demonnic.chat.tabsToBlink[chat] = nil
    end
    if demonnic.chat.config.blink and chat == demonnic.chat.config.Alltab then
      demonnic.chat.tabsToBlink = {}
    end
  end
  demonnic.chat.tabs[chat]:setColor(newr,newg,newb)
  demonnic.chat.tabs[chat]:echo(chat, demonnic.chat.config.activeTabText, &quot;c&quot;)
  demonnic.chat.windows[chat]:show()
  demonnic.chat.currentTab = chat  
end

function demonnic.chat:resetUI()
  demonnic.chat.container = Geyser.Container:new(demonnic.chat[demonnic.chat.config.location]())
  demonnic.chat.tabBox = Geyser.HBox:new({
    x=0,
    y=0,
    width = &quot;100%&quot;,
    height = &quot;25px&quot;,
    name = &quot;DemonChatTabs&quot;,
  },demonnic.chat.container)

end

function demonnic.chat:create()
  --reset the UI
  demonnic.chat:resetUI()
  --Set some variables locally to increase readability
  local r = demonnic.chat.config.inactiveColors.r
  local g = demonnic.chat.config.inactiveColors.g
  local b = demonnic.chat.config.inactiveColors.b
  local winr = demonnic.chat.config.windowColors.r
  local wing = demonnic.chat.config.windowColors.g
  local winb = demonnic.chat.config.windowColors.b

  --iterate the table of channels and create some windows and tabs
  for i,tab in ipairs(demonnic.chat.config.channels) do
    demonnic.chat.tabs[tab] = Geyser.Label:new({
      name=string.format(&quot;tab%s&quot;, tab),
    }, demonnic.chat.tabBox)
    demonnic.chat.tabs[tab]:echo(tab, demonnic.chat.config.inactiveTabText, &quot;c&quot;)
    demonnic.chat.tabs[tab]:setColor(r,g,b)
    demonnic.chat.tabs[tab]:setClickCallback(&quot;demonnicChatSwitch&quot;, tab)
    demonnic.chat.windows[tab] = Geyser.MiniConsole:new({
--      fontSize = demonnic.chat.config.fontSize,
      x = 0,
      y = 25,
      height = &quot;100%&quot;,
      width = &quot;100%&quot;,
      name = string.format(&quot;win%s&quot;, tab),
    }, demonnic.chat.container)
    demonnic.chat.windows[tab]:setFontSize(demonnic.chat.config.fontSize)
    demonnic.chat.windows[tab]:setColor(winr,wing,winb)
    demonnic.chat.windows[tab]:setWrap(demonnic.chat.config.width)
    demonnic.chat.windows[tab]:hide()
  end
  local showme = demonnic.chat.config.Alltab or demonnic.chat.config.channels[1]
  demonnicChatSwitch(showme)
  --start the blink timers, if enabled
  if demonnic.chat.config.blink and not demonnic.chat.blinkTimerOn then
    demonnic.chat:blink()
  end
end

function demonnic.chat:append(chat)
  local r = demonnic.chat.config.windowColors.r
  local g = demonnic.chat.config.windowColors.g
  local b = demonnic.chat.config.windowColors.b
  selectCurrentLine()
  if demonnic.chat.config.preserveBackground then
    setBgColor(r,g,b)
  end
  copy()
  demonnic.chat.windows[chat]:append()
  if demonnic.chat.config.gag then 
    deleteLine() 
    tempLineTrigger(1,1, [[if isPrompt() then deleteLine() end]])
  end
  if demonnic.chat.config.Alltab then appendBuffer(string.format(&quot;win%s&quot;, demonnic.chat.config.Alltab)) end
  if demonnic.chat.config.blink and chat ~= demonnic.chat.currentTab then 
    if (demonnic.chat.config.Alltab == demonnic.chat.currentTab) and not demonnic.chat.config.blinkOnAll then
      return
    else
      demonnic.chat.tabsToBlink[chat] = true
    end
  end
end



function demonnic.chat:blink()
  if demonnic.chat.blinkID then killTimer(demonnic.chat.blinkID) end
  if not demonnic.chat.config.blink then 
    demonnic.chat.blinkTimerOn = false
    return 
  end
  for tab,_ in pairs(demonnic.chat.tabsToBlink) do
    demonnic.chat.tabs[tab]:flash()
  end
  demonnic.chat.blinkID = tempTimer(demonnic.chat.config.blinkTime, function () demonnic.chat:blink() end)
end

function demonnic.chat:topright()
  return {
    fontSize = demonnic.chat.config.fontSize,
    x=string.format(&quot;-%sc&quot;,demonnic.chat.config.width + 2),
    y=0,
    width=&quot;-15px&quot;,
    height=string.format(&quot;%ic&quot;, demonnic.chat.config.lines + 2),
  }
end

function demonnic.chat:topleft()
  return {
    fontSize = demonnic.chat.config.fontSize,
    x=0,
    y=0,
    width=string.format(&quot;%sc&quot;,demonnic.chat.config.width),
    height=string.format(&quot;%ic&quot;, demonnic.chat.config.lines + 2),
  }
end

function demonnic.chat:bottomright()
  return {
    fontSize = demonnic.chat.config.fontSize,
    x=string.format(&quot;-%sc&quot;,demonnic.chat.config.width + 2),
    y=string.format(&quot;-%sc&quot;,demonnic.chat.config.lines + 2),
    width=&quot;-15px&quot;,
    height=string.format(&quot;%ic&quot;, demonnic.chat.config.lines + 2),
  }
end

function demonnic.chat:bottomleft()
  return {
    fontSize = demonnic.chat.config.fontSize,
    x=0,
    y=string.format(&quot;-%sc&quot;,demonnic.chat.config.lines + 2),
    width=string.format(&quot;%sc&quot;,demonnic.chat.config.width),
    height=string.format(&quot;%ic&quot;, demonnic.chat.config.lines + 2),
  }
end</script>
                    <eventHandlerList/>
                </Script>
                <Script isActive="yes" isFolder="no">
                    <name>demonnicOnStart</name>
                    <packageName></packageName>
                    <script>function demonnicOnStart()
  if demonnic.chat.use then
    demonnic.chat:create()
  end
end</script>
                    <eventHandlerList>
                        <string>sysLoadEvent</string>
                    </eventHandlerList>
                </Script>
                <Script isActive="yes" isFolder="no">
                    <name>echo functions</name>
                    <packageName></packageName>
                    <script>
function demonnic.chat:cecho(chat, message)
  local alltab = demonnic.chat.config.Alltab
  local blink = demonnic.chat.config.blink
  cecho(string.format(&quot;win%s&quot;,chat), message)
  if alltab and chat ~= alltab then 
    cecho(string.format(&quot;win%s&quot;, alltab), message)
  end
  if blink and chat ~= demonnic.chat.currentTab then
    if (alltab == demonnic.chat.currentTab) and not demonnic.chat.config.blinkOnAll then
      return
    else
      demonnic.chat.tabsToBlink[chat] = true
    end
  end
end

function demonnic.chat:decho(chat, message)
  local alltab = demonnic.chat.config.Alltab
  local blink = demonnic.chat.config.blink
  decho(string.format(&quot;win%s&quot;,chat), message)
  if alltab and chat ~= alltab then 
    decho(string.format(&quot;win%s&quot;, alltab), message)
  end
  if blink and chat ~= demonnic.chat.currentTab then
    if (alltab == demonnic.chat.currentTab) and not demonnic.chat.config.blinkOnAll then
      return
    else
      demonnic.chat.tabsToBlink[chat] = true
    end
  end
end

function demonnic.chat:hecho(chat, message)
  local alltab = demonnic.chat.config.Alltab
  local blink = demonnic.chat.config.blink
  hecho(string.format(&quot;win%s&quot;,chat), message)
  if alltab and chat ~= alltab then 
    hecho(string.format(&quot;win%s&quot;, alltab), message)
  end
  if blink and chat ~= demonnic.chat.currentTab then
    if (alltab == demonnic.chat.currentTab) and not demonnic.chat.config.blinkOnAll then
      return
    else
      demonnic.chat.tabsToBlink[chat] = true
    end
  end
end

function demonnic.chat:echo(chat, message)
  local alltab = demonnic.chat.config.Alltab
  local blink = demonnic.chat.config.blink
  echo(string.format(&quot;win%s&quot;,chat), message)
  if alltab and chat ~= alltab then 
    echo(string.format(&quot;win%s&quot;, alltab), message)
  end
  if blink and chat ~= demonnic.chat.currentTab then
    if (alltab == demonnic.chat.currentTab) and not demonnic.chat.config.blinkOnAll then
      return
    else
      demonnic.chat.tabsToBlink[chat] = true
    end
  end
end</script>
                    <eventHandlerList/>
                </Script>
            </ScriptGroup>
            <ScriptGroup isActive="yes" isFolder="yes">
                <name>Calendar</name>
                <packageName></packageName>
                <script>--Don't mess with this stuff!!
demonnic = demonnic or {}
demonnic.calendar = demonnic.calendar or {}
demonnic.calendar.config = demonnic.calendar.config or {}
demonnic.calendar.herbs = {}
demonnic.calendar.display = demonnic.calendar.display or {}
demonnic.calendar.date = demonnic.calendar.date or {
  year = 297,
  day = 5,
  moonphase = &quot;Waxing Crescent&quot;,
  month = &quot;Dvarsh&quot;,
}

demonnic.calendar.herbs.hibernating = { Estar = &quot;flax merbloom weed&quot;,
                                        Urlachmar = &quot;kafe&quot;,
                                        Kiani = &quot;colewort&quot;,
                                        Dioni = &quot;calamus earwort juniper sage&quot;,
                                        Vestian = &quot;horehound wormwood&quot;,
                                        Avechary = &quot;mistletoe&quot;,
                                        Dvarsh = &quot;sparkleberry&quot;,
                                        Tzarin = &quot;reishi sargassum&quot;,
                                        Klangiary = &quot;arnica pennyroyal&quot;,
                                        Juliary = &quot;coltsfoot faeleaf&quot;,
                                        Shanthin = &quot;galingale marjoram rosehips&quot;,
                                        Roarkian = &quot;chervil yarrow&quot;,
}
demonnic.calendar.herbs.flourishing = { Dvarsh = &quot;flax merbloom weed&quot;,
                                        Tzarin = &quot;kafe rawtea&quot;,
                                        Klangiary = &quot;colewort&quot;,
                                        Juliary = &quot;calamus earwort juniper sage&quot;,
                                        Shanthin = &quot;horehound wormwood&quot;,
                                        Avechary = &quot;mistletoe&quot;,
                                        Estar = &quot;sparkleberry&quot;,
                                        Urlachmar = &quot;reishi sargassum&quot;,
                                        Kiani = &quot;arnica pennyroyal&quot;,
                                        Dioni = &quot;coltsfoot faeleaf&quot;,
                                        Vestian = &quot;galingale marjoram rosehips&quot;,
                                        Avechary = &quot;chervil yarrow&quot;,
}
demonnic.calendar.herbs.replant = { Urlachmar = &quot;flax merbloom weed&quot;,
                                    Kiani = &quot;kafe&quot;,
                                    Dioni = &quot;colewort&quot;,
                                    Vestian = &quot;calamus earwort juniper sage&quot;,
                                    Avechary = &quot;horehound wormwood&quot;,
                                    Dvarsh = &quot;mistletoe&quot;,
                                    Tzarin = &quot;sparkleberry&quot;,
                                    Klangiary = &quot;reishi sargassum&quot;,
                                    Juliary = &quot;arnica pennyroyal&quot;,
                                    Shanthin = &quot;coltsfoot faeleaf&quot;,
                                    Roarkian = &quot;galingale marjoram rosehips&quot;,
                                    Estar = &quot;chervil yarrow&quot;,
}

function demonnic.calendar:readFormat()
  demonnic.calendar.display[1] = string.format(&quot;&lt;%s&gt;&lt;%s&gt;01&lt;%s&gt;  02  03  04  05\n06  07  08  09  10\n11  12  13  14  15\n16  17  18  19  20\n21  22  23  24  25&quot;, demonnic.calendar.config.inactiveColor, demonnic.calendar.config.activeColor, demonnic.calendar.config.inactiveColor)
  demonnic.calendar.display[2] = string.format(&quot;&lt;%s&gt;01  &lt;%s&gt;02&lt;%s&gt;  03  04  05\n06  07  08  09  10\n11  12  13  14  15\n16  17  18  19  20\n21  22  23  24  25&quot;, demonnic.calendar.config.inactiveColor, demonnic.calendar.config.activeColor, demonnic.calendar.config.inactiveColor)
  demonnic.calendar.display[3] = string.format(&quot;&lt;%s&gt;01  02  &lt;%s&gt;03&lt;%s&gt;  04  05\n06  07  08  09  10\n11  12  13  14  15\n16  17  18  19  20\n21  22  23  24  25&quot;, demonnic.calendar.config.inactiveColor, demonnic.calendar.config.activeColor, demonnic.calendar.config.inactiveColor)
  demonnic.calendar.display[4] = string.format(&quot;&lt;%s&gt;01  02  03  &lt;%s&gt;04&lt;%s&gt;  05\n06  07  08  09  10\n11  12  13  14  15\n16  17  18  19  20\n21  22  23  24  25&quot;, demonnic.calendar.config.inactiveColor, demonnic.calendar.config.activeColor, demonnic.calendar.config.inactiveColor)
  demonnic.calendar.display[5] = string.format(&quot;&lt;%s&gt;01  02  03  04  &lt;%s&gt;05\n&lt;%s&gt;06  07  08  09  10\n11  12  13  14  15\n16  17  18  19  20\n21  22  23  24  25&quot;, demonnic.calendar.config.inactiveColor, demonnic.calendar.config.activeColor, demonnic.calendar.config.inactiveColor)
  demonnic.calendar.display[6] = string.format(&quot;&lt;%s&gt;01  02  03  04  05\n&lt;%s&gt;06&lt;%s&gt;  07  08  09  10\n11  12  13  14  15\n16  17  18  19  20\n21  22  23  24  25&quot;, demonnic.calendar.config.inactiveColor, demonnic.calendar.config.activeColor, demonnic.calendar.config.inactiveColor)
  demonnic.calendar.display[7] = string.format(&quot;&lt;%s&gt;01  02  03  04  05\n06  &lt;%s&gt;07&lt;%s&gt;  08  09  10\n11  12  13  14  15\n16  17  18  19  20\n21  22  23  24  25&quot;, demonnic.calendar.config.inactiveColor, demonnic.calendar.config.activeColor, demonnic.calendar.config.inactiveColor)
  demonnic.calendar.display[8] = string.format(&quot;&lt;%s&gt;01  02  03  04  05\n06  07  &lt;%s&gt;08&lt;%s&gt;  09  10\n11  12  13  14  15\n16  17  18  19  20\n21  22  23  24  25&quot;, demonnic.calendar.config.inactiveColor, demonnic.calendar.config.activeColor, demonnic.calendar.config.inactiveColor)
  demonnic.calendar.display[9] = string.format(&quot;&lt;%s&gt;01  02  03  04  05\n06  07  08  &lt;%s&gt;09&lt;%s&gt;  10\n11  12  13  14  15\n16  17  18  19  20\n21  22  23  24  25&quot;, demonnic.calendar.config.inactiveColor, demonnic.calendar.config.activeColor, demonnic.calendar.config.inactiveColor)
  demonnic.calendar.display[10] = string.format(&quot;&lt;%s&gt;01  02  03  04  05\n06  07  08  09  &lt;%s&gt;10\n&lt;%s&gt;11  12  13  14  15\n16  17  18  19  20\n21  22  23  24  25&quot;, demonnic.calendar.config.inactiveColor, demonnic.calendar.config.activeColor, demonnic.calendar.config.inactiveColor)
  demonnic.calendar.display[11] = string.format(&quot;&lt;%s&gt;01  02  03  04  05\n06  07  08  09  10\n&lt;%s&gt;11&lt;%s&gt;  12  13  14  15\n16  17  18  19  20\n21  22  23  24  25&quot;, demonnic.calendar.config.inactiveColor, demonnic.calendar.config.activeColor, demonnic.calendar.config.inactiveColor)
  demonnic.calendar.display[12] = string.format(&quot;&lt;%s&gt;01  02  03  04  05\n06  07  08  09  10\n11  &lt;%s&gt;12&lt;%s&gt;  13  14  15\n16  17  18  19  20\n21  22  23  24  25&quot;, demonnic.calendar.config.inactiveColor, demonnic.calendar.config.activeColor, demonnic.calendar.config.inactiveColor)
  demonnic.calendar.display[13] = string.format(&quot;&lt;%s&gt;01  02  03  04  05\n06  07  08  09  10\n11  12  &lt;%s&gt;13&lt;%s&gt;  14  15\n16  17  18  19  20\n21  22  23  24  25&quot;, demonnic.calendar.config.inactiveColor, demonnic.calendar.config.activeColor, demonnic.calendar.config.inactiveColor)
  demonnic.calendar.display[14] = string.format(&quot;&lt;%s&gt;01  02  03  04  05\n06  07  08  09  10\n11  12  13  &lt;%s&gt;14&lt;%s&gt;  15\n16  17  18  19  20\n21  22  23  24  25&quot;, demonnic.calendar.config.inactiveColor, demonnic.calendar.config.activeColor, demonnic.calendar.config.inactiveColor)
  demonnic.calendar.display[15] = string.format(&quot;&lt;%s&gt;01  02  03  04  05\n06  07  08  09  10\n11  12  13  14  &lt;%s&gt;15\n&lt;%s&gt;16  17  18  19  20\n21  22  23  24  25&quot;, demonnic.calendar.config.inactiveColor, demonnic.calendar.config.activeColor, demonnic.calendar.config.inactiveColor)
  demonnic.calendar.display[16] = string.format(&quot;&lt;%s&gt;01  02  03  04  05\n06  07  08  09  10\n11  12  13  14  15\n&lt;%s&gt;16&lt;%s&gt;  17  18  19  20\n21  22  23  24  25&quot;, demonnic.calendar.config.inactiveColor, demonnic.calendar.config.activeColor, demonnic.calendar.config.inactiveColor)
  demonnic.calendar.display[17] = string.format(&quot;&lt;%s&gt;01  02  03  04  05\n06  07  08  09  10\n11  12  13  14  15\n16  &lt;%s&gt;17&lt;%s&gt;  18  19  20\n21  22  23  24  25&quot;, demonnic.calendar.config.inactiveColor, demonnic.calendar.config.activeColor, demonnic.calendar.config.inactiveColor)
  demonnic.calendar.display[18] = string.format(&quot;&lt;%s&gt;01  02  03  04  05\n06  07  08  09  10\n11  12  13  14  15\n16  17  &lt;%s&gt;18&lt;%s&gt;  19  20\n21  22  23  24  25&quot;, demonnic.calendar.config.inactiveColor, demonnic.calendar.config.activeColor, demonnic.calendar.config.inactiveColor)
  demonnic.calendar.display[19] = string.format(&quot;&lt;%s&gt;01  02  03  04  05\n06  07  08  09  10\n11  12  13  14  15\n16  17  18  &lt;%s&gt;19&lt;%s&gt;  20\n21  22  23  24  25&quot;, demonnic.calendar.config.inactiveColor, demonnic.calendar.config.activeColor, demonnic.calendar.config.inactiveColor)
  demonnic.calendar.display[20] = string.format(&quot;&lt;%s&gt;01  02  03  04  05\n06  07  08  09  10\n11  12  13  14  15\n16  17  18  19  &lt;%s&gt;20\n&lt;%s&gt;21  22  23  24  25&quot;, demonnic.calendar.config.inactiveColor, demonnic.calendar.config.activeColor, demonnic.calendar.config.inactiveColor)
  demonnic.calendar.display[21] = string.format(&quot;&lt;%s&gt;01  02  03  04  05\n06  07  08  09  10\n11  12  13  14  15\n16  17  18  19  20\n&lt;%s&gt;21&lt;%s&gt;  22  23  24  25&quot;, demonnic.calendar.config.inactiveColor, demonnic.calendar.config.activeColor, demonnic.calendar.config.inactiveColor)
  demonnic.calendar.display[22] = string.format(&quot;&lt;%s&gt;01  02  03  04  05\n06  07  08  09  10\n11  12  13  14  15\n16  17  18  19  20\n21  &lt;%s&gt;22&lt;%s&gt;  23  24  25&quot;, demonnic.calendar.config.inactiveColor, demonnic.calendar.config.activeColor, demonnic.calendar.config.inactiveColor)
  demonnic.calendar.display[23] = string.format(&quot;&lt;%s&gt;01  02  03  04  05\n06  07  08  09  10\n11  12  13  14  15\n16  17  18  19  20\n21  22  &lt;%s&gt;23&lt;%s&gt;  24  25&quot;, demonnic.calendar.config.inactiveColor, demonnic.calendar.config.activeColor, demonnic.calendar.config.inactiveColor)
  demonnic.calendar.display[24] = string.format(&quot;&lt;%s&gt;01  02  03  04  05\n06  07  08  09  10\n11  12  13  14  15\n16  17  18  19  20\n21  22  23  &lt;%s&gt;24&lt;%s&gt;  25&quot;, demonnic.calendar.config.inactiveColor, demonnic.calendar.config.activeColor, demonnic.calendar.config.inactiveColor)
  demonnic.calendar.display[25] = string.format(&quot;&lt;%s&gt;01  02  03  04  05\n06  07  08  09  10\n11  12  13  14  15\n16  17  18  19  20\n21  22  23  24  &lt;%s&gt;25&lt;%s&gt;&quot;, demonnic.calendar.config.inactiveColor, demonnic.calendar.config.activeColor, demonnic.calendar.config.inactiveColor)
end
</script>
                <eventHandlerList/>
                <Script isActive="yes" isFolder="no">
                    <name>Configuration Options</name>
                    <packageName></packageName>
                    <script>--configuration options


--Whether you want the calendar or not
demonnic.calendar.config.use = true


--True if you want the herb window, false otherwise
demonnic.calendar.config.herbs = true

--Font size for the window
demonnic.calendar.config.fontSize = 8

--color of the days it isn't (inactive).
--this is a color name
demonnic.calendar.config.inactiveColor = &quot;green&quot;

--color of the current day (active)
--this is a color name
demonnic.calendar.config.activeColor = &quot;purple&quot;

--location of the window. Can be any of the following:
--
--bottomleft
--bottomright
--topleft
--topright
demonnic.calendar.config.location = &quot;bottomright&quot;



--This is to fill the demonnic.calendar.display table after you set/change the colors above
demonnic.calendar:readFormat()</script>
                    <eventHandlerList/>
                </Script>
                <Script isActive="yes" isFolder="no">
                    <name>Code</name>
                    <packageName></packageName>
                    <script>--A set of functions to return the proper Geyser constraints for initialization
--correspond with the four config options available for calendar placement (topleft, topright, bottomleft, bottomright)

function demonnic.calendar.config.bottomright()
  if demonnic.calendar.config.herbs then
    return { 
      fontSize = demonnic.calendar.config.fontSize,
      x = &quot;-52c&quot;,
      y = &quot;-14c&quot;,
      height = &quot;14c&quot;,
      width = &quot;50c&quot;,
    }
  else
    return {
      fontSize = demonnic.calendar.config.fontSize,
      x = &quot;-22c&quot;,
      y = &quot;-9c&quot;,
      height = &quot;7c&quot;,
      width = &quot;20c&quot;,
    }
  end
end

function demonnic.calendar.config.bottomleft()
  if demonnic.calendar.config.herbs then
    return { 
      fontSize = demonnic.calendar.config.fontSize,
      x = &quot;0c&quot;,
      y = &quot;-14c&quot;,
      height = &quot;14c&quot;,
      width = &quot;50c&quot;,
    }
  else
    return {
      fontSize = demonnic.calendar.config.fontSize,
      x = 0,
      y = &quot;-7c&quot;,
      height = &quot;7c&quot;,
      width = &quot;20c&quot;,
    }
  end
end

function demonnic.calendar.config.topleft()
  if demonnic.calendar.config.herbs then
    return { 
      fontSize = demonnic.calendar.config.fontSize,
      x = 0,
      y = 0,
      height = &quot;14c&quot;,
      width = &quot;50c&quot;,
    }
  else
    return {
      fontSize = demonnic.calendar.config.fontSize,
      x = 0,
      y = 0,
      height = &quot;7c&quot;,
      width = &quot;20c&quot;,
    }
  end
end

function demonnic.calendar.config.topright()
  if demonnic.calendar.config.herbs then
    return { 
      fontSize = demonnic.calendar.config.fontSize,
      x = &quot;-52c&quot;,
      y = 0,
      height = &quot;14c&quot;,
      width = &quot;50c&quot;,
    }
  else
    return {
      fontSize = demonnic.calendar.config.fontSize,
      x = &quot;-22c&quot;,
      y = 0,
      height = &quot;7c&quot;,
      width = &quot;20c&quot;,
    }
  end
end

--This function will actually create the calendar for us.

function demonnic.calendar:create()
  local myFontSize = demonnic.calendar.config.fontSize
  local myLocation = demonnic.calendar.config[demonnic.calendar.config.location]()
  demonnic.calendar.container = Geyser.Container:new(myLocation)
  demonnic.calendar.container:setFontSize(myFontSize)
  demonnic.calendar.calendar = Geyser.MiniConsole:new({
    x = 0,
    y = 0,
    height = &quot;7c&quot;,
    width = &quot;20c&quot;,
    fontSize = myFontSize,
    name = &quot;demonnic.calendar&quot;,
  }, demonnic.calendar.container)
  demonnic.calendar.calendar:setFontSize(myFontSize)
  demonnic.calendar.calendar:setColor(0,0,0)
  if demonnic.calendar.config.herbs then 
    demonnic.calendar.herbWindow = Geyser.MiniConsole:new({
      x = 0,
      y = &quot;7c&quot;,
      height = &quot;7c&quot;,
      width = &quot;50c&quot;,
      fontSize = myFontSize,
      name = &quot;demonnic.herbCalendar&quot;,
    }, demonnic.calendar.container)
    demonnic.calendar.herbWindow:setFontSize(myFontSize)
    demonnic.calendar.herbWindow:setColor(0,0,0)
  end
end

--And a function to actually print the calendar to the miniconsole
--

function demonnic.calendar:print()
  demonnic.calendar.calendar:clear()
  local header = string.format(&quot;%s %s&quot;, demonnic.calendar.date.month, demonnic.calendar.date.year)
  local pad = math.floor((20 - string.len(header)) / 2)
  header = string.format(&quot;&lt;%s&gt;%s&quot;, demonnic.calendar.config.activeColor, header)
  pad = string.rep(&quot; &quot;, pad)
  header = string.format(&quot;%s&lt;%s&gt;%s\n&quot;, pad, demonnic.calendar.config.activeColor, header)
  pad = math.floor((20 - string.len(demonnic.calendar.date.moonphase)) / 2)
  pad = string.rep(&quot; &quot;, pad)
  local moonphase = string.format(&quot;%s&lt;%s&gt;%s\n&quot;, pad, demonnic.calendar.config.activeColor, demonnic.calendar.date.moonphase)
  demonnic.calendar.calendar:cecho(string.format(&quot;%s%s%s&quot;, header, moonphase, demonnic.calendar.display[demonnic.calendar.date.day]))

  if demonnic.calendar.config.herbs then
    demonnic.calendar.herbWindow:clear()
    local active = demonnic.calendar.config.activeColor
    local inactive = demonnic.calendar.config.inactiveColor
    local month = demonnic.calendar.date.month
    local replant = string.format(&quot;&lt;%s&gt;Herbs to replant : &lt;%s&gt;%s&quot;, active, inactive, demonnic.calendar.herbs.replant[month])
    local hibernate = string.format(&quot;&lt;%s&gt;Herbs Hibernating: &lt;%s&gt;%s\n&quot;, active, inactive, demonnic.calendar.herbs.hibernating[month])
    local flourish = string.format(&quot;&lt;%s&gt;Herbs Flourishing: &lt;%s&gt;%s\n&quot;, active, inactive, demonnic.calendar.herbs.flourishing[month])
    demonnic.calendar.herbWindow:cecho(string.format(&quot;%s%s%s&quot;, flourish, hibernate, replant))
  end
end
</script>
                    <eventHandlerList/>
                </Script>
                <Script isActive="yes" isFolder="no">
                    <name>demonnicCalInit</name>
                    <packageName></packageName>
                    <script>function demonnicCalInit()
  if demonnic.calendar.config.use then demonnic.calendar:create() end
end</script>
                    <eventHandlerList>
                        <string>sysLoadEvent</string>
                    </eventHandlerList>
                </Script>
            </ScriptGroup>
            <ScriptGroup isActive="yes" isFolder="yes">
                <name>Influencer</name>
                <packageName></packageName>
                <script>--Don't change this stuff. Really. 

demonnic.influencer = demonnic.influencer or {}
demonnic.influencer.targetList = demonnic.influencer.targetList or {}
demonnic.influencer.types = {
  &quot;beg&quot;,
  &quot;paranoia&quot;,
  &quot;weaken&quot;,
  &quot;empower&quot;,
  &quot;seduce&quot;,
}
demonnic.influencer.beg = demonnic.influencer.begging or {}
demonnic.influencer.paranoia = demonnic.influencer.paranoia or {}
demonnic.influencer.weaken = demonnic.influencer.weaken or {}
demonnic.influencer.empower = demonnic.influencer.empower or {}
demonnic.influencer.seduce = demonnic.influencer.seduce or {}
</script>
                <eventHandlerList/>
                <ScriptGroup isActive="yes" isFolder="yes">
                    <name>Events</name>
                    <packageName></packageName>
                    <script></script>
                    <eventHandlerList/>
                    <Script isActive="yes" isFolder="no">
                        <name>demonnicKnowInf</name>
                        <packageName></packageName>
                        <script>function demonnicKnowInf(event_name, skill)
  if skill == &quot;influence&quot; then demonnic.influencer:init() end
end</script>
                        <eventHandlerList>
                            <string>demonnicSkillFilled</string>
                        </eventHandlerList>
                    </Script>
                    <Script isActive="yes" isFolder="no">
                        <name>demonnic_infAdd</name>
                        <packageName></packageName>
                        <script>function demonnic_infAdd()
  local item = gmcp.Char.Items.Add.item
  if demonnic.influencer.massInfluence and (demonnic.influencer.mobtype == &quot;all&quot;or string.find(item.name:lower(), demonnic.influencer.mobtype:lower())) then
    table.insert(demonnic.influencer.targetList, item.id)
  end
end
</script>
                        <eventHandlerList>
                            <string>gmcp.Char.Items.Add</string>
                        </eventHandlerList>
                    </Script>
                    <Script isActive="yes" isFolder="no">
                        <name>demonnic_infLeave</name>
                        <packageName></packageName>
                        <script>function demonnic_infLeave()
  local remove = gmcp.Char.Items.Remove
  if remove.location == &quot;room&quot; then
    for i,id in ipairs(demonnic.influencer.targetList) do
      if tostring(remove.item) == id then
        table.remove(demonnic.influencer.targetList, i)
        return
      end
    end
  end
end</script>
                        <eventHandlerList>
                            <string>gmcp.Char.Items.Remove</string>
                        </eventHandlerList>
                    </Script>
                </ScriptGroup>
                <Script isActive="yes" isFolder="no">
                    <name>Configuration Options</name>
                    <packageName></packageName>
                    <script>demonnic.influencer.exceptions = {
  &quot;some iridescent spores&quot;,
  &quot;a sprite bound in shadows&quot;,
  &quot;a palm sigil&quot;,
  &quot;a mushroom circle&quot;,
  &quot;a sylph bound in shadows&quot;,
  &quot;a pixie bound in shadows&quot;,
  &quot;a brownie bound in shadows&quot;,
  &quot;a redcap&quot;,
  &quot;a wood nymph bound in shadows&quot;,
  &quot;a pigwidgeon bound in shadows&quot;,
  &quot;a banshee bound in shadows&quot;,
  &quot;a barghest&quot;,
  &quot;a slaugh&quot;,
  &quot;a willowisp bound in shadows&quot;,
  &quot;a pooka bound in shadows&quot;,
  &quot;a leprechaun bound in shadows&quot;,
}</script>
                    <eventHandlerList/>
                </Script>
                <Script isActive="yes" isFolder="no">
                    <name>Code</name>
                    <packageName></packageName>
                    <script>--function which is called after we get the information on the influence skill
--it will set up all the skills we know for influencing automagically
function demonnic.influencer:init()
  local topskill = #demonnic.skills.influence
  --Set the 'beg' influence list
  if topskill &gt;= 2 then table.insert(demonnic.influencer.beg, &quot;begging&quot;) end
  if topskill &gt;= 9 then table.insert(demonnic.influencer.beg, &quot;supplication&quot;) end
  if topskill &gt;= 19 then table.insert(demonnic.influencer.beg, &quot;wheedling&quot;) end
  --Set the 'paranoia' influence list
  if topskill &gt;= 4 then table.insert(demonnic.influencer.paranoia, &quot;rumours&quot;) end
  if topskill &gt;= 10 then table.insert(demonnic.influencer.paranoia, &quot;distrust&quot;) end
  if topskill &gt;= 20 then table.insert(demonnic.influencer.paranoia, &quot;conspiracies&quot;) end
  --Set the 'weaken' influence list
  if topskill &gt;= 5 then table.insert(demonnic.influencer.weaken, &quot;teasing&quot;) end
  if topskill &gt;= 12 then table.insert(demonnic.influencer.weaken, &quot;mockery&quot;) end
  if topskill &gt;= 22 then table.insert(demonnic.influencer.weaken, &quot;derision&quot;) end
  --Set the 'empower' influence list
  if topskill &gt;= 6 then table.insert(demonnic.influencer.empower, &quot;compliments&quot;) end
  if topskill &gt;= 13 then table.insert(demonnic.influencer.empower, &quot;admiration&quot;) end
  if topskill &gt;= 23 then table.insert(demonnic.influencer.empower, &quot;praise&quot;) end
  --Set the 'seduce' influence list
  if topskill &gt;= 8 then table.insert(demonnic.influencer.seduce, &quot;flattery&quot;) end
  if topskill &gt;= 15 then table.insert(demonnic.influencer.seduce, &quot;charm&quot;) end
  if topskill &gt;= 24 then table.insert(demonnic.influencer.seduce, &quot;beguiling&quot;) end
end


--this function gets run when an influence is complete. Either we win, or they
--won't let us influence them, or they aren't there, or...
function demonnic.influencer:complete()
  if demonnic.influencer.massInfluence and #demonnic.influencer.targetList &gt; 0 then 
    demonnic:printDebug(&quot;influencer&quot;, &quot;we're mass influencing, and there are more targets&quot;)
    demonnic.influencer.target = table.remove(demonnic.influencer.targetList,1)
    demonnic:printDebug(&quot;influencer&quot;, &quot;Next target is &quot; .. demonnic.influencer.target)
  else
    demonnic:printDebug(&quot;influencer&quot;, &quot;alright, nothing left to influence&quot;)
    demonnic.influencer.actionCancelled = true
    demonnic.influencer.massInfluence = false
    demonnic.influencer.target = &quot;&quot;
  end
end


--this function actually sets up the next influence. 
function demonnic.influencer:continue()
  demonnic:printDebug(&quot;influencer&quot;, &quot;Time to influence again&quot;)
  if demonnic.influencer.target == nil then 
    demonnic:printDebug(&quot;influencer&quot;, &quot;No target to influence. Time to stop influencing&quot;) 
    return 
  end
  demonnic:printDebug(&quot;influencer&quot;, &quot;We have a target, it is &quot; .. demonnic.influencer.target)
  if demonnic.influencer.actionCancelled == false then
    demonnic:printDebug(&quot;influencer&quot;, &quot;The action has not been canceled&quot;)
	if demonnic.curEgo &lt;= (demonnic.maxEgo * 0.25) then
	  demonnic:printDebug(&quot;influencer&quot;, &quot;Time to run, less than a quarter ego remaining&quot;)
	  demonnic:echo(&quot;FLEEING&quot;)
	  send(demonnic.influencer.exit)
	else
	  demonnic:printDebug(&quot;influencer&quot;, &quot;No need to flee.&quot;)
      if demonnic.influencer.actionNext &gt; #demonnic.influencer.actionList then
        demonnic:printDebug(&quot;influencer&quot;, &quot;Ok, our next action is greater than the number of actions, time to go back to 1&quot;)
		 demonnic.influencer.actionNext = 1
	  end
      demonnic.influencer.action = &quot;INFLUENCE &quot;..demonnic.influencer.target..&quot; WITH &quot;..demonnic.influencer.actionList[demonnic.influencer.actionNext]
      send(demonnic.influencer.action)
      demonnic.influencer.actionNext = demonnic.influencer.actionNext + 1
      demonnic.chaser:add([[demonnic.influencer:continue()]], {consumesBal = false})
	end
  end
end

</script>
                    <eventHandlerList/>
                </Script>
            </ScriptGroup>
            <ScriptGroup isActive="yes" isFolder="yes">
                <name>Harvester</name>
                <packageName></packageName>
                <script></script>
                <eventHandlerList/>
                <Script isActive="yes" isFolder="no">
                    <name>Code</name>
                    <packageName></packageName>
                    <script>demonnic.harvester = demonnic.harvester or {}
demonnic.harvester.hibernating = {arnica = &quot;Klangiary&quot;,
                        calamus = &quot;Dioni&quot;,
                        chervil = &quot;Roarkian&quot;,
                        colewort = &quot;Kiani&quot;,
                        coltsfoot = &quot;Juliary&quot;,
                        earwort = &quot;Dioni&quot;,
                        faeleaf = &quot;Juliary&quot;,
                        flax = &quot;Estar&quot;,
                        galingale = &quot;Shanthin&quot;,
                        horehound = &quot;Vestian&quot;,
                        juniper = &quot;Dioni&quot;,
                        kafe = &quot;Urlachmar&quot;,
                        kombu = &quot;Dioni&quot;,
                        marjoram = &quot;Shanthin&quot;,
                        merbloom = &quot;Estar&quot;,
                        mistletoe = &quot;Avechary&quot;,
                        myrtle = &quot;Estar&quot;,
                        pennyroyal = &quot;Klangiary&quot;,
                        reishi = &quot;Tzarin&quot;,
                        rosehips = &quot;Shanthin&quot;,
                        sage = &quot;Dioni&quot;,
                        sargassum = &quot;Tzarin&quot;,
                        sparkleberry = &quot;Dvarsh&quot;,
                        weed = &quot;Estar&quot;,
                        wormwood = &quot;Vestian&quot;,
                        yarrow = &quot;Roarkian&quot;}
demonnic.calendar.date = demonnic.calendar.date or {month = &quot;Klangiary&quot;, day = &quot;1&quot;, year = &quot;255&quot;}
if demonnic.harvester.harvesting == nil then demonnic.harvester.harvesting = false end

function demonnic.harvester:harvest(type, amount)
  if demonnic.harvester.harvesting then 
    demonnic:printDebug(&quot;harvester&quot;, &quot;Ok, we are in fact attempting to harvest&quot;)
    if demonnic.calendar.date.month == demonnic.harvester.hibernating[type] then 
      amount = amount - 10
    else
      amount = amount - 5
    end
    if amount &gt; 1 then
      for i=1,amount do
	demonnic:printDebug(&quot;harvester&quot;, &quot;Type:amountleft &quot; .. type .. &quot;:&quot; .. amount - i)
        demonnic.chaser:add([[send(&quot;harvest ]] .. type .. [[&quot;)]], {consumesEq = false})
      end
      demonnic.chaser:add([[send(&quot;inr all spices&quot;);send(&quot;inr all ]] .. type .. [[&quot;);tempTimer(1, function() send(&quot;\n&quot;) end)]], {consumesEq = false})
      demonnic:echo(&quot;Harvesting &quot; .. amount .. &quot; &quot; .. type .. &quot;&quot;)
    elseif amount == 1 then
      demonnic.chaser:add([[send(&quot;harvest ]] .. type .. [[&quot;)]], {consumesEq = false})
      demonnic.chaser:add([[send(&quot;inr all spices&quot;);send(&quot;inr all ]] .. type .. [[&quot;);tempTimer(1, function() send(&quot;\n&quot;) end)]], {consumesEq = false})
      demonnic:echo(&quot;Only 1  &quot; .. type .. &quot; to get&quot;)
    else
      demonnic:echo(&quot;Sorry, not enough &quot; .. type .. &quot; to harvest any&quot;)
    end
  else 
    demonnic:printDebug(&quot;harvester&quot;,&quot;It does not think we are harvesting&quot;)
  end
end


</script>
                    <eventHandlerList/>
                </Script>
            </ScriptGroup>
        </ScriptGroup>
    </ScriptPackage>
    <TriggerPackage>
        <TriggerGroup isActive="yes" isFolder="yes" isTempTrigger="no" isMultiline="no" isPerlSlashGOption="no" isColorizerTrigger="no" isFilterTrigger="no" isSoundTrigger="no" isColorTrigger="no" isColorTriggerFg="no" isColorTriggerBg="no">
            <name>Demonnic</name>
            <script></script>
            <triggerType>0</triggerType>
            <conditonLineDelta>39</conditonLineDelta>
            <mStayOpen>0</mStayOpen>
            <mCommand></mCommand>
            <packageName></packageName>
            <mFgColor>#ff0000</mFgColor>
            <mBgColor>#ffff00</mBgColor>
            <mSoundFile></mSoundFile>
            <colorTriggerFgColor>#000000</colorTriggerFgColor>
            <colorTriggerBgColor>#000000</colorTriggerBgColor>
            <regexCodeList/>
            <regexCodePropertyList/>
            <TriggerGroup isActive="yes" isFolder="yes" isTempTrigger="no" isMultiline="no" isPerlSlashGOption="no" isColorizerTrigger="no" isFilterTrigger="no" isSoundTrigger="no" isColorTrigger="no" isColorTriggerFg="no" isColorTriggerBg="no">
                <name>Shared</name>
                <script></script>
                <triggerType>0</triggerType>
                <conditonLineDelta>0</conditonLineDelta>
                <mStayOpen>0</mStayOpen>
                <mCommand></mCommand>
                <packageName></packageName>
                <mFgColor>#ff0000</mFgColor>
                <mBgColor>#ffff00</mBgColor>
                <mSoundFile></mSoundFile>
                <colorTriggerFgColor>#000000</colorTriggerFgColor>
                <colorTriggerBgColor>#000000</colorTriggerBgColor>
                <regexCodeList/>
                <regexCodePropertyList/>
                <TriggerGroup isActive="yes" isFolder="yes" isTempTrigger="no" isMultiline="no" isPerlSlashGOption="no" isColorizerTrigger="no" isFilterTrigger="no" isSoundTrigger="no" isColorTrigger="yes" isColorTriggerFg="yes" isColorTriggerBg="yes">
                    <name>demonnicPrompt</name>
                    <script></script>
                    <triggerType>0</triggerType>
                    <conditonLineDelta>39</conditonLineDelta>
                    <mStayOpen>0</mStayOpen>
                    <mCommand></mCommand>
                    <packageName></packageName>
                    <mFgColor>#ff0000</mFgColor>
                    <mBgColor>#ffff00</mBgColor>
                    <mSoundFile></mSoundFile>
                    <colorTriggerFgColor>#ffff00</colorTriggerFgColor>
                    <colorTriggerBgColor>#000000</colorTriggerBgColor>
                    <regexCodeList>
                        <string>^(\d+)h, (\d+)m, (\d+)e, (\d+)p(, (\d+)en)?(, (\d+)w)?(, (\d+)mo)? ([esSilrxkbdp]*)(\&lt;\&gt;)?-$</string>
                    </regexCodeList>
                    <regexCodePropertyList>
                        <integer>1</integer>
                    </regexCodePropertyList>
                    <Trigger isActive="yes" isFolder="no" isTempTrigger="no" isMultiline="no" isPerlSlashGOption="no" isColorizerTrigger="no" isFilterTrigger="yes" isSoundTrigger="no" isColorTrigger="no" isColorTriggerFg="no" isColorTriggerBg="no">
                        <name>Prompt Flags</name>
                        <script>demonnic.chaser.balances.equilibrium = 0
demonnic.chaser.balances.balance = 0
</script>
                        <triggerType>0</triggerType>
                        <conditonLineDelta>99</conditonLineDelta>
                        <mStayOpen>0</mStayOpen>
                        <mCommand></mCommand>
                        <packageName></packageName>
                        <mFgColor>#ff0000</mFgColor>
                        <mBgColor>#ffff00</mBgColor>
                        <mSoundFile></mSoundFile>
                        <colorTriggerFgColor>#000000</colorTriggerFgColor>
                        <colorTriggerBgColor>#000000</colorTriggerBgColor>
                        <regexCodeList>
                            <string>\d+h, \d+m.* (.*)-</string>
                        </regexCodeList>
                        <regexCodePropertyList>
                            <integer>1</integer>
                        </regexCodePropertyList>
                        <Trigger isActive="yes" isFolder="no" isTempTrigger="no" isMultiline="no" isPerlSlashGOption="no" isColorizerTrigger="no" isFilterTrigger="no" isSoundTrigger="no" isColorTrigger="no" isColorTriggerFg="no" isColorTriggerBg="no">
                            <name>Equilibrium</name>
                            <script>demonnic.chaser.balances.equilibrium = 1
</script>
                            <triggerType>0</triggerType>
                            <conditonLineDelta>39</conditonLineDelta>
                            <mStayOpen>0</mStayOpen>
                            <mCommand></mCommand>
                            <packageName></packageName>
                            <mFgColor>#ff0000</mFgColor>
                            <mBgColor>#ffff00</mBgColor>
                            <mSoundFile></mSoundFile>
                            <colorTriggerFgColor>#000000</colorTriggerFgColor>
                            <colorTriggerBgColor>#000000</colorTriggerBgColor>
                            <regexCodeList>
                                <string>e</string>
                            </regexCodeList>
                            <regexCodePropertyList>
                                <integer>0</integer>
                            </regexCodePropertyList>
                        </Trigger>
                        <Trigger isActive="yes" isFolder="no" isTempTrigger="no" isMultiline="no" isPerlSlashGOption="no" isColorizerTrigger="no" isFilterTrigger="no" isSoundTrigger="no" isColorTrigger="no" isColorTriggerFg="no" isColorTriggerBg="no">
                            <name>Balance</name>
                            <script>demonnic.chaser.balances.balance = 1
</script>
                            <triggerType>0</triggerType>
                            <conditonLineDelta>0</conditonLineDelta>
                            <mStayOpen>0</mStayOpen>
                            <mCommand></mCommand>
                            <packageName></packageName>
                            <mFgColor>#ff0000</mFgColor>
                            <mBgColor>#ffff00</mBgColor>
                            <mSoundFile></mSoundFile>
                            <colorTriggerFgColor>#000000</colorTriggerFgColor>
                            <colorTriggerBgColor>#000000</colorTriggerBgColor>
                            <regexCodeList>
                                <string>x</string>
                            </regexCodeList>
                            <regexCodePropertyList>
                                <integer>0</integer>
                            </regexCodePropertyList>
                        </Trigger>
                        <Trigger isActive="yes" isFolder="no" isTempTrigger="no" isMultiline="no" isPerlSlashGOption="no" isColorizerTrigger="no" isFilterTrigger="no" isSoundTrigger="no" isColorTrigger="no" isColorTriggerFg="no" isColorTriggerBg="no">
                            <name>process</name>
                            <script>demonnic.chaser:doChase()
</script>
                            <triggerType>0</triggerType>
                            <conditonLineDelta>0</conditonLineDelta>
                            <mStayOpen>0</mStayOpen>
                            <mCommand></mCommand>
                            <packageName></packageName>
                            <mFgColor>#ff0000</mFgColor>
                            <mBgColor>#ffff00</mBgColor>
                            <mSoundFile></mSoundFile>
                            <colorTriggerFgColor>#000000</colorTriggerFgColor>
                            <colorTriggerBgColor>#000000</colorTriggerBgColor>
                            <regexCodeList>
                                <string>return true</string>
                            </regexCodeList>
                            <regexCodePropertyList>
                                <integer>4</integer>
                            </regexCodePropertyList>
                        </Trigger>
                    </Trigger>
                </TriggerGroup>
                <Trigger isActive="yes" isFolder="no" isTempTrigger="no" isMultiline="no" isPerlSlashGOption="no" isColorizerTrigger="no" isFilterTrigger="no" isSoundTrigger="no" isColorTrigger="no" isColorTriggerFg="no" isColorTriggerBg="no">
                    <name>Logged in!</name>
                    <script>send(&quot;date&quot;)</script>
                    <triggerType>0</triggerType>
                    <conditonLineDelta>0</conditonLineDelta>
                    <mStayOpen>0</mStayOpen>
                    <mCommand></mCommand>
                    <packageName></packageName>
                    <mFgColor>#ff0000</mFgColor>
                    <mBgColor>#ffff00</mBgColor>
                    <mSoundFile></mSoundFile>
                    <colorTriggerFgColor>#000000</colorTriggerFgColor>
                    <colorTriggerBgColor>#000000</colorTriggerBgColor>
                    <regexCodeList>
                        <string>Your last login was from</string>
                    </regexCodeList>
                    <regexCodePropertyList>
                        <integer>2</integer>
                    </regexCodePropertyList>
                </Trigger>
                <Trigger isActive="yes" isFolder="no" isTempTrigger="no" isMultiline="no" isPerlSlashGOption="no" isColorizerTrigger="no" isFilterTrigger="no" isSoundTrigger="no" isColorTrigger="no" isColorTriggerFg="no" isColorTriggerBg="no">
                    <name>demonnic_date gate</name>
                    <script>tempTimer(.3, function () demonnic.calendar:print() end)</script>
                    <triggerType>0</triggerType>
                    <conditonLineDelta>99</conditonLineDelta>
                    <mStayOpen>0</mStayOpen>
                    <mCommand></mCommand>
                    <packageName></packageName>
                    <mFgColor>#ff0000</mFgColor>
                    <mBgColor>#ffff00</mBgColor>
                    <mSoundFile></mSoundFile>
                    <colorTriggerFgColor>#000000</colorTriggerFgColor>
                    <colorTriggerBgColor>#000000</colorTriggerBgColor>
                    <regexCodeList>
                        <string>Today is the</string>
                        <string>It is now the</string>
                        <string>The phase of the moon is</string>
                        <string>In your world it is</string>
                    </regexCodeList>
                    <regexCodePropertyList>
                        <integer>2</integer>
                        <integer>2</integer>
                        <integer>0</integer>
                        <integer>2</integer>
                    </regexCodePropertyList>
                    <Trigger isActive="yes" isFolder="no" isTempTrigger="no" isMultiline="no" isPerlSlashGOption="no" isColorizerTrigger="no" isFilterTrigger="no" isSoundTrigger="no" isColorTrigger="no" isColorTriggerFg="no" isColorTriggerBg="no">
                        <name>capture date</name>
                        <script>demonnic.calendar.date.day = tonumber(matches[2])
demonnic.calendar.date.month = matches[3]
demonnic.calendar.date.year = tonumber(matches[4])
demonnic.calendar.date.moonphase = matches[5]
deleteLine()</script>
                        <triggerType>0</triggerType>
                        <conditonLineDelta>0</conditonLineDelta>
                        <mStayOpen>0</mStayOpen>
                        <mCommand></mCommand>
                        <packageName></packageName>
                        <mFgColor>#ff0000</mFgColor>
                        <mBgColor>#ffff00</mBgColor>
                        <mSoundFile></mSoundFile>
                        <colorTriggerFgColor>#000000</colorTriggerFgColor>
                        <colorTriggerBgColor>#000000</colorTriggerBgColor>
                        <regexCodeList>
                            <string>^Today is the (\d+)\w+ of (\w+), (\d+) years after the Coming of Estarra. The phase of the moon is the (\w+\s*\w*)\.$</string>
                        </regexCodeList>
                        <regexCodePropertyList>
                            <integer>1</integer>
                        </regexCodePropertyList>
                    </Trigger>
                    <Trigger isActive="yes" isFolder="no" isTempTrigger="no" isMultiline="no" isPerlSlashGOption="no" isColorizerTrigger="no" isFilterTrigger="no" isSoundTrigger="no" isColorTrigger="no" isColorTriggerFg="no" isColorTriggerBg="no">
                        <name>date change</name>
                        <script>demonnic.calendar.date.day = tonumber(matches[2])
demonnic.calendar.date.month = matches[3]
demonnic.calendar.date.year = tonumber(matches[4])
deleteLine()</script>
                        <triggerType>0</triggerType>
                        <conditonLineDelta>0</conditonLineDelta>
                        <mStayOpen>0</mStayOpen>
                        <mCommand></mCommand>
                        <packageName></packageName>
                        <mFgColor>#ff0000</mFgColor>
                        <mBgColor>#ffff00</mBgColor>
                        <mSoundFile></mSoundFile>
                        <colorTriggerFgColor>#000000</colorTriggerFgColor>
                        <colorTriggerBgColor>#000000</colorTriggerBgColor>
                        <regexCodeList>
                            <string>It is now the (\d+)\w+ of (\w+), (\d+) years after the Coming of Estarra.</string>
                        </regexCodeList>
                        <regexCodePropertyList>
                            <integer>1</integer>
                        </regexCodePropertyList>
                    </Trigger>
                    <Trigger isActive="yes" isFolder="no" isTempTrigger="no" isMultiline="no" isPerlSlashGOption="no" isColorizerTrigger="no" isFilterTrigger="no" isSoundTrigger="no" isColorTrigger="no" isColorTriggerFg="no" isColorTriggerBg="no">
                        <name>moon phase</name>
                        <script>demonnic.calendar.date.moonphase = matches[2]
deleteLine()</script>
                        <triggerType>0</triggerType>
                        <conditonLineDelta>99</conditonLineDelta>
                        <mStayOpen>0</mStayOpen>
                        <mCommand></mCommand>
                        <packageName></packageName>
                        <mFgColor>#ff0000</mFgColor>
                        <mBgColor>#ffff00</mBgColor>
                        <mSoundFile></mSoundFile>
                        <colorTriggerFgColor>#000000</colorTriggerFgColor>
                        <colorTriggerBgColor>#000000</colorTriggerBgColor>
                        <regexCodeList>
                            <string>^The phase of the moon is that of the (\w+\s*\w*)\.$</string>
                        </regexCodeList>
                        <regexCodePropertyList>
                            <integer>1</integer>
                        </regexCodePropertyList>
                    </Trigger>
                    <Trigger isActive="yes" isFolder="no" isTempTrigger="no" isMultiline="no" isPerlSlashGOption="no" isColorizerTrigger="no" isFilterTrigger="no" isSoundTrigger="no" isColorTrigger="no" isColorTriggerFg="no" isColorTriggerBg="no">
                        <name>My own date/time... which I don't care about</name>
                        <script>deleteLine()</script>
                        <triggerType>0</triggerType>
                        <conditonLineDelta>99</conditonLineDelta>
                        <mStayOpen>0</mStayOpen>
                        <mCommand></mCommand>
                        <packageName></packageName>
                        <mFgColor>#ff0000</mFgColor>
                        <mBgColor>#ffff00</mBgColor>
                        <mSoundFile></mSoundFile>
                        <colorTriggerFgColor>#000000</colorTriggerFgColor>
                        <colorTriggerBgColor>#000000</colorTriggerBgColor>
                        <regexCodeList>
                            <string>In your world it is</string>
                        </regexCodeList>
                        <regexCodePropertyList>
                            <integer>2</integer>
                        </regexCodePropertyList>
                    </Trigger>
                </Trigger>
            </TriggerGroup>
            <TriggerGroup isActive="yes" isFolder="yes" isTempTrigger="no" isMultiline="no" isPerlSlashGOption="no" isColorizerTrigger="no" isFilterTrigger="no" isSoundTrigger="no" isColorTrigger="no" isColorTriggerFg="no" isColorTriggerBg="no">
                <name>Tabbed Chat</name>
                <script></script>
                <triggerType>0</triggerType>
                <conditonLineDelta>0</conditonLineDelta>
                <mStayOpen>0</mStayOpen>
                <mCommand></mCommand>
                <packageName></packageName>
                <mFgColor>#ff0000</mFgColor>
                <mBgColor>#ffff00</mBgColor>
                <mSoundFile></mSoundFile>
                <colorTriggerFgColor>#000000</colorTriggerFgColor>
                <colorTriggerBgColor>#000000</colorTriggerBgColor>
                <regexCodeList/>
                <regexCodePropertyList/>
                <Trigger isActive="yes" isFolder="no" isTempTrigger="no" isMultiline="no" isPerlSlashGOption="no" isColorizerTrigger="no" isFilterTrigger="no" isSoundTrigger="no" isColorTrigger="no" isColorTriggerFg="no" isColorTriggerBg="no">
                    <name>Org</name>
                    <script>demonnic.chat:append(&quot;Org&quot;)</script>
                    <triggerType>0</triggerType>
                    <conditonLineDelta>39</conditonLineDelta>
                    <mStayOpen>0</mStayOpen>
                    <mCommand></mCommand>
                    <packageName></packageName>
                    <mFgColor>#ff0000</mFgColor>
                    <mBgColor>#ffff00</mBgColor>
                    <mSoundFile></mSoundFile>
                    <colorTriggerFgColor>#000000</colorTriggerFgColor>
                    <colorTriggerBgColor>#000000</colorTriggerBgColor>
                    <regexCodeList>
                        <string>(Glomdoring):</string>
                    </regexCodeList>
                    <regexCodePropertyList>
                        <integer>2</integer>
                    </regexCodePropertyList>
                </Trigger>
            </TriggerGroup>
            <TriggerGroup isActive="yes" isFolder="yes" isTempTrigger="no" isMultiline="no" isPerlSlashGOption="no" isColorizerTrigger="no" isFilterTrigger="no" isSoundTrigger="no" isColorTrigger="no" isColorTriggerFg="no" isColorTriggerBg="no">
                <name>Influencer</name>
                <script></script>
                <triggerType>0</triggerType>
                <conditonLineDelta>40</conditonLineDelta>
                <mStayOpen>0</mStayOpen>
                <mCommand></mCommand>
                <packageName></packageName>
                <mFgColor>#ff0000</mFgColor>
                <mBgColor>#ffff00</mBgColor>
                <mSoundFile></mSoundFile>
                <colorTriggerFgColor>#000000</colorTriggerFgColor>
                <colorTriggerBgColor>#000000</colorTriggerBgColor>
                <regexCodeList/>
                <regexCodePropertyList/>
                <Trigger isActive="yes" isFolder="no" isTempTrigger="no" isMultiline="no" isPerlSlashGOption="no" isColorizerTrigger="no" isFilterTrigger="no" isSoundTrigger="no" isColorTrigger="no" isColorTriggerFg="no" isColorTriggerBg="no">
                    <name>cannot influence</name>
                    <script>demonnic.influencer:complete()
</script>
                    <triggerType>0</triggerType>
                    <conditonLineDelta>99</conditonLineDelta>
                    <mStayOpen>0</mStayOpen>
                    <mCommand></mCommand>
                    <packageName></packageName>
                    <mFgColor>#ff0000</mFgColor>
                    <mBgColor>#ffff00</mBgColor>
                    <mSoundFile></mSoundFile>
                    <colorTriggerFgColor>#000000</colorTriggerFgColor>
                    <colorTriggerBgColor>#000000</colorTriggerBgColor>
                    <regexCodeList>
                        <string>^.* is so caught up in admiring .* that .* barely notices you\.$</string>
                        <string>^Apparently not hearing anything you said, (.*) grabs you by the shoulders and demands to know if you are one of 'them'\.$</string>
                        <string>^.* keeps asking .* why .* considered giving so much away, and pays you no attention\.$</string>
                        <string>^.* smiles at you condescendingly and pats your head\.$</string>
                        <string>^(.*) brushes you off, apparently too tired to engage you in any meaningful dialogue\.$</string>
                        <string>\w+ keeps thumping himself on the head, not hearing a word you say</string>
                        <string>\w+ laughs uproariously at your amusing stories.</string>
                        <string>\w+ brushes you off, apparently too tired to engage you in any meaningful dialogue</string>
                        <string>^.* doesn't even seem to notice your actions, as \w+ is lost daydreaming a future living with you\.$</string>
                        <string>.* doesn't even seem to notice you, as \w+ is lost thinking of \w+ friendship with you</string>
                    </regexCodeList>
                    <regexCodePropertyList>
                        <integer>1</integer>
                        <integer>1</integer>
                        <integer>1</integer>
                        <integer>1</integer>
                        <integer>1</integer>
                        <integer>1</integer>
                        <integer>1</integer>
                        <integer>1</integer>
                        <integer>1</integer>
                        <integer>1</integer>
                    </regexCodePropertyList>
                </Trigger>
                <Trigger isActive="yes" isFolder="no" isTempTrigger="no" isMultiline="no" isPerlSlashGOption="no" isColorizerTrigger="no" isFilterTrigger="no" isSoundTrigger="no" isColorTrigger="no" isColorTriggerFg="no" isColorTriggerBg="no">
                    <name>influenced successfully!</name>
                    <script>demonnic.influencer:complete()</script>
                    <triggerType>0</triggerType>
                    <conditonLineDelta>99</conditonLineDelta>
                    <mStayOpen>0</mStayOpen>
                    <mCommand></mCommand>
                    <packageName></packageName>
                    <mFgColor>#ff0000</mFgColor>
                    <mBgColor>#ffff00</mBgColor>
                    <mSoundFile></mSoundFile>
                    <colorTriggerFgColor>#000000</colorTriggerFgColor>
                    <colorTriggerBgColor>#000000</colorTriggerBgColor>
                    <regexCodeList>
                        <string>^(.*) sighs dramatically and searches (.*?) pockets</string>
                        <string>^(.*) breaks down and sobs, telling you how true it is that (.*?) is nothing but a pathetic fraud.</string>
                        <string>^(.*) puffs up (.*) chest and a crazy gleam enters (.*) eyes as (.*) vigorously agrees with you that (.*) intelligence and strength far surpass anyone else's.$</string>
                        <string>^(.*) wildly looks around, (.*) left eye suddenly developing a nervous twitch, and asks you to keep a look out for 'them'.$</string>
                        <string>wraps an arm around you, declaring you to be the truest of friends</string>
                        <string>^.* drops down on \w+ knees and worships the very ground you walk on!$</string>
                    </regexCodeList>
                    <regexCodePropertyList>
                        <integer>1</integer>
                        <integer>1</integer>
                        <integer>1</integer>
                        <integer>1</integer>
                        <integer>0</integer>
                        <integer>1</integer>
                    </regexCodePropertyList>
                </Trigger>
                <Trigger isActive="yes" isFolder="no" isTempTrigger="no" isMultiline="no" isPerlSlashGOption="no" isColorizerTrigger="no" isFilterTrigger="no" isSoundTrigger="no" isColorTrigger="no" isColorTriggerFg="no" isColorTriggerBg="no">
                    <name>not in the room!</name>
                    <script>if not demonnic.influencer.actionCancelled then 
  demonnic.influencer:complete()
  demonnic.chaser:doChase()
end</script>
                    <triggerType>0</triggerType>
                    <conditonLineDelta>99</conditonLineDelta>
                    <mStayOpen>0</mStayOpen>
                    <mCommand></mCommand>
                    <packageName></packageName>
                    <mFgColor>#ff0000</mFgColor>
                    <mBgColor>#ffff00</mBgColor>
                    <mSoundFile></mSoundFile>
                    <colorTriggerFgColor>#000000</colorTriggerFgColor>
                    <colorTriggerBgColor>#000000</colorTriggerBgColor>
                    <regexCodeList>
                        <string>I do not recognize anything called that here.</string>
                        <string>Ahh, I am truly sorry, but I do not see anyone by that name here.</string>
                        <string>You cannot see that being here.</string>
                        <string>You detect nothing here by that name.</string>
                        <string>Nothing can be seen here by that name.</string>
                        <string>You cannot influence the inanimate!</string>
                        <string>You may only influence sentient beings.</string>
                        <string>You are unable to communicate with animals.</string>
                        <string>You have no influence with the undead.</string>
                        <string>You cannot influence a corpse!</string>
                    </regexCodeList>
                    <regexCodePropertyList>
                        <integer>3</integer>
                        <integer>3</integer>
                        <integer>3</integer>
                        <integer>3</integer>
                        <integer>3</integer>
                        <integer>3</integer>
                        <integer>3</integer>
                        <integer>3</integer>
                        <integer>3</integer>
                        <integer>3</integer>
                    </regexCodePropertyList>
                </Trigger>
            </TriggerGroup>
            <TriggerGroup isActive="yes" isFolder="yes" isTempTrigger="no" isMultiline="no" isPerlSlashGOption="no" isColorizerTrigger="no" isFilterTrigger="no" isSoundTrigger="no" isColorTrigger="no" isColorTriggerFg="no" isColorTriggerBg="no">
                <name>Harvesting</name>
                <script></script>
                <triggerType>0</triggerType>
                <conditonLineDelta>0</conditonLineDelta>
                <mStayOpen>0</mStayOpen>
                <mCommand></mCommand>
                <packageName></packageName>
                <mFgColor>#ff0000</mFgColor>
                <mBgColor>#ffff00</mBgColor>
                <mSoundFile></mSoundFile>
                <colorTriggerFgColor>#000000</colorTriggerFgColor>
                <colorTriggerBgColor>#000000</colorTriggerBgColor>
                <regexCodeList/>
                <regexCodePropertyList/>
                <Trigger isActive="yes" isFolder="no" isTempTrigger="no" isMultiline="yes" isPerlSlashGOption="no" isColorizerTrigger="no" isFilterTrigger="no" isSoundTrigger="no" isColorTrigger="yes" isColorTriggerFg="yes" isColorTriggerBg="yes">
                    <name>What to harvest?</name>
                    <script>tempTimer(2, [[demonnic.harvester.harvesting = false]])
</script>
                    <triggerType>0</triggerType>
                    <conditonLineDelta>2</conditonLineDelta>
                    <mStayOpen>5</mStayOpen>
                    <mCommand></mCommand>
                    <packageName></packageName>
                    <mFgColor>#ff0000</mFgColor>
                    <mBgColor>#ffff00</mBgColor>
                    <mSoundFile></mSoundFile>
                    <colorTriggerFgColor>#00b300</colorTriggerFgColor>
                    <colorTriggerBgColor>#000000</colorTriggerBgColor>
                    <regexCodeList>
                        <string>The following plants are growing in this room:</string>
                        <string>FG6BG2</string>
                    </regexCodeList>
                    <regexCodePropertyList>
                        <integer>3</integer>
                        <integer>6</integer>
                    </regexCodePropertyList>
                    <Trigger isActive="yes" isFolder="no" isTempTrigger="no" isMultiline="no" isPerlSlashGOption="no" isColorizerTrigger="no" isFilterTrigger="no" isSoundTrigger="no" isColorTrigger="no" isColorTriggerFg="no" isColorTriggerBg="no">
                        <name>pull out what to harvest</name>
                        <script>if demonnic.harvester.toHarvest ~= nil then
  if matches[2] ~= demonnic.harvester.toHarvest then
    return
  else
    demonnic.harvester:harvest(matches[2], tonumber(matches[3]))
  end
else
  demonnic.harvester:harvest(matches[2], tonumber(matches[3]))
end
</script>
                        <triggerType>0</triggerType>
                        <conditonLineDelta>39</conditonLineDelta>
                        <mStayOpen>0</mStayOpen>
                        <mCommand></mCommand>
                        <packageName></packageName>
                        <mFgColor>#ff0000</mFgColor>
                        <mBgColor>#ffff00</mBgColor>
                        <mSoundFile></mSoundFile>
                        <colorTriggerFgColor>#000000</colorTriggerFgColor>
                        <colorTriggerBgColor>#000000</colorTriggerBgColor>
                        <regexCodeList>
                            <string>^(?:.*) \((\w+)\)\s*(\d+) left\.$</string>
                        </regexCodeList>
                        <regexCodePropertyList>
                            <integer>1</integer>
                        </regexCodePropertyList>
                    </Trigger>
                </Trigger>
            </TriggerGroup>
        </TriggerGroup>
    </TriggerPackage>
</MudletPackage>
