|
- ;; coll utils
-
- (fn length-of [coll]
- (if coll
- (do
- (var c 0)
- (each [k (pairs coll)]
- (set c (+ c 1)))
- c)
- 0))
-
- (fn first [coll]
- (let [key (next coll)]
- (. coll key)))
-
- ;; str utils
-
- (fn starts-with [s patt]
- (= (string.sub s 1 (string.len patt)) patt))
-
- (fn un-quote [s]
- (string.gsub s "\'" ""))
-
- ;; lang utils
-
- (fn matches [a b]
- (if (starts-with a "lte:")
- (>= (tonumber (string.sub a 5)) (tonumber b))
-
- (starts-with a "gte:")
- (<= (tonumber (string.sub a 5)) (tonumber b))
-
- (= a b)))
-
- ;; querying
-
- (lambda find-items [params ?sort]
- (let [results (icollect [_ row (ipairs items)]
- (do
- (var hit true)
- (each [key param (pairs params)]
- (do
- (set hit (and hit (matches param (. row key))))))
- (if hit
- row)))]
- (if (and ?sort results)
- (do
- (table.sort results ?sort)
- results)
- results)))
-
- (lambda find-item [params ?sort]
- (let [results (find-items params ?sort)]
- (if results
- (first results))))
-
- ;; specialized querying
-
- (fn find-item-by-name [name]
- (find-item {8 name}))
-
- (fn find-next-better-item [class subclass invtype lv ilv stat-position item-stat ?sort]
- (find-items {4 class
- 6 subclass
- 10 invtype
- 14 (string.format "lte:%d" lv)
- 14 (string.format "gte:%d" (- lv 4))
- ;; 12 (string.format "gte:%d" ilv)
- stat-position (string.format "gte:%d" item-stat)}
- ?sort))
-
- (lambda find-good-item [invtype lv stat-position stat-baseline ?sort]
- (find-items {10 invtype
- 14 (string.format "lte:%d" lv)
- 14 (string.format "gte:%d" (- lv 6))
- stat-position (string.format "gte:%d" stat-baseline)}
- ?sort))
-
- ;; arg parsing
-
- (fn parse-opts [msg]
- (icollect [k v (string.gmatch msg "%w+")] v))
-
- ;; ui
-
- (fn ui-print [msg]
- (UIErrorsFrame:AddMessage msg))
-
- (fn stat-name [n]
- (let [stat-names ["Mana" "Health" "No Visible Effect"
- "Agility" "Strength" "Intellect"
- "Spirit" "Stamina" "No Visible Effect" "No Visible Effect"
-
- "No Visible Effect" "No Visible Effect*" "Defense Rating"
- "Dodge" "Parry Rating" "Shield Block Rating"
- "Melee Hit Rating" "Ranged Hit Rating" "Spell Hit Rating"
-
- "Melee Critical Strike" "Ranged Critical Strike" "Spell Critical Strike"
- "Melee Hit Avoidance" "Ranged Hit Avoidance" "Spell Hit Avoidance"
- "Melee Critical Avoidance" "Spell Critical Avoidance" "Melee Haste Rating"
-
- "Ranged Haste Rating" "Spell Haste Rating" "Hit Avoidance Rating"
- "Hit Rating" "Critical Strike" "Hit Avoidance Rating"
-
- "Critical Avoidance Rating" "Resilience" "Haste"
- "Expertise" "Attack Power" "Ranged Attack Power"
- "No Visible Effect" "Healing Done By Magical Spells and Effects up to value" "Damage Done By Magical Spells and Effects up to value"
-
- "Mana Regeneration (Ticks every 5 seconds)" "Armor Penetration Rating" "Spell Power"
- "Health Regeneration (Ticks every 5 seconds)" "Spell Penetration" "Block Value of Shield"
- "Mastery" "Armor" "Fire Resist"
-
- "Frost Resist" "Shadow Resist" "Nature Resist"
- "Arcane Resist"]]
- (.. (. stat-names (+ n 1)) " (" n ")")))
-
- (fn stat-print [item]
- (var val "")
- (for [n 22 56]
- (if (< 0 (. item n))
- (set val (.. val " " (stat-name (- n 21)) ": " (. item n)))))
- val)
-
- ;; main
-
- (global
- main
- (fn main [msg]
- (let [opts (icollect [v (string.gmatch msg "%w+")] v)
- [slot stat gear-index] opts
-
- slot (.. slot "Slot") ;; omit the need to type it out
- stat (+ 21 (tonumber stat)) ;; stats start after field 21, so agility (3) is 22+3, etc
- gear-index (tonumber (or gear-index "1"))
-
- inv-slot (GetInventorySlotInfo slot)
- i-link (GetInventoryItemLink "player" inv-slot)
-
- p-level (UnitLevel "player")]
-
- ;; (print (string.format "slot %s stat %s gear-index %s" slot stat gear-index))
-
- (if (not i-link)
- ;; empty
- (let [best (. (find-good-item inv-slot (UnitLevel "player") stat 0 (fn [a b] (< (. a 12) (. b 12)))) gear-index)]
- (if best
- (do
- (ui-print (.. "next best available: "
- (. best 8)
- " "
- (stat-print best)
- " at "
- (or (. best 20)) "N/A")))))
-
- ;; exists
- (let [i-name (GetItemInfo i-link)
- stats (find-item-by-name (un-quote i-name))]
-
- (if stats
- (let [i-class (. stats 4)
- i-subclass (. stats 6)
- i-invtype (. stats 10)
- i-level (. stats 12)
- i-stat (. stats stat)
- best (. (find-next-better-item i-class i-subclass i-invtype p-level i-level stat i-stat (fn [a b] (< (. a stat) (. b stat)))) gear-index)]
-
- (if best
- (do
- (ui-print (.. "next best available: "
- (. best 8)
- " "
- (stat-print best)
- " at "
- (or (. best 20)) "N/A"))
-
- (ui-print (.. "currently equipped " i-name " " (or (. stats stat) "N/A")))))))
- "ok")))))
-
- (fn maxxed []
- (let [slots ["AmmoSlot"
- "BackSlot"
- "Bag0Slot"
- "Bag1Slot"
- "Bag2Slot"
- "Bag3Slot"
- "ChestSlot"
- "FeetSlot"
- "Finger0Slot"
- "Finger1Slot"
- "HandsSlot"
- "HeadSlot"
- "LegsSlot"
- "MainHandSlot"
- "NeckSlot"
- "RangedSlot"
- "SecondaryHandSlot"
- "ShirtSlot"
- "ShoulderSlot"
- "TabardSlot"
- "Trinket0Slot"
- "Trinket1Slot"
- "WaistSlot"
- "WristSlot"]]
- slots))
|