Incroyable ! Génération d'armes personnalisés !

Répondre
Partager Rechercher
L'un des gros problèmes auquel s'étaient heurté les bonnes volontés des créatifs qui voulait offrir des armes "sur mesures" à leurs joueurs était l'impossibilité de générer des objets possédant des caractéristiques non-prédéfinies.
Ce problème est maintenant presque résolue pour les armes, je cite ici le post fondateur de eMRaistlin :

Citation :
Je vous rappelle que :

- On peut depuis peu créer un 'OnHit' par script sur les armes.

- On peut créer une copie d'un objet en modifiant le tag

- On peut recuperer le tag d'une arme facilement...

Je pense que l'on peut donc creer des armes aux proprietes singuliere aussi facilement qu'en creant un script pour autre chose...

Va falloir s'y mettre (et paff... du boulot en plus .... )
Effectivement, toutes les propriétés de l'arme pourront être définies par script, incorporée dans son tag, qui sera vérifié par le script du OnHit pour savoir quels effets appliquer !!

C'est le début du règne des forgerons !

Le problème de la description peut-être réglé par l'octroi d'un pouvoir unique à l'arme, lançant un dialogue construit, grâce à des custom tokens, à partir du tag de l'arme appelante...

Au risque de surcharger son serveur (mais l'on espère que les armes "générée" resteront fort rares, on est pas des gros bills non plus), on peut également ajouter des caractéristiques "permanentes" aux objets, par le biais d'ExecuteScript() récursif. (mais là je reste plus réservé... ces caractéristiques "permanentes" devraient être réservé aux objets vraiment exceptionnels, sinon, les serveurs grilleront ! ).

Voilà je pense que les scripts seront assez simples à maintenir :
Il s'agira principalement de gargantuesques switch...case, s'appuyant sur les variables prédéfinies (traitées par le NWScript comme des constantes) d'effet (EFFECT_TYPE_* ), incorporée directement aux tags, avec une longueur constante et l'emploi de IntToString()...
Vraiment très simple !!
Pop des valeurs à travers une sélection de sous-chaînes puis boucle jusqu'à ce que la chaîne se réduise à une chaîne vide "".
Passage des paramètres par le même procédé : totalement mécaniste et très explicite du côté du script grâce à l'emploi des constantes et du case.


Bien entendu, nous attendons vos suggestions pour le effets les plus interressant...
(Je suis personnelement sur la transformation d'une creature blessée en pierre, et un autre en poring ^^)
Heum... je passe mon tour

C'est hyper lourd à faire. Faudrait aut'chose qu'un scripteur de seconde zone comme moi (ok je sais, tu étais à cent lieues de penser à moi pour ce boulot, merci ça fait plaisir ).


Ça tente quelqu'un d'être l'auteur de cette petite merveille?
...
Oui! J'ai vu un doigt levé au fond!... D'accord, le projet est à toi cher Jedaï

Bon courage
Ah pas moi, je suis en train de bosser sur le panthéon des royaumes oubliés avec tout les objets de culte qui donnerons les capacités que confère le clergé a ses prêtres et peut être quelques surprises.
J'espère seulement qu'une prochaine extension de NWN ne viendra pas me couper l'herbe sous le pied comme pour le jeu de carte merveilleux.

Jaha Effect
Ben moi je veux bien, encore faut-il des suggestions, comme l'a si bien dit eM.

Le modèle général est pas bien compliqué, hein. Comme je l'ai dit, c'est pure question de manipulation de string et de switch...case... .
On peut faire tous les effets de base très simplement, par contre les effets nouveaux nécessitent de concevoir ça un peu plus soigneusement...

Premièrement, il faut établir soigneusement le modèle du tag : je suis complètement pour un tag entièrement chiffré, c'est clair et net ! D'accord c'est moins lisible, mais :
1, ça permet de compacter l'information (le tag est limité à 32 caractères non ?)
2, ça permet d'utiliser un switch...case, donc gain en vitesse d'exécution et en clarté du script.

Maintenant faut établir autre chose : faut-il avoir un modèle basé sur une taille des nombres fixe (3 chiffres chacun) par exemple ou sur des séparateurs ? (ou même mixte)
Le problème se pose surtout sur les paramètres à virgule flottante : on perd en précision et en taille si on prend la première solution.
D'un autre côté la première solution est beaucoup plus facile et rapide à mettre en oeuvre (surtout plus rapide) et c'est pas Azraël qui me contredira, vu que son "tableau" était basé sur ce principe.
C'est moins consommateur en CPU aussi.
Je vote donc pour la première solution, mais là, c'est une question de goût .

Donc, avis et suggestions ??
Houla, va y avoir une intense utilisation du GetSubString

On peut toujours économiser de la place dans le tag en utilisant de l'hexa, ainsi au lieu de trois caractères, on peut passer à deux.
Le problème est qu'il y a beaucoup plus que 256 spells...

Ya la fonction IntToHexString mais ya pô l'inverse
Aarrg, j'ai dû faire une erreur quelque part...

Mon problème est surtout de savoir ce que vous attendez de ce système, de toute façon tout de suite, je suis assez limité dans mes possibilités de test, donc...

Je veux bien faire un modèle mais de toute façon, mettre tous les effets d'un seul coup, c'est un peu beaucoup... Disons que on va en discuter...
Bon et puis on continuera tout ça demain parce que là, il commence à se faire tard...

Première ébauche :
Code PHP:

//OnHit script (© Jedaï ;-) )

int GetParameter(string sTagint nOffset);

void main()
{
    
object oMod GetModule();
    
object oItem GetLocalObjectoMod"OnHit_Item" );
    
object oTarget OBJECT_SELF;
    
object oOwner GetLocalObjectoMod"OnHit_Owner" );
    
    
string sTag GetTagoItem );
    
int nOffset 0;
    
int nDamDealt GetTotalDamageDealt();
    
    while ( 
GetParametersTagnOffset ) )
    {
        switch( 
GetParametersTagnOffset++ ) )
        {
        case 
ITEM_PROPERTY_REGENERATION_VAMPIRIC //vampire
        
{
            
ApplyEffectToObjectDURATION_TYPE_INSTANTEffectVisualEffectVFX_IMP_NEGATIVE_ENERGY ), oTarget );
            
ApplyEffectToObjectDURATION_TYPE_INSTANTEffectVisualEffectVFX_IMP_HEALING_L  ), oOwner );
            
ApplyEffectToObjectDURATION_TYPE_INSTANTEffectHealnDamDealt  ), oOwner );
        }
        }
    }
}

int GetParameter(string sTagint nOffset)
{
    return 
StringToIntGetSubStringsTagnOffset 3);

Là y a qu'une propriété, mais les bases sont posées, et on peut affiner...
C'est là que je me met à vouloir assassiner Bioware parce qu'ils ont "oublié" de mettre deux fonctions toutes bêtes : les fonctions de traduction de caractères vers le code ASCII, et l'inverse....
M****, avec ça on aurait pu travailler en base 256 !!! Deux caractères auraient été très largement suffisants !!
L'hexa ne suffit pas bien sûr et je ne me vois pas faisant une grosse fonction de conversion avec plein de if...else if... bien lourd pour le CPU s'il doit se peler ça une quinzaine de fois dans chaque script OnHit...
Bon, on peut toujours y aller "à la barbare" comme ça pour la conversion :
Code PHP:

//fonctions de conversion int<->string hex

int HexStr2Intstring sHexa )
{
    
string sConv "0123456789ABCDEF";
    
    
int n 0;
    
int i 0;
    
int nL GetStringLengthsHexa );
    
    
string sChar;
    
    for(; 
nLnL--)
    {
        
sChar GetStringRightsHexa);
        
sHexa GetStringLeftsHexanL );        
        
+= FindSubStringsHexasChar ) * pow16);
        
i++:
    }
    
    return 
n;
}

string Int2HexStrint nDec )
{
    
string sConv "0123456789ABCDEF";
    
int i 10;
    
string s "";
    
int nT 0;
    
    while( 
nDec )
    {
        if( 
nT nDec pow16i) )
        {
            
+= GetSubStringsConvnT);
            
nDec -= nT pow16i);
        }
        
i--
    }
    
    return 
s;

Mais je le sens pas niveau temps de calcul...Quelqu'un aurait une autre suggestion ?
ca me parait pas mal, mais honnetement, une fois que tu aura fais 99 case dans ton ActivateItem pour cette arme, je pense que tu aura largement rentabilisé ce OnHit.

non ?

(j'te rappelle qu'au niveau du OnHit, y'a deja d'autre options par defaut ^^)
Citation :
(Je parle, niveau puissance)
Bein, a vrai dire, ca depend : si dans le OnHitActivate, tu met un script qui dit DestroyObject, la cible meurs sur le coup, sans sauvegarde, sans rien, en fait...

Si tu met un ApplyEffect(ExtraordinaryEffect(EffectDeath())), alors la cible meurs, protégée ou non par des immunités..

Apres, tu peux faire n'imps avec ca : la cible est transformée en creature autre, la cible est teleportée, la cible perd son or...

en fait, tout ce que tu peux faire via un trigger ou un sort ou autre...

Donc : oui, definitivement, tu peut faire plus puissant

Apres, je rappele qu'a vaincre sans péril, on triomphe sans gloire !
l'interêt, c'est qu'elles sont "customisables" in-game
avec un forgeron quoi, on passe commande des effets qu'on veut, et ils sont implémenté sans qu'il soit forcé de reuploader un nouveau module avec un pov épée en plus dedans

ca permet de faire l'arme de gros bill de tes rêves, en plein jeu
enfin je crois
Citation :
Provient du message de eMRaistlin
Bein, a vrai dire, ca depend : si dans le OnHitActivate, tu met un script qui dit DestroyObject, la cible meurs sur le coup, sans sauvegarde, sans rien, en fait...

Si tu met un ApplyEffect(ExtraordinaryEffect(EffectDeath())), alors la cible meurs, protégée ou non par des immunités..

Apres, tu peux faire n'imps avec ca : la cible est transformée en creature autre, la cible est teleportée, la cible perd son or...

en fait, tout ce que tu peux faire via un trigger ou un sort ou autre...

Donc : oui, definitivement, tu peut faire plus puissant

Apres, je rappele qu'a vaincre sans péril, on triomphe sans gloire !
Ok ,je vois ...

Il y aurait une éventuel parade face à ce genre de scripte?

Je dis ça parce que c'est très bien dans la mesure ou on peut personnalisé à fond son module, mais par contre ....
Il va y avoir de très gros abus sur les serveurs publiques.
non : pas d'abus : le script ne se ballade pas avec l'arme : il est independant: pas moyen de sauvegarder le script avec l'arme sur le PC...


Et en plus, y'a tellement d'autre moyen de Tricher (en plus des moyens legaux de booster un perso) que je ne comprend pas qu'on puisse faire des seveurs publiques sans mot de passe
Effectivement, le script est lié au serveur, cette arme n'aura aucun pouvoir sur d'autres serveurs.

De plus tu peux bien sûr simuler les effets "normaux" pour permettre la génération automatique d'armes personnalisée mais en plus tu peux incorporer à ce système des effets "spéciaux" selon ta fantaisie !

Sympa, non ?
Citation :
Provient du message de eMRaistlin
non : pas d'abus : le script ne se ballade pas avec l'arme : il est independant: pas moyen de sauvegarder le script avec l'arme sur le PC...


Et en plus, y'a tellement d'autre moyen de Tricher (en plus des moyens legaux de booster un perso) que je ne comprend pas qu'on puisse faire des seveurs publiques sans mot de passe
Citation :
Provient du message de Jedaï
Effectivement, le script est lié au serveur, cette arme n'aura aucun pouvoir sur d'autres serveurs.

De plus tu peux bien sûr simuler les effets "normaux" pour permettre la génération automatique d'armes personnalisée mais en plus tu peux incorporer à ce système des effets "spéciaux" selon ta fantaisie !

Sympa, non ?
Ok ,ça me rassure

C'est dommage que ce soit aussi complexe pour faire les scriptes, (disons qu’il faut consacrer un minimum de temps pour comprendre la logique) je me saurais bien amuser avec ça .
Je suis vraiment limité sans ces scriptes sur mon module .
Bein, avec un investissement minimum de ta part, nous, on sera ravi de faire des corrections...
(par contre, sortir des script ex-nihilo, c'est souvent pas mal de travail de conception que, personnelement, je n'ai pas le temps de fournir... et c'est sans doute pareil pour pas mal de monde ici ^^)

Donc, a la limite, fait les tutoriaux (y'en a pour 2h maxi) ca te donnera une base suffisate pour faire un script grossier, que l'on pourra conrriger le cas echeant ^^
Ok, je comprend mieux avec ton modèle Jed

Je pensais que le TAG allait servir de traducteur pour les effets et tous le reste.


Genre un caractère du TAG sert à indiquer la catégorie d'effet, un sort, un effet visuel ou encore un effet prédéfini, les 2 ou 3 caractères d'après permettent ensuite de specifier l'effet.

- Pour un sort, ce serait par exemple Spell_Ray_of_Frost.
- Un visuel pourrait être VFX_IMP_NEGATIVE_ENERGY
- Pour un effet predefini EffectBeam.

Vu que quasi tous les sorts et effets sont déjà numérotés dans le nwscript.nss, on aura juste à appeler le numéro.

Le système deviendrais ainsi beaucoup plus puissant, presque illimité au prix d'une complexité du script accrue et donc pour l'optimisation ressource, c'est p'tet pô le top.

Ya pô photo, c'est utopique mais je trouvais l'idée belle


(vi le ASCII aurait été encore mieux )
Le seul problème c'est que ni les effets, ni les propriétés d'objets ne peuvent être appelés directement à travers leur constante.
Donc tu es obligé de faire un cas pour chaque effet ou truc personnalisé..
Par contre ta proposition est tout à fait applicable aux sorts, et on peut sans problème en faire un cas particulier de mon script du type :

Code PHP:

//OnHit script (© Jedaï ;-) )

int GetParameter(string sTagint nOffset);

void main()
{
    
object oMod GetModule();
    
object oItem GetLocalObjectoMod"OnHit_Item" );
    
object oTarget OBJECT_SELF;
    
object oOwner GetLocalObjectoMod"OnHit_Owner" );
    
    
string sTag GetTagoItem );
    
int nOffset 0;
    
int nDamDealt GetTotalDamageDealt();
    
int nT1nT2;
    
object oT;
    
    while ( 
GetParametersTagnOffset ) )
    {
        switch( 
GetParametersTagnOffset++ ) )
        {
        case 
ITEM_PROPERTY_REGENERATION_VAMPIRIC //vampire
        
{
            
ApplyEffectToObjectDURATION_TYPE_INSTANTEffectVisualEffectVFX_IMP_NEGATIVE_ENERGY ), oTarget );
            
ApplyEffectToObjectDURATION_TYPE_INSTANTEffectVisualEffectVFX_IMP_HEALING_L  ), oOwner );
            
ApplyEffectToObjectDURATION_TYPE_INSTANTEffectHealnDamDealt  ), oOwner );
            break;
        }
        case 
666 //sort
        
{
            
nT1 GetParametersTagnOffset++ );
            
oT CreateObjectOBJECT_TYPE_PLACEABLE"plc_invisobj"GetLocationoOwner );
            
AssignCommandoTActionCastSpellAtObjectnT1oTargetMETAMAGIC_ANYTRUE0PROJECTILE_PATH_TYPE_DEFAULTTRUE ) );
            
DestroyObjectoT );
            break;
        }
        }
    }
}

int GetParameter(string sTagint nOffset)
{
    return 
StringToIntGetSubStringsTagnOffset 3);

Ca le fait non ?

[EDIT] Je confirme que je suis une quiche et que j'avais oublié les break !!
Evidemment c'est du script pour les paresseux mais bon...
Par ailleurs ça peut être intéressant pour les générateurs de trésor aussi...

Ouais c'est sûr que si on est courageux, on se fait tout ça à la main mais jamais on obtiendra la richesse qu'on peut avoir avec ce système.
C'est surtout intéressant pour l'artisanat : on peut enfin combiner tous les ingrédients !
D'autant que c'est tout à fait compatible avec tes 150 blueprints Taern : on peut ainsi avoir des apparences et des noms différents pour désigner des "classes" d'objets, puis des variations à l'intérieur de ces classes de façon à ne jamais avoir deux objets exactement identique. En plus on peut se retrouver avec des "pièces rares" possédant des aptitudes tout à fait particulières. On peut établir des fréquences pour chaque aptitudes, etc...


Notez par ailleurs qu'avec ce système (surtout l'histoire du OnHit) on peut inclure des "failles invisibles" dans certaines de ces armes, qui pourtant ressembleront à toutes les autres !!

Enfin je suis sûr qu'avec un peu d'imagination, on peut vraiment faire quelque chose d'intéressant avec ce système !
C kler qu'avec ce OnHit, ca laisse imaginer plein de choses au concepteurs sadiques......

Je vois bien une épée courte (pour pouvoir la mettre en main gauche) qui au lieu d'enlever des points de vie a l'adversaire, lui en redonne a chaque fois. J'imagine la réaction du PJ quand il se rendra compte que sa super "épée de la mort qui tue" fait tout sauf du mal aux ennemis
Répondre

Connectés sur ce fil

 
1 connecté (0 membre et 1 invité) Afficher la liste détaillée des connectés