Aller au contenu

Le marché crypto

Six devises créées par cette ville, un cours qui bouge que quelqu’un regarde ou non, et un moyen de transférer des avoirs d’un téléphone à un autre sans qu’aucune banque n’en entende parler.

Rien à l’intérieur ne demande jamais au monde extérieur ce que vaut quoi que ce soit. Les cours sont ceux de votre serveur.


Débute àVariationCe que c’est
Santocoin SNT42 000 $3 %La première créée par la ville. Lente, lourde, dans le portefeuille de tout le monde
Vinewood VNW3 200 $8 %La célébrité, tarifée à l’heure
Bayview BAY180 $2 %Monotone à dessein. Un endroit où placer son argent le temps de réfléchir
Dustcoin DST12 $15 %Vient du comté, et elle est déjà allée sur la lune deux fois
Voltline VLT640 $9 %Électricité, eau et voirie. Ennuyeuse jusqu’à ce que le courant saute
Omen OMN4 $22 %Personne ne sait qui l’a créée

Supprimez-en une du fichier de configuration et elle cesse d’exister. Les avoirs de personne ne sont supprimés pour autant — remettez la devise et chacun retrouve exactement ce qu’il possédait.


shared/config/crypto.lua :

Tick = 300, -- seconds between one price and the next
Volatility = 1.0, -- every coin's swing, multiplied. One number for the whole market
History = 48, -- how many prices the chart remembers
Shock = { Chance = 0.02, Size = 0.22 }, -- rare, and the reason anybody checks twice a day
Fee = 0.02, -- the house, on the way in and on the way out
Trade = { Min = 10, Max = 250000 }, -- what one order may be, in money

Et par devise : le cours auquel elle débute, sa variation Swing, une dérive Drift qui l’oriente à la hausse ou à la baisse au fil des semaines, un plancher Floor et un plafond Ceiling dont elle ne sort jamais, et une profondeur Depth — l’argent nécessaire pour faire bouger cette devise d’un pour cent lorsque quelqu’un l’échange. Une devise à faible profondeur est une devise qu’un joueur fortuné peut faire grimper tout seul, ce qui rend une telle monnaie intéressante à posséder et redoutable à surveiller. Depth = 0 signifie que les ordres ne font pas varier le cours du tout, ce qui est plus simple et beaucoup plus facile à farmer.

Icon attribue une image à une devise ; une devise personnelle sans icône se rabat sur un glyphe dessiné, puis sur la première lettre de son symbole.


Wallet = 'character', -- or 'device'

En mode character, un téléphone volé affiche une application vide au voleur. En mode device, le téléphone est le portefeuille, et voler un appareil emporte le portefeuille d’investissements avec lui.

Il est livré réglé sur character, car l’autre option transforme chaque agression de rue en braquage de banque, et cela doit être un choix délibéré plutôt qu’un comportement par défaut.


Un cours est exprimé en centimes et un solde en millionièmes de devise, tous deux sous forme d’entiers du début à la fin, arrondis en défaveur de la personne qui effectue la transaction, avec la commission ajoutée par-dessus. Acheter quelque chose et le revendre dans la même seconde coûte toujours de l’argent — un marché où cette opération s’équilibrerait serait un marché où une boucle d’achats-ventes imprimerait de l’argent à l’infini.

Le client n’est jamais interrogé sur la valeur d’une devise et n’envoie jamais de prix. Chaque écriture sur un portefeuille est protégée par un verrou, car lire les soldes, déplacer l’argent et réécrire les données représente trois étapes avec une attente entre chacune, et deux ordres lors du même tick vendraient sinon les mêmes devises deux fois.


exports.mic_phone:Coins() --> every coin, with price, change and history
exports.mic_phone:CoinPrice('santo') --> 42137.55, in money
exports.mic_phone:GetCrypto(src, 'santo') --> 0.4218
exports.mic_phone:GetCryptoValue(src) --> the whole portfolio, in money
exports.mic_phone:AddCrypto(src, 'omen', 12.5) --> a hack that pays in coin, a mining script
exports.mic_phone:RemoveCrypto(src, 'omen', 12.5) --> false when they did not have it, and nothing moves
exports.mic_phone:SetCoinPrice('omen', 0.4) --> move the market for a story

RemoveCrypto refuse l’opération plutôt que de passer en négatif, sa réponse indique donc aussi ont-ils pu payer — ce qui est précisément la question qu’une boutique vendant un objet contre de la cryptomonnaie se pose :

if exports.mic_phone:RemoveCrypto(src, 'omen', price) then giveThem(thing) end