You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
500 lines
18 KiB
500 lines
18 KiB
local FILE_PATH = "Interface\\AddOns\\Narcissus\\ART\\Splash\\Mawmart\\";
|
|
|
|
local After = C_Timer.After
|
|
local pi = math.pi;
|
|
local sin = math.sin;
|
|
local L = Narci.L;
|
|
|
|
local isMinimapHooked, SetUpMainButton, CreateMailButton;
|
|
|
|
local COLORS = {
|
|
Blue = {0, 113/255, 220/255}, -- 0.44, 0.86
|
|
DarkBlue = {4/255, 30/255, 60/255},
|
|
LightBlue = {91/255, 177/255, 1},
|
|
Green = {62/255, 173/255, 91/255},
|
|
};
|
|
|
|
local function GetColor(key)
|
|
return unpack(COLORS[key]);
|
|
end
|
|
|
|
local HEADER_HEIGHT = 32;
|
|
local FRAME_HEIGHT;
|
|
local MainFrame, BuyButton, BackdropOverlay;
|
|
|
|
|
|
local function outSine(t, b, e, d)
|
|
return (e - b) * sin(t / d * (pi / 2)) + b
|
|
end
|
|
|
|
local function Header_OnUpdate(self, elapsed)
|
|
self.t = self.t + elapsed;
|
|
local logoX, labelX;
|
|
if self.t > 0 then
|
|
logoX = outSine(self.t, -256, 8, self.duration);
|
|
labelX = outSine(self.t, 256, -56, self.duration);
|
|
local h = outSine(self.t, FRAME_HEIGHT, HEADER_HEIGHT, self.duration);
|
|
if self.t > self.duration then
|
|
h = HEADER_HEIGHT;
|
|
logoX = 8;
|
|
labelX = -56;
|
|
self:SetScript("OnUpdate", nil);
|
|
MainFrame.Content.FadeIn:Play();
|
|
MainFrame.Content:Show();
|
|
end
|
|
BackdropOverlay:SetHeight(h);
|
|
else
|
|
logoX = -256;
|
|
labelX = 256;
|
|
end
|
|
self.Logo1:SetPoint("LEFT", self, "LEFT", logoX, 0);
|
|
self.Label1:SetPoint("RIGHT", self, "RIGHT", labelX, 0);
|
|
end
|
|
|
|
local itemData = {
|
|
{name = "Incense", thumbnail = "Incense1", price = 1120, rating = 1.5, itemName = "Wrynnfall - Brass Incense Stick Holder - Limited Edition - Designed by Dan", numPreview = 3, category="Home / Decor / Candles & Home Fragrance", },
|
|
{name = "Lego", thumbnail = "Lego1", price = 69.99, rating = 5.0, itemName = "Mediocre Bad Guys: Reassembled Nathaniel Minifigure", numPreview = 3, category="Toys / Building Sets & Blocks / LETGO", },
|
|
{name = "Mug", thumbnail = "Mug1", price = 59.99 , rating = 2.8, itemName = "Best Dad Ever - Ceramic Coffee Mug Sets - 11 oz - Father's Day Gifts", numPreview = 3, category="Party & Occasions / Party Supplies / Party Tableware"},
|
|
{name = "Castle", thumbnail = "Castle1", price = 49.99, rating = 4.6, itemName = "The Moving Castle - Eredar Children\'s Sand Castle Building Kit", numPreview = 4, category="Toys / Outdoor Play / Sandboxes & Water Tables", },
|
|
{name = "Jigsaw", thumbnail = "Jigsaw1", price = 829, rating = 3.4, itemName = "House of Light Jigsaw 1000 Pieces", numPreview = 2, category="Toys / Games & Puzzles / Puzzles", },
|
|
};
|
|
|
|
local function ShowMinimapMailButton(mailID)
|
|
local MapButton = MiniMapMailFrame;
|
|
local senderName;
|
|
if mailID == 1 then
|
|
senderName = "The Mailer";
|
|
else
|
|
senderName = "Oribos Customs and Portal Protection";
|
|
end
|
|
if not isMinimapHooked then
|
|
isMinimapHooked = true;
|
|
MapButton:HookScript("OnEnter", function(f)
|
|
GameTooltip:Hide();
|
|
GameTooltip:SetOwner(f, "ANCHOR_BOTTOMLEFT");
|
|
if GameTooltip:IsOwned(f) then
|
|
local senders = { senderName, GetLatestThreeSenders() };
|
|
local headerText = #senders >= 1 and HAVE_MAIL_FROM or HAVE_MAIL;
|
|
FormatUnreadMailTooltip(GameTooltip, headerText, senders);
|
|
GameTooltip:Show();
|
|
end
|
|
end);
|
|
end
|
|
MapButton:Show();
|
|
end
|
|
|
|
local function OtherItem_OnEnter(self)
|
|
self.Underline.Expand:Play();
|
|
self.Underline:Show();
|
|
end
|
|
|
|
local function OtherItem_OnLeave(self)
|
|
self.Underline.Expand:Stop();
|
|
self.Underline:Hide();
|
|
end
|
|
|
|
local function OtherItem_OnClick(self)
|
|
MainFrame:DisplayItem(self.index);
|
|
end
|
|
|
|
local function SmallPreview_OnEnter(self)
|
|
for i, button in pairs(self:GetParent().Previews) do
|
|
button.Underline:Hide();
|
|
button.Underline.Expand:Stop();
|
|
end
|
|
self.Underline.Expand:Play();
|
|
self.Underline:Show();
|
|
MainFrame.Content.MainPreview:SetTexture(FILE_PATH.. itemData[self.itemIndex].name .. self.order);
|
|
end
|
|
|
|
NarciItemShopMixin = {};
|
|
|
|
function NarciItemShopMixin:OnLoad()
|
|
MainFrame = self;
|
|
FRAME_HEIGHT = self:GetHeight();
|
|
self.ShopLogoLeft:SetTexture(FILE_PATH.. "EntranceLogoLeft");
|
|
self.ShopLogoRight:SetTexture(FILE_PATH.. "EntranceLogoRight");
|
|
BackdropOverlay = self.BackdropOverlay;
|
|
--self:PlayEntrance();
|
|
|
|
--Set Delivery Time
|
|
local futureDay = time() + 86400 * 3;
|
|
local dateString = date("%a, %b %d", futureDay);
|
|
self.Content.ETA:SetText(string.format("Arrives by %s", dateString));
|
|
|
|
--Create OtherItems
|
|
local OtherItemsFrame = self.Content.OtherItemsFrame;
|
|
local NUM_BUTTONS = #itemData;
|
|
local button;
|
|
local buttonWidth, buttonOffset;
|
|
for i = 1, NUM_BUTTONS do
|
|
button = CreateFrame("Button", nil, OtherItemsFrame, "NarciItemShopOtherItemButtonTemplate");
|
|
button:ClearAllPoints();
|
|
button:SetScript("OnEnter", OtherItem_OnEnter);
|
|
button:SetScript("OnLeave", OtherItem_OnLeave);
|
|
button:SetScript("OnClick", OtherItem_OnClick);
|
|
button.Underline:SetColorTexture( GetColor("Blue") );
|
|
if i == 1 then
|
|
buttonWidth = button:GetWidth();
|
|
local w = OtherItemsFrame:GetWidth();
|
|
buttonOffset = (w - NUM_BUTTONS * buttonWidth) / (NUM_BUTTONS - 1);
|
|
button:SetPoint("BOTTOMLEFT", OtherItemsFrame, "BOTTOMLEFT", 0, 18);
|
|
else
|
|
button:SetPoint("BOTTOMLEFT", OtherItemsFrame.ItemButtons[i - 1], "BOTTOMRIGHT", buttonOffset, 0);
|
|
end
|
|
button.Thumbnail:SetTexture(FILE_PATH.. itemData[i].thumbnail, nil, nil, "TRILINEAR");
|
|
button.Name:SetText(itemData[i].itemName);
|
|
button.Price:SetText(string.format("$%.2f", itemData[i].price));
|
|
button.index = i;
|
|
end
|
|
|
|
--Small Previews
|
|
local PreviewFrame = self.Content.PreviewFrame;
|
|
for i = 1, 4 do
|
|
button = CreateFrame("Button", nil, PreviewFrame, "NarciItemShopSmallPreviewTemplate");
|
|
button:ClearAllPoints();
|
|
button:SetScript("OnEnter", SmallPreview_OnEnter);
|
|
button.Underline:SetColorTexture( GetColor("Blue") );
|
|
button.order = i;
|
|
if i == 1 then
|
|
button:SetPoint("TOPLEFT", PreviewFrame, "TOPLEFT", 0, 0);
|
|
else
|
|
button:SetPoint("TOP", PreviewFrame.Previews[i - 1], "BOTTOM", 0, -10);
|
|
end
|
|
button:Hide();
|
|
end
|
|
|
|
self:DisplayItem(1);
|
|
end
|
|
|
|
function NarciItemShopMixin:OnMouseDown()
|
|
--self:PlayEntrance();
|
|
end
|
|
|
|
function NarciItemShopMixin:PlayEntrance()
|
|
self.isPlayed = true;
|
|
self.BackdropOverlay:SetHeight(FRAME_HEIGHT);
|
|
self.BackdropOverlay:SetColorTexture( GetColor("Blue") );
|
|
self.ShopLogoLeft:ClearAllPoints();
|
|
self.ShopLogoLeft:SetPoint("CENTER", self, "CENTER", 0, 0);
|
|
self.ShopLogoRight:ClearAllPoints();
|
|
self.ShopLogoRight:SetPoint("CENTER", self, "CENTER", 0, 0);
|
|
self:StopAnimating();
|
|
self.Header:Hide();
|
|
self.Header:SetScript("OnUpdate", nil);
|
|
self.Content:Hide();
|
|
self.Content:SetAlpha(0);
|
|
self.Backdrop:Hide();
|
|
self.animationIndex = 0;
|
|
self:PlayNextAnimation();
|
|
end
|
|
|
|
function NarciItemShopMixin:PlayNextAnimation()
|
|
local index = self.animationIndex + 1;
|
|
self.animationIndex = index;
|
|
if index == 1 then
|
|
self.SponsoredBy.FadeIn:Play();
|
|
elseif index == 2 then
|
|
self.SponsoredBy.FadeOut:Play();
|
|
self.ShopLogoLeft.FlyUp:Play();
|
|
elseif index == 3 then
|
|
self.ShopLogoLeft.FlyDown:Play();
|
|
self.Slogan.Fade:Play();
|
|
After(0.02, function()
|
|
self.BackdropOverlay:SetColorTexture( GetColor("DarkBlue") );
|
|
self.Header:SetScript("OnUpdate", Header_OnUpdate);
|
|
self.Header:Show();
|
|
end);
|
|
self.Backdrop:Show();
|
|
self.Header.t = -3.5;
|
|
self.Header.duration = 1.5;
|
|
self.ShopLogoRight.FlyIn:Play();
|
|
end
|
|
end
|
|
|
|
function NarciItemShopMixin:SetRating(rating)
|
|
local f = self.Content.RatingFrame;
|
|
local ratingCap = 5;
|
|
if rating > ratingCap then
|
|
rating = ratingCap;
|
|
end
|
|
if not f.stars then
|
|
f.stars = {};
|
|
local star;
|
|
for i = 1, ratingCap do
|
|
star = f:CreateTexture(nil, "OVERLAY");
|
|
star:SetSize(12, 12);
|
|
star:SetPoint("LEFT", f, "LEFT", (i - 1) * 12, 0);
|
|
star:SetTexture(FILE_PATH.."RatingStar");
|
|
f.stars[i] = star;
|
|
end
|
|
end
|
|
local numStars = math.ceil(rating);
|
|
local star;
|
|
for i = 1, numStars do
|
|
star = f.stars[i];
|
|
if i == numStars then
|
|
if rating == numStars then
|
|
star:SetTexCoord(0, 0.25, 0, 1);
|
|
else
|
|
--half
|
|
star:SetTexCoord(0.25, 0.5, 0, 1);
|
|
end
|
|
else
|
|
--full
|
|
star:SetTexCoord(0, 0.25, 0, 1);
|
|
end
|
|
end
|
|
for i = numStars + 1, ratingCap do
|
|
star = f.stars[i];
|
|
--hollow
|
|
star:SetTexCoord(0.5, 0.75, 0, 1);
|
|
end
|
|
|
|
f.Number:SetText(string.format("(%.1f)", rating));
|
|
end
|
|
|
|
function NarciItemShopMixin:DisplayItem(index)
|
|
local data = itemData[index];
|
|
if not data then return end;
|
|
|
|
if index ~= self.displayedItem then
|
|
self.displayedItem = index;
|
|
else
|
|
return
|
|
end
|
|
|
|
--self.Content.MainPreview:SetTexture(FILE_PATH.. data.name.."1");
|
|
self.Content.ItemHeader:SetText(data.itemName);
|
|
self.Content.Price:SetText(string.format("$oul %.2f", data.price));
|
|
self.Content.ItemCategory:SetText(data.category);
|
|
self:SetRating(data.rating);
|
|
BuyButton.index = index;
|
|
BuyButton:SetState(data.isPurchased);
|
|
|
|
local numPreview = data.numPreview;
|
|
local Previews = self.Content.PreviewFrame.Previews;
|
|
for i = 1, numPreview do
|
|
Previews[i].Thumbnail:SetTexture(FILE_PATH.. data.name .. i, nil, nil, "TRILINEAR");
|
|
Previews[i].itemIndex = index;
|
|
Previews[i]:Show();
|
|
end
|
|
for i = numPreview + 1, #Previews do
|
|
Previews[i]:Hide();
|
|
end
|
|
SmallPreview_OnEnter(Previews[1]);
|
|
end
|
|
|
|
function NarciItemShopMixin:OnHide()
|
|
if self.hasBought then
|
|
self.hasBought = nil;
|
|
NarcissusDB.ShowOrderConfirmation = true;
|
|
CreateMailButton(1);
|
|
ShowMinimapMailButton(1);
|
|
ShowMinimapMailButton(1);
|
|
SetUpMainButton("The Mailer", "Your Order Has Been Verified", 365, 133473);
|
|
end
|
|
end
|
|
|
|
NarciItemShopBuyButtonMixin = {};
|
|
|
|
function NarciItemShopBuyButtonMixin:OnLoad()
|
|
BuyButton = self;
|
|
end
|
|
|
|
function NarciItemShopBuyButtonMixin:OnEnter()
|
|
self.Background:SetColorTexture( GetColor("LightBlue") );
|
|
end
|
|
|
|
function NarciItemShopBuyButtonMixin:OnLeave()
|
|
self.Background:SetColorTexture( GetColor("Blue") );
|
|
end
|
|
|
|
function NarciItemShopBuyButtonMixin:OnClick()
|
|
self:SetState(true);
|
|
self.Shake:Play();
|
|
itemData[self.index].isPurchased = true;
|
|
NarcissusDB.UserIsCurious = true;
|
|
NarcissusDB.DeliveryArrival = time() + 86400 * 3;
|
|
MainFrame.hasBought = true;
|
|
end
|
|
|
|
function NarciItemShopBuyButtonMixin:SetState(isPurchased)
|
|
if isPurchased then
|
|
self:Disable();
|
|
self.Background:SetColorTexture( GetColor("Green") );
|
|
self.ButtonText:SetText("Purchased");
|
|
else
|
|
self:Enable();
|
|
self.Background:SetColorTexture( GetColor("Blue") );
|
|
self.ButtonText:SetText("Buy Now");
|
|
end
|
|
self.Shake:Stop();
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
--Mail
|
|
local presets = {};
|
|
|
|
local MailButton;
|
|
|
|
--MailButton.Button.Icon:SetTexture(133473);
|
|
|
|
local function SetOpenMain(contentIndex)
|
|
OpenMailInvoiceFrame:Hide();
|
|
OpenMailScrollFrame:Show();
|
|
|
|
local data = presets[contentIndex];
|
|
OpenMailSender.Name:SetText(data[1]);
|
|
OpenMailSubject:SetText(data[2]);
|
|
|
|
--Text
|
|
local playerName = UnitName("player");
|
|
OpenMailBodyText:SetText( string.format(data[3], playerName) , true);
|
|
OpenStationeryBackgroundLeft:SetTexture(136859);
|
|
OpenStationeryBackgroundRight:SetTexture(136860);
|
|
--Attachment
|
|
local attachmentText = OpenMailAttachmentText;
|
|
if attachmentText then
|
|
local marginxl = 10 + 4;
|
|
local marginxr = 43 + 4;
|
|
local areax = OpenMailFrame:GetWidth() - marginxl - marginxr;
|
|
local gapy1 = 3;
|
|
local gapy2 = 3;
|
|
local indenty = 28 + gapy2;
|
|
local iconx, icony = MailButton.Button:GetSize();
|
|
iconx, icony = iconx + 2, icony + 2;
|
|
local itemRowCount = 0;
|
|
local areay = gapy2 + attachmentText:GetHeight() + gapy2 + (icony * itemRowCount) + (gapy1 * (itemRowCount - 1)) + gapy2;
|
|
local scrollHeight = 305 - areay;
|
|
if (scrollHeight > 256) then
|
|
scrollHeight = 256;
|
|
areay = 305 - scrollHeight;
|
|
end
|
|
attachmentText:SetText(NO_ATTACHMENTS);
|
|
attachmentText:SetTextColor(0.5, 0.5, 0.5);
|
|
local height = attachmentText:GetHeight();
|
|
attachmentText:SetPoint("TOPLEFT", OpenMailFrame, "BOTTOMLEFT", marginxl + (areax - attachmentText:GetWidth()) / 2, indenty + (areay - height) / 2 + height);
|
|
|
|
-- Resize the scroll frame
|
|
local min = math.min;
|
|
OpenMailScrollFrame:SetHeight(scrollHeight);
|
|
OpenMailScrollChildFrame:SetHeight(scrollHeight);
|
|
OpenMailHorizontalBarLeft:SetPoint("TOPLEFT", "OpenMailFrame", "BOTTOMLEFT", 2, 39 + areay);
|
|
OpenScrollBarBackgroundTop:SetHeight(min(scrollHeight, 256));
|
|
OpenScrollBarBackgroundTop:SetTexCoord(0, 0.484375, 0, min(scrollHeight, 256) / 256);
|
|
OpenStationeryBackgroundLeft:SetHeight(scrollHeight);
|
|
OpenStationeryBackgroundLeft:SetTexCoord(0, 1.0, 0, min(scrollHeight, 256) / 256);
|
|
OpenStationeryBackgroundRight:SetHeight(scrollHeight);
|
|
OpenStationeryBackgroundRight:SetTexCoord(0, 1.0, 0, min(scrollHeight, 256) / 256);
|
|
|
|
-- Disable Button
|
|
OpenMailReplyButton:Disable();
|
|
OpenMailDeleteButton:SetText(MAIL_RETURN);
|
|
OpenMailReportSpamButton:Hide();
|
|
OpenMailSender:SetPoint("BOTTOMRIGHT", OpenMailFrame, "TOPRIGHT" , -12, -54);
|
|
end
|
|
--Hide Attachment Button
|
|
for key, itemButton in pairs(OpenMailFrame.OpenMailAttachments) do
|
|
itemButton:Hide();
|
|
end
|
|
|
|
if not GetLatestThreeSenders() then
|
|
MiniMapMailFrame:Hide();
|
|
end
|
|
|
|
NarcissusDB.ShowOrderConfirmation = nil;
|
|
end
|
|
|
|
function CreateMailButton(mailID)
|
|
if not MailButton then
|
|
MailButton = CreateFrame("Frame", nil, InboxFrame, "NarciMailItemTemplate");
|
|
MailButton:Hide();
|
|
local anchorTo = MailItem1;
|
|
MailButton:SetPoint("TOPLEFT", anchorTo, "TOPLEFT", 0, 0);
|
|
MailButton:SetPoint("BOTTOMRIGHT", anchorTo, "BOTTOMRIGHT", 0, 0);
|
|
MailButton:SetFrameStrata("HIGH");
|
|
MailButton.mailID = mailID;
|
|
|
|
|
|
local function MailButton_OnClick(self)
|
|
if ( self:GetChecked() ) then
|
|
--ShowUIPanel(OpenMailFrame);
|
|
OpenMailFrame:Show();
|
|
OpenMailFrameInset:SetPoint("TOPLEFT", 4, -80);
|
|
PlaySound(SOUNDKIT.IG_SPELLBOOK_OPEN);
|
|
InboxFrame.openMailID = nil;
|
|
if MailButton.mailID == 1 then
|
|
SetOpenMain("confirm");
|
|
else
|
|
SetOpenMain("confiscate");
|
|
end
|
|
end
|
|
MailButton:Hide();
|
|
NarcissusDB.ShowOrderConfirmation = nil;
|
|
end
|
|
|
|
local function MailButton_OnShow(self)
|
|
anchorTo:SetAlpha(0);
|
|
end
|
|
|
|
local function MailButton_OnHide(self)
|
|
MailButton:Hide();
|
|
anchorTo:SetAlpha(1);
|
|
if not GetLatestThreeSenders() then
|
|
MiniMapMailFrame:Hide();
|
|
end
|
|
end
|
|
|
|
MailButton.Button:SetScript("OnClick", MailButton_OnClick);
|
|
MailButton.Button:SetScript("OnShow", MailButton_OnShow);
|
|
MailButton.Button:SetScript("OnHide", MailButton_OnHide);
|
|
end
|
|
end
|
|
|
|
|
|
function SetUpMainButton(sender, subject, daysLeft, icon)
|
|
MailButton.Sender:SetText(sender);
|
|
MailButton.Subject:SetText(subject);
|
|
daysLeft = "|cff20ff20"..string.format(DAYS_ABBR, math.floor(daysLeft)).." |r"; --GREEN_FONT_COLOR_CODE
|
|
MailButton.ExpireTime:SetText(daysLeft);
|
|
MailButton.Button.Icon:SetTexture(icon);
|
|
MailButton:Show();
|
|
end
|
|
|
|
presets = {
|
|
confirm = {"The Mailer", "Your Mawmart Order Has Been Verified", "%s,\n\nThank you for your purchase. The master is pleased. For every Soul Coin you spend, a blade is forged, honed and ready to cut into the hearts of the non-believers.\n\nKind regards,\nThe Mailer"};
|
|
confiscate = {"Oribos Customs and Portal Protection", "We Have Seized Your Package", "Greetings Maw Walker,\n\nWe just confiscated a package sent from the Maw, and the items inside seemed to be purchased under your name. We have started an investigation to find the perpetrator because we are sure that a hero like you won't do anything to jeopardize the Purpose?"};
|
|
};
|
|
|
|
|
|
local MailLoader = CreateFrame("Frame");
|
|
MailLoader:RegisterEvent("PLAYER_ENTERING_WORLD");
|
|
MailLoader:SetScript("OnEvent", function(self, event)
|
|
self:UnregisterEvent(event);
|
|
local language = GetLocale();
|
|
if language ~= "enUS" then
|
|
return
|
|
end
|
|
if NarcissusDB.ShowOrderConfirmation then
|
|
C_Timer.After(2, function()
|
|
CreateMailButton(1);
|
|
ShowMinimapMailButton(1);
|
|
SetUpMainButton("The Mailer", "Your Order Has Been Verified", 365, 133473);
|
|
end)
|
|
end
|
|
if NarcissusDB.DeliveryArrival then
|
|
local now = time();
|
|
if now > NarcissusDB.DeliveryArrival then
|
|
NarcissusDB.DeliveryArrival = nil;
|
|
C_Timer.After(2.5, function()
|
|
CreateMailButton(2);
|
|
ShowMinimapMailButton(2);
|
|
SetUpMainButton("Oribos Customs and Portal Protection", "We Have Seized Your Package", 365, 354719);
|
|
end)
|
|
end
|
|
end
|
|
end)
|