wobin@1: AddonName, AfterDark = ... wobin@1: LibStub("AceTimer-3.0"):Embed(AfterDark) wobin@1: LibStub("AceEvent-3.0"):Embed(AfterDark) wobin@1: wobin@1: AfterDark.L = LibStub("AceLocale-3.0"):GetLocale("AfterDark", true) wobin@1: local L = AfterDark.L wobin@1: wobin@1: local RIDE = "Interface\\AddOns\\AfterDark\\Images\\rotv.mp3" wobin@1: local ANTHEM = "Interface\\AddOns\\AfterDark\\Images\\fta.mp3" wobin@1: wobin@1: local SCREEN_HEIGHT = GetScreenHeight() wobin@1: local SCREEN_WIDTH = GetScreenWidth() wobin@1: wobin@1: local ScreenSaving = false wobin@1: wobin@1: burntoutToasters, shinyToasters, toasterRack, pendingFlight = {}, {}, {}, {} wobin@1: wobin@1: function OnFinished(self) wobin@1: if ScreenSaving then wobin@1: table.insert(pendingFlight, AfterDark:ScheduleTimer("SpawnMonkey", 0 )) wobin@1: if #shinyToasters < AfterDark.db.profile.Busy then wobin@1: table.insert(pendingFlight, AfterDark:ScheduleTimer("SpawnMonkey", math.random(0, AfterDark.db.profile.Speed))) wobin@1: end wobin@1: end wobin@1: AfterDark:CleanCrumbTray(self.parent) wobin@1: end wobin@1: wobin@1: function AfterDark:BringMeTheHeadOfAlfredoGarcia() wobin@1: local frame = table.remove(burntoutToasters) wobin@1: if not frame then wobin@1: frame = CreateFrame("Frame", nil, UIParent) wobin@1: frame:SetFrameStrata("BACKGROUND") wobin@1: frame:SetFrameLevel(math.random(1,60)) wobin@1: frame:SetHeight(64) wobin@1: frame:SetWidth(64) wobin@1: wobin@1: frame.mover = frame:CreateAnimationGroup() wobin@1: frame.mover.parent = frame wobin@1: frame.mover:SetLooping("NONE") wobin@1: frame.mover:SetScript("OnFinished", OnFinished) wobin@1: wobin@1: frame.transporter = frame.mover:CreateAnimation("Translation") wobin@1: frame.zoomer = frame.mover:CreateAnimation("Scale") wobin@1: wobin@1: if math.random(0,100) < 85 then wobin@1: AfterDark:ConstructToaster(frame) wobin@1: else wobin@1: AfterDark:SliceBread(frame) wobin@1: end wobin@1: end wobin@1: wobin@1: wobin@1: table.insert(shinyToasters, frame) wobin@1: if not toasterRack[frame] then wobin@1: toasterRack[frame] = true wobin@1: end wobin@1: return frame wobin@1: end wobin@1: wobin@1: function AfterDark:SpawnMonkey() wobin@1: local halfHeight = SCREEN_HEIGHT/2 wobin@1: local yOffset = math.random(-halfHeight, halfHeight) wobin@1: wobin@1: local scale = math.random(0.75, 1.5) wobin@1: wobin@1: if #shinyToasters >= AfterDark.db.profile.Busy then return end wobin@1: local head = self:BringMeTheHeadOfAlfredoGarcia() wobin@1: wobin@1: head:ClearAllPoints() wobin@1: head:SetPoint("RIGHT", UIParent, "RIGHT", 64, yOffset) wobin@1: wobin@1: local yLanding = math.random(-halfHeight, halfHeight) wobin@1: wobin@1: if head.IsToast then head.shade:SetAlpha(1 - AfterDark.db.profile.Darkness) end -- Retoast the bread wobin@1: head:Respeed() wobin@1: wobin@1: head.transporter:SetOffset(-SCREEN_WIDTH - 64 * scale, yLanding) wobin@1: head.transporter:SetDuration(AfterDark.db.profile.Speed) wobin@1: head.zoomer:SetScale(scale, scale) wobin@1: head.zoomer:SetDuration(AfterDark.db.profile.Speed) wobin@1: head:Start() wobin@1: end wobin@1: wobin@1: function AfterDark:PlayThatFunkyMusic() wobin@1: if AfterDark.db.profile.Music == "zRandom" then wobin@1: if math.random(1,2) == 1 then wobin@1: PlayMusic(RIDE) wobin@1: else wobin@1: PlayMusic(ANTHEM) wobin@1: end wobin@1: return wobin@1: else wobin@1: if AfterDark.db.profile.Music == "Ride" then wobin@1: PlayMusic(RIDE) wobin@1: else wobin@1: PlayMusic(ANTHEM) wobin@1: end wobin@1: end wobin@1: end wobin@1: wobin@1: function AfterDark:ScheduleFlight() wobin@1: StopMusic() wobin@1: table.insert(pendingFlight, self:ScheduleTimer("PlayThatFunkyMusic", 1)) wobin@1: table.insert(pendingFlight, self:ScheduleTimer("BeFreeMyPretties", 4)) wobin@1: end wobin@1: wobin@1: function AfterDark:BeFreeMyPretties() wobin@1: for i=1,AfterDark.db.profile.Busy do wobin@1: table.insert(pendingFlight, AfterDark:ScheduleTimer("SpawnMonkey", math.random(0, AfterDark.db.profile.Speed))) wobin@1: end wobin@1: wobin@1: end wobin@1: wobin@1: function AfterDark:QuickItsTheFuzz() wobin@1: for i,v in ipairs(pendingFlight) do wobin@1: AfterDark:CancelTimer(v, true) wobin@1: end wobin@1: for v,_ in pairs(toasterRack) do wobin@1: v:Finish() wobin@1: self:CleanCrumbTray(v) wobin@1: end wobin@1: pendingFlight = {} wobin@1: StopMusic() wobin@1: end wobin@1: wobin@1: function AfterDark:CleanCrumbTray(frame) wobin@1: for i = #shinyToasters, 1, -1 do wobin@1: if frame == shinyToasters[i] then wobin@1: table.insert(burntoutToasters, table.remove(shinyToasters, i)) wobin@1: return wobin@1: end wobin@1: end wobin@1: end wobin@1: wobin@1: function AfterDark:LightsAreOnButNobodysHome(eventName, target) wobin@1: if target ~= "player" then return end wobin@1: if UnitIsAFK("player") then wobin@1: ScreenSaving = true wobin@1: self:ScheduleFlight() wobin@1: else wobin@1: ScreenSaving = false wobin@1: self:QuickItsTheFuzz() wobin@1: end wobin@1: end wobin@1: wobin@1: function AfterDark:SetMeUp(event, addon) wobin@1: if addon ~= "AfterDark" then return end wobin@1: self:RegisterEvent("PLAYER_FLAGS_CHANGED", "LightsAreOnButNobodysHome") wobin@1: self.db = LibStub("AceDB-3.0"):New("AfterDarkDB", {profile = { Busy = 30, Music = "zRandom", Darkness = 0.5, Speed = 10 } }) wobin@1: AfterDark:SetupOptions() wobin@1: end wobin@1: wobin@1: AfterDark:RegisterEvent("ADDON_LOADED", "SetMeUp") wobin@1: