DarkSideRC
Nombre de messages : 63 Date d'inscription : 03/01/2006
| Sujet: Regulation auto des marchands Mar 21 Fév - 23:46 | |
| Voila, je me suis mis aux scripts NWN et j'ai pondu ceci. Il a ete teste et semble fonctionner correctement. (bon, desole pour l'indentation mais le copier coller a pas pris ce que j'avais fait) - Citation :
- //==============================================================================
// Script d'autoregulation economique des marchands // // Principe : // // Rachat d'objets d'occasion : le taux est fixe en fonction de la proportion // de liquidite du marchand par rapport a son patrimoine total, en l'occurence // un taux de 50% du prix est fixe si ses liquidites sont de 10%. Et plus ses // liquidites seront faibles, plus le taux de recaht sera faible. Donc, plus on // lui vendra d'objets sans en acheter moins ils les achetera chers. // // Vente d'objets neufs : le taux est fixe en fonction de la richesse du PJ // comparee la richesse qu'il est sensse avaoir a son niveau (Cf GdM D&Dv3.5). // Tant que le joueur n'est pas "Trop" riche, le taux est de 100%, puis augmente // proportionellement a sa richesse : un PJ 2 fois plus riche que ce qu'il // devrait etre aura un taux d'achat de 200%. // // Utilisation : // // - Placer ce script dans l'option du dialogue correspondant a l'ouverture du // magasin. // - Surtout si on utilise le CNR, ne pas mettre d'objets "illimites" dans // l'inventaire (sauf cas exceptionnels) // - Les options du magasin qu'il faut selectionner sous peine de disfonction- // nement sont : Prix de vente / achat=100%, Cocher "A un prix maximum d'achat" // mais mettre 0 dans la valeur, Cocher "A une quantite d'or limite" mais // mettre 0 dans la valeur. Dans ce cas, les valeurs seront calcules // automatiquements a la premiere ouverture : Quantite d'or = 10% de la valeur // totale et prix max d'achat = 10% de la quantite d'or //==============================================================================
#include "nw_i0_plot"
//Evaluer la valeur totale d'un conteneur en tenant compte des //objets conteneurs qu'ils pourrait contenir et des objets equipes
int GetValeurConteneur(object oContainer) { int iValeur = 0;
object oItem = GetFirstItemInInventory(oContainer); while (oItem != OBJECT_INVALID) { iValeur += GetGoldPieceValue(oItem);; if (GetHasInventory(oItem) == TRUE) { iValeur += GetValeurConteneur(oItem); } oItem = GetNextItemInInventory(oContainer); }
if (GetObjectType(oContainer) == OBJECT_TYPE_CREATURE) { int nSlot; for (nSlot=INVENTORY_SLOT_HEAD; nSlot<=INVENTORY_SLOT_BOLTS; nSlot++) { oItem = GetItemInSlot(nSlot, oContainer); if (oItem != OBJECT_INVALID) { iValeur += GetGoldPieceValue(oItem);; } } }
return iValeur; }
void main() { //recuperer le magasin object oStore = GetNearestObject (OBJECT_TYPE_STORE); if (GetObjectType(oStore) == OBJECT_TYPE_STORE) { object oClient = GetPCSpeaker();
//evaluation du patrimoine du marchand int vStock = GetValeurConteneur(oStore); //SendMessageToPC(oClient, "Valeur du stock = " + IntToString(vStock) + " po");
int liquidite = GetStoreGold(oStore); if (liquidite == 0) { liquidite = vStock / 10; //10% du stock SetStoreGold (oStore, liquidite); liquidite = GetStoreGold(oStore); } //SendMessageToPC(oClient, "Liquidites du marchand = " + IntToString(liquidite) + " po");
//calcul du prix de rachat d'ocasion
int pctAchat = 0; float patrimoine = 1.0 + IntToFloat(vStock) + IntToFloat (liquidite); float liquiditeTheo = patrimoine / 10.0; //10% du patrimoine float tauxobjectif = 0.5; //50% si liquidite correcte float coef = (tauxobjectif * liquiditeTheo) / (liquiditeTheo * (1.0 - tauxobjectif)); float pctA = (coef * IntToFloat(liquidite)) / (liquiditeTheo + (coef * IntToFloat(liquidite))); float diff = (1.0 - pctA) * 100.0; pctAchat = FloatToInt(-diff);
SetStoreMaxBuyPrice (oStore, liquidite / 10); SendMessageToPC(oClient, "Taux de rachat des objets d'ocasion = " + IntToString(100+pctAchat) + "%");
//evaluation du patrimoine du client
int vSacADos = GetValeurConteneur(oClient); //SendMessageToPC(oClient, "Valeur du sac a dos du client = " + IntToString(vSacADos) + " po");
int tresor = GetGold(oClient); //SendMessageToPC(oClient, "Liquidites du client = " + IntToString(tresor) + " po");
int pctVente = 0; float patrimoineClient = IntToFloat(vSacADos) + IntToFloat (tresor); //en theorie, le patrimoine d'un PJ doit etre sensiblement egale aux XPs du prochain niveau int nHD = GetHitDice(oClient); int nRTheo = ((nHD * (nHD + 1)) / 2) * 1000; float tauxRichesse = patrimoineClient / (1.0 + IntToFloat(nRTheo)); if (tauxRichesse > 1.0) { float diff = (tauxRichesse - 1.0) * 100.0; pctVente = FloatToInt(diff); } SendMessageToPC(oClient, "Taux de revente des objets neufs = " + IntToString(100+pctVente) + "%");
gplotAppraiseOpenStore(oStore, GetPCSpeaker(), pctVente, pctAchat); } else { ActionSpeakStringByStrRef(53090, TALKVOLUME_TALK); } } | |
|