annotate Turok/Modules/Utilities/PetBattle.lua @ 9:9400a0ff8540

Ugh Timer: - container update directionality - talent update iterates over a non-volatile table to carry out updates - index management steps organized - talentRow status implemented, returns the spell associated with the talent chosen from that row CombatLog: - sort out font controls and unbork arguments
author Nenue
date Sun, 21 Feb 2016 13:08:30 -0500
parents a9b8b0866ece
children
rev   line source
Nenue@6 1 --- ${PACKAGE_NAME}
Nenue@6 2 -- @file-author@
Nenue@6 3 -- @project-revision@ @project-hash@
Nenue@6 4 -- @file-revision@ @file-hash@
Nenue@6 5 -- Created: 1/17/2016 6:51 PM
Nenue@6 6
Nenue@6 7 local ADDON, Turok = ...
Nenue@6 8 local T, _G, pairs, pairs = Turok.Addon, _G, pairs, ipairs
Nenue@6 9 local mod = T:NewModule("PetBattle")
Nenue@9 10 local print = function(...)
Nenue@9 11 if not DEBUG then return end
Nenue@9 12 if _G.Devian and _G.DevianDB.workspace ~= 1 then
Nenue@9 13 _G.print('Petz', ...)
Nenue@9 14 end
Nenue@9 15 end
Nenue@6 16 local trace = function(self, e, ...)
Nenue@6 17 print(e, ...)
Nenue@6 18 end
Nenue@6 19
Nenue@6 20 local PBS
Nenue@6 21 local turn_font = [[Interface\Addons\Turok\Media\font\ArchivoNarrow-Bold.ttf]]
Nenue@6 22 local turn_size = 24
Nenue@6 23 local turn_outline = 'OUTLINE'
Nenue@6 24 local icon_size = 64
Nenue@6 25 local spacing = 5
Nenue@6 26 local padding = 0
Nenue@6 27 local strongweak_size = 20
Nenue@6 28
Nenue@6 29 local cpb = C_PetBattles
Nenue@6 30 T.defaults.petbattle = {
Nenue@6 31 swatch = {
Nenue@6 32 anchor = 'BOTTOM', anchorTo = 'BOTTOM',
Nenue@6 33 parent = 'UIParent',
Nenue@6 34 x = 0, y =240,
Nenue@6 35 width = 200, height = 100,
Nenue@6 36 font = [[Interface\Addons\Turok\Media\font\ArchivoNarrow-Bold.ttf]],
Nenue@6 37 size = 16,
Nenue@6 38 },
Nenue@6 39 spell = {
Nenue@6 40 anchor = 'TOPLEFT', anchorTo = 'TOPLEFT',
Nenue@6 41 size = 24,
Nenue@6 42 width = 72, height = 72,
Nenue@6 43 x = 0, y =0,
Nenue@6 44 padding = 0,
Nenue@6 45 spacing = 0,
Nenue@6 46 },
Nenue@6 47 sideSwatch = {
Nenue@6 48 width = 100, height = 50, padding = 0, spacing = 5,
Nenue@6 49 anchor = 'TOPLEFT', anchorTo = 'BOTTOMLEFT', x = 0, y = 0,
Nenue@6 50 parent = 'TkPetSwatch',
Nenue@6 51 },
Nenue@6 52 sideSpell = {
Nenue@6 53 anchor = 'TOPLEFT', anchorTo = 'TOPLEFT',
Nenue@6 54 size = 16,
Nenue@6 55 width = 36, height = 36,
Nenue@6 56 padding = 0,
Nenue@6 57 spacing = 0,
Nenue@6 58 },
Nenue@6 59 icon = {
Nenue@6 60 size = 72,
Nenue@6 61 width = 64,
Nenue@6 62 height = 64,
Nenue@6 63 }
Nenue@6 64 }
Nenue@6 65 mod.abilityButtons = {}
Nenue@6 66 mod.switcherButtons = {}
Nenue@6 67 mod.icons = {}
Nenue@6 68 mod.strongweak = {}
Nenue@6 69 mod.turns = {}
Nenue@6 70 mod.petlist = {}
Nenue@6 71 local PLAYER, ENEMY = 1, 2
Nenue@6 72 local function PBS_UpdateEnemySwatch(self)
Nenue@6 73
Nenue@6 74 print('UpdateSwatch')
Nenue@6 75 local db = TurokData.petbattle.swatch
Nenue@6 76 local playerActivePet = cpb.GetActivePet(PLAYER)
Nenue@6 77 local enemyActivePet = cpb.GetActivePet(ENEMY)
Nenue@6 78 local enemyNumPets = cpb.GetNumPets(ENEMY)
Nenue@6 79 local playerPetType = cpb.GetPetType(PLAYER, playerActivePet)
Nenue@6 80 local enemyPetType = cpb.GetPetType(ENEMY, enemyActivePet)
Nenue@6 81 local enemyPetName = cpb.GetName(ENEMY, playerActivePet)
Nenue@6 82 for petSlot=1, 3 do
Nenue@6 83 local swatchFrame = (petSlot == enemyActivePet) and self or ((petSlot < enemyNumPets) and self.sideSwatch or self.sideSwatch2)
Nenue@6 84 local db = (swatchFrame == self) and db.spell or db.sideSpell
Nenue@6 85 local type = cpb.GetPetType(ENEMY, petSlot)
Nenue@6 86 print(cText(' PetType='), enemyActivePet)
Nenue@6 87 print(cText(' current='), enemyPetType)
Nenue@6 88 for spellSlot=1, 3 do
Nenue@6 89 print(' ', cText('PetSlotOffset='), cNum(petSlot), cText('AbilitySlotOffset'), cNum(spellSlot))
Nenue@6 90 local id, name, texture, cooldown, desc, numTurns, attackType, noStrongWeakHints = cpb.GetAbilityInfo(ENEMY, petSlot, spellSlot)
Nenue@6 91 local usable, remaining = cpb.GetAbilityState(ENEMY, petSlot, spellSlot)
Nenue@6 92
Nenue@6 93 --print('info', cpb.GetAbilityInfo(ENEMY, petSlot, spellSlot))
Nenue@6 94 -- print('effect', cpb.GetAbilityEffectInfo(id, turnIdx, effectIdx, paramName)
Nenue@6 95 --print('state', cpb.GetAbilityState(ENEMY,petSlot,spellSlot))
Nenue@6 96 --print('statemod', cpb.GetAbilityStateModification(ENEMY,petSlot,spellSlot))
Nenue@6 97 --print('proc', cpb.GetAbilityProcTurnIndex(ENEMY,petSlot,spellSlot))
Nenue@6 98 --print('statemod', cpb.GetAbilityState(ENEMY,petSlot,spellSlot))
Nenue@6 99 local AbilityButton, icon, strong, turns -- Icon, Strength/Weakness, Turns cooldown
Nenue@6 100 if not swatchFrame.buttons[spellSlot] then
Nenue@6 101 swatchFrame.buttons[spellSlot] = CreateFrame('Frame', 'TkPetSpell'..spellSlot, swatchFrame, 'TkPetSpellTemplate')
Nenue@6 102 AbilityButton = swatchFrame.buttons[spellSlot]
Nenue@6 103
Nenue@6 104 AbilityButton:SetSize(db.width, db.height)
Nenue@6 105 AbilityButton:SetPoint(db.anchor, swatchFrame, db.anchor, (spellSlot-1)*(db.width+ db.spacing), 0)
Nenue@6 106
Nenue@6 107 AbilityButton.icon:SetSize(db.width, db.height)
Nenue@6 108 AbilityButton.icon:SetTexCoord(0.1, 0.9, 0.1, 0.9)
Nenue@6 109
Nenue@6 110 AbilityButton.strongWeakHint:SetSize(strongweak_size, strongweak_size)
Nenue@6 111 AbilityButton.strongWeakHint:SetPoint('CENTER', swatchFrame.buttons[spellSlot], 'CENTER', 0, 0)
Nenue@6 112
Nenue@6 113 AbilityButton.turnsLeft:SetFont(turn_font, turn_size, turn_outline)
Nenue@6 114 AbilityButton.turnsLeft:SetPoint('CENTER', icon, 'CENTER')
Nenue@6 115 else
Nenue@6 116 AbilityButton = swatchFrame.buttons[spellSlot]
Nenue@6 117 end
Nenue@6 118 local icon, strong , turns = AbilityButton.icon, AbilityButton.strongWeakHint, AbilityButton.turnsLeft
Nenue@6 119
Nenue@6 120 print('Working on:', swatchFrame, AbilityButton)
Nenue@6 121 print('AbilityState('..petSlot..', '..spellSlot..')', 'usable=', usable, 'turnsLeft=', remaining)
Nenue@6 122 print(cWord(name), cKey(attackType))
Nenue@6 123
Nenue@6 124 if petSlot > enemyNumPets then
Nenue@6 125 -- this will also eval true when pet battle over since numPets will be 0
Nenue@6 126 AbilityButton.popOut:Play()
Nenue@6 127 else
Nenue@6 128 local abilityChanged
Nenue@6 129 if id ~= AbilityButton.spellID then
Nenue@6 130 abilityChanged = true
Nenue@6 131 AbilityButton.spellID = id
Nenue@6 132 AbilityButton.spellName = name
Nenue@6 133 AbilityButton.spellDesc = desc
Nenue@6 134 AbilityButton.spellType = attackType
Nenue@6 135 AbilityButton.spellMaxCooldown = cooldown
Nenue@6 136 AbilityButton.spellDesc = desc
Nenue@6 137 AbilityButton.spellCooldown = remaining
Nenue@6 138 AbilityButton.spellNumTurns = numTurns
Nenue@6 139 end
Nenue@6 140 if AbilityButton.petType ~= enemyPetType then
Nenue@6 141 AbilityButton.petType = enemyPetType
Nenue@6 142 AbilityButton.noStrongWeakHints = noStrongWeakHints
Nenue@6 143 end
Nenue@6 144
Nenue@6 145 if not usable then
Nenue@6 146 icon:SetDesaturated(true)
Nenue@6 147 icon:SetVertexColor(0.5, 0.5, 0.5, 1)
Nenue@6 148 else
Nenue@6 149 icon:SetDesaturated(false)
Nenue@6 150 icon:SetVertexColor(1, 1, 1, 1)
Nenue@6 151 end
Nenue@6 152
Nenue@6 153 icon:SetTexture(texture)
Nenue@6 154 turns:SetText((cooldown > 0) and cooldown or nil)
Nenue@6 155 --AbilityButton.damage:SetText()
Nenue@6 156
Nenue@6 157 print('noStrongWeakHints', noStrongWeakHints)
Nenue@6 158 print('abilityModification', cpb.GetAttackModifier(enemyPetType, playerPetType))
Nenue@6 159 local modifier = cpb.GetAttackModifier(enemyPetType, playerPetType)
Nenue@6 160 if not noStrongWeakHints then
Nenue@6 161 if modifier < 1 then
Nenue@6 162 strong:SetTexture(0,1,0,0.5)
Nenue@6 163 else
Nenue@6 164 strong:SetTexture(1,0,0,0.5)
Nenue@6 165 end
Nenue@6 166
Nenue@6 167 strong:Show()
Nenue@6 168 else
Nenue@6 169 strong:Hide()
Nenue@6 170 end
Nenue@6 171 if numTurns then
Nenue@6 172 print('numTurns=',numTurns)
Nenue@6 173 end
Nenue@6 174 if not AbilityButton:IsVisible() or abilityChanged then
Nenue@6 175 AbilityButton:Show()
Nenue@6 176 AbilityButton.popIn:Play()
Nenue@6 177 end
Nenue@6 178
Nenue@6 179 end
Nenue@6 180
Nenue@6 181
Nenue@6 182 end
Nenue@6 183 swatchFrame:SetSize(db.width*3+db.spacing*2+db.padding*2, db.height+padding*2)
Nenue@6 184 swatchFrame.petName = enemyPetName
Nenue@6 185 swatchFrame.petType = enemyPetType
Nenue@6 186 local db = (swatchFrame == self) and db.swatch or db.sideSwatch
Nenue@6 187 swatchFrame:Show()
Nenue@6 188 end
Nenue@6 189 end
Nenue@6 190
Nenue@6 191 local function PBS_Switch ()
Nenue@6 192 print('Switch button was clicked.')
Nenue@6 193 end
Nenue@6 194 mod.PLAYER_ENTERING_WORLD = function(self, e)
Nenue@6 195 print(cpb.IsInBattle())
Nenue@6 196 if cpb.IsInBattle() then
Nenue@6 197 PBS_UpdateEnemySwatch(PBS, e, 2)
Nenue@6 198 end
Nenue@6 199
Nenue@6 200
Nenue@6 201 if _G.PetBattleFrame.BottomFrame.SwitchPetButton then
Nenue@6 202 print("There's a pet battle frame button ")
Nenue@6 203 --_G.PetBattleFrame.BottomFrame.SwitchPetButton:SetScript('OnClick', PBS_Switch)
Nenue@6 204 end
Nenue@6 205 end
Nenue@6 206
Nenue@6 207 local PBS_Hide = function()
Nenue@6 208 for i = 1, 3 do
Nenue@6 209 if PBS.buttons[i] then
Nenue@6 210 PBS.buttons[i].popOut:Play()
Nenue@6 211 end
Nenue@6 212 if PBS.sideSwatch.buttons[i] then
Nenue@6 213 PBS.sideSwatch.buttons[i].popOut:Play()
Nenue@6 214 end
Nenue@6 215 if PBS.sideSwatch2.buttons[i] then
Nenue@6 216 PBS.sideSwatch2.buttons[i].popOut:Play()
Nenue@6 217 end
Nenue@6 218 end
Nenue@6 219 end
Nenue@6 220
Nenue@6 221 local PBS_Event = function(self, e, ...)
Nenue@6 222 print('event', e)
Nenue@6 223 local owner = ...
Nenue@6 224 if e == 'PET_BATTLE_PET_ROUND_PLAYBACK_COMPLETE' or e == 'PET_BATTLE_OPENING_DONE' then
Nenue@6 225 PBS_UpdateEnemySwatch(PBS)
Nenue@6 226 elseif e == 'PET_BATTLE_CLOSE' then
Nenue@6 227 PBS_Hide(PBS)
Nenue@6 228 end
Nenue@6 229 end
Nenue@6 230 function mod:OnEnable()
Nenue@6 231 PBS = CreateFrame('Frame', 'TkPetSwatch', UIParent, 'TkPetSwatchTemplate')
Nenue@6 232 PBS.buttons = {}
Nenue@6 233 PBS.sideSwatch = CreateFrame('Frame', 'TkSideSwatch', PBS, 'TkPetSwatchTemplate')
Nenue@6 234 PBS.sideSwatch.buttons = {}
Nenue@6 235 PBS.sideSwatch2 = CreateFrame('Frame', 'TkSideSwatch', PBS, 'TkPetSwatchTemplate')
Nenue@6 236 PBS.sideSwatch2.buttons = {}
Nenue@6 237 local db = TurokData.petbattle
Nenue@6 238 T.SetFrameLayout(PBS, db.swatch)
Nenue@6 239 T.SetFrameLayout(PBS.sideSwatch, db.sideSwatch)
Nenue@6 240 T.SetFrameLayout(PBS.sideSwatch2, db.sideSwatch)
Nenue@6 241 PBS.sideSwatch2:ClearAllPoints()
Nenue@6 242 PBS.sideSwatch2:SetPoint('LEFT', PBS.sideSwatch, 'RIGHT', db.sideSpell.spacing, 0)
Nenue@6 243
Nenue@6 244 mod.effectIndex = {
Nenue@6 245 cpb.GetAllEffectNames()
Nenue@6 246 }
Nenue@6 247
Nenue@6 248 PBS:SetScript('OnEvent', PBS_Event)
Nenue@6 249 PBS:RegisterEvent('PET_BATTLE_OPENING_DONE')
Nenue@6 250 PBS:RegisterEvent('PET_BATTLE_PET_CHANGED')
Nenue@6 251 PBS:RegisterEvent('PET_BATTLE_OVER')
Nenue@6 252 PBS:RegisterEvent('PET_BATTLE_CLOSE')
Nenue@6 253 PBS:RegisterEvent('PET_BATTLE_ABILITY_CHANGED')
Nenue@6 254 PBS:RegisterEvent('PET_BATTLE_ACTION_SELECTED')
Nenue@6 255 --PBS:RegisterEvent('PET_BATTLE_AURA_APPLIED')
Nenue@6 256 --PBS:RegisterEvent('PET_BATTLE_AURA_CANCELED')
Nenue@6 257 --PBS:RegisterEvent('PET_BATTLE_PET_TYPE_CHANGED')
Nenue@6 258 PBS:RegisterEvent('PET_BATTLE_TURN_STARTED')
Nenue@6 259 --PBS:RegisterEvent('PET_BATTLE_HEALTH_CHANGED')
Nenue@6 260 --PBS:RegisterEvent('PET_BATTLE_MAX_HEALTH_CHANGED')
Nenue@6 261 PBS:RegisterEvent('PET_BATTLE_PET_ROUND_RESULTS')
Nenue@6 262 PBS:RegisterEvent('PET_BATTLE_PET_ROUND_PLAYBACK_COMPLETE')
Nenue@6 263 end
Nenue@6 264
Nenue@6 265 --[[
Nenue@6 266 mod.PET_BATTLE_OPENING_DONE = trace
Nenue@6 267 mod.PET_BATTLE_OPENING_START = trace
Nenue@6 268 mod.PET_BATTLE_OVER = trace
Nenue@6 269 mod.PET_BATTLE_ABILITY_CHANGED = trace
Nenue@6 270 mod.PET_BATTLE_ACTION_SELECTED = trace
Nenue@6 271 mod.PET_BATTLE_AURA_APPLIED = trace -- <team> <slot> <id>
Nenue@6 272 mod.PET_BATTLE_AURA_CANCELED = trace -- <team> <slot> <id>
Nenue@6 273 mod.PET_BATTLE_AURA_CHANGED = trace -- <team> <slot> <id>
Nenue@6 274 mod.PET_BATTLE_CAPTURED = trace
Nenue@6 275 mod.PET_BATTLE_CLOSE = trace
Nenue@6 276 mod.PET_BATTLE_FINAL_ROUND = trace -- <team>
Nenue@6 277 mod.PET_BATTLE_HEALTH_CHANGED = trace -- <team> <pet slot> <delta>
Nenue@6 278 mod.PET_BATTLE_LEVEL_CHANGED = trace
Nenue@6 279 mod.PET_BATTLE_LOOT_RECEIVED = trace
Nenue@6 280 mod.PET_BATTLE_MAX_HEALTH_CHANGED = trace
Nenue@6 281 mod.PET_BATTLE_PET_CHANGED = trace -- <team>
Nenue@6 282 mod.PET_BATTLE_PET_TYPE_CHANGED = trace -- <team> <slot> <type>
Nenue@6 283 mod.PET_BATTLE_PET_ROUND_PLAYBACK_COMPLETE = trace -- <round number>
Nenue@6 284 mod.PET_BATTLE_PET_ROUND_RESULTS = trace -- <round number>
Nenue@6 285 mod.PET_BATTLE_PVP_DUEL_REQUESTED = trace
Nenue@6 286 mod.PET_BATTLE_PVP_DUEL_REQUEST_CANCEL = trace
Nenue@6 287 mod.PET_BATTLE_QUEUE_PROPOSAL_ACCEPTED = trace
Nenue@6 288 mod.PET_BATTLE_QUEUE_PROPOSAL_DECLINED = trace
Nenue@6 289 mod.PET_BATTLE_QUEUE_PROPOSE_MATCH = trace
Nenue@6 290 mod.PET_BATTLE_QUEUE_STATUS = trace
Nenue@6 291 mod.PET_BATTLE_TURN_STARTED = trace
Nenue@6 292 mod.PET_BATTLE_XP_CHANGED = trace -- <team> <slot> <exp>
Nenue@6 293 --]]