MinetestForFun / server-minetestforfun

Repository of the subgame and mods of "MinetestForFun" server
https://www.xorhub.com
The Unlicense
27 stars 10 forks source link

Idée: faire un magasin centralisé #436

Closed Cyberpangolin closed 8 years ago

Cyberpangolin commented 8 years ago

Imaginons un magasin qui permettrait d'acheter, ou vendre, n'importe quelle ressource, et qui , pour fixer les prix, tiendrait compte automatiquement de la rareté des items, donc motiverait les gens à miner.

Chaque joueur peut librement acheter ou vendre n'importe quel item au magasin.

Calcul des prix pour acheter au magasin:

On se donne, dans le magasin A éléments de type X. B minecoins (ou toute autre monnaire de votre choix) (note: on tient compte de B/2 dans les calculs afin de diminuer les chocs sur les prix après telle ou telle transaction. )

SI A<(B/2) OU A=(B/2) Le magasin vend // le joueur peut acheter 1 élément X pour P minecoins, où P = (((B/2)/A) + 0,49) arrondi.

SI A>(B/2) (cas a priori improbable, le magasin est en défaut d'argent) Le magasin vend // le joueur peut acheter 1 élément X pour 1 minecoin (donc on fixe un tarif minimum)

Possibilité d'acheter des multiples de ces valeurs, sur une unique transaction, aux conditions suivantes: Règle des 25%: Le magasin ne vend jamais plus de 25%, ni 25% de son stock à la fois. (sauf si B=0) Règle du stack: le magasin ne vend jamais plus d'un stack à la fois.

exemple concret:

Le magasin dispose de 56 diams, 7827 pommes, et 123'456 minecoins. paul vient acheter 99 pommes. Tarifs du magasin: 1 diams = 1103 coins 1 pomme = 8 coins Il paye donc 792 coins de son portefeuille et repart avec ses 99 pommes.

stock final: 56 diams 7728 pommes 124248 coins

tarifs: 1 diams = 1110 coins 1 pomme = 9 coins

Donc, les tarifs montent si les gens achètent, et les ressources immobiles (diams, ici), gagnent de la valeur.

Calcul des prix pour vendre quelque chose au magasin:

On se donne, dans le magasin A éléments de type X. B minecoins (ou toute autre monnaire de votre choix) (note: on tient compte de B/2 dans les calculs afin de diminuer les chocs sur les prix après telle ou telle transaction. )

SI A<(B/2) OU A=(B/2) Le magasin achète // le joueur peut vendre 1 élément X pour P minecoins, où P = (((B/2)/A) - 0,49) arrondi.

SI A>(B/2) (cas a priori improbable, le magasin est en défaut d'argent) Le magasin achète // le joueur peut vendre au magasin 2 éléments X pour 1 minecoin (donc on fixe un tarif minimum).

Possibilité d'acheter des multiples de ces valeurs, sur une unique transaction, aux conditions suivantes: Règle des 25%: Le magasin ne dépense jamais plus de 25% de son stock d'argent à la fois. Les stocks d'items ne varient jamais de plus de 25% à la fois. Règle du stack: le magasin n'achète jamais plus d'un stack à la fois.

exemple concret:

Le magasin dispose de 56 diams, 7827 pommes, et 123'456 minecoins. Hugette vient vendre 99 pommes. Tarifs du magasin: 1 diams = 1102 coins 1 pomme = 7 coins Il vend donc au magasin 99 pommes pour 693 coins.

stock final: 56 diams 7926=123456/2 pommes 122763 coins

tarifs finaux: 1 diams = 1096 coins 1 pomme = 7 coins

Donc, les tarifs baissent si les gens vendent, et les ressources immobiles (diams, ici), perdent de la valeur.

Les items rares prennent de la valeur avec le temps, surtout s'ils sont peu transactionnés, car la masse monétaire (le nombre de coins) disponibles dans le magasin augmente. Si régulièrement Huguette et Paul font des transactions de pommes, il y aura, après 10 transactions identiques de chacun de nos 2 protagonistes, 990 minecoins de plus dans le magasin, et donc tous les tarifs seront, en moyenne, 0.8% plus élevés.

Remplissage proposé:

Entre 50 d'un item rare (diamants, mithril) et 5000 d'un item courant (wood, ...), et 100'000 coins.

Edit: suite au calcul refait avec Hugette et Paul, je propose des remplissages de départ plus petits: 1 stack de chaque ressource courante, et 10 items dans les pas courants, avec 10000 minecoins. Du coup, les gens qui jouent le jeu dès le début sont favorisés, et les prix s'équilibrent plus vite.

crabman parlait de caisses enregistreuses, et de gérer un mod (ou un type d'objet ) par caisse. du coup, on serait "forcés" de se balader d'un magasin à l'autre. Par contre, dans ce cas, il serait bon de linker la masse monétaire et que TOUS les magasins prennent en compte une même référence de quantité d'argent stockée. Sinon, la bijouterie vendant du diamant n'aura pas de transaction, et donc les tarifs pour lui vendre un diam's ne monteront jamais.

En espérant que vous avez tout compris :)

EDIT: mise en forme du post,meilleure prise en compte de la masse monétaire pour lisser les évolutions de prix (B/2 au lieu de B), ainsi que du tarif en coins, plus facile à appréhender donc plus sympathique.

Cyberpangolin commented 8 years ago

Idée d'interface, par étape: caisseconcept

Cyberpangolin commented 8 years ago

Tiens, apparemment il faudrait tenir compte du potentiel dévastateur sur l'économie de cette méthode: si un item hyper rare est vendu au magasin, tous les prix pourraient chuter de 25% d'un coup au max. Je propose donc un facteur correctif: la valeur A ou B décisive pour calculer un prix en coins ne serait plus fonction du nombre de coins disponibles au magasin, mais de sa racine carrée. Comme ça le magasin (et tous les prix avec) risque, au pire, de perdre 0.25×0.25= 6.25% de masse monétaire et non 25%, ce qui semble nettement plus raisonnable.

ObaniGemini commented 8 years ago

C'est bien d'avoir des idées

BetterToAutomateTheWorld commented 8 years ago

C'est pas mal, mais à mes yeux c'est clairement quelque chose de faisable par les joueurs, et l'économie du serveur équilibrera d'elle même naturellement le prix des objets. En effet plus le serveur est vieux, plus les objets auront un cout réduit... (car plus de ressources auront été miné/utilisé/etc)

Après le top faut pas ce mentir, c'est un "hôtel des ventes" ou tous le joueurs peuvent mettre en vente ou acheter des objets comme bon leurs semble et au prix qu'il désire, avec un filtre pour chercher les objets par nom. Ça serait top car plus une ressource serait présente, plus son prix baisserait, et d'autre part plus une ressource serait intéressante/rare/utile, plus son prix resterait haut (voir augmenterait).

Mais je suis quasiment certain qu'un tel mod est impossible à coder sur Minetest, sans faire de concession, ou ce prendre la tête 6mois sur le code et ces aspect technique. (tellement Minetest n'est pas prévu pour un tel mod interactif)

Cyberpangolin commented 8 years ago

Là c'est le moment où je regrette très fortement de ne pas savoir coder. Mais à mon avis, il y a déjà dans ce topic plus de lignes écrites que ce qui est nécessaire pour bricoler à partir de mods existants un mod basé sur cette idée et fonctionnel. Typiquement, pour l'interface, j'irais piocher dans /rules (choix achat / vente= français/anglais) et dans notre menu qui montre les crafts pour les items. Les calculs de prix se font à la volée, je pense que même MT sait faire une division ou une racine. C'est pas parce que c'est pas simple que c'est compliqué :). J'aurai du temps cet été. Qui sait..? Vais-je apprendre à coder en lua pour l'occasion? Vous le saurez... Dans le prochain épisode.

Après le top faut pas ce mentir, c'est un "hôtel des ventes" ou tous le joueurs peuvent mettre en vente ou acheter des objets comme bon leurs semble et au prix qu'il désire, avec un filtre pour chercher les objets par nom. Ça serait top car plus une ressource serait présente, plus son prix baisserait, et d'autre part plus une ressource serait intéressante/rare/utile, plus son prix resterait haut (voir augmenterait).

C'est exactement ce qui se produit dans mon modèle :). J'ajouterais aussi qu'une ressource pas rare mais jamais achetée / vendue prend du prix aussi, donc si le joueur est malin il peut en profiter pour en vendre un lot au magasin, et repartir plein de thunes alors que le prix de revente de cet item a fortement diminué.

Edit: après recherche, le mode "money" est inclus dans MFF, avec entre autres des shops. ça peut servir de base: un "bancomat" qui vendrait ou prendrait des pièces de cuivre d'argent, ou d'or contre 1, 10 ou 100 coins sur le compte en banque décentralisé. Ensuite, on aurait un shop avec l'interface montréee pus haut, et les payements s'effectueraient en fonction du solde du compte en banque décentralisé. D'ailleurs, s'il est possible de stocker une valeur décentralisée par joueur, il doit être possible de faire la même chose avec chaque matériau.

ObaniGemini commented 8 years ago

Tout le monde sait coder.

Si tu as du temps à perdre consacrer à continuer le shop au spawn, pourquoi pas.

Cyberpangolin commented 8 years ago

et Obani sait flooder. Plus sérieusement, merci de t'abstenir de ce genre de commentaire. "Tout le monde" n'est pas "toi". Je n'irais pas plu loin pour éviter de devenir grossier ou de nourrir le troll.

ghost commented 8 years ago

Il faut commencer par faire la monnaie: 1) Soit on fait un inventaire détaché, donc géré par joueur, problème de transfert si le joueur n'est pas connecté, stockage limité, il faut additionnée les slots pour avoir le total etc(ou alors on peut faire un slot illimité en taille), mais légé.

2) Soit on fait une table(un seul fichier) avec les comptes de tous les joueurs, on peut faire des transferts sans problème, mais risque de perte si un crash se produit, fichier très lourd car chaque joueur même de passage aura un compte.

3) Soit on fait une table mais on gère par joueur, 1 joueur = 1 fichier, on ne charge que quand on a besoin, on enregistre/charge à chaque transaction, pas besoin que le joueur soit là pour lui transférer de l'argent.

BetterToAutomateTheWorld commented 8 years ago

Je suis franchement pour un système monétaire avec les monnaie actuels mais stocké dans un inventaire dédié et "caché", ça ne prend pas de place d'inventaire, juste nourrit un inventaire caché. Puis on affiche simplement le montant disponible au joueur dans sa fenetre inventaire, et on convertie automatiquement les monnaie inférieur en monnaie supérieur, 100 pc = 1pa, 100pa = 1po c'est franchement le top à mes yeux, alors oui le montant ne sera pas "modifiable" hors ligne, mais ça ne me semble pas quelque chose d'indispensable utiliser des comamndes, ou un mode texte pour voir son montant d'argent, c'est clairement pas user freindly

ghost commented 8 years ago

@Cyberpangolin C'est un peu compliqué le système de monnaie, si il y a 1 item dans la boutique, elle a +100 000$, je veut en vendre, le prix est de 59000, je ne peut pas car elle ne dépasse pas 25% de son solde, donc 100 000/4=25000.

Sinon j'ai presque fini, plus qu'a faire le système pour l'achat (les formspec des transactions) et corriger quelques truc par ci par là. shop_buy

Cyberpangolin commented 8 years ago

wow. Juste wow. Magnifiiique!

J'ai mal formulé la règle des 25%, désolé. je la corrige en fonction de notre discussion ;) En effet, le stock d'items ne doit pas varier de >=25%, donc quand il reste 4 items, le magasin refuse de vendre. Donc, il n'y aura jamais moins de 4 items en stock.

farfadet46 commented 8 years ago

désolé de cette question, mais pourquoi ne pas vouloir ventre les 4 derniers items du magasin ?

(pour pas être casse c**) je trouve inutile le fait d'afficher le solde du magasin, seulement faire une vérif et afficher un message si le solde est trop bas non ?

Genre : Si le joueur modifie la quantité désirée, vérifier si cette valeur est dans la caisse, sinon afficher un message ou le montant en rouge ...

Le fait est que cette valeur (en haut a gauche) risque plus de perturber le joueur qu'autre chose normalement le vendeur ne vois pas le solde de l'acheteur (le magasin ici)

sinon joli boulot sinon ;

BetterToAutomateTheWorld commented 8 years ago

@farfadet46 je n'en vois pas non plus d'utilité, si les joueurs créer une pénurie d'un objets, c'est leur faute, et c'est la loi du marché, s'il y a plus de demande que d'offre, une pénurie s'installe et le prix de l'objet augmente en flèche

Personnellement, je trouve ce système bon et innovant, mais vraiment prématuré. Le système monétaire requiert des ajustements et des simplification d'usage que nous n'avons pas encore (j'en donne mon avis du fonctionnement qu'il devrait être plus haut d'ailleurs)

Cyberpangolin commented 8 years ago

@farfadet46 @Ombridride On ne vend pas les 4 derniers items afin d'éviter que la vente d'un joueur au magasin d'un seul item lui permette de récolter tout l'argent du magasin. Par contre, ce qui pourrait facilement être fait (a priori), c'est que l'affichage au joueur du nombre d'items disponible soit inférieur de 4 au nombre réel. Du coup, le joueur voit "0" quand il y a "4" dans le système, et il ne peut plus acheter. Les tarifs sont déjà pas mal explosifs: ca fait 25% de la caisse. Si elle contient 200'000 coins, on parle quand même de... 49'999 coins pour un item que le magasin achèterait. Et du coup, tous les prix chuteraient d'autant, ce qui motiverait les autres joueurs à acheter plus de matériel. Et à remplir les caisses.

Et, oui, je pense que dans la version définitive ce serait intéressant que le joueur lambda ne puisse pas regarder combien le magasin possède de coins.

BetterToAutomateTheWorld commented 8 years ago

On fait quoi pour "l'argent", un coin unique qui porte un nom particulier et qu'on obtient dans une case porte-feuille invisible de l'inventaire et qui s'afficher en nombre suivi d'un symbole(de la monnaie) quelque part dans l'inventaire ?

Cyberpangolin commented 8 years ago

Note: tout ceci a été discuté par IRC. un système de conversion de coins ingame vers un porte-monnaie est en cours d'implémentation, la caisse a des protections améliorées et la balance des prix a été revue.

Nouveaux calculs: Calcul des prix pour acheter au magasin:

On se donne, dans le magasin A éléments de type X. B minecoins (ou toute autre monnaire de votre choix) (note: on tient compte de B/10 dans les calculs afin de diminuer les chocs sur les prix après telle ou telle transaction. )

SI A<(B/10) OU A=(B/10) Le magasin vend // le joueur peut acheter 1 élément X pour P minecoins, où P = 100* (SQRT SQRT SQRT (((B/10)/(A-99)))) arrondi.

SI A>(B/10) (cas a priori improbable, le magasin est en défaut d'argent) Le magasin vend // le joueur peut acheter 1 élément X pour 1 minecoin (donc on fixe un tarif minimum)

On se donne, dans le magasin A éléments de type X. B minecoins (ou toute autre monnaire de votre choix) (note: on tient compte de B/10 dans les calculs afin de diminuer les chocs sur les prix après telle ou telle transaction. )

SI A<(B/10) OU A=(B/10) Le magasin achète // le joueur peut vendre 1 élément X pour P minecoins, où P = 100* (SQRT SQRT SQRT (((B/10)/(A+100)))) arrondi.

SI A>(B/10) (cas a priori improbable, le magasin est en défaut d'argent) Le magasin achète // le joueur peut vendre au magasin 10 éléments X pour 1 minecoin (donc on fixe un tarif minimum).

Possibilité d'acheter des multiples de ces valeurs, sur une unique transaction, aux conditions suivantes: Règle des 10%: Le magasin ne dépense jamais plus de 10% de son stock d'argent à la fois. Les stocks d'items ne varient jamais de plus de 10% à la fois. Règle du stack: le magasin n'achète jamais plus d'un stack à la fois.

Ainsi, impossible de bousicoter pour flouter le magasin: Avec l'ancien système si j'achetais 50 items puis je les revendais immédiatement j'en tirais un bénéfice. Ici ce n'est plus le cas.

farfadet46 commented 8 years ago

oulala c'est trop complexe pour que je comprenne vos calculs XD je pensais que les différents éléments avaient un tarif d'achat et un tarif de vente différent par item selon la rareté et que ce montant varierai selon l'offre et la demande mais que la caisse avait tout en stock illimité :/

concrètement j’achète de la cobble au même prix que du bois ou encore que du mithril ?

désolé j'ai vraiment rien compris :(

Cyberpangolin commented 8 years ago

@farfadet46 ce que tu dois comprendre et pour reprendre ton post: les différents éléments auront un tarif d'achat et un tarif de vente différent par item selon la disponibilité (/rareté) dans le magasin et ce montant variera selon l'offre et la demande. La caisse est limitée, mais pompe du fric aux joueurs (car les tarifs d'achat et de vente diffèrent.), donc il faut miner pour avoir des coins en plus pour pouvoir continuer d'acheter / vendre des trucs.

ghost commented 8 years ago

Arf on a un bug ennuyeux, si l'admin visite la boutique et qu'il a un(e) pick/shield admin ou des nodes réservés à l'admin, il sont ajoutés dans la boutique et tous le monde peut les acheter. Le mieux serait donc de ne pas remplir avec un stock de départ.

Cyberpangolin commented 8 years ago

Sachant que de toute façon il y a une liste noire sur laquelle se trouvent les coins (bah oui, je vais pas échanger un copper coin contre des minecoins au shop), ne serait-il pas plus facile de détecter les items / nodes réservés à l'admin, et les ajouter dans la liste noire? Je pense que ce bout de code existe déjà, puisque unified inventory ne tient pas compte des items de l'admin pour un joueur lambda.

Ou, solution plus manuelle mais probablement plus simple, ajouter à la main sur la liste noire les items de l'admin. A priori, cela concerne peu d'items: son armure, ses pioches, et le command block. De toute façon, admin a le privilège /give s'il veut un item :).

ghost commented 8 years ago

oui pour les coins c'est déja ajouté. Unified_inventory affiche tout, mais on ne peut pas se les give.

Cyberpangolin commented 8 years ago

Après contrôle avec crabman il teste s'il y a un craft ou non. Sans craft (=> dispo en créa seulement), l'inventaire n'affiche pas l'item. -> à appliquer au magasin.

Cyberpangolin commented 8 years ago

Si personne ne s'y oppose, ce long fil ayant débouché sur le repo https://github.com/MinetestForFun/minercantile , je ferme ce ticket aux alentours de 22h00.

BetterToAutomateTheWorld commented 8 years ago

ça me va