local MAX_TUTORIAL_VERTICAL_TILE = 30; local MAX_TUTORIAL_IMAGES = 3; local MAX_TUTORIAL_KEYS = 4; local TUTORIALFRAME_TOP_HEIGHT = 80; local TUTORIALFRAME_MIDDLE_HEIGHT = 10; local TUTORIALFRAME_BOTTOM_HEIGHT = 30; local TUTORIALFRAME_WIDTH = 364; local TUTORIAL_LAST_ID = nil; local ARROW_TYPES = { "ArrowUp", "ArrowDown", "ArrowLeft", "ArrowRight", "ArrowCurveUpRight", "ArrowCurveUpLeft", "ArrowCurveDownRight", "ArrowCurveDownLeft", "ArrowCurveRightDown", "ArrowCurveRightUp", "ArrowCurveLeftDown", "ArrowCurveLeftUp", } local ARROW_SIZES = { ["ArrowUp"] = {x = 68, y = 89}, ["ArrowDown"] = {x = 68, y = 89}, ["ArrowLeft"] = {x = 89, y = 68}, ["ArrowRight"] = {x = 89, y = 68}, ["ArrowCurveUpRight"] = {x = 66, y = 81}, ["ArrowCurveUpLeft"] = {x = 66, y = 81}, ["ArrowCurveDownRight"] = {x = 66, y = 81}, ["ArrowCurveDownLeft"] = {x = 66, y = 81}, ["ArrowCurveRightDown"] = {x = 82, y = 66}, ["ArrowCurveRightUp"] = {x = 82, y = 66}, ["ArrowCurveLeftDown"] = {x = 82, y = 66}, ["ArrowCurveLeftUp"] = {x = 82, y = 66}, } local MOUSE_SIZE = { x = 76, y = 101} local TUTORIALFRAME_QUEUE = { }; local TUTORIAL_DATA = { [1] = "QuestGiver", [2] = "Movement", [3] = "LookAround", [4] = "QuestGiver", [5] = "Combat1", [6] = "Spells", [7] = "LootPig", [8] = "LootedItem", [9] = "OnUseItem", [10] = "Bags", [11] = "Food", [12] = "Drink", [13] = "Talents", [14] = "Trainer", [15] = "SpellBook", [16] = "Rep", [17] = "Reply", [18] = "Grouping", [19] = "Players", [20] = "Vendor", [21] = "QuestLog", [22] = "Friends", [24] = "Equip", [25] = "Death", [27] = "Fat", [28] = "Swim", [29] = "Breath", [30] = "Resting", [31] = "Hearthstones", [32] = "Pvp", [33] = "Jumping", [34] = "QuestComplete", [35] = "Travel", [36] = "DamagedItems", [37] = "BrokenItems", [38] = "Professions", [39] = "Groups", [40] = "Spellbook2", [41] = "LeetQuests", [42] = "Welcome", [43] = "QuestGray", [44] = "Ranged", [45] = "Ammo", [46] = "RaidGroups", [47] = "TotemBar", [48] = "Battleground1", [49] = "Battleground2", [50] = "Keyring", [51] = "LFG", [52] = "CosmeticPets", [53] = "Mounts", [54] = "ThreatWarnings", [55] = "Ding", [56] = "HealthManaBar", [57] = "EnemyHealth", [58] = "FullBags", [59] = "FreeingUpBags", [60] = "Hotbar", }; local DISPLAY_DATA = { -- Do not remove "Base" it is the default ["Base"] = { tileHeight = 7, anchorData = {align = "LEFT", xOff = 15, yOff = 30}, textBox = {topLeft_xOff = 33, topLeft_yOff = -75, bottomRight_xOff = -29, bottomRight_yOff = 35}, }, ["BaseTall"] = { tileHeight = 12, anchorData = {align = "LEFT", xOff = 15, yOff = 30}, textBox = {topLeft_xOff = 33, topLeft_yOff = -75, bottomRight_xOff = -29, bottomRight_yOff = 35}, }, -- layers can be BACKGROUND, BORDER, ARTWORK, OVERLAY, HIGHLIGHT -- if you don't assign one it will default to ARTWORK ["QuestGiver"] = { tileHeight = 21, anchorData = {align = "RIGHT", xOff = -25, yOff = -100}, textBox = {topLeft_xOff = 33, topLeft_yOff = -180, bottomRight_xOff = -29, bottomRight_yOff = 35}, imageData1 = {file ="Interface\\TutorialFrame\\UI-TutorialFrame-QuestCursor", align = "TOP", xOff = 0, yOff = -110}, imageData2 = {file ="Interface\\TutorialFrame\\UI-TutorialFrame-QuestGiver", align = "TOP", xOff = -40, yOff = -50}, mouseData = {image = "RightClick", align = "TOP", xOff = 80, yOff = -60}, }, ["Movement"] = { tileHeight = 18, anchorData = {align = "LEFT", xOff = 15, yOff = 30}, textBox = {topLeft_xOff = 33, topLeft_yOff = -200, bottomRight_xOff = -29, bottomRight_yOff = 35}, keyData1 = {command = "TURNLEFT", layer = "OVERLAY", align = "TOPLEFT", xOff = 105, yOff = -100}, keyData2 = {command = "MOVEBACKWARD", layer = "OVERLAY", align = "TOPLEFT", xOff = 160, yOff = -100}, keyData3 = {command = "TURNRIGHT", layer = "OVERLAY", align = "TOPLEFT", xOff = 215, yOff = -100}, keyData4 = {command = "MOVEFORWARD", align = "TOPLEFT", xOff = 160, yOff = -60}, ArrowUp = {layer = "BORDER", align = "TOPLEFT", xOff = 182, yOff = -40, scale = 0.5}, ArrowDown = {layer = "ARTWORK", align = "TOPLEFT", xOff = 182, yOff = -150, scale = 0.5}, ArrowRight = {layer = "ARTWORK", align = "TOPLEFT", xOff = 270, yOff = -120, scale = 0.5}, ArrowLeft = {layer = "ARTWORK", align = "TOPLEFT", xOff = 83, yOff = -120, scale = 0.5}, }, ["Moved"] = { tileHeight = 20, anchorData = {align = "LEFT", xOff = 15, yOff = 30}, textBox = {topLeft_xOff = 33, topLeft_yOff = -185, bottomRight_xOff = -29, bottomRight_yOff = 35}, imageData1 = {file ="Interface\\TutorialFrame\\UI-TutorialFrame-QuestCursor", align = "CENTER", xOff = 0, yOff = 10}, imageData2 = {file ="Interface\\TutorialFrame\\UI-TutorialFrame-QuestGiver", align = "CENTER", xOff = -40, yOff = 30}, mouseData = {image = "RightClick", align = "CENTER", xOff = 80, yOff = 30}, }, ["Ding"] = { tileHeight = 22, anchorData = {align = "LEFT", xOff = 15, yOff = 30}, callOut = {parent = "PlayerFrame", align = "TOPLEFT", xOff = 34, yOff = -6, width = 78, height = 78}, textBox = {topLeft_xOff = 33, topLeft_yOff = -215, bottomRight_xOff = -29, bottomRight_yOff = 35}, imageData1 = {file ="Interface\\TutorialFrame\\UI-TutorialFrame-LevelUp", align = "TOP", xOff = 10, yOff = -30}, }, ["OnUseItem"] = { tileHeight = 21, anchorData = {align = "RIGHT", xOff = -25, yOff = 70}, textBox = {topLeft_xOff = 33, topLeft_yOff = -200, bottomRight_xOff = -29, bottomRight_yOff = 35}, imageData1 = {file ="Interface\\TutorialFrame\\UI-TutorialFrame-OnUseItem", align = "TOP", xOff = -35, yOff = -70}, mouseData = {image = "RightClick", align = "TOP", xOff = 110, yOff = -85}, }, ["LootedItem"] = { tileHeight = 21, anchorData = {align = "RIGHT", xOff = -25, yOff = 70}, callOut = {parent = "MainMenuBarBackpackButton", align = "TOPLEFT", xOff = -5, yOff = 5, width = 50, height = 45}, textBox = {topLeft_xOff = 33, topLeft_yOff = -190, bottomRight_xOff = -29, bottomRight_yOff = 35}, imageData1 = {file ="Interface\\TutorialFrame\\UI-TutorialFrame-LootedItem", align = "TOP", xOff = 5, yOff = -55}, }, ["LootPig"] = { tileHeight = 24, anchorData = {align = "RIGHT", xOff = -25, yOff = 90}, textBox = {topLeft_xOff = 33, topLeft_yOff = -195, bottomRight_xOff = -29, bottomRight_yOff = 35}, imageData1 = {file ="Interface\\TutorialFrame\\UI-TutorialFrame-LootCorpse", align = "TOP", xOff = -60, yOff = -13}, imageData2 = {file ="Interface\\TutorialFrame\\UI-TutorialFrame-LootCursor", align = "TOP", xOff = 40, yOff = -90}, mouseData = {image = "RightClick", align = "TOP", xOff = 110, yOff = -65}, }, ["Spells"] = { tileHeight = 15, anchorData = {align = "LEFT", xOff = 15, yOff = -200}, textBox = {topLeft_xOff = 33, topLeft_yOff = -120, bottomRight_xOff = -29, bottomRight_yOff = 35}, imageData1 = {file ="Interface\\TutorialFrame\\UI-TutorialFrame-Spell01", align = "TOP", xOff = -60, yOff = -50}, imageData2 = {file ="Interface\\TutorialFrame\\UI-TutorialFrame-Spell02", align = "TOP", xOff = 10, yOff = -50}, imageData3 = {file ="Interface\\TutorialFrame\\UI-TutorialFrame-Spell03", align = "TOP", xOff = 80, yOff = -50}, }, ["Combat1"] = { tileHeight = 19, anchorData = {align = "LEFT", xOff = 15, yOff = -150}, callOut = {parent = "MainMenuBar", align = "TOPLEFT", xOff = -5, yOff = -5, width = 525, height = 50}, textBox = {topLeft_xOff = 33, topLeft_yOff = -145, bottomRight_xOff = -29, bottomRight_yOff = 35}, imageData1 = {file ="Interface\\TutorialFrame\\UI-TutorialFrame-AttackCursor", align = "TOP", xOff = -60, yOff = -60}, mouseData = {image = "LeftClick", align = "TOP", xOff = 50, yOff = -45}, }, ["LookAround"] = { tileHeight = 18, anchorData = {align = "LEFT", xOff = 15, yOff = 30}, textBox = {topLeft_xOff = 33, topLeft_yOff = -175, bottomRight_xOff = -29, bottomRight_yOff = 35}, mouseData = {layer = "OVERLAY", image = "RightClick", align = "TOP", xOff = 15, yOff = -55}, ArrowUp = {align = "TOPLEFT", xOff = 182, yOff = -40, scale = 0.5}, ArrowDown = {align = "TOPLEFT", xOff = 182, yOff = -125, scale = 0.5}, ArrowRight = {align = "TOPLEFT", xOff = 210, yOff = -90, scale = 0.5}, ArrowLeft = {align = "TOPLEFT", xOff = 140, yOff = -90, scale = 0.5}, -- ArrowCurveUpLeft = {layer = "OVERLAY", align = "TOPRIGHT", xOff = -215, yOff = -55, scale = 0.5}, -- ArrowCurveUpRight = {layer = "OVERLAY", align = "TOPRIGHT", xOff = -70, yOff = -55, scale = 0.5}, }, ["Hotbar"] = { tileHeight = 14, anchorData = {align = "LEFT", xOff = 15, yOff = -150}, callOut = {parent = "MainMenuBar", align = "TOPLEFT", xOff = -5, yOff = -5, width = 525, height = 50}, textBox = {topLeft_xOff = 33, topLeft_yOff = -120, bottomRight_xOff = -29, bottomRight_yOff = 35}, imageData1 = {file ="Interface\\TutorialFrame\\UI-TutorialFrame-Spell01", align = "TOP", xOff = -60, yOff = -50}, imageData2 = {file ="Interface\\TutorialFrame\\UI-TutorialFrame-Spell02", align = "TOP", xOff = 10, yOff = -50}, imageData3 = {file ="Interface\\TutorialFrame\\UI-TutorialFrame-Spell03", align = "TOP", xOff = 80, yOff = -50}, }, ["SpellBook"] = { tileHeight = 28, anchorData = {align = "RIGHT", xOff = -25, yOff = -130}, callOut = {parent = "SpellbookMicroButton", align = "TOPLEFT", xOff = -5, yOff = -17, width = 38, height = 45}, imageData1 = {file ="Interface\\TutorialFrame\\UI-TutorialFrame-Spellbook", align = "TOP", xOff = 10, yOff = -50}, textBox = {topLeft_xOff = 33, topLeft_yOff = -225, bottomRight_xOff = -29, bottomRight_yOff = 35}, }, ["Death"] = { tileHeight = 22, anchorData = {align = "RIGHT", xOff = -25, yOff = 70}, callOut = {parent = "Minimap", align = "TOPLEFT", xOff = -8, yOff = 0, width = 151, height = 145}, textBox = {topLeft_xOff = 33, topLeft_yOff = -185, bottomRight_xOff = -29, bottomRight_yOff = 35}, imageData1 = {file ="Interface\\TutorialFrame\\UI-TutorialFrame-SpiritRez", align = "TOP", xOff = 10, yOff = -50}, }, ["Resting"] = { tileHeight = 11, anchorData = {align = "LEFT", xOff = 15, yOff = 150}, callOut = {parent = "PlayerFrame", align = "TOPLEFT", xOff = 32, yOff = -4, width = 85, height = 85}, textBox = {topLeft_xOff = 33, topLeft_yOff = -75, bottomRight_xOff = -29, bottomRight_yOff = 35}, }, ["Hearthstones"] = { tileHeight = 10, anchorData = {align = "LEFT", xOff = 15, yOff = 30}, textBox = {topLeft_xOff = 33, topLeft_yOff = -120, bottomRight_xOff = -29, bottomRight_yOff = 35}, imageData1 = {file ="Interface\\TutorialFrame\\UI-TutorialFrame-Hearthstone", align = "TOP", xOff = 10, yOff = -50}, }, ["Pvp"] = { tileHeight = 10, anchorData = {align = "LEFT", xOff = 15, yOff = 150}, callOut = {parent = "PlayerFrame", align = "TOPLEFT", xOff = 34, yOff = -6, width = 78, height = 78}, textBox = {topLeft_xOff = 33, topLeft_yOff = -75, bottomRight_xOff = -29, bottomRight_yOff = 35}, }, ["Jumping"] = { tileHeight = 7, anchorData = {align = "LEFT", xOff = 15, yOff = 30}, textBox = {topLeft_xOff = 33, topLeft_yOff = -75, bottomRight_xOff = -29, bottomRight_yOff = 35}, }, ["QuestComplete"] = { tileHeight = 24, anchorData = {align = "RIGHT", xOff = -25, yOff = 60}, callOut = {parent = "Minimap", align = "TOPLEFT", xOff = -8, yOff = 0, width = 151, height = 145}, textBox = {topLeft_xOff = 33, topLeft_yOff = -185, bottomRight_xOff = -29, bottomRight_yOff = 35}, imageData1 = {file ="Interface\\TutorialFrame\\UI-TutorialFrame-QuestCompleteCursor", align = "TOP", xOff = 0, yOff = -110}, imageData2 = {file ="Interface\\TutorialFrame\\UI-TutorialFrame-QuestComplete", align = "TOP", xOff = -40, yOff = -50}, mouseData = {image = "RightClick", align = "TOP", xOff = 80, yOff = -60}, }, ["Travel"] = { tileHeight = 25, anchorData = {align = "LEFT", xOff = 15, yOff = 30}, textBox = {topLeft_xOff = 33, topLeft_yOff = -195, bottomRight_xOff = -29, bottomRight_yOff = 35}, imageData1 = {file ="Interface\\TutorialFrame\\UI-TutorialFrame-FlightCursor", align = "TOP", xOff = 0, yOff = -110}, imageData2 = {file ="Interface\\TutorialFrame\\UI-TutorialFrame-FlightMaster", align = "TOP", xOff = -40, yOff = -50}, mouseData = {image = "RightClick", align = "TOP", xOff = 80, yOff = -60}, }, ["DamagedItems"] = { tileHeight = 17, anchorData = {align = "RIGHT", xOff = -25, yOff = -20}, callOut = {parent = "DurabilityFrame", align = "TOPLEFT", xOff = 0, yOff = 8, width = 58, height = 90}, textBox = {topLeft_xOff = 33, topLeft_yOff = -150, bottomRight_xOff = -29, bottomRight_yOff = 35}, imageData1 = {file ="Interface\\TutorialFrame\\UI-TutorialFrame-RepairCursor", align = "TOP", xOff = 0, yOff = -60}, imageData2 = {file ="Interface\\TutorialFrame\\UI-TutorialFrame-TheDude", align = "TOP", xOff = -40, yOff = -10}, mouseData = {image = "RightClick", align = "TOP", xOff = 80, yOff = -40}, }, ["BrokenItems"] = { tileHeight = 18, anchorData = {align = "RIGHT", xOff = -25, yOff = -20}, callOut = {parent = "DurabilityFrame", align = "TOPLEFT", xOff = 0, yOff = 8, width = 58, height = 90}, textBox = {topLeft_xOff = 33, topLeft_yOff = -150, bottomRight_xOff = -29, bottomRight_yOff = 35}, imageData1 = {file ="Interface\\TutorialFrame\\UI-TutorialFrame-RepairCursor", align = "TOP", xOff = 0, yOff = -60}, imageData2 = {file ="Interface\\TutorialFrame\\UI-TutorialFrame-TheDude", align = "TOP", xOff = -40, yOff = -10}, mouseData = {image = "RightClick", align = "TOP", xOff = 80, yOff = -40}, }, -- ["Professions"] = { -- tileHeight = 11, -- anchorData = {align = "LEFT", xOff = 15, yOff = 30}, -- textBox = {topLeft_xOff = 33, topLeft_yOff = -75, bottomRight_xOff = -29, bottomRight_yOff = 35}, -- }, ["Groups"] = { tileHeight = 11, anchorData = {align = "LEFT", xOff = 15, yOff = 30}, textBox = {topLeft_xOff = 33, topLeft_yOff = -75, bottomRight_xOff = -29, bottomRight_yOff = 35}, }, ["Spellbook2"] = { tileHeight = 28, anchorData = {align = "RIGHT", xOff = -25, yOff = -130}, callOut = {parent = "SpellbookMicroButton", align = "TOPLEFT", xOff = -5, yOff = -17, width = 38, height = 45}, imageData1 = {file ="Interface\\TutorialFrame\\UI-TutorialFrame-Spellbook", align = "TOP", xOff = 10, yOff = -50}, textBox = {topLeft_xOff = 33, topLeft_yOff = -225, bottomRight_xOff = -29, bottomRight_yOff = 35}, }, ["LeetQuests"] = { tileHeight = 21, anchorData = {align = "LEFT", xOff = 15, yOff = 30}, imageData1 = {file ="Interface\\TutorialFrame\\UI-TutorialFrame-Elite", align = "TOP", xOff = 10, yOff = -50}, textBox = {topLeft_xOff = 33, topLeft_yOff = -160, bottomRight_xOff = -29, bottomRight_yOff = 35}, }, ["Welcome"] = { tileHeight = 22, anchorData = {align = "LEFT", xOff = 15, yOff = 30}, textBox = {topLeft_xOff = 33, topLeft_yOff = -180, bottomRight_xOff = -29, bottomRight_yOff = 35}, imageData1 = {file ="Interface\\TutorialFrame\\UI-TutorialFrame-Logo", align = "TOP", xOff = 10, yOff = -50}, }, ["RaidGroups"] = { tileHeight = 14, anchorData = {align = "LEFT", xOff = 15, yOff = 30}, textBox = {topLeft_xOff = 33, topLeft_yOff = -75, bottomRight_xOff = -29, bottomRight_yOff = 35}, }, ["TotemBar"] = { tileHeight = 12, anchorData = {align = "LEFT", xOff = 15, yOff = -150}, callOut = {parent = "MultiCastActionBarFrame", align = "TOPLEFT", xOff = -5, yOff = 4, width = 45, height = 45}, textBox = {topLeft_xOff = 33, topLeft_yOff = -75, bottomRight_xOff = -29, bottomRight_yOff = 35}, }, ["CosmeticPets"] = { tileHeight = 11, anchorData = {align = "RIGHT", xOff = -25, yOff = -150}, callOut = {parent = "CharacterMicroButton", align = "TOPLEFT", xOff = -5, yOff = -17, width = 38, height = 45}, textBox = {topLeft_xOff = 33, topLeft_yOff = -75, bottomRight_xOff = -29, bottomRight_yOff = 35}, }, ["Mounts"] = { tileHeight = 13, anchorData = {align = "RIGHT", xOff = -25, yOff = -150}, callOut = {parent = "CharacterMicroButton", align = "TOPLEFT", xOff = -5, yOff = -17, width = 38, height = 45}, textBox = {topLeft_xOff = 33, topLeft_yOff = -75, bottomRight_xOff = -29, bottomRight_yOff = 35}, }, ["ThreatWarnings"] = { tileHeight = 19, anchorData = {align = "LEFT", xOff = 15, yOff = 30}, textBox = {topLeft_xOff = 33, topLeft_yOff = -150, bottomRight_xOff = -29, bottomRight_yOff = 35}, imageData1 = {file ="Interface\\TutorialFrame\\UI-TutorialFrame-Threat", align = "TOP", xOff = 10, yOff = -50}, }, ["HealthManaBar"] = { tileHeight = 19, anchorData = {align = "LEFT", xOff = 15, yOff = 150}, callOut = {parent = "PlayerFrame", align = "TOPLEFT", xOff = 100, yOff = -33, width = 135, height = 40}, textBox = {topLeft_xOff = 33, topLeft_yOff = -125, bottomRight_xOff = -29, bottomRight_yOff = 35}, imageData1 = {file ="Interface\\TutorialFrame\\UI-TutorialFrame-DudeFull", align = "TOP", xOff = 10, yOff = -35}, }, ["FullBags"] = { tileHeight = 22, anchorData = {align = "RIGHT", xOff = -25, yOff = 70}, textBox = {topLeft_xOff = 33, topLeft_yOff = -185, bottomRight_xOff = -29, bottomRight_yOff = 35}, callOut = {parent = "MainMenuBarBackpackButton", align = "TOPLEFT", xOff = -5, yOff = 5, width = 50, height = 45}, imageData1 = {file ="Interface\\TutorialFrame\\UI-TutorialFrame-FullBackpack", align = "TOP", xOff = -22, yOff = -55}, }, ["EnemyHealth"] = { tileHeight = 13, anchorData = {align = "LEFT", xOff = 15, yOff = 150}, textBox = {topLeft_xOff = 33, topLeft_yOff = -125, bottomRight_xOff = -29, bottomRight_yOff = 35}, -- callOut = {parent = "TargetFrame", align = "TOPLEFT", xOff = -5, yOff = -34, width = 140, height = 38}, imageData1 = {file ="Interface\\TutorialFrame\\UI-TutorialFrame-EnemyHealth", align = "TOP", xOff = 10, yOff = -35}, }, ["FreeingUpBags"] = { tileHeight = 24, anchorData = {align = "RIGHT", xOff = -25, yOff = 70}, callOut = {parent = "MainMenuBarBackpackButton", align = "TOPLEFT", xOff = -5, yOff = 5, width = 50, height = 45}, textBox = {topLeft_xOff = 33, topLeft_yOff = -185, bottomRight_xOff = -29, bottomRight_yOff = 35}, imageData1 = {file ="Interface\\TutorialFrame\\UI-TutorialFrame-FullBackpack", align = "TOP", xOff = -70, yOff = -65}, mouseData = {image = "RightClick", align = "TOP", xOff = 110, yOff = -65}, }, ["Bags"] = { tileHeight = 13, anchorData = {align = "RIGHT", xOff = -25, yOff = 50}, callOut = {parent = "MainMenuBarBackpackButton", align = "TOPLEFT", xOff = -150, yOff = 5, width = 200, height = 45}, textBox = {topLeft_xOff = 33, topLeft_yOff = -125, bottomRight_xOff = -29, bottomRight_yOff = 35}, imageData1 = {file ="Interface\\TutorialFrame\\UI-TutorialFrame-Bag", align = "TOP", xOff = -60, yOff = -50}, imageData2 = {file ="Interface\\TutorialFrame\\UI-TutorialFrame-Bag02", align = "TOP", xOff = 10, yOff = -50}, imageData3 = {file ="Interface\\TutorialFrame\\UI-TutorialFrame-Bag03", align = "TOP", xOff = 80, yOff = -50}, }, ["Talents"] = { tileHeight = 9, anchorData = {align = "RIGHT", xOff = -25, yOff = -150}, callOut = {parent = "TalentMicroButton", align = "TOPLEFT", xOff = -5, yOff = -17, width = 38, height = 45}, textBox = {topLeft_xOff = 33, topLeft_yOff = -75, bottomRight_xOff = -29, bottomRight_yOff = 35}, }, ["Rep"] = { tileHeight = 8, anchorData = {align = "RIGHT", xOff = -25, yOff = -150}, callOut = {parent = "CharacterMicroButton", align = "TOPLEFT", xOff = -5, yOff = -17, width = 38, height = 45}, textBox = {topLeft_xOff = 33, topLeft_yOff = -75, bottomRight_xOff = -29, bottomRight_yOff = 35}, }, ["Reply"] = { tileHeight = 6, anchorData = {align = "LEFT", xOff = 25, yOff = -50}, textBox = {topLeft_xOff = 33, topLeft_yOff = -75, bottomRight_xOff = -29, bottomRight_yOff = 35}, }, ["Players"] = { tileHeight = 11, anchorData = {align = "LEFT", xOff = 50, yOff = 150}, textBox = {topLeft_xOff = 33, topLeft_yOff = -135, bottomRight_xOff = -29, bottomRight_yOff = 35}, -- callOut = {parent = "TargetFrame", align = "TOPLEFT", xOff = -5, yOff = -5, width = 210, height = 80}, imageData1 = {file ="Interface\\TutorialFrame\\UI-TutorialFrame-DudeParty", align = "TOP", xOff = 0, yOff = -40}, }, ["QuestLog"] = { tileHeight = 10, anchorData = {align = "RIGHT", xOff = -25, yOff = -150}, callOut = {parent = "QuestLogMicroButton", align = "TOPLEFT", xOff = -5, yOff = -17, width = 38, height = 45}, textBox = {topLeft_xOff = 33, topLeft_yOff = -75, bottomRight_xOff = -29, bottomRight_yOff = 35}, }, ["Friends"] = { tileHeight = 10, anchorData = {align = "RIGHT", xOff = -25, yOff = -150}, callOut = {parent = "SocialsMicroButton", align = "TOPLEFT", xOff = -5, yOff = -17, width = 38, height = 45}, textBox = {topLeft_xOff = 33, topLeft_yOff = -75, bottomRight_xOff = -29, bottomRight_yOff = 35}, }, ["Equip"] = { tileHeight = 25, anchorData = {align = "RIGHT", xOff = -25, yOff = 70}, callOut = {parent = "CharacterMicroButton", align = "TOPLEFT", xOff = -5, yOff = -17, width = 38, height = 45}, imageData1 = {file ="Interface\\TutorialFrame\\UI-TutorialFrame-EquipItem", align = "TOP", xOff = 10, yOff = -15}, textBox = {topLeft_xOff = 33, topLeft_yOff = -225, bottomRight_xOff = -29, bottomRight_yOff = 35}, }, ["Battleground1"] = { tileHeight = 7, anchorData = {align = "RIGHT", xOff = -25, yOff = 70}, callOut = {parent = "Minimap", align = "TOPLEFT", xOff = -8, yOff = 0, width = 151, height = 145}, textBox = {topLeft_xOff = 33, topLeft_yOff = -75, bottomRight_xOff = -29, bottomRight_yOff = 35}, }, ["Battleground2"] = { tileHeight = 7, anchorData = {align = "RIGHT", xOff = -25, yOff = 70}, callOut = {parent = "Minimap", align = "TOPLEFT", xOff = -8, yOff = 0, width = 151, height = 145}, textBox = {topLeft_xOff = 33, topLeft_yOff = -75, bottomRight_xOff = -29, bottomRight_yOff = 35}, }, ["Keyring"] = { tileHeight = 7, anchorData = {align = "RIGHT", xOff = -25, yOff = -150}, callOut = {parent = "KeyRingButton", align = "TOPLEFT", xOff = -8, yOff = 7, width = 35, height = 52}, textBox = {topLeft_xOff = 33, topLeft_yOff = -75, bottomRight_xOff = -29, bottomRight_yOff = 35}, }, ["LFG"] = { tileHeight = 7, anchorData = {align = "RIGHT", xOff = -25, yOff = -150}, callOut = {parent = "LFDMicroButton", align = "TOPLEFT", xOff = -5, yOff = -17, width = 38, height = 45}, textBox = {topLeft_xOff = 33, topLeft_yOff = -75, bottomRight_xOff = -29, bottomRight_yOff = 35}, }, ["Food"] = { tileHeight = 10, anchorData = {align = "LEFT", xOff = 15, yOff = 30}, textBox = {topLeft_xOff = 33, topLeft_yOff = -130, bottomRight_xOff = -29, bottomRight_yOff = 35}, imageData1 = {file ="Interface\\TutorialFrame\\UI-TutorialFrame-Food01", align = "TOP", xOff = -60, yOff = -50}, imageData2 = {file ="Interface\\TutorialFrame\\UI-TutorialFrame-Food02", align = "TOP", xOff = 10, yOff = -50}, imageData3 = {file ="Interface\\TutorialFrame\\UI-TutorialFrame-Food03", align = "TOP", xOff = 80, yOff = -50}, }, ["Drink"] = { tileHeight = 13, anchorData = {align = "LEFT", xOff = 15, yOff = 30}, textBox = {topLeft_xOff = 33, topLeft_yOff = -120, bottomRight_xOff = -29, bottomRight_yOff = 35}, imageData1 = {file ="Interface\\TutorialFrame\\UI-TutorialFrame-Drink01", align = "TOP", xOff = -60, yOff = -50}, imageData2 = {file ="Interface\\TutorialFrame\\UI-TutorialFrame-Drink02", align = "TOP", xOff = 10, yOff = -50}, imageData3 = {file ="Interface\\TutorialFrame\\UI-TutorialFrame-Drink03", align = "TOP", xOff = 80, yOff = -50}, }, ["QuestGray"] = { tileHeight = 18, anchorData = {align = "LEFT", xOff = 15, yOff = 30}, textBox = {topLeft_xOff = 33, topLeft_yOff = -195, bottomRight_xOff = -29, bottomRight_yOff = 35}, imageData1 = {file ="Interface\\TutorialFrame\\UI-TutorialFrame-QuestGray", align = "TOP", xOff = 30, yOff = -50}, }, ["Ranged"] = { tileHeight = 20, anchorData = {align = "LEFT", xOff = 15, yOff = 30}, textBox = {topLeft_xOff = 33, topLeft_yOff = -125, bottomRight_xOff = -29, bottomRight_yOff = 35}, imageData1 = {file ="Interface\\TutorialFrame\\UI-TutorialFrame-Shoot01", align = "TOP", xOff = -60, yOff = -50}, imageData2 = {file ="Interface\\TutorialFrame\\UI-TutorialFrame-Shoot02", align = "TOP", xOff = 10, yOff = -50}, imageData3 = {file ="Interface\\TutorialFrame\\UI-TutorialFrame-Shoot03", align = "TOP", xOff = 80, yOff = -50}, }, ["Trainer"] = { tileHeight = 17, anchorData = {align = "LEFT", xOff = 15, yOff = 30}, textBox = {topLeft_xOff = 33, topLeft_yOff = -145, bottomRight_xOff = -29, bottomRight_yOff = 35}, imageData1 = {file ="Interface\\TutorialFrame\\UI-TutorialFrame-TrainerCursor", align = "TOP", xOff = 0, yOff = -60}, imageData2 = {file ="Interface\\TutorialFrame\\UI-TutorialFrame-TheDude", align = "TOP", xOff = -40, yOff = -10}, mouseData = {image = "RightClick", align = "TOP", xOff = 80, yOff = -40}, }, ["Vendor"] = { tileHeight = 17, anchorData = {align = "RIGHT", xOff = -25, yOff = 70}, textBox = {topLeft_xOff = 33, topLeft_yOff = -150, bottomRight_xOff = -29, bottomRight_yOff = 35}, imageData1 = {file ="Interface\\TutorialFrame\\UI-TutorialFrame-LootCursor", align = "TOP", xOff = 0, yOff = -60}, imageData2 = {file ="Interface\\TutorialFrame\\UI-TutorialFrame-TheDude", align = "TOP", xOff = -40, yOff = -10}, mouseData = {image = "RightClick", align = "TOP", xOff = 80, yOff = -40}, }, ["Professions"] = { tileHeight = 18, anchorData = {align = "LEFT", xOff = 15, yOff = 30}, textBox = {topLeft_xOff = 33, topLeft_yOff = -150, bottomRight_xOff = -29, bottomRight_yOff = 35}, imageData1 = {file ="Interface\\TutorialFrame\\UI-TutorialFrame-TrainerCursor", align = "TOP", xOff = 0, yOff = -60}, imageData2 = {file ="Interface\\TutorialFrame\\UI-TutorialFrame-TheDude", align = "TOP", xOff = -40, yOff = -10}, mouseData = {image = "RightClick", align = "TOP", xOff = 80, yOff = -40}, }, ["Breath"] = { tileHeight = 9, anchorData = {align = "LEFT", xOff = 15, yOff = 30}, textBox = {topLeft_xOff = 33, topLeft_yOff = -95, bottomRight_xOff = -29, bottomRight_yOff = 35}, imageData1 = {file ="Interface\\TutorialFrame\\UI-TutorialFrame-BreathBar", align = "TOP", xOff = 10, yOff = -40}, }, ["Fat"] = { tileHeight = 9, anchorData = {align = "LEFT", xOff = 15, yOff = 30}, textBox = {topLeft_xOff = 33, topLeft_yOff = -95, bottomRight_xOff = -29, bottomRight_yOff = 35}, imageData1 = {file ="Interface\\TutorialFrame\\UI-TutorialFrame-FatigueBar", align = "TOP", xOff = 10, yOff = -40}, }, ["Grouping"] = { tileHeight = 20, anchorData = {align = "LEFT", xOff = 15, yOff = 30}, textBox = {topLeft_xOff = 33, topLeft_yOff = -165, bottomRight_xOff = -29, bottomRight_yOff = 35}, imageData1 = {file ="Interface\\TutorialFrame\\UI-TutorialFrame-DudeParty", align = "TOP", xOff = -50, yOff = -63}, imageData2 = {file ="Interface\\TutorialFrame\\UI-TutorialFrame-GloveCursor", layer = "OVERLAY", align = "TOP", xOff = 40, yOff = -90}, mouseData = {image = "RightClick", align = "TOP", xOff = 110, yOff = -65}, }, ["Swim"] = { tileHeight = 14, anchorData = {align = "LEFT", xOff = 15, yOff = 30}, textBox = {topLeft_xOff = 33, topLeft_yOff = -135, bottomRight_xOff = -29, bottomRight_yOff = 35}, mouseData = {image = "RightClick", align = "TOP", xOff = 10, yOff = -35}, }, ["Ammo"] = { tileHeight = 14, anchorData = {align = "LEFT", xOff = 15, yOff = 30}, textBox = {topLeft_xOff = 33, topLeft_yOff = -135, bottomRight_xOff = -29, bottomRight_yOff = 35}, mouseData = {image = "RightClick", align = "TOP", xOff = 10, yOff = -35}, }, }; function TutorialFrame_OnLoad(self) self:RegisterEvent("TUTORIAL_TRIGGER"); for i = 1, MAX_TUTORIAL_VERTICAL_TILE do local texture = self:CreateTexture("TutorialFrameLeft"..i, "BORDER"); texture:SetTexture("Interface\\TutorialFrame\\UI-TUTORIAL-FRAME"); texture:SetTexCoord(0.3066406, 0.3261719, 0.656250025, 0.675781275); texture:SetSize(11, 10); texture = self:CreateTexture("TutorialFrameRight"..i, "BORDER"); texture:SetTexture("Interface\\TutorialFrame\\UI-TUTORIAL-FRAME"); texture:SetTexCoord(0.3496094, 0.3613281, 0.656250025, 0.675781275); texture:SetSize(7, 10); end TutorialFrameLeft1:SetPoint("TOPLEFT", TutorialFrameTop, "BOTTOMLEFT", 6, 0); TutorialFrameRight1:SetPoint("TOPRIGHT", TutorialFrameTop, "BOTTOMRIGHT", -1, 0); for i = 1, MAX_TUTORIAL_IMAGES do local texture = self:CreateTexture("TutorialFrameImage"..i, "ARTWORK"); end for i = 1, MAX_TUTORIAL_KEYS do local texture = self:CreateTexture("TutorialFrameKey"..i, "ARTWORK"); texture:SetTexture("Interface\\TutorialFrame\\UI-TUTORIAL-FRAME"); texture:SetTexCoord(0.1542969, 0.3007813, 0.8046875, 0.9433594); texture:SetSize(76, 72); local keyString = self:CreateFontString("TutorialFrameKeyString"..i, "ARTWORK", "GameFontNormalHugeBlack"); keyString:SetPoint("CENTER", texture, "CENTER", 0, 10); end TutorialFrame_ClearTextures(); end function TutorialFrame_OnShow(self) self:RegisterEvent("DISPLAY_SIZE_CHANGED"); TutorialFrame_CheckNextPrevButtons(); end function TutorialFrame_OnHide(self) self:UnregisterEvent("DISPLAY_SIZE_CHANGED"); if ( (getn(TUTORIALFRAME_QUEUE) <= 0) and (UnitLevel("player") > 5) ) then TutorialFrameAlertButton:Hide(); UIParent_ManageFramePositions(); end end function TutorialFrame_CheckNextPrevButtons() if ( GetPrevCompleatedTutorial(TutorialFrame.id) ) then TutorialFramePrevButton:Enable(); else TutorialFramePrevButton:Disable(); end if ( GetNextCompleatedTutorial(TutorialFrame.id) or (getn(TUTORIALFRAME_QUEUE) > 0) ) then TutorialFrameNextButton:Enable(); else TutorialFrameNextButton:Disable(); end end function TutorialFrame_Update(currentTutorial) FlagTutorial(currentTutorial); TutorialFrame.id = currentTutorial; local displayData = DISPLAY_DATA[ TUTORIAL_DATA[currentTutorial] ]; if ( not displayData ) then displayData = DISPLAY_DATA["Base"]; end -- setup the frame TutorialFrame_ClearTextures(); local anchorData = displayData.anchorData; TutorialFrame:SetPoint( anchorData.align, UIParent, anchorData.align, anchorData.xOff, anchorData.yOff ); local anchorParentLeft = TutorialFrameLeft1; local anchorParentRight = TutorialFrameRight1; for i = 2, displayData.tileHeight do local leftTexture = _G["TutorialFrameLeft"..i]; local rightTexture = _G["TutorialFrameRight"..i]; leftTexture:SetPoint("TOPLEFT", anchorParentLeft, "BOTTOMLEFT", 0, 0); rightTexture:SetPoint("TOPRIGHT", anchorParentRight, "BOTTOMRIGHT", 0, 0); leftTexture:Show(); rightTexture:Show(); anchorParentLeft = leftTexture; anchorParentRight = rightTexture; end TutorialFrameBottom:SetPoint("TOPLEFT", anchorParentLeft, "BOTTOMLEFT", 0, 0); TutorialFrameBottom:SetPoint("TOPRIGHT", anchorParentRight, "TOPRIGHT", 0, 0); local height = TUTORIALFRAME_TOP_HEIGHT + (displayData.tileHeight * TUTORIALFRAME_MIDDLE_HEIGHT) + TUTORIALFRAME_BOTTOM_HEIGHT; TutorialFrame:SetSize(TUTORIALFRAME_WIDTH, height); -- setup the text local title = _G["TUTORIAL_TITLE"..currentTutorial]; local text = _G["TUTORIAL"..currentTutorial]; if ( title and text) then TutorialFrameTitle:SetText(title); TutorialFrameText:SetText(text); end if ( displayData.textBox) then TutorialFrameTextScrollFrame:SetPoint("TOPLEFT", TutorialFrame, "TOPLEFT", displayData.textBox.topLeft_xOff, displayData.textBox.topLeft_yOff); TutorialFrameTextScrollFrame:SetPoint("BOTTOMRIGHT", TutorialFrame, "BOTTOMRIGHT", displayData.textBox.bottomRight_xOff, displayData.textBox.bottomRight_yOff); end -- setup the callout local callOut = displayData.callOut; if(callOut) then TutorialFrameCallOut:SetSize(callOut.width, callOut.height); TutorialFrameCallOut:SetPoint( callOut.align, callOut.parent, callOut.align, callOut.xOff, callOut.yOff ); TutorialFrameCallOut:Show(); TutorialFrameCallOutPulser:Play(); end -- setup images for i = 1, MAX_TUTORIAL_IMAGES do local imageTexture = _G["TutorialFrameImage"..i]; local imageData = displayData["imageData"..i]; if(imageData and imageTexture) then imageTexture:SetTexture(imageData.file); imageTexture:SetPoint( imageData.align, TutorialFrame, imageData.align, imageData.xOff, imageData.yOff ); if ( imageData.layer ) then imageTexture:SetDrawLayer(imageData.layer); end imageTexture:Show(); elseif( imageTexture ) then imageTexture:ClearAllPoints(); imageTexture:SetTexture(""); imageTexture:Hide(); end end -- setup mouse local mouseData = displayData.mouseData; if(mouseData) then local mouseTexture = _G["TutorialFrameMouse"..mouseData.image]; mouseTexture:SetPoint( mouseData.align, TutorialFrame, mouseData.align, mouseData.xOff, mouseData.yOff ); local scale = 1.0; if ( mouseData.scale ) then scale = mouseData.scale; end mouseTexture:SetWidth( MOUSE_SIZE.x * scale ); mouseTexture:SetHeight( MOUSE_SIZE.y * scale ); if ( mouseData.layer ) then mouseTexture:SetDrawLayer(mouseData.layer); end mouseTexture:Show(); end -- setup keys for i = 1, MAX_TUTORIAL_KEYS do local keyTexture = _G["TutorialFrameKey"..i]; local keyString = _G["TutorialFrameKeyString"..i]; local keyData = displayData["keyData"..i]; if(keyTexture and keyString and keyData) then keyTexture:SetPoint( keyData.align, TutorialFrame, keyData.align, keyData.xOff, keyData.yOff ); keyString:SetText( GetBindingText(GetBindingKey(keyData.command), "KEY_") ); if ( keyData.layer ) then keyTexture:SetDrawLayer(keyData.layer); keyString:SetDrawLayer(keyData.layer); end keyTexture:Show(); keyString:Show(); elseif ( keyTexture ) then keyTexture:ClearAllPoints(); keyTexture:Hide(); keyString:Hide(); end end -- setup arrows for i = 1, getn(ARROW_TYPES) do arrowData = displayData[ ARROW_TYPES[i] ]; arrowTexture = _G[ "TutorialFrame"..ARROW_TYPES[i] ]; if ( arrowData and arrowTexture ) then arrowTexture:SetPoint( arrowData.align, TutorialFrame, arrowData.align, arrowData.xOff, arrowData.yOff ); if ( arrowData.layer ) then arrowTexture:SetDrawLayer(arrowData.layer); end if ( arrowData.scale ) then arrowTexture:SetWidth( ARROW_SIZES[ARROW_TYPES[i]].x * arrowData.scale ); arrowTexture:SetHeight( ARROW_SIZES[ARROW_TYPES[i]].y * arrowData.scale ); end arrowTexture:Show(); elseif ( arrowTexture ) then arrowTexture:ClearAllPoints(); arrowTexture:Hide(); end end -- show TutorialFrame:Show(); TutorialFrame_CheckNextPrevButtons(); end function TutorialFrame_ClearTextures() TutorialFrame:ClearAllPoints(); TutorialFrameBottom:ClearAllPoints(); TutorialFrameTextScrollFrame:ClearAllPoints(); TutorialFrameCallOutPulser:Stop(); TutorialFrameCallOut:ClearAllPoints(); TutorialFrameCallOut:Hide(); TutorialFrameMouseRightClick:ClearAllPoints(); TutorialFrameMouseLeftClick:ClearAllPoints(); TutorialFrameMouseBothClick:ClearAllPoints(); TutorialFrameMouseWheel:ClearAllPoints(); TutorialFrameMouseRightClick:Hide(); TutorialFrameMouseLeftClick:Hide(); TutorialFrameMouseBothClick:Hide(); TutorialFrameMouseWheel:Hide(); -- top & left1 & right1 never have thier anchors changed; or are independantly hidden for i = 2, MAX_TUTORIAL_VERTICAL_TILE do local leftTexture = _G["TutorialFrameLeft"..i]; local rightTexture = _G["TutorialFrameRight"..i]; leftTexture:ClearAllPoints(); rightTexture:ClearAllPoints(); leftTexture:Hide(); rightTexture:Hide(); end end function TutorialFrame_NewTutorial(tutorialID) -- check that we haven't already seen it if ( IsTutorialFlagged(tutorialID) ) then return; end for index, value in pairs(TUTORIALFRAME_QUEUE) do if( (value == tutorialID) ) then return; end end TUTORIAL_LAST_ID = tutorialID; local button = TutorialFrameAlertButton; tinsert(TUTORIALFRAME_QUEUE, tutorialID); if ( not TutorialFrame:IsShown() ) then button.id = tutorialID; button:Show(); UIParent_ManageFramePositions(); if ( not TutorialFrame:IsShown() and not InCombatLockdown() ) then TutorialFrame_AlertButton_OnClick(button); end elseif ( button:IsEnabled() == 0 ) then button.id = tutorialID; end TutorialFrame_CheckBadge(); if ( getn(TUTORIALFRAME_QUEUE) > 0 ) then TutorialFrameNextButton:Enable(); end end function TutorialFramePrevButton_OnClick(self) PlaySound("igMainMenuOptionCheckBoxOn"); local prevTutorial = GetPrevCompleatedTutorial(TutorialFrame.id); if ( prevTutorial ) then TutorialFrame_Update(prevTutorial); end end function TutorialFrameNextButton_OnClick(self) PlaySound("igMainMenuOptionCheckBoxOn"); local nextTutorial = GetNextCompleatedTutorial(TutorialFrame.id); if ( nextTutorial ) then TutorialFrame_Update(nextTutorial); elseif (getn(TUTORIALFRAME_QUEUE) > 0) then TutorialFrame_AlertButton_OnClick(TutorialFrameAlertButton); end end function TutorialFrame_AlertButton_OnClick(self) local tutorialID = TUTORIALFRAME_QUEUE[1]; if ( tutorialID ) then tremove(TUTORIALFRAME_QUEUE, 1); TutorialFrame_Update(tutorialID); elseif ( TUTORIAL_LAST_ID ) then TutorialFrame_Update(TUTORIAL_LAST_ID); end TutorialFrame_CheckBadge(); end function TutorialFrame_Hide() PlaySound("igMainMenuClose"); HideUIPanel(TutorialFrame); if ( getn(TUTORIALFRAME_QUEUE) > 0 ) then TutorialFrame_AlertButton_OnClick( TutorialFrameAlertButton ); end end function TutorialFrame_CheckBadge() TutorialFrameAlertButtonBadge:Hide(); TutorialFrameAlertButtonBadgeText:Hide(); --[[ leaving this here in case the badge system make a return if( getn(TUTORIALFRAME_QUEUE) > 1 or (TutorialFrame:IsShown() and getn(TUTORIALFRAME_QUEUE) > 0) ) then TutorialFrameAlertButtonBadge:Show(); local count = getn(TUTORIALFRAME_QUEUE); if ( not TutorialFrame:IsShown() ) then count = count - 1; end TutorialFrameAlertButtonBadgeText:SetText( count ); TutorialFrameAlertButtonBadgeText:Show(); else TutorialFrameAlertButtonBadge:Hide(); TutorialFrameAlertButtonBadgeText:Hide(); end --]] end function TutorialFrame_ClearQueue() TUTORIALFRAME_QUEUE = { }; end