Worldedit
  Worldedit
Le site sur l'éditeur de warcraft 3 !
 
  FAQFAQ   RechercherRechercher   Liste des MembresListe des Membres    Groupes d'utilisateursGroupes d'utilisateurs   medals.php?sid=37523db864e7838b8147e0dffd9a79f8Médailles   S'enregistrerS'enregistrer 
 ProfilProfil   Se connecter pour vérifier ses messages privésSe connecter pour vérifier ses messages privés   ConnexionConnexion 
  FAQFAQ World Editor   UploadUploader une map ou une image    UploadAjouter sa map à l'annuaire   UploadConsulter l'annuaire

[vJass] HelpCenter

 
Poster un nouveau sujet   Répondre au sujet    Worldedit Index du Forum -> Fonction Jass
Voir le sujet précédent :: Voir le sujet suivant  
Auteur Message
 jk2pach
Invité








MessagePosté le: 10/01/10 11:17    Sujet du message: [vJass] HelpCenter Citer

Nom de la fonction : HelpCenter
Créateur : jk2pach (Apocalypse)
Fonctions requises : Table (Vexorian@wc3.net), voir ensuite.
Code :Voir après
Utilisation : Idem, l'exemple est contenu dans la fonction
Copyright : Libre
Remarques : Nécessite le JassNewGenPack, puisqu'il s'agit d'une fonction en VJass.

Cette fonction est simple: elle permet au joueur d'afficher de l'aide en cours de carte en entrant (réglable) "-help" en cours de jeu. Le simple fait d'entrer "-help" permet d'afficher les mots-clefs disponibles pour l'aide.

Ensuite, le joueur pourra entrer "-help UnMotClef". Si UnMotClef existe, alors le jeu affichera pour ce joueur les lignes programmées.

J'utilise ce système pour Stars.
J'ai laissé les premiers mots clefs pour montrer comment remplir le texte dans l'initializer de la fonction.

Pour utiliser ces deux fonctions, créez deux déclencheurs vides sous l'éditeur. Ensuite, faites Convert to Custom Text. Effacez le contenu et remplacez le par un copier-coller des deux fonctions (la mienne, et Table)

HelpCenter
Secret:

Jass:
library HelpCenter initializer init requires Table

globals
    private constant real DUR = 30. //Le texte sera affiché pendant DUR secondes
    private constant string COM = "-help" //La chaîne de caractères entrée par un joueur pour déclencher le système
    private constant string LINE = "|c00AFAAFF"+"=============================================================="+"|r"//Permet de bien afficher les messages.
    private constant string NAME = "|c00AFAAFF"+"Help Center"+"|r" //Le titre qui sera affiché au dessus des rubriques
    private constant string INFO = "Enter -help XXXX where XXXX is one of the following key words:" //Texte affiché lorsque l'on entre simplement la commande "-help"
    string array HelpName [30] //le titre de chaque rubrique (le mot clef). Ici, 30 maximum
    string array HelpText [30][15] //Le contenu de chaque rubrique associée à un mot+clef. On a bien 30 mots clefs maximum, et, ensuite, jusqu'à 15 lignes de textes séparées qui peuvent être affichées. Je déconseille d'en utiliser plus pour des questions de lisibilité.
    constant integer HelpTextMax = 15//Nombre maximum de phrases (le 15 de la variable précédente)
    integer HelpMax = 0//Sera utilisé pour détecter automatiquement le nombre de mots clefs. Ne pas modifier
    private StringTable Str_table//Ne pas modifier: équivalent d'un hashtable, mais permettant l'usage de strings
    private integer HelpCommand_length //Ne pas modifier: permettra de stocker le nombre de caractères de la commande -help
endglobals

//Ne pas modifier cette fonction: permet d'enregistrer les données
    //! textmacro t__HelpSystem_Init takes TEXT_ID, TITLE1 ,TITLE2
    set Str_table["$TEXT_ID$"] = $TEXT_ID$
    set Str_table["$TITLE1$"] = $TEXT_ID$
    set Str_table["$TITLE2$"] = $TEXT_ID$
    //! endtextmacro
//
//ici, il vous suffit de reproduire vos propres textes. N'oubliez pas d'incrémenter l'entier i
    private function SetTextVariables takes nothing returns nothing
        local integer i = 1
            //Respect the order of letters is better.
            set HelpName[i]= "Alien"
            set HelpText[i][0]="Can not colonize planet or build structures."
            set HelpText[i][1]="Can not collect resources."
            set HelpText[i][2]="Do not have income."
            set HelpText[i][3]="Can only build light shuttle."
            set HelpText[i][4]="Can improve units by making them assemblate."
            set HelpText[i][5]="Really different units than other ways."
            set HelpText[i][6]= "Aliens earn XP by assimilating planets."
            //! runtextmacro t__HelpSystem_Init("i","alien","aliens")
            set i = i + 1
            //
            set HelpName[i]= "Assimilate"
            set HelpText[i][0]= "Assimilate is available for Aliens only."
            set HelpText[i][1]= "To assimilate a planet, which will grants you Resources (Iron and Pulsars), you need to send an Alien Mothership or Omega Cruiser to the planet target."
            set HelpText[i][2]= "Then you have to use the skill of the Mothership or the Omega Cruiser called Assimilate by targeting the planet with this skill."
            set HelpText[i][3]= "This skill works on all planets."
            set HelpText[i][4]= "If Assimilate is a success, you will get more Resources and you will be receive more Alpha Light Shuttles."
            set HelpText[i][5]= "Assimilation grants XP"
            //! runtextmacro t__HelpSystem_Init("i","assimilate","assimilise")
            set i = i + 1
            //
            set HelpMax = i
    endfunction
//
//Ne pas modifier
    private function Conditions takes nothing returns boolean
        local player whichPlayer = GetTriggerPlayer()
        local string text = GetEventPlayerChatString()
        local integer string_length = StringLength(text)
        local integer index
        local integer i = 0           

//Si la commande est égale à "-help", on affiche la liste des mots clefs
//Si la commande est égale à "-help" + quelque chose, on regarde si le quelque chose correspond à un mot clef enregistré. Si oui, on va afficher pour le joueur l'ensemble des phrases associées.
            if SubString(text,0,HelpCommand_length) == COM then
           
                set text = SubString(text,HelpCommand_length+1,string_length)
               
                if text != null then
                    set index = Str_table[text]
                    call DisplayTimedTextToPlayer(whichPlayer,0.,0.,DUR,LINE)
                    call DisplayTimedTextToPlayer(whichPlayer,0.,0.,DUR,"|c00AFAAFF"+HelpName[index]+"|r")
                    loop
                        exitwhen i > HelpTextMax
                       
                        if HelpText[index][i]!= null then
                            call DisplayTimedTextToPlayer(whichPlayer,0.,0.,DUR,HelpText[index][i])
                        endif
                       
                        set i = i + 1
                    endloop
                   
                else
               
                    set text = "Keywords: "
                    call DisplayTimedTextToPlayer(whichPlayer,0.,0.,DUR,LINE)
                    call DisplayTimedTextToPlayer(whichPlayer,0.,0.,DUR,NAME)
                    call DisplayTimedTextToPlayer(whichPlayer,0.,0.,DUR,INFO)
                   
                    loop
                        exitwhen i > HelpMax
                       
                        if HelpName[i]!= null then
                            set text = text+" - "+HelpName[i]
                        endif
                       
                        set i = i + 1
                    endloop
                   
                    call DisplayTimedTextToPlayer(whichPlayer,0.,0.,DUR,text)
                    call DisplayTimedTextToPlayer(whichPlayer,0.,0.,DUR,LINE)
               
                endif
               
            endif
            set text = null
            set whichPlayer = null
            return false
           
    endfunction

    private function init takes nothing returns nothing
        local trigger t = CreateTrigger()
        local integer i = 0
            set Str_table = StringTable.create()
            call SetTextVariables()
            set HelpCommand_length = StringLength(COM
            set i = 0
            loop
                exitwhen i > MAXPLAYER
                call TriggerRegisterPlayerChatEvent( t, Player(i), COM, false )
                set i = i + 1
            endloop
            call TriggerAddCondition(t, Condition(function Conditions))
    endfunction   

endlibrary



Table de Vexorian: permet d'utiliser différement les hashtables (avec des chaines de caractères plutôt que des entiers).

Table
Secret:

Jass:
[Jass:b305b1ed98]library Table
//***************************************************************
//* Table object 3.0
//* ------------
//*
//*   set t=Table.create() - instanceates a new table object
//*   call t.destroy()     - destroys it
//*   t[1234567]           - Get value for key 1234567
//*                          (zero if not assigned previously)
//*   set t[12341]=32      - Assigning it.
//*   call t.flush(12341)  - Flushes the stored value, so it
//*                          doesn't use any more memory
//*   t.exists(32)         - Was key 32 assigned? Notice
//*                          that flush() unassigns values.
//*   call t.reset()       - Flushes the whole contents of the
//*                          Table.
//*
//*   call t.destroy()     - Does reset() and also recycles the id.
//*
//*   If you use HandleTable instead of Table, it is the same
//* but it uses handles as keys, the same with StringTable.
//*
//*  You can use Table on structs' onInit  if the struct is
//* placed in a library that requires Table or outside a library.
//*
//*  You can also do 2D array syntax if you want to touch
//* mission keys directly, however, since this is shared space
//* you may want to prefix your mission keys accordingly:
//*
//*  set Table["thisstring"][ 7 ] = 2
//*  set Table["thisstring"][ 5 ] = Table["thisstring"][7]
//*
//***************************************************************

//=============================================================
    globals
        private constant integer MAX_INSTANCES=8100 //400000
        //Feel free to change max instances if necessary, it will only affect allocation
        //speed which shouldn't matter that much.

    //=========================================================
        private hashtable ht
    endglobals

    private struct GTable[MAX_INSTANCES]

        method reset takes nothing returns nothing
            call FlushChildHashtable(ht, integer(this) )
        endmethod

        private method onDestroy takes nothing returns nothing
            call this.reset()
        endmethod

        //=============================================================
        // initialize it all.
        //
        private static method onInit takes nothing returns nothing
            set ht = InitHashtable()
        endmethod

    endstruct

    //Hey: Don't instanciate other people's textmacros that you are not supposed to, thanks.
    //! textmacro Table__make takes name, type, key
    struct $name$ extends GTable

        method operator [] takes $type$ key returns integer
            return LoadInteger(ht, integer(this), $key$)
        endmethod

        method operator []= takes $type$ key, integer value returns nothing
            call SaveInteger(ht,  integer(this)  ,$key$, value)
        endmethod

        method flush takes $type$ key returns nothing
            call RemoveSavedInteger(ht, integer(this), $key$)
        endmethod

        method exists takes $type$ key returns boolean
            return HaveSavedInteger( ht,  integer(this)  ,$key$)
        endmethod

        static method flush2D takes string firstkey returns nothing
            call $name$(- StringHash(firstkey)).reset()
        endmethod

        static method operator [] takes string firstkey returns $name$
            return $name$(- StringHash(firstkey) )
        endmethod

    endstruct
    //! endtextmacro

    //! runtextmacro Table__make("Table","integer","key" )
    //! runtextmacro Table__make("StringTable","string", "StringHash(key)" )
    //! runtextmacro Table__make("HandleTable","handle","GetHandleId(key)" )

endlibrary
[/Jass:b305b1ed98]


Update 09/04/2010 - utilise les Tables pour gagner en vitesse.
_________________


Dernière édition par jk2pach le 09/04/10 10:04; édité 2 fois
Revenir en haut
 Troll-Brain
Ri1kamoua


Inscrit le: 23 Aoû 2007
Messages: 7143
Sujets: 147
Spécialité en worldedit: le troll, le flood, la vulgarité, mon coeur balance
Médailles: 2 (En savoir plus...)
Grand mage créateur de sort (Quantité : 1) Rédacteur de tuto #3 (Quantité : 1)

MessagePosté le: 10/01/10 19:20    Sujet du message: Citer

Quelque détails :

1) Ça ne nécessite pas forcément le JNGP mais un compilateur vJass, donc à priori JassHelper, mais Le JNGP est le tout en un utilisé par 99,9 % des utilisateurs windows (statistiques pris au café du coin de la gare de Rambouillet).

2) Le code que doit modifier l'utilisateur devrait se trouver juste après les constantes dans une function private tel que EditTheCodeHere.
L'initializer resterait à la fin mais appellerait cette fonction.

3) On devrait pouvoir choisir le nombre de string alternatifs via une constant integer

4) On ne devrait pas être obligé de taper les strings alternatifs.

5) Tu devrais séparer en 2 bloc de globals les variables constantes que l'utilisateur peut modifier des autres utilisées internalement par la librairie.

6) En parlant du code en lui même les loop c'est pas génial mais ca n'a pas grande importance ici, c'est juste un texte affiché quand un joueur demande de l'aide.
Mais parce que je suis complètement givré j'aurais probablement utilisé une hashtable ou quelque chose du style pour rendre l'exécution du code O(1) et non O(N)
_________________
Le violet, c'est moche.
Revenir en haut
Voir le profil de l'utilisateur Envoyer un message privé
 jk2pach
Invité








MessagePosté le: 11/01/10 08:48    Sujet du message: Citer

Pour les hashtables je ne voit pas trop comment les utiliser ici Surprised (et pourquoi? C'est plus rapide?)
_________________
Revenir en haut
 Magus
Membre a fort taux de post


Inscrit le: 13 Oct 2007
Messages: 994
Sujets: 25
Spécialité en worldedit: Codeur


MessagePosté le: 11/01/10 11:06    Sujet du message: Citer

Tu ranges les différents éléments des aides (ou alors juste leur indice) dans une HashTable indexé par leur nom. Lorsqu'un joueur tape un nom d'aide, tu regardes dans la table avec ce nom. Si ce nom est pas dans la table, le joueur a entré une commande inconnue.

EDIT : Et c'est plus rapide dans le sens ou tu n'as pas de boucle. La seule chose que tu fais c'est regarde dans à la bonne place dans un tableau pour récupérer ce dont tu as besoin (du moins, si les hashtables n'ont pas été codés avec les pieds).
_________________
- La théorie c'est quand rien ne fonctionne mais tout le monde sait pourquoi.
- La pratique c'est quand tout fonctionne mais personne ne sait pourquoi.
- Chez moi la théorie et la pratique sont réunies, rien ne fonctionne et personne ne sait pourquoi.
Revenir en haut
Voir le profil de l'utilisateur Envoyer un message privé MSN Messenger
 jk2pach
Invité








MessagePosté le: 11/01/10 13:30    Sujet du message: Citer

Ca signifie donc que je devrais remplacer toutes mes boucles par des hashtables? (pas que pour cette fonction, mais en général).
_________________
Revenir en haut
 Rommstein60
MODÉRATEUR À LA RETRAITE


Inscrit le: 23 Aoû 2007
Messages: 4766
Sujets: 136
Spécialité en worldedit: Keskesapeutfout'
Médailles: 1 (En savoir plus...)
Rédacteur de tuto #1 (Quantité : 1)

MessagePosté le: 11/01/10 16:56    Sujet du message: Citer

Apocalypse a écrit:
Ca signifie donc que je devrais remplacer toutes mes boucles par des hashtables? (pas que pour cette fonction, mais en général).

D'un point de vue logique, utiliser des boucles va entraîner à pas mal de vérification de conditions, tandis qu'un hashtable va directement chercher la valeur dans l'index donné. Mais je pense que ça dépend de la situation aussi, ce système n'utilise pas non plus des tonnes de conditions dans un temps normal, si on arrive à plusieurs centaines/milliers de conditions, alors là mieux vaut peut-être utiliser un hashtable.
Selon moi.

_________________
Leçon n°1 du WorldEdit : « Le violet > Troll-Brain »
Revenir en haut
Voir le profil de l'utilisateur Envoyer un message privé
 Troll-Brain
Ri1kamoua


Inscrit le: 23 Aoû 2007
Messages: 7143
Sujets: 147
Spécialité en worldedit: le troll, le flood, la vulgarité, mon coeur balance
Médailles: 2 (En savoir plus...)
Grand mage créateur de sort (Quantité : 1) Rédacteur de tuto #3 (Quantité : 1)

MessagePosté le: 11/01/10 17:39    Sujet du message: Citer

Comme je l'ai dit je le ferais juste parce que je suis givré, mais basiquement ce que dit Rommstein est vrai.
Enfin tu divises centaines par 10, mais on doit réellement se poser la question de l'utilité d'une telle chose que dans un code appelé très fréquemment ou X fois dans un intervalle de temps très court.

Ce n'est clairement pas le cas ici.

D'ailleurs je me demande si l'utilisation d'un gamecache ne serait pas plus approprié qu'une hashtable, étant donné l'utilisation de strings.
Tout dépend de l'efficacité de la fonction StringHash.

Mais il faut savoir qu'une hashtable tout comme le gamecache d'ailleurs est "case insentive", ne tient pas compte de la casse, ou autrement dit ne différencie pas les minuscules des majuscules.

Cette limitation est plutôt un atout en général que quelque chose de gênant, surtout dans cet exemple.

Dans le cas de StringHash, cette fonction est de plus "slash insentive" (peut être est ce la même chose pour le game cache).
Et peut être existe t'il d'autres problèmes du genre.
_________________
Le violet, c'est moche.
Revenir en haut
Voir le profil de l'utilisateur Envoyer un message privé
 profet
Instanton Gravitationnel Singulier


Inscrit le: 21 Aoû 2007
Messages: 1633
Sujets: 53
Spécialité en worldedit: Pain d'épice multitâche (terrain, scripts, textures, modèles...)
Médailles: 2 (En savoir plus...)
Profet (Quantité : 1) Rédacteur de tuto #3 (Quantité : 1)

MessagePosté le: 11/01/10 19:41    Sujet du message: Citer

...

ou en faisant une conceptions un peu différente mais plus évoluée, dans les grandes lignes:

- un système de "registration" pour externaliser (hors de la librairie) les commandes (spécifiques à la map)

- une StringTable contenant les callbacks (fcts à appeler) en fonction de la commande passée
_________________

Bêta Systems: 70%
Bêta Spells: 13%
Bêta Arts & graphics: 70%
Revenir en haut
Voir le profil de l'utilisateur Envoyer un message privé Visiter le site web du posteur
 Troll-Brain
Ri1kamoua


Inscrit le: 23 Aoû 2007
Messages: 7143
Sujets: 147
Spécialité en worldedit: le troll, le flood, la vulgarité, mon coeur balance
Médailles: 2 (En savoir plus...)
Grand mage créateur de sort (Quantité : 1) Rédacteur de tuto #3 (Quantité : 1)

MessagePosté le: 11/01/10 19:50    Sujet du message: Citer

profet a écrit:
...

Allez fais toi plaisir, vomit ton mépris.

Perso je pense que j'utiliserais une hashtable.
Je vois difficilement plus facile et configurable tout en ayant une efficacité raisonnable.

Enfin bien sûr faut coder autour de l'utilisation de la hahstable pour faire quelque chose d'utilisable.
_________________
Le violet, c'est moche.
Revenir en haut
Voir le profil de l'utilisateur Envoyer un message privé
 jk2pach
Invité








MessagePosté le: 09/04/10 09:52    Sujet du message: Citer

Fonction actualisée grâce à l'aide de Troll-Brain.

Je me sers d'un Hashtable, ce qui permet une vitesse plus grande.
En conservant l'usage de variables pour le contenu du texte, on conserve la souplesse du système d'avant (pouvoir facilement ajouter/supprimer des mots-clefs et leurs textes associés).
_________________
Revenir en haut
 Dj0z
Membre actif


Inscrit le: 05 Avr 2010
Messages: 114
Sujets: 8
Spécialité en worldedit: Faire des maps originales; déclencheurs; solutions.


MessagePosté le: 09/04/10 10:05    Sujet du message: Citer

Troll-Brain a écrit:


Dans le cas de StringHash, cette fonction est de plus "slash insentive" (peut être est ce la même chose pour le game cache).
Et peut être existe t'il d'autres problèmes du genre.


...Plaît-il?
_________________
Pour tout ce qui concerne mes maps: http://dj0zmaps.goodforum.net/

"Avatar: L'Ennemi Imprévu": Avatar (de James Cameron) dans warcraft!
http://www.hiveworkshop.com/forums/maps-564/avatar-0-27b-164032/

Chaos Colossus: L'assaut des Colosses du Chaos!
http://www.hiveworkshop.com/forums/maps-564/chaos-colossus-0-83-ju-123911/

Rival Dynasties: Découvrez le vrai potentiel de warcraft, sur fond de guerres dynastiques!
http://www.hiveworkshop.com/forums/maps-564/rival-dynasties-0-99j-142287/
Revenir en haut
Voir le profil de l'utilisateur Envoyer un message privé Visiter le site web du posteur
 Troll-Brain
Ri1kamoua


Inscrit le: 23 Aoû 2007
Messages: 7143
Sujets: 147
Spécialité en worldedit: le troll, le flood, la vulgarité, mon coeur balance
Médailles: 2 (En savoir plus...)
Rédacteur de tuto #3 (Quantité : 1) Grand mage créateur de sort (Quantité : 1)

MessagePosté le: 09/04/10 20:03    Sujet du message: Citer

J'ai lu cela quelque part, sans tester.
Mais là je viens d'essayer ceci.
Jass:
StringHash("a/b") == StringHash("a\\b")

Par contre si tu changes le nombre de slashs tu obtient des résultats différents.
Je suppose que celui qui m'a dit cela est encore parti d'un cas particulier pour en faire une généralité ...
Pourtant je le savais que je ne devais faire confiance à personne Razz

EDIT :

Apocalypse a écrit:
Table de Vexorian: permet d'utiliser différement les hashtables (avec des chaines de caractères plutôt que des entiers).

Non ...
C'est juste une façon sexy d'utiliser une hashtable.
Mais cela n'est parfois pas suffisant, et utiliser les 2 paramètres d'une hashtable (entre autres choses) peut s'avérer être utile, voir indispensable.
_________________
Le violet, c'est moche.
Revenir en haut
Voir le profil de l'utilisateur Envoyer un message privé
 Dj0z
Membre actif


Inscrit le: 05 Avr 2010
Messages: 114
Sujets: 8
Spécialité en worldedit: Faire des maps originales; déclencheurs; solutions.


MessagePosté le: 10/04/10 13:26    Sujet du message: Citer

Donc slash insensitive signifie que " / " et " \ " sont traités indifféremment, tant qu'on n'en met qu'un , c'est ça?
_________________
Pour tout ce qui concerne mes maps: http://dj0zmaps.goodforum.net/

"Avatar: L'Ennemi Imprévu": Avatar (de James Cameron) dans warcraft!
http://www.hiveworkshop.com/forums/maps-564/avatar-0-27b-164032/

Chaos Colossus: L'assaut des Colosses du Chaos!
http://www.hiveworkshop.com/forums/maps-564/chaos-colossus-0-83-ju-123911/

Rival Dynasties: Découvrez le vrai potentiel de warcraft, sur fond de guerres dynastiques!
http://www.hiveworkshop.com/forums/maps-564/rival-dynasties-0-99j-142287/
Revenir en haut
Voir le profil de l'utilisateur Envoyer un message privé Visiter le site web du posteur
 Troll-Brain
Ri1kamoua


Inscrit le: 23 Aoû 2007
Messages: 7143
Sujets: 147
Spécialité en worldedit: le troll, le flood, la vulgarité, mon coeur balance
Médailles: 2 (En savoir plus...)
Grand mage créateur de sort (Quantité : 1) Rédacteur de tuto #3 (Quantité : 1)

MessagePosté le: 10/04/10 14:09    Sujet du message: Citer

Dj0z a écrit:
Donc slash insensitive signifie que " / " et " \ " sont traités indifféremment, tant qu'on n'en met qu'un , c'est ça?

Non, quand je n'en met qu'un je n'obtient pas le même entier, seulement comme dans l'ex.
Y'a surement d'autres cas particuliers, seul avoir l'algorithme de StringHash sous les yeux permettrait d'éclaircir totalement le mystère Sad
_________________
Le violet, c'est moche.
Revenir en haut
Voir le profil de l'utilisateur Envoyer un message privé
Montrer les messages depuis:   
Poster un nouveau sujet   Répondre au sujet    Worldedit Index du Forum -> Fonction Jass Toutes les heures sont au format GMT + 1 Heure
Page 1 sur 1
La question posée dans ce topic a été résolue !

 
Sauter vers:  
Vous ne pouvez pas poster de nouveaux sujets dans ce forum
Vous ne pouvez pas répondre aux sujets dans ce forum
Vous ne pouvez pas éditer vos messages dans ce forum
Vous ne pouvez pas supprimer vos messages dans ce forum
Vous ne pouvez pas voter dans les sondages de ce forum


Powered by phpBB © 2001, 2005 phpBB Group
Traduction par : phpBB-fr.com