view AfterDark.lua @ 13:3a5816741bcb tip

Added tag v1.0Release for changeset 2761550de087
author wobin
date Sun, 20 Dec 2009 22:29:05 +1100
parents f601b8507480
children
line wrap: on
line source
AddonName, AfterDark = ...
LibStub("AceTimer-3.0"):Embed(AfterDark)
LibStub("AceEvent-3.0"):Embed(AfterDark)

AfterDark.L = LibStub("AceLocale-3.0"):GetLocale("AfterDark", true)
local L = AfterDark.L

local RIDE = "Interface\\AddOns\\AfterDark\\Images\\rotv.mp3"
local ANTHEM = "Interface\\AddOns\\AfterDark\\Images\\fta.mp3"

local SCREEN_HEIGHT = GetScreenHeight()
local SCREEN_WIDTH = GetScreenWidth()

local ScreenSaving = false

burntoutToasters, shinyToasters, toasterRack, pendingFlight = {}, {}, {}, {}

function OnFinished(self)
	if ScreenSaving then 
		table.insert(pendingFlight, AfterDark:ScheduleTimer("SpawnMonkey", 0 ))
		if #shinyToasters < AfterDark.db.profile.Busy then
			table.insert(pendingFlight, AfterDark:ScheduleTimer("SpawnMonkey", math.random(0, AfterDark.db.profile.Speed)))
		end
	end
	AfterDark:CleanCrumbTray(self.parent)
end

function AfterDark:BringMeTheHeadOfAlfredoGarcia()
	local frame = table.remove(burntoutToasters)
	if not frame then
		frame = CreateFrame("Frame", nil, UIParent)
		frame:SetFrameStrata("BACKGROUND")
		frame:SetFrameLevel(math.random(1,60))
		frame:SetHeight(64)
		frame:SetWidth(64)
	
		frame.mover = frame:CreateAnimationGroup()
		frame.mover.parent = frame
		frame.mover:SetLooping("NONE")
		frame.mover:SetScript("OnFinished", OnFinished)	

		frame.transporter = frame.mover:CreateAnimation("Translation")
		frame.zoomer = frame.mover:CreateAnimation("Scale")

		if math.random(0,100) < 85 then
			AfterDark:ConstructToaster(frame)
		else
			AfterDark:SliceBread(frame)
		end	
	end	


	table.insert(shinyToasters, frame)
	if not toasterRack[frame] then
		toasterRack[frame] = true
	end
	return frame
end

function AfterDark:SpawnMonkey()
	local halfHeight = SCREEN_HEIGHT/2
	local yOffset = math.random(-halfHeight, halfHeight)
	
	local scale = math.random(0.75, 1.5)

	if #shinyToasters >= AfterDark.db.profile.Busy then return end
	local head = self:BringMeTheHeadOfAlfredoGarcia()

	head:ClearAllPoints()
	head:SetPoint("RIGHT", UIParent, "RIGHT", 64, yOffset)

	local yLanding = math.random(-halfHeight, halfHeight)

	if head.IsToast then head.shade:SetAlpha(1 - AfterDark.db.profile.Darkness) end -- Retoast the bread
	head:Respeed()

	head.transporter:SetOffset(-SCREEN_WIDTH - 64 * scale, yLanding)
	head.transporter:SetDuration(AfterDark.db.profile.Speed)
	head.zoomer:SetScale(scale, scale)
	head.zoomer:SetDuration(AfterDark.db.profile.Speed)
	head:Start()
end

function AfterDark:PlayThatFunkyMusic()
	if AfterDark.db.profile.Music == "zRandom" then
		if math.random(1,2) == 1 then
			PlayMusic(RIDE)
		else
			PlayMusic(ANTHEM)
		end
		return
	else
		if AfterDark.db.profile.Music == "Ride" then
			PlayMusic(RIDE)
		else
			PlayMusic(ANTHEM)
		end
	end
end

function AfterDark:ScheduleFlight()
	StopMusic()
	table.insert(pendingFlight, self:ScheduleTimer("PlayThatFunkyMusic", 1))
	table.insert(pendingFlight, self:ScheduleTimer("BeFreeMyPretties", 4))
end

function AfterDark:BeFreeMyPretties()
	for i=1,AfterDark.db.profile.Busy do
		table.insert(pendingFlight, AfterDark:ScheduleTimer("SpawnMonkey", math.random(0, AfterDark.db.profile.Speed)))
	end

end

function AfterDark:QuickItsTheFuzz()
	for i,v in ipairs(pendingFlight) do
		AfterDark:CancelTimer(v, true)
	end
	for v,_ in pairs(toasterRack) do
		v:Finish()
		self:CleanCrumbTray(v)
	end
	pendingFlight = {}
	StopMusic()
end

function AfterDark:CleanCrumbTray(frame)
	for i = #shinyToasters, 1, -1 do
		if frame == shinyToasters[i] then
			table.insert(burntoutToasters, table.remove(shinyToasters, i))
			return
		end
	end
end

function AfterDark:LightsAreOnButNobodysHome(eventName, target)
	if target ~= "player" then return end
	if UnitIsAFK("player") then 
		ScreenSaving = true
		self:ScheduleFlight()
	else
		ScreenSaving = false
		self:QuickItsTheFuzz()
	end
end

function AfterDark:SetMeUp(event, addon)
	if addon ~= "AfterDark" then return end
	self:RegisterEvent("PLAYER_FLAGS_CHANGED", "LightsAreOnButNobodysHome")
	self.db = LibStub("AceDB-3.0"):New("AfterDarkDB", {profile = { Busy = 30, Music = "zRandom", Darkness = 0.5, Speed = 10 } })
	AfterDark:SetupOptions()
end

AfterDark:RegisterEvent("ADDON_LOADED", "SetMeUp")