hofmeister Bavard
Messages : 109
| Sujet: Scripts RPG[dial,journal,inventaire/caracteristiques] Mer 22 Mai 2013 - 14:09 | |
| Bonjour, voila des scripts pour mettre en place un système de dialogue avec conditions et résultats pour GM7 pro. Edit: j'ai réutilisé la base pour enregistrer un journal dans une liste. Système de dialoguesUtilité: Utiliser des variables définies dans un système de fichier texte pour organiser, poser des conditions et modifier des variables dans les dialogues. - Spoiler:
Le principe est d'entrer des noms de variables dans un fichier input_dialog, dans le répertoire de votre programme, qui seront exploités -en tant que condition, avec les opérateurs <=> possibles. Je ne suis pas sûr que les priorités des conditions fonctionnent parfaitement, on ne peut mettre de parenthèses. Les deux premières conditions liées par || ou && sont prioritaires sur les autres. -en tant que résultat, on peut incrémenter décrémenter ou assigner. (+=,-=,=) L'idée principale est de créer un fichier texte du même nom que l'objet qui doit "parler", dans un système inspiré de l'éditeur d'arcanum, sous la forme: {1}{texte de bienvenue du npc}{condition(s)}{résultats}{} {2}{réplique 1}{conditions}{resultats}{goto} {10}{dialogue2}{conditions}{résultats}{}... Par exemple avec les variables pers int définie dans le fichier input_dialog (une variable par ligne, pas d'interlignes), un objet personnage dans GM et un fichier personnage.txt dans le même répertoire, la forme suivante: {1}{Bonjour}{int >6}{}{} {2}{Quelle est la suite?}{}{}{60} {3}{Au revoir}{}{}{0} {10}{Toi pas malin}{int <7}{}{} {11}{Mais j'm'amiéliore}{}{int+=1}{20} {12}{Mais persuasif}{pers >4}{}{} {20}{A voir}{}{}{} {21}{Au Revoir}{}{}{0} {60}{Tu as gagné un niveau}{}{}{} {61}{Salut}{}{}{0} donnera, après bien sûr avoir réglé les variables int et pers pour le joueur par exemple à 4 et 5, 2 fois Toi pas malin (si on clique sur "je m'améliore->A voir, au revoir), puis le joueur ayant gagné 2 sur la variable int, la réplique de bienvenue devient bonjour->quelle est la suite-> Tu as gagné... A noter l'espace obligatoire après le nom de variable pour la condition, son absence dans les résultats. Les textes de bienvenue alternatifs doivent impérativement se trouver avant les dialogues où renvoient les goto, ici par exemple le texte de bienvenue 10 précède 20 et 60. Pour ce, il faut d'abord mettre dans un contrôleur en Game Start le script suivant de déclaration de variables, utiliser une liste n'était peut-être pas obligatoire, enfin... - Code:
-
{ globalvar dial;globalvar sortie;globalvar last_object; globalvar repliques;globalvar l_journal;globalvar testboone; globalvar l_count;globalvar vardial; dial=0;sortie="";l_count=0;testboone=0; repliques=ds_list_create(); l_journal=ds_list_create(); script_execute(sc_read_eq); } Il faudra créer un objet o_perso, les personnages devant parler l'auront pour parent, et mettre dans un event left pressed: - Code:
-
{ /*Le script analyse le fichier du nom de l'objet affecté par le dialogue, le stocke dans un tableau à deux entrées dont la première, de 0 à 4, représente: 0:"l'index" de la réplique. la ligne suivante, si égale à cet index+1, sera une réplique du joueur. 1:le texte à afficher 2:des conditions cf sc_div_str_c 3:des résultats 4:l'index de renvoi, vide pour la réplique du NPC,rempli pour la réplique du joueur, ou 0 si c'est un "au revoir" la deuxième entrée est la ligne où se situent les diverses répliques */ globalvar rep_actuelle;
dial=1; last_object=id; if file_exists(string(object_get_name(object_index))+".txt") { current=file_text_open_read(string(object_get_name(object_index))+".txt"); l_count=0; while!(file_text_eof(current)) { ligne[l_count]=file_text_read_string(current); file_text_readln(current); l_count+=1; } file_text_close(current); } for (j=0;j<l_count;j+=1) { incoma=string_pos("{",ligne[j]); crochet=string_copy(ligne[j],incoma+1,string_length(ligne[j])-incoma); incoma2=string_pos("{",crochet); incomb=string_pos("}",ligne[j]); countcra=string_count("{",ligne[j]); countcrb=string_count("}",ligne[j]); if (countcra==5)&&(countcrb==5) { if incoma2>incomb-incoma { temp=string_copy(ligne[j],incoma+1,incomb-incoma-1); vardial[0,j]=temp; } else { break; } incoma=string_pos("{",crochet); crochet2=string_copy(crochet,incoma+1,string_length(crochet)-incoma); incomb=string_pos("}",crochet2); incoma2=string_pos("{",crochet2); if incoma2>incomb-incoma { temp=string_copy(crochet,incoma+1,incomb-1); vardial[1,j]=temp; } else { break; } incoma=string_pos("{",crochet2); crochet3=string_copy(crochet2,incoma+1,string_length(crochet2)-incoma); incomb=string_pos("}",crochet3); incoma2=string_pos("{",crochet3); if incoma2>incomb-incoma { temp=string_copy(crochet2,incoma+1,incomb-1); vardial[2,j]=temp; } else { break; } incoma=string_pos("{",crochet3); crochet4=string_copy(crochet3,incoma+1,string_length(crochet3)-incoma); incomb=string_pos("}",crochet4); incoma2=string_pos("{",crochet4); if incoma2>incomb-incoma { temp=string_copy(crochet3,incoma+1,incomb-1); vardial[3,j]=temp; } else { break; } incoma=string_pos("{",crochet4); crochet5=string_copy(crochet4,incoma+1,string_length(crochet4)-incoma); incomb=string_pos("}",crochet5); temp=string_copy(crochet4,incoma+1,incomb-1); vardial[4,j]=temp; } else { break; } } lenum=script_execute(sc_seek_fc); temp=vardial[1,lenum]; temp2=vardial[2,lenum]; condi=true; if temp2!="" { condi=script_execute(sc_div_str_c,temp2); } rep_actuelle=lenum; if condi == true { if (variable_local_exists("temp")) { sortie=temp; script_execute(sc_div_str_r,vardial[3,lenum]); } pri=lenum+1; ds_list_clear(repliques); do { temp=real(vardial[0,pri]); temp2=real(vardial[0,pri-1])+1; co=script_execute(sc_div_str_c,vardial[2,pri]); if (variable_local_exists("temp"))&&(temp==temp2)&&(co==true) { ds_list_add(repliques,vardial[1,pri]); } pri+=1; } until !((pri<l_count)&&(temp==temp2)) }
} Nommer un script sc_seek_fc, et y coller: - Code:
-
{ for(z=0;z<l_count;z+=1) { if vardial[4,z]=="" { tep=script_execute(sc_div_str_c,vardial[2,z]); if tep==true { return z; } } } } Puis un script sc_div_str_c, et y coller: - Code:
-
{ /*A utiliser avec comme entree la string des conditions, du type "j_disc >4||j_int >4&&j_int <10", notez l'espace obligatoire après le nom de variable. Si le premier boléen est un OR et que la première ou la 2eme expression est vraie,la fonction return true. Sauf ce cas, Les AND doivent être placés AVANT les OR, sinon ils les annulent: exp1&&exp2||exp3&&exp4 fonctionne comme: (exp1&&exp2)&&(exp2||exp3)&&(exp3&&exp4) donc équivaut à exp1&&exp2&&exp3&&exp4. Par contre: exp1&&exp1||exp2||exp3||exp4&&exp5 donne exp1&&(exp2||exp3)&&exp4&&exp5 ou différemment: exp1&&exp2||exp3 donne (exp1&&exp2)&&(exp2||exp3) donc exp3 est inutile. exp1&&exp2||exp3||exp4 donne (exp1&&exp2)&&(exp3||exp4)*/ count=string_count("&&",argument)+string_count("||",argument); copy=argument; if argument=="" { return true; } if count==0 { cond[0]=2; temcostr=string_copy(copy,1,string_length(copy)); lete=script_execute(sc_an_c,temcostr); return lete; } for(i=0;i<count+1;i+=1) { incoma=string_pos("&&",copy); incomb=string_pos("||",copy); incomc=string_pos(" ",copy); if (incoma!=0)&&(incomb==0) { cond[i]=0; temcostr=string_copy(copy,1,incoma-1); check[i]=script_execute(sc_an_c,temcostr); copy2=string_copy(copy,incoma+2,string_length(copy)-(incoma+1)); copy=copy2; } if (incoma==0)&&(incomb!=0) { cond[i]=1; temcostr=string_copy(copy,1,incomb-1); check[i]=script_execute(sc_an_c,temcostr); copy2=string_copy(copy,incomb+2,string_length(copy)-(incomb+1)); copy=copy2; } if (incoma<incomb)&&(incomb!=0)&&(incoma!=0) { cond[i]=0; temcostr=string_copy(copy,1,incoma-1); check[i]=script_execute(sc_an_c,temcostr); copy2=string_copy(copy,incoma+2,string_length(copy)-(incoma+1)); copy=copy2; } if (incomb<incoma)&&(incoma!=0)&&(incomb!=0) { cond[i]=1; temcostr=string_copy(copy,1,incomb-1); check[i]=script_execute(sc_an_c,temcostr); copy2=string_copy(copy,incomb+2,string_length(copy)-(incomb+1)); copy=copy2; } if (incoma==0)&&(incomb==0) { cond[i]=2; temcostr=string_copy(copy,1,string_length(copy)); check[i]=script_execute(sc_an_c,temcostr); } } for(i=0;i<count;i+=1) { if cond[i]==0 { if !((check[i]==true)&&(check[i+1]==true)) { return false; } } if cond[i]==1 { if i==0 { if (check[i]==true)||(check[i+1]==true) { return true; } } if !((check[i]==true)||(check[i+1]==true)) { return false; } } if i==count-1 { if cond[i+1]==2 { if cond[i]==0 { if (check[i]==false)||(check[i+1]==false) { return false; } } if cond[i]==1 { if !((check[i]==true)||(check[i+1]==true)) { return false; } } } } } return true;
} Même chose pour sc_an_c: - Code:
-
{
incomsp=string_pos(" ",argument0); incomch=string_char_at(argument0,incomsp+1); coprea=string_copy(argument0,incomsp+2,string_length(argument0)-(incomsp+1)); temv=real(coprea); switch incomch { case "<":test=1;break; case "=":test=2;break; case ">":test=3;break; default : test=0; } if test==0 { break; } temstr=string_copy(argument0,1,incomsp-1);
execute_string("temcstr="+temstr+";"); if test==1 { if temcstr<temv { return true; } else { return false; } } if test==2 { if temcstr==temv { return true; } else { return false; } } if test==3 { if temcstr>temv { return true; } else { return false; } } } sc_div_str_r: - Code:
-
{ /*Le script change une variable entree dans la 4eme paire de crochets selon le modele j_int=3 ou j_int+=3 ou j_int-=3*/ count=string_count(",",argument); copy=argument; if argument=="" { break; } if count == 0 { temcostr=string_copy(copy,1,string_length(copy)); script_execute(sc_an_r,temcostr); break; } for(i=0;i<count+1;i+=1) { incoma=string_pos(",",copy); if incoma!=0 { temcostr=string_copy(copy,1,incoma-1); } else { temcostr=copy; } script_execute(sc_an_r,temcostr); copy2=string_copy(copy,incoma+1,string_length(copy)-(incoma)); copy=copy2; } } sc_an_r: - Code:
-
{ incoms=string_pos("=",argument); if incoms == 0 { break; } coprea=string_copy(argument,incoms+1,string_length(argument)-(incoms)); if coprea =="" { break; } temv=real(coprea); incomch=string_char_at(argument,incoms-1); switch incomch { case "+":test=1;incoms-=1;break; case "-":test=2;incoms-=1;break; default : test=0; } temrstr=string_copy(argument,1,incoms-1); if test==0 { execute_string(temrstr+"=temv;"); } if test==1 { execute_string(temrstr+"+=temv;"); } if test==2 { execute_string(temrstr+"-=temv;"); } } Dans l'event Global left pressed du controller, qui sera bien sûr dans la même room que les personnages: (notez que ce script doit être modifié en fonction de la mise en forme du texte, il sert à prendre en compte le fait que le joueur clique sur une réplique et emmène au dialogue correspondant) - Code:
-
{ if dial == 1 { l_rep=ds_list_size(repliques); for(ki=1;ki<l_rep+1;ki+=1) { if (mouse_x>last_object.x-100)&&(mouse_x<last_object.x-100+string_width(ds_list_find_value(repliques,ki-1))) { if (mouse_y>last_object.y+15+20*ki)&&(mouse_y<last_object.y+15+20*ki+string_height("nimp")) { script_execute(sc_div_str_r,vardial[3,rep_actuelle+ki]); goto=real(vardial[4,rep_actuelle+ki]); if goto == 0 { dial=0; } gotol=script_execute(sc_seek_ind,goto); break; } } } if variable_local_exists("gotol") { if !(is_string(gotol)) { sortie=vardial[1,gotol]; script_execute(sc_div_str_r,vardial[3,gotol]); ds_list_clear(repliques); ji=gotol+1; rep_actuelle=gotol; do { temp=real(vardial[0,ji]); temp2=real(vardial[0,ji-1])+1; if (variable_local_exists("temp"))&&(temp==temp2) { ds_list_add(repliques,vardial[1,ji]); ji+=1; } } until !((ji<l_count)&&(temp==temp2)) } } } } En fait le texte de bienvenue est enregistré dans la variable globale 'sortie', les répliques dans la liste du même nom. JournalUtilité: Enregistrer dans une liste des entrées de journal si elles répondent aux conditions définies - Spoiler:
Pour le journal, on peut modifier le script du "clic_perso" (2eme script) pour qu'il n'analyse plus que trois paires de crochets, et qu'il prenne pour référence un fichier "journal". Ce script enregistre dans une liste les entrées texte qui répondent aux conditions. Ainsi, avec dans le fichier journal.txt: {0}{journal de bord, 9 avril 1974#Nous nous sommes mutinés.}{} {1}{La folie règne à bord}{j_int >6} On aura enregistrée la seule ligne 0 pour j_int<7, mais comme le dialogue modifie cette variable, l'entrée apparaîtra après quelques exécutions. Voila le code à entrer à l'activation d'un onglet journal: - Code:
-
{ /*Le script analyse le fichier du nom de "journal", le stocke dans un tableau à deux entrées dont la première, de 0 à 2, représente: 0:"l'index" de la réplique. la ligne suivante, si égale à cet index+1, sera une réplique du joueur. 1:le texte à afficher 2:des conditions cf sc_div_str_c
la deuxième entrée est la ligne où se situent les diverses répliques */
if file_exists("journal.txt") { current=file_text_open_read("journal.txt"); l_ct=0; while!(file_text_eof(current)) { ligne[l_ct]=file_text_read_string(current); file_text_readln(current); l_ct+=1; } file_text_close(current); } for (j=0;j<l_ct;j+=1) { incoma=string_pos("{",ligne[j]); crochet=string_copy(ligne[j],incoma+1,string_length(ligne[j])-incoma); incoma2=string_pos("{",crochet); incomb=string_pos("}",ligne[j]); countcra=string_count("{",ligne[j]); countcrb=string_count("}",ligne[j]); if (countcra==3)&&(countcrb==3) { if incoma2>incomb-incoma { temp=string_copy(ligne[j],incoma+1,incomb-incoma-1); vardial[0,j]=temp; } else { break; } incoma=string_pos("{",crochet); crochet2=string_copy(crochet,incoma+1,string_length(crochet)-incoma); incomb=string_pos("}",crochet2); incoma2=string_pos("{",crochet2); if incoma2>incomb-incoma { temp=string_copy(crochet,incoma+1,incomb-1); vardial[1,j]=temp; } else { break; } incoma=string_pos("{",crochet2); crochet3=string_copy(crochet2,incoma+1,string_length(crochet2)-incoma); incomb=string_pos("}",crochet3); temp=string_copy(crochet2,incoma+1,incomb-1); vardial[2,j]=temp; } else { break; } } ds_list_clear(l_journal); for(j=0;j<l_ct;j+=1) { tep=script_execute(sc_div_str_c,vardial[2,j]); if tep==true { ds_list_add(l_journal,vardial[1,j]); } }
} Comme on peut voir, les entrées du journal sont enregistrées dans la liste du nom de variable globale l_journal, il ne reste plus qu'à les afficher dans un draw. Inventaire/CaractéristiquesUtilité: Modifier les paramètres d'une instance en fonction de l'équipement d'items, qui se fait pour l'instant une seule fois. L'équipement de l'item est restreint par les paramètres de l'instance (on peut mettre une caractéristique minimale nécessaire...) Assigner un emplacement d'inventaire pour équiper l'item, limiter l'item à une classe. Utiliser le système d'objets parents pour créer des types de npc (humains, orcs...) dont les caractéristiques sont modifiées ensuite selon leur équipement. Faire des modèles de listes d'items possédées. - Spoiler:
L'idée est de définir en tableau de globalvar chaque item. On peut définir les items dans un fichier texte analysé selon la même méthode, ou dans un script exécuté en début de partie. Attribuer une classe au personnage peut se faire de la même façon qu'un item... A revoir pour les futurs modèles d'évolution de niveau...Pour l'instant, il y a des tableaux de taille 5: nom_objet[0]= nombre de slot, 0 sera réservé aux items "consommables", 1,2,3... représentant les emplacements d'inventaire. nom_objet[1]=durée d'activation, 0 représente toujours. nom_objet[2]=effets sur les caractéristiques de l'instance, selon la forme attaque +=/-=/= num (ex:nom_objet[2]="attaque=3,dexterite+=1"; nom_objet[3]=restriction de classe, une simple string à comparer avec celle stockée dans id.class nom_objet[4]=conditions d'équipement ex: nom_objet[4]="force >4||dexterite >7&&endurance >2 Le but est de pouvoir creer des objets dont seul l'inventaire reste à définir, leurs caractéristiques ayant été préétablies par un objet parent. On définit aussi dans un fichier texte des listes d'équipements qu'ont pourra réutiliser, sous la forme: epee_bronze,1 arc,1 Il sera judicieux de placer les équipements efficaces en début de liste car pour l'instant le premier objet répondant aux conditions d'équipement est assigné au slot équivalent. Dans cet exemple si epee_bronze[0] et arc[0] ont la même valeur, un seul sera équipé. Le nombre après la virgule est la quantité possédée. Le code suivant est à placer dans un script qu'on peut nommer sc_read_pack: - Code:
-
{ if file_exists(argument) { current=file_text_open_read(argument); l_ct=0; while!(file_text_eof(current)) { ligne[l_ct]=file_text_read_string(current); file_text_readln(current); l_ct+=1; } file_text_close(current); } for (j=0;j<l_ct;j+=1) { strie=ligne[j]; inch=string_pos(",",strie); currit=string_copy(strie,1,inch-1); currnb=real(string_copy(strie,inch+1,string_length(strie)-inch)); id.inv[j,0]=currit; id.inv[j,1]=currnb; } id.ct_inv=l_ct; } Ensuite, il faut créer un objet chaque fois qu'on veut faire varier l'équipement et mettre dans son create event: - Code:
-
script_execute(sc_read_pack,"basetemplate.txt"); où "basetemplate.txt" est le nom du pack d'équipements. Ces objets ont pour parent un autre qui définit leurs caractéristiques dans l'event room_start: - Code:
-
{ if testboone==0 { id.attaque=1; id.s_attaque=1; id.sante=10; id.s_sante=10; id.toucher=1; id.s_toucher=1; id.force=10; id.s_force=10; id.class="rogue"; id.slot0=""; id.slot1=""; event_inherited(); } } Ici, attaque, toucher, force représentent toutes les caractéristiques personnalisées que vous avez définies pour les items. En effet, les items ne peuvent que modifier les variables de l'instance associée(le joueur ou pnj), pour leur attribuer une variable propre, comme la valeur en or par exemple, il faudra la définir ailleurs. Il est aussi indispensable d'assigner une string à id.class, même "", et de définir tous les slots de nom_objet[0]. id.slot1 représente si le slot 1(correspondant à nom_objet[0]=1) est vide ("") ou assigné d'une string contenant le nom de l'objet. ("nom_objet"). les variables comme s_attaque servent à retrouver la valeur de base pour enlever un objet qui assigne une valeur avec =. Le nouvel objet parent doit avoir pour parent le (dernier) objet contenant le code suivant dans room_start event: - Code:
-
{ if testboone==0 { script_execute(sc_init_eq); testboone=1; } } sc_init_eq: - Code:
-
{ for(i=0;i<id.ct_inv;i+=1) { nomobj=id.inv[i,0]; execute_string("nv="+nomobj+"[2];"); execute_string("tpduree="+nomobj+"[1];"); execute_string("tpslot="+nomobj+"[0];"); execute_string("eqslot=id.slot"+string(tpslot)+";"); execute_string("eqclass="+nomobj+"[3];"); execute_string("strcond="+nomobj+"[4];"); tes=script_execute(sc_div_c_id,strcond); tpereur=id.class; if (tpduree==0)&&(eqslot=="")&&((tpereur==eqclass)||(eqclass==""))&&(tes==true) &&(tpslot>0) { script_execute(sc_div_eff,nv,0); execute_string("id.slot"+string(tpslot)+"=nomobj;"); } } } les scripts "sc_div_c_id" et "sc_div_eff" sont un recyclage de sc_div_str_c et sc_div_str_r qui assignent ou testent les données de l'instance plutôt que les variables. sc_div_eff a pour argument1 une valeur 0 ou 1, 0 effectue la modification telle que définie et 1 fait le contraire pour enlever l'équipement. Je les cite à tout hasard: sc_div_c_id: - Code:
-
{ /*A utiliser avec comme entree la string des conditions, du type "j_disc >4||j_int >4&&j_int <10", notez l'espace obligatoire après le nom de variable. Si le premier boléen est un OR et que la première ou la 2eme expression est vraie,la fonction return true. Sauf ce cas, Les AND doivent être placés AVANT les OR, sinon ils les annulent: exp1&&exp2||exp3&&exp4 fonctionne comme: (exp1&&exp2)&&(exp2||exp3)&&(exp3&&exp4) donc équivaut à exp1&&exp2&&exp3&&exp4. Par contre: exp1&&exp1||exp2||exp3||exp4&&exp5 donne exp1&&(exp2||exp3)&&exp4&&exp5 ou différemment: exp1&&exp2||exp3 donne (exp1&&exp2)&&(exp2||exp3) donc exp3 est inutile. exp1&&exp2||exp3||exp4 donne (exp1&&exp2)&&(exp3||exp4)*/ count=string_count("&&",argument)+string_count("||",argument); copy=argument; if argument=="" { return true; } if count==0 { cond[0]=2; temcostr=string_copy(copy,1,string_length(copy)); lete=script_execute(sc_an_c_id,temcostr); return lete; } for(li=0;li<count+1;li+=1) { incoma=string_pos("&&",copy); incomb=string_pos("||",copy); incomc=string_pos(" ",copy); if (incoma!=0)&&(incomb==0) { cond[li]=0; temcostr=string_copy(copy,1,incoma-1); check[li]=script_execute(sc_an_c_id,temcostr); copy2=string_copy(copy,incoma+2,string_length(copy)-(incoma+1)); copy=copy2; } if (incoma==0)&&(incomb!=0) { cond[li]=1; temcostr=string_copy(copy,1,incomb-1); check[li]=script_execute(sc_an_c_id,temcostr); copy2=string_copy(copy,incomb+2,string_length(copy)-(incomb+1)); copy=copy2; } if (incoma<incomb)&&(incomb!=0)&&(incoma!=0) { cond[li]=0; temcostr=string_copy(copy,1,incoma-1); check[li]=script_execute(sc_an_c_id,temcostr); copy2=string_copy(copy,incoma+2,string_length(copy)-(incoma+1)); copy=copy2; } if (incomb<incoma)&&(incoma!=0)&&(incomb!=0) { cond[li]=1; temcostr=string_copy(copy,1,incomb-1); check[li]=script_execute(sc_an_c_id,temcostr); copy2=string_copy(copy,incomb+2,string_length(copy)-(incomb+1)); copy=copy2; } if (incoma==0)&&(incomb==0) { cond[li]=2; temcostr=string_copy(copy,1,string_length(copy)); check[li]=script_execute(sc_an_c_id,temcostr); } } for(li=0;li<count;li+=1) { if cond[li]==0 { if !((check[li]==true)&&(check[li+1]==true)) { return false; } } if cond[li]==1 { if li==0 { if (check[li]==true)||(check[li+1]==true) { return true; } } if !((check[li]==true)||(check[li+1]==true)) { return false; } } if cond[li]==2 { if li>0 { if cond[li-1]==0 { if !(check[li]==true) { return false; } } if cond[li-1]==1 { if !((check[li]==true)||(check[li-1]==true)) { return false; } } } } } return true;
} sc_an_c_id: - Code:
-
{
incomsp=string_pos(" ",argument0); incomch=string_char_at(argument0,incomsp+1); coprea=string_copy(argument0,incomsp+2,string_length(argument0)-(incomsp+1)); temv=real(coprea); switch incomch { case "<":test=1;break; case "=":test=2;break; case ">":test=3;break; default : test=0; } if test==0 { break; } temstr=string_copy(argument0,1,incomsp-1);
execute_string("temcstr=id."+temstr+";"); if test==1 { if temcstr<temv { return true; } else { return false; } } if test==2 { if temcstr==temv { return true; } else { return false; } } if test==3 { if temcstr>temv { return true; } else { return false; } } } sc_div_eff - Code:
-
{ /*Le script change une variable entree dans la 4eme paire de crochets selon le modele j_int=3 ou j_int+=3 ou j_int-=3*/ ctu=string_count(",",argument0); copy=argument0; if argument0=="" { break; } if ctu == 0 { temcostr=string_copy(copy,1,string_length(copy)); script_execute(sc_an_eff,temcostr,argument1); break; } for(lu=0;lu<ctu+1;lu+=1) { incoma=string_pos(",",copy); if incoma!=0 { temcostr=string_copy(copy,1,incoma-1); } else { temcostr=copy; } script_execute(sc_an_eff,temcostr,argument1); copy2=string_copy(copy,incoma+1,string_length(copy)-(incoma)); copy=copy2; } } sc_an_eff - Code:
-
{ incoms=string_pos("=",argument0); if incoms == 0 { break; } coprea=string_copy(argument0,incoms+1,string_length(argument0)-(incoms)); if coprea =="" { break; } temv=real(coprea); incomch=string_char_at(argument0,incoms-1); switch incomch { case "+":test=1;incoms-=1;break; case "-":test=2;incoms-=1;break; default : test=0; } temrstr=string_copy(argument0,1,incoms-1); if argument1==0 { if test==0 { execute_string("id."+temrstr+"=temv;"); } if test==1 { execute_string("id."+temrstr+"+=temv;"); } if test==2 { execute_string("id."+temrstr+"-=temv;"); } } if argument1==1 { if test==0 { execute_string("id."+temrstr+"=id.s_"+temrstr+";"); } if test==1 { execute_string("id."+temrstr+"-=temv;"); } if test==2 { execute_string("id."+temrstr+"+=temv;"); } } } Les scripts suivants servent à équiper un objet avec argument0=numéro de slot,argument1=la string conditionnelle habituelle. exemple: - Code:
-
script_execute(sc_eq_slot,0,"sante >8&&sante <10"); Ceci vérifie qu'une fois l'item equipée, l'id de l'objet faisant appel au script aura des caractéristiques répondant à ces conditions. Comme le slot est 0, le nombre d'item est diminué de 1, si 0 effacée de l'inventaire. sc_eq_slot: - Code:
-
{ execute_string("ns=id.slot"+string(argument0)+";"); if ns!="" { execute_string("varitres="+ns+"[2];"); execute_string("id.slot"+string(argument0)+"='';"); script_execute(sc_div_eff,varitres,1); } ntp=script_execute(sc_select_in_inv,argument0,argument1); if ntp!="" { execute_string("id.slot"+string(argument0)+"=ntp;"); execute_string("varitres="+ntp+"[2];"); script_execute(sc_div_eff,varitres,0); if argument0==0 { tpo=0; id.inv[ref_inv,1]-=1; if id.inv[ref_inv,1]<=0 { for(z=0;z<ct_inv;z+=1) { if z!=ref_inv { copinv[tpo,0]=id.inv[tpo,0]; copinv[tpo,1]=id.inv[tpo,1]; tpo+=1; } } for(z=0;z<tpo;z+=1) { id.inv[z,0]=copinv[z,0]; id.inv[z,1]=copinv[z,1]; if z==tpo-1 { id.ct_inv=tpo+1; } } } } } } sc_select_in_inv: - Code:
-
{
for(br=0;br<id.ct_inv;br+=1) { nomobj=id.inv[br,0]; execute_string("nv="+nomobj+"[2];"); execute_string("tpslot="+nomobj+"[0];"); execute_string("eqslot=id.slot"+string(tpslot)+";"); execute_string("eqclass="+nomobj+"[3];"); execute_string("strcond="+nomobj+"[4];"); tes=script_execute(sc_div_c_id,strcond); tpereur=id.class; if nv!="" { script_execute(sc_div_eff,nv,0); } tes2=script_execute(sc_div_c_id,argument1); if ((tpereur==eqclass)||(eqclass==""))&&(tes==true)&&(argument0==tpslot) &&(tes2==true) { ct_i_select=nomobj; if nv!="" { script_execute(sc_div_eff,nv,1); } ref_inv=br; return ct_i_select; } if nv!="" { script_execute(sc_div_eff,nv,1); } if br==id.ct_inv-1 { ct_i_select=ns; return ct_i_select; } } }
Un exemple de ce que ça fait: exempleLe pacman du bas aura sans doute une autre réplique une fois que vous aurez parlé au pacman du haut... Le journal est mis à jour, notez qu'en 'attaquant' le fantôme, il 'décide' de prendre des potions tant qu'il en reste. Voilà, j'espère que tout cela n'est pas trop brouillon et vous sera utile.
Dernière édition par hofmeister le Jeu 30 Mai 2013 - 11:11, édité 3 fois (Raison : complété et débuggé ajout exemple) |
|