Implement buying merchandise off shelf

Refreshes the shelf after buying and after closing chest.
This commit is contained in:
Tyler Hallada 2020-11-02 01:39:45 -05:00
parent 69b87517ec
commit ece73fcf0e
6 changed files with 107 additions and 9 deletions

Binary file not shown.

View File

@ -1,10 +1,85 @@
scriptname BRMerchActivatorScript extends ObjectReference
Actor Property PlayerRef Auto
Keyword property BRLinkMerchShelf auto
Keyword property BRLinkMerchChest auto
Keyword property BRLinkItemRef auto
Keyword property BRLinkActivatorRef auto
Keyword property BRLinkMerchToggle auto
Keyword property BRLinkMerchNext auto
Keyword property BRLinkMerchPrev auto
Activator property ActivatorStatic auto
Actor property PlayerRef auto
Quest property BRQuest auto
MiscObject property Gold001 auto
Event OnActivate(ObjectReference akActionRef)
event OnActivate(ObjectReference akActionRef)
if akActionRef == PlayerRef
Form merch = BRMerchandiseList.Buy(self)
PlayerRef.AddItem(merch, 1)
debug.Trace("BRMerchActivatorScript OnActivate by PlayerRef")
int totalQuantity = BRMerchandiseList.GetQuantity(self)
int price = BRMerchandiseList.GetPrice(self)
BRQuestScript BRScript = BRQuest as BRQuestScript
ObjectReference merchRef = self.GetLinkedRef(BRLinkItemRef)
Form selectedMerchandiseRepl = BRScript.SelectedMerchandise.GetBaseObject()
selectedMerchandiseRepl.SetName(merchRef.GetBaseObject().GetName())
bool inBuyMenu = true
int quantity = 1
while inBuyMenu
int amount = quantity * price
int choice = BRScript.BuyMerchandiseMessage.Show(quantity as float, totalQuantity as float, amount as float, price as float)
if choice == 0
bool result = BRTransaction.Create(BRScript.ApiUrl, BRScript.ApiKey, BRScript.ActiveShopId, false, quantity, amount, BRLinkItemRef, self)
if !result
Debug.MessageBox("Failed to buy merchandise.\n\n" + BRScript.BugReportCopy)
endif
inBuyMenu = false
elseif choice == 1
bool result = BRTransaction.Create(BRScript.ApiUrl, BRScript.ApiKey, BRScript.ActiveShopId, false, totalQuantity, totalQuantity * price, BRLinkItemRef, self)
if !result
Debug.MessageBox("Failed to buy merchandise.\n\n" + BRScript.BugReportCopy)
endif
inBuyMenu = false
elseif choice == 2
string enteredQuantity = BRScript.UILib.ShowTextInput("Enter Quantity", "")
if enteredQuantity as int == 0
debug.Notification("Failed to parse a valid quantity. Enter a number between 1 and " + totalQuantity)
elseif enteredQuantity < 1
debug.Notification("Entered quantity less than minimum quantity: 1. Setting quantity to 1")
quantity = 1
elseif enteredQuantity as int > totalQuantity
debug.Notification("Entered quantity greater than maximum quantity: " + totalQuantity + ". Setting quantity to " + totalQuantity)
quantity = totalQuantity
else
quantity = enteredQuantity as int
endif
else
inBuyMenu = false
endif
endWhile
selectedMerchandiseRepl.SetName("Selected Merchandise")
endif
EndEvent
endEvent
function RefreshMerchandise()
BRQuestScript BRScript = BRQuest as BRQuestScript
ObjectReference merchantShelf = self.GetLinkedRef(BRLinkMerchShelf)
if !BRMerchandiseList.Refresh(BRScript.ApiUrl, BRScript.ApiKey, BRScript.ActiveShopId, merchantShelf, ActivatorStatic, BRLinkMerchShelf, BRLinkMerchChest, BRLinkItemRef, BRLinkActivatorRef, BRLinkMerchToggle, BRLinkMerchNext, BRLinkMerchPrev)
Debug.MessageBox("Failed refresh merchandise.\n\n" + BRScript.BugReportCopy)
endif
endFunction
event OnCreateTransactionSuccess(int id, int quantity, int amount)
debug.Trace("BRMerchActivatorScript OnCreateTransactionSuccess id: " + id + " quantity: " + quantity + " amount: " + amount)
ObjectReference merchRef = self.GetLinkedRef(BRLinkItemRef)
PlayerRef.RemoveItem(Gold001, amount)
PlayerRef.AddItem(merchRef.GetBaseObject(), quantity)
RefreshMerchandise()
endEvent
; TODO: gracefully handle expected error cases (e.g. someone else buys all of item before this player can buy them)
Event OnCreateTransactionFail(string error)
Debug.Trace("BRMerchActivatorScript OnCreateTransactionFail error: " + error)
BRQuestScript BRScript = BRQuest as BRQuestScript
Debug.MessageBox("Failed to buy merchandise.\n\n" + error + "\n\n" + BRScript.BugReportCopy)
RefreshMerchandise()
endEvent

View File

@ -1,5 +1,13 @@
Scriptname BRMerchChestScript extends ObjectReference
Keyword property BRLinkMerchShelf auto
Keyword property BRLinkMerchChest auto
Keyword property BRLinkItemRef auto
Keyword property BRLinkActivatorRef auto
Keyword property BRLinkMerchToggle auto
Keyword property BRLinkMerchNext auto
Keyword property BRLinkMerchPrev auto
Activator property ActivatorStatic auto
Actor Property PlayerRef Auto
Quest Property BRQuest Auto
@ -28,6 +36,11 @@ event OnCreateMerchandiseSuccess(bool created, int id)
BRQuestScript BRScript = BRQuest as BRQuestScript
BRScript.MerchandiseListId = id;
Debug.Notification("Saved merchandise successfully")
ObjectReference merchantShelf = self.GetLinkedRef(BRLinkMerchShelf)
if !BRMerchandiseList.Refresh(BRScript.ApiUrl, BRScript.ApiKey, BRScript.ActiveShopId, merchantShelf, ActivatorStatic, BRLinkMerchShelf, BRLinkMerchChest, BRLinkItemRef, BRLinkActivatorRef, BRLinkMerchToggle, BRLinkMerchNext, BRLinkMerchPrev)
Debug.MessageBox("Failed refresh merchandise.\n\n" + BRScript.BugReportCopy)
endif
else
Debug.Trace("BRMerchChestScript no container changes to save to the server")
endif

View File

@ -4,9 +4,12 @@ scriptname BRMerchandiseList
bool function Toggle(string apiUrl, string apiKey, int shop_id, ObjectReference merchantShelf, Form activatorStatic, Keyword shelfKeyword, Keyword chestKeyword, Keyword itemKeyword, Keyword activatorKeyword, Keyword toggleKeyword, Keyword nextKeyword, Keyword prevKeyword) global native
bool function NextPage(string apiUrl, string apiKey, int shop_id, ObjectReference merchantShelf, Form activatorStatic, Keyword shelfKeyword, Keyword chestKeyword, Keyword itemKeyword, Keyword activatorKeyword, Keyword toggleKeyword, Keyword nextKeyword, Keyword prevKeyword) global native
bool function PrevPage(string apiUrl, string apiKey, int shop_id, ObjectReference merchantShelf, Form activatorStatic, Keyword shelfKeyword, Keyword chestKeyword, Keyword itemKeyword, Keyword activatorKeyword, Keyword toggleKeyword, Keyword nextKeyword, Keyword prevKeyword) global native
bool function Load(string apiUrl, string apiKey, int shop_id, ObjectReference merchantShelf, Form activatorStatic, Keyword shelfKeyword, Keyword chestKeyword, Keyword itemKeyword, Keyword activatorKeyword, Keyword toggleKeyword, Keyword nextKeyword, Keyword prevKeyword) global native
bool function Refresh(string apiUrl, string apiKey, int shop_id, ObjectReference merchantShelf, Form activatorStatic, Keyword shelfKeyword, Keyword chestKeyword, Keyword itemKeyword, Keyword activatorKeyword, Keyword toggleKeyword, Keyword nextKeyword, Keyword prevKeyword) global native
bool function Replace3D(ObjectReference merchantShelf, Form activatorStatic, Keyword shelfKeyword, Keyword itemKeyword) global native
Form function Buy(ObjectReference merchandiseActivator) global native
bool function Create(string apiUrl, string apiKey, int shopId, ObjectReference merchantChest) global native
bool function Create(string apiUrl, string apiKey, int shopId, ObjectReference merchantChest) global native
int function GetQuantity(ObjectReference activator) global native
int function GetPrice(ObjectReference activator) global native

View File

@ -20,9 +20,13 @@ int property ActiveShopId auto
string property ActiveShopName auto
string property ActiveShopDescription auto
; references
actor property PlayerRef auto
Actor property PlayerRef auto
ObjectReference property ShopXMarker auto
message property ShopDetailMessage auto
; messages
Message property ShopDetailMessage auto
Message property BuyMerchandiseMessage auto
; message replacement refs
ObjectReference property SelectedMerchandise auto
; UI sync properties
bool property StartModFailed = false auto
bool property UpdateShopComplete = false auto

View File

@ -0,0 +1,3 @@
scriptname BRTransaction
bool function Create(string apiUrl, string apiKey, int shop_id, bool is_sell, int quantity, int amount, Keyword item_keyword, ObjectReference activator) global native