Aelor

Forum officiel du module NeverWinter Nights et role play Aelor.
 
AccueilAccueil  PortailPortail  RechercherRechercher  S'enregistrerS'enregistrer  Connexion  

Partagez
 

 Regulation auto des marchands

Aller en bas 
AuteurMessage
DarkSideRC

DarkSideRC

Nombre de messages : 63
Date d'inscription : 03/01/2006

Regulation auto des marchands Empty
MessageSujet: Regulation auto des marchands   Regulation auto des marchands EmptyMar 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);
}
}
Revenir en haut Aller en bas
 
Regulation auto des marchands
Revenir en haut 
Page 1 sur 1

Permission de ce forum:Vous ne pouvez pas répondre aux sujets dans ce forum
Aelor :: Archives :: Editeur :: Script-
Sauter vers: