diff --git a/README.md b/README.md
index ef40b5a..d677550 100644
--- a/README.md
+++ b/README.md
@@ -72,6 +72,10 @@ Um **Raspberry Pi Zero 2W** faz o port forwarding, o UPnP e o DNS da rede. Veja
Veja [docs/security-2015.md](docs/security-2015.md) para a lista completa das medidas de segurança (e das fraquezas mantidas de propósito).
+### Robux e Tix
+
+Moedas **virtuais** (sem dinheiro de verdade). Todo dia de login rende T$ 10, e membros do Builders Club ganham também o salário diário de Robux (BC 15, TBC 35, OBC 60). No catálogo, o item custa R$ preço ou T$ preço x 10. O saldo aparece no topo; a página `Money.aspx` mostra o saldo e, para admin, permite dar ou tirar saldo de um usuário.
+
### Modo bot (servidores 24/7)
Todo jogo publicado (os que já existem e os novos) ganha um servidor mantido por um bot chamado **HOST**, sem ninguém
diff --git a/RobloxServer.Web/Catalog.aspx.cs b/RobloxServer.Web/Catalog.aspx.cs
index 7fa9802..05a054e 100644
--- a/RobloxServer.Web/Catalog.aspx.cs
+++ b/RobloxServer.Web/Catalog.aspx.cs
@@ -19,11 +19,22 @@ public class Catalog : SocialPage
protected override string Handle(string verb, long id, User user)
{
- if (verb == "buy")
+ if (verb == "buy" || verb == "buytix")
{
CatalogItem item = CatalogService.Items.Find(i => i.Id == id);
if (item == null) return "That item does not exist.";
- if (!SocialStore.AddItem(user.Id, item.Id)) return "You already own this item.";
+ if (SocialStore.Owns(user.Id, item.Id)) return "You already own this item.";
+ int robux = verb == "buy" ? item.Price : 0;
+ int tix = verb == "buytix" ? item.Price * Economy.TixPerRobux : 0;
+ if ((robux > 0 || tix > 0) && !Economy.TryCharge(user.Id, robux, tix))
+ {
+ return verb == "buy" ? "You do not have enough Robux." : "You do not have enough Tix.";
+ }
+ if (!SocialStore.AddItem(user.Id, item.Id))
+ {
+ Economy.Grant(user.Id, robux, tix);
+ return "You already own this item.";
+ }
CatalogService.Items.Update(i => i.Id == id, i => i.Sales++);
NextUrl = Url("Inventory.aspx");
return null;
@@ -149,7 +160,7 @@ string RenderItem(CatalogItem item, User user)
sb.Append("
Every day you log in you get T$ " + Economy.DailyTix);
+ if (stipend > 0)
+ {
+ sb.Append(" and a stipend of R$ " + stipend + " (" + E(SocialStore.TierName(tier)) + ")");
+ }
+ sb.Append(". Catalog items cost Robux, or " + Economy.TixPerRobux + " Tix for each R$. ");
+ sb.Append(stipend > 0 ? "" : "Builders Club members also get a daily Robux stipend. ");
+ sb.Append("Go to the Catalog.
");
+ sb.Append("
Robux and Tix are virtual and cannot be bought with real money on this server.