|
Bon, j'ai fait des ajouts, désolé Archamedes, je n'ai pas encore rajouté les tests de compétences, je pourrais le faire, mais je commence à m'inquiéter devant l'enflure que prend ma fonction, et je me demande si je n'ai pas déjà rajouté trop de truc....
Enfin certaines des fonctions ont été "sorties" du corps de la fonction Transform, et elle peuvent être assez utiles, en offrant une interface de haut niveau pour les suppressions et tests multiples dans l'inventaire.
Il devient maintenant évident qu'il faudra créer des fonctions "raccourcis" avec un certain nombre de paramètres fixés, selon les préférences du scripteur pour son système de forge.
///////////////////////////////////////////////////////////////////////////// /* Bibliothèque pour la création d'objets à partir d'autres */ ///////////////////////////////////////////////////////////////////////////// // Nom : nwl_forgitem.nss // Auteur : Jedaï /////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////// //DECLARATIONS DE CONSTANTES /////////////////////////////////////////////////////////////////////////////
int DESTROY_AT_THE_BEGINNING = 2; int DESTROY_AT_MIDDLE = 4; int DESTROY_AT_THE_END = 8;
int DESTROY_IF_FAILURE = 16;
int HENCHMAN_CREATURE = 32;
///////////////////////////////////////////////////////////////////////////// //PROTOTYPES DES FONCTIONS /////////////////////////////////////////////////////////////////////////////
//Compte le nombre d'items de tag sTag dans l'inventaire de oOwner int CountItem( string sTag, object oOwner = OBJECT_SELF );
//Détruit le nombre nNum d'items de tag sTag dans l'inventaire de oOwner //renvoie le nombre d'items réellement détruits int DestroyNumItem( string sTag, int nNum = 1, object oOwner = OBJECT_SELF);
//Vérifie si oOwner contient bien une série d'objet, dont les quantités et les tags sont indiqués dans des chaînes formées ainsi : //"2!POTION_MAG:ANNEAU:EPEE_LONGUE_01:6!QUEUE_SERPENT:" //vérifie si oOwner contient au moins 2 items de tag "POTION_MAG", 1 item de tag "EPEE_LONGUE_01" et 6 "QUEUE_SERPENT" int TestItemString( string sItems, object oOwner );
//Détruit une série d'items dans l'inventaire de oOwner, grâce à une chaîne formée ainsi : //"2!POTION_MAG:ANNEAU:EPEE_LONGUE_01:6!QUEUE_SERPENT:" //détruit 2 items de tag "POTION_MAG", 1 item de tag "EPEE_LONGUE_01" et 6 "QUEUE_SERPENT" //si nForce est à FALSE, la série d'item ne sera pas détruite si ces items ne sont pas tous présents, //la fonction renvoie le nombre d'items réellement détruit //ATENTION : pour tous les items qui sont susceptibles de se trouver dans des piles, mettez la quantité à //détruire, même s'il s'agit de 1! int DestroyItemString( string sToDestroy, object oOwner, int nForce = TRUE );
//Vérifie dans oForge si les objets requis sont présents dans les bonnes quantités, //Vérifie dans oMaker (par défaut égal à oForge) si les outils sont bien présents //si c'est le cas, la fonction renvoie TRUE/1, crée l'objet de blueprint/resref sObtenu dans oForge, //, détruit les objets requis et oForge dit sMessage //dans le cas contraire, elle renvoie FALSE/0 //sRequis est formé des tags des objets requis, ainsi que des quantités de ces objets, exemple : //"2!POTION_MAG:ANNEAU:EPEE_LONGUE_01:6!QUEUE_SERPENT:" //De même sObtenu (qui ne contient qu'un seul blueprint) peut comporter une indication de quantité //exemple : 10!potion_bleue. //nFlag peut contenir les flags suivants (séparés par |, ex : , DESTROY_IF_FAILURE | DESTROY_AT_THE_END, ) : //* DESTROY_AT_THE_BEGINNING, DESTROY_AT_MIDDLE et DESTROY_AT_THE_END //déterminent quand les objets requis sont détruits, si il y a un délai avant la création //si les objets requis (mais pas les outils) ne sont pas présents au moment de la vérification, la création ne se fera pas //par défaut, les objets seront détruit à la moitié du-temps //* DESTROY_IF_FAILURE indique qu'en cas d'échec, les objets requis devront être détruits //fDelay indique un délai en secondes avant la création de l'objet //nSuccess indique le pourcentage de chance de réussite de l'objet //ATTENTION : toujours mettre ":" à la fin de sRequis, ne pas en mettre au début //ne pas mettre de nombre négatif, ne pas mettre 2 fois le même tag dans sRequis, //pour tous les items qui sont susceptibles de se trouver dans des piles, mettez la quantité à //détruire, même s'il s'agit de 1! int Transform( string sRequis, string sObtenu, object oForge = OBJECT_SELF, string sUtils = "", object oMaker = OBJECT_INVALID, int nSuccess = 100, float fDelay = 0.0f, int nFlag = 0, string sMessage = "");
//Vérifie dans oForge si les objets requis sont présents dans les bonnes quantités, //Vérifie dans oMaker (par défaut égal à oForge) si les outils sont bien présents //si c'est le cas, la fonction renvoie TRUE/1, crée la créature de blueprint/resref sObtenu à côté de oForge, //, détruit les objets requis et oForge dit sMessage //dans le cas contraire, elle renvoie FALSE/0 //sRequis est formé des tags des objets requis, ainsi que des quantités de ces objets, exemple : //"2!POTION_MAG:ANNEAU:EPEE_LONGUE_01:6!QUEUE_SERPENT:" //De même sObtenu (qui ne contient qu'un seul blueprint) peut comporter une indication de quantité //exemple : 10!gobelin. //nFlag peut contenir les flags suivants (séparés par |, ex : , DESTROY_IF_FAILURE | DESTROY_AT_THE_END, ) : //* DESTROY_AT_THE_BEGINNING, DESTROY_AT_MIDDLE et DESTROY_AT_THE_END //déterminent quand les objets requis sont détruits, si il y a un délai avant la création //si les objets requis (mais pas les outils) ne sont pas présents au moment de la vérification, la création ne se fera pas //par défaut, les objets seront détruit à la moitié du temps //* HENCHMAN_CREATURE indique que la créature créée doit être liée à oMaker //* DESTROY_IF_FAILURE indique qu'en cas d'échec, les objets requis devront être détruits //fDelay indique un délai en secondes avant la création de l'objet //nSuccess indique le pourcentage de chance de réussite de l'objet //oWP : le waypoint où apparaîtra l'objet, par défaut, à côté de oForge //ATTENTION : toujours mettre ":" à la fin de sRequis, ne pas en mettre au début //ne pas mettre de nombre négatif, ne pas mettre 2 fois le même tag dans sRequis, //pour tous les items qui sont susceptibles de se trouver dans des piles, mettez la quantité à //détruire, même s'il s'agit de 1! int Cocoon( string sRequis, string sObtenu, object oForge = OBJECT_SELF, string sUtils = "", object oMaker = OBJECT_INVALID, int nSuccess = 100, float fDelay = 0.0f, int nFlag = 0, object oWP = OBJECT_INVALID, string sMessage = "");
///////////////////////////////////////////////////////////////////////////// //FONCTIONS /////////////////////////////////////////////////////////////////////////////
void vcio( string sItemTemplate, object oTarget = OBJECT_SELF, int nStackSize = 1 ) { CreateItemOnObject( sItemTemplate, oTarget, nStackSize ); }
void vco( int nObjectType, string sTemplate, location locLocation, int bUseAppearAnimation = FALSE) { CreateObject( nObjectType, sTemplate, locLocation, bUseAppearAnimation ); }
void vt( string sRequis, string sObtenu, object oForge, int nFlag, string sMessage, float fDelay = 0.0f) { if( fDelay == 0.0 ) { if( nFlag & DESTROY_AT_THE_END ) { if( ! DestroyItemString( sRequis, oForge, FALSE )) return; }
int nNum; int nItems = 1;
if( (nNum = FindSubString( sObtenu, "!" )) != -1 ) { nItems = StringToInt( GetStringLeft( sObtenu, nNum ) ); sObtenu = GetStringRight( sObtenu, GetStringLength( sObtenu ) - nNum - 1 ); }
for( ; nItems; nItems-- ) DelayCommand(0.1, vcio( sObtenu, oForge ));
if( sMessage != "" ) AssignCommand( oForge, SpeakString( sMessage ) ); } else if( DestroyItemString( sRequis, oForge, FALSE ) ) { DelayCommand( fDelay, vt( sRequis, sObtenu, oForge, nFlag, sMessage ) ); } }
void vc( string sRequis, string sObtenu, object oForge, location lSpawn, int nFlag, string sMessage, object oMaker, float fDelay = 0.0f) { if( fDelay == 0.0 ) { if( nFlag & DESTROY_AT_THE_END ) { if( ! DestroyItemString( sRequis, oForge, FALSE )) return; }
int nNum; int nItems = 1;
if( (nNum = FindSubString( sObtenu, "!" )) != -1 ) { nItems = StringToInt( GetStringLeft( sObtenu, nNum ) ); sObtenu = GetStringRight( sObtenu, GetStringLength( sObtenu ) - nNum - 1 ); }
object oCreature; for( ; nItems; nItems-- ) oCreature = CreateObject( OBJECT_TYPE_CREATURE, sObtenu, lSpawn, TRUE );
if( nFlag & HENCHMAN_CREATURE ) AddHenchman( oMaker, oCreature );
if( sMessage != "" ) AssignCommand( oForge, SpeakString( sMessage ) ); } else if( DestroyItemString( sRequis, oForge, FALSE ) ) { DelayCommand( fDelay, vc( sRequis, sObtenu, oForge, lSpawn, nFlag, sMessage, oMaker) ); } }
int DestroyNumItem( string sTag, int nNum = 1, object oOwner = OBJECT_SELF) { object oItem = GetFirstItemInInventory( oOwner ); string sResref; int nCount = 0; while( GetIsObjectValid( oItem )) { if( GetTag( oItem ) == sTag ) { sResref = GetResRef( oItem ); nCount += GetNumStackedItems( oItem ); DestroyObject( oItem, 0.1 ); }
oItem = GetNextItemInInventory( oOwner ); }
int nToKeep = nCount - nNum;
if( nToKeep <= 0 ) return nCount;
for( ; nToKeep; nToKeep-- ) AssignCommand( GetModule(), DelayCommand( 0.2, vcio( sResref, oOwner )));
return nNum; }
int CountItem( string sTag, object oOwner = OBJECT_SELF ) { object oItem = GetFirstItemInInventory( oOwner ); int nCount = 0; while( GetIsObjectValid( oItem )) { if( GetTag( oItem ) == sTag ) nCount += GetNumStackedItems( oItem );
oItem = GetNextItemInInventory( oOwner ); }
return nCount; }
int TestItemString( string sItems, object oOwner ) { string sTag; int nNum, nItems;
while( (nNum = FindSubString( sItems, ":" )) != -1 ) { sTag = GetStringLeft( sItems, nNum ); sItems = GetStringRight( sItems, GetStringLength( sItems ) - nNum - 1 );
if( (nNum = FindSubString( sTag, "!" )) != -1 ) { nItems = StringToInt( GetStringLeft( sTag, nNum ) ); sTag = GetStringRight( sTag, GetStringLength( sTag ) - nNum - 1 ); if( CountItem( sTag, oOwner ) < nItems ) return FALSE; } else if( ! GetIsObjectValid( GetItemPossessedBy( oOwner, sTag ) ) ) return FALSE; } return TRUE; }
int DestroyItemString( string sToDestroy, object oOwner, int nForce = TRUE ) { if( ! nForce ) { if( ! TestItemString( sToDestroy, oOwner ) ) return FALSE; }
string sTag; int nNum, nItems; int nNumItem = 0;
while( (nNum = FindSubString( sToDestroy, ":" )) != -1 ) { sTag = GetStringLeft( sToDestroy, nNum ); sToDestroy = GetStringRight( sToDestroy, GetStringLength( sToDestroy ) - nNum - 1 );
if( (nNum = FindSubString( sTag, "!" )) != -1 ) { nItems = StringToInt( GetStringLeft( sTag, nNum ) ); sTag = GetStringRight( sTag, GetStringLength( sTag ) - nNum - 1 ); nNumItem += DestroyNumItem( sTag, nItems, oOwner ); } else { DestroyObject( GetItemPossessedBy( oOwner, sTag ) ); nNumItem++; } }
return nNumItem; }
int Transform( string sRequis, string sObtenu, object oForge = OBJECT_SELF, string sUtils = "", object oMaker = OBJECT_INVALID, int nSuccess = 100, float fDelay = 0.0f, int nFlag = 0, string sMessage = "") { if( !GetIsObjectValid( oMaker )) oMaker = oForge;
if( ! (TestItemString( sRequis, oForge ) && TestItemString( sUtils, oMaker )) ) return FALSE; if( Random( 101 ) > nSuccess ) { if( nFlag & DESTROY_IF_FAILURE ) DestroyItemString( sRequis, oForge );
return FALSE; }
int nNum;
if( fDelay == 0.0f ) { DestroyItemString( sRequis, oForge );
int nItems = 1;
if( (nNum = FindSubString( sObtenu, "!" )) != -1 ) { nItems = StringToInt( GetStringLeft( sObtenu, nNum ) ); sObtenu = GetStringRight( sObtenu, GetStringLength( sObtenu ) - nNum - 1 ); }
for( ; nItems; nItems-- ) DelayCommand(0.1, vcio( sObtenu, oForge ));
if( sMessage != "" ) AssignCommand( oForge, SpeakString( sMessage ) ); } else { if( nFlag & DESTROY_AT_THE_BEGINNING ) { DestroyItemString( sRequis, oForge );
int nItems = 1;
if( (nNum = FindSubString( sObtenu, "!" )) != -1 ) { nItems = StringToInt( GetStringLeft( sObtenu, nNum ) ); sObtenu = GetStringRight( sObtenu, GetStringLength( sObtenu ) - nNum - 1 ); }
for( ; nItems; nItems-- ) AssignCommand( oForge, DelayCommand(fDelay, vcio( sObtenu, oForge )));
if( sMessage != "" ) AssignCommand( oForge, DelayCommand(fDelay, SpeakString( sMessage )) ); } else if( nFlag & DESTROY_AT_THE_END ) AssignCommand( oForge, DelayCommand( fDelay, vt( sRequis, sObtenu, oForge, nFlag, sMessage) )); else AssignCommand( oForge, DelayCommand( fDelay/2.0f, vt( sRequis, sObtenu, oForge, nFlag, sMessage, fDelay/2.0f) )); }
return TRUE; }
int Cocoon( string sRequis, string sObtenu, object oForge = OBJECT_SELF, string sUtils = "", object oMaker = OBJECT_INVALID, int nSuccess = 100, float fDelay = 0.0f, int nFlag = 0, object oWP = OBJECT_INVALID, string sMessage = "") { if( !GetIsObjectValid( oMaker )) oMaker = oForge;
if( ! (TestItemString( sRequis, oForge ) && TestItemString( sUtils, oMaker )) ) return FALSE; if( Random( 101 ) > nSuccess ) { if( nFlag & DESTROY_IF_FAILURE ) DestroyItemString( sRequis, oForge );
return FALSE; }
int nNum;
location lSpawn; if( GetIsObjectValid( oWP ) ) lSpawn = GetLocation( oWP ); else lSpawn = GetLocation( oForge );
if( fDelay == 0.0f ) { DestroyItemString( sRequis, oForge );
int nItems = 1;
if( (nNum = FindSubString( sObtenu, "!" )) != -1 ) { nItems = StringToInt( GetStringLeft( sObtenu, nNum ) ); sObtenu = GetStringRight( sObtenu, GetStringLength( sObtenu ) - nNum - 1 ); }
object oCreature; for( ; nItems; nItems-- ) oCreature = CreateObject( OBJECT_TYPE_CREATURE, sObtenu, lSpawn, TRUE );
if( nFlag & HENCHMAN_CREATURE ) AddHenchman( oMaker, oCreature );
if( sMessage != "" ) AssignCommand( oForge, SpeakString( sMessage ) ); } else { if( nFlag & DESTROY_AT_THE_BEGINNING ) { DestroyItemString( sRequis, oForge ); AssignCommand( oForge, DelayCommand(fDelay, vc( "", sObtenu, OBJECT_INVALID, lSpawn, nFlag, sMessage, oMaker ))); } else if( nFlag & DESTROY_AT_THE_END ) AssignCommand( oForge, DelayCommand( fDelay, vc( sRequis, sObtenu, oForge, lSpawn, nFlag, sMessage, oMaker) )); else AssignCommand( oForge, DelayCommand( fDelay/2.0f, vc( sRequis, sObtenu, oForge, lSpawn, nFlag, sMessage, oMaker, fDelay / 2.0f) )); }
return TRUE; }
//void main(){}
|