Script engine (un début)

Description

J'ai recherché activement un moteur de script pour un jeu que je refais en C# XNA et je n'ai pas réussis a en trouver. Mise à part certain sous forme de dll mais bon je n'avais pas envie d'ajouter de dll en plus de celle qu'il y a déjà. Je me suis donc mis à écrire un petit moteur de script. Sous forme de class qui doit être hérité.
Il n'est pas à sa version finale et reste énormement à être améhttp://rp.devfr.com/delivery/ck.php?oaparams=2__bannerid=19__zoneid=62__cb=bae316337e__maxdest=http://boutique.codes-sources.com/produit-avanquest-techsmith-snag-it-38746748.aspx
SnagIT, THE outil de capture !lioré(Je l'ai programmé en une semaine a peu prés).
    • En somme il supporte les instructions

les plus :
for, repeat, while, switch, if
les tableaux unidimentionnel déclaration $ar=array(1,3," rrr",$i)
les opérateurs : +, -, *, /, %, &(concaténation de chaine)
les variables commences toutes par '$'
1 instruction par ligne

exemple:
$i++
$i+=1
possibilité "d'interfacer" les objets avec le script

les moins :
Quand je l'ai dévellopé (cette semaine)
par de report en cas d'erreur c'est c# qui génére les erreurs
dans les fonctions ne pas appeler d'autre fonction ex:
$i = input( strtoupper("quelquechose"),"valeur par defaut")
ou encore $r=array(random(1))
  • Respecter scrupuleusement la syntaxe

ex :
for($x=0;$x<10;$x++)
{
..
..
}

fonctionnera alors que
for($x=0;$x<10;$x++) { ..... }
ne fonctionnera pas

les chaines ne doivent pas contenir de double + ou -
ex : $r= "petit teste -- ok"
et d'autre détaille que je n'ai pas remarqué peut être
le mieux reste d'essayer

Source / Exemple :


// exemple de derivation
    public class AdaptedScript : Scripting
    {
        //ajout d'un objet Form1 parent
        protected Form1 parent;

        public AdaptedScript(Form1 aparent)
        {
            parent = aparent;
        }
            
        protected override string GetStrFromOtherVar(string name, string[] param, out bool finded)
        {
         //dans le script $b2.top représente évidement la position Y du controle dans la fiche
            if (name == "$b2.top")
            {
                finded = true;
                return parent.button2.Top.ToString();
            }
            finded = false;
            return "none";
        }
        protected override bool SetOtherVar(string name, string[] param, string value)
            {
                //name contient le nom de la variable à affecter
                //exemple de script : $teste.x.y=12+8
                //ici name sera $teste.x.y et value sera 20
                //dans le cas de tableau ex $v[4,7] name sera $v et param[] = {4,7}
                if (name == "$list")
                {
                    parent.listBox1.Items[Convert.ToInt32(param[0])] = value;
                    return true;
                }
                else if (name == "$b2.top")
                {
                    parent.button2.Top = Convert.ToInt32(value);
                    return true;
                }
                return false;
            }

        protected override string DoFunction(string name, string[] param)
        {
            if (name == "input")
            {
                if (param.Length >= 2)
                {
                    parent.input.Text = param[0];
                    parent.input.txtResultat.Text = param[1];
                    parent.input.ShowDialog();
                    return Encode(parent.input.txtResultat.Text);
                }
                //necessité d'encoder les chaines de caracteres
                return Encode(param[0]);
            }
            else if (name == "lcase")
                return param[0].ToLower();
            else if (name == "ucase")
                return param[0].ToUpper();
            else return base.DoFunction(name, param);
        }
        
        protected override void DoMethode(string name, string[] param)
        {
            if (name == "$list.add")
                parent.listBox1.Items.Add(param[0]);
            else if (name == "$list.clear")
                parent.listBox1.Items.Clear();
            else if (name == "$button.setcolor")
                parent.button1.BackColor = Color.FromArgb(Convert.ToInt32(param[0]), Convert.ToInt32(param[1]), Convert.ToInt32(param[2]));
            else if (name == "$b2.randcolor")
                parent.button2.BackColor = Color.FromArgb(Convert.ToInt32(rnd.Next(255)), Convert.ToInt32(rnd.Next(255)), Convert.ToInt32(rnd.Next(255)));
            else if (name == "show")
                parent.mess(param[0]);
            else base.DoMethode(name, param);
        }
    }

Conclusion :


Dans son état actuel peut être exploitable à condition de faire trés attention au code. Peut être un bon exemple d'emploi massif de fonction récursive. Je vais essayer de l'améliorer même si il me suffit dans son état actuel. N'hésitez pas à laisser des commentaires.

Codes Sources

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.