Verificare se esiste una variabile locale

« Older   Newer »
 
  Share  
.
  1.     +1   Top   Top
     
    .
    Avatar

    Utente

    Group
    Member
    Posts
    18

    Status
    Ciao a tutti!
    Sto scrivendo questo script per individuare la presenza di una variabile, purtroppo sono niubbo e devo chiedere la vostra pazienza :(

    In breve, esiste un oggetto che permette di modificare le evocazioni delle varie magie "Evoca creatura" tramite conversazione.
    La struttura della conversazione è la seguente:
    1) Livello 1, Livello 2, ecc.. (fino al 9, uno per ogni magia "evoca creatura");
    2) Elenco evocazioni disponibili per livello.

    Una volta selezionata l'evocazione preferita, viene inserita una variabile (non numerica) su questo oggetto che permette alla magia di scegliere l'evocazione.
    es. "evoca1" (nome variabile) + "coniglio" (nome creatura)

    Quello che io vorrei fare è inserire i tokens colorati personalizzati in modo che, nel menù principale della conversazione, nell'elenco dei livelli di evoca creatura (1, 2, 3, ecc) appaia il nome della creatura scelta per ogni livello.
    Ho iniziato ad inserire, in ogni singola creatura disponibile, il SetCustomToken.

    Quello che manca è uno script che, all'attivazione dell'oggetto, verifichi l'esistenza della variabile per ogni livello e, se questa variabile non è ancora presente, inserisca come token personalizzato "da selezionare".

    Sto provando a scrivere lo script, ma non riesco a sistemare gli errori, qualcuno potrebbe aiutarmi?

    CODICE
    #include "x2_inc_switches"

    void main()

    {

                     int nEvent =GetUserDefinedItemEventNumber();

                     if(nEvent !=  X2_ITEM_EVENT_ACTIVATE)
                     return;

                     //Imposta "da scegliere" se un'evocazione non è stata ancora scelta per il livello.
                     if(GetLocalString(GetItemPossessedBy(GetPCSpeaker(), "TAG oggetto"), "evoca1"))
                       SetCustomToken(1601, "Da selezionare");
                     if(GetLocalString(GetItemPossessedBy(GetPCSpeaker(), "TAG oggetto"), "evoca2"))
                       SetCustomToken(1602, "Da selezionare");
                     if(GetLocalString(GetItemPossessedBy(GetPCSpeaker(), "TAG oggetto"), "evoca3"))
                       SetCustomToken(1603, "Da selezionare");
                     if(GetLocalString(GetItemPossessedBy(GetPCSpeaker(), "TAG oggetto"), "evoca4"))
                       SetCustomToken(1604, "Da selezionare");
                     if(GetLocalString(GetItemPossessedBy(GetPCSpeaker(), "TAG oggetto"), "evoca5"))
                       SetCustomToken(1605, "Da selezionare");
                     if(GetLocalString(GetItemPossessedBy(GetPCSpeaker(), "TAG oggetto"), "evoca6"))
                       SetCustomToken(1606, "Da selezionare");
                     if(GetLocalString(GetItemPossessedBy(GetPCSpeaker(), "TAG oggetto"), "evoca7"))
                       SetCustomToken(1607, "Da selezionare");
                     if(GetLocalString(GetItemPossessedBy(GetPCSpeaker(), "TAG oggetto"), "evoca8"))
                       SetCustomToken(1608, "Da selezionare");
                     if(GetLocalString(GetItemPossessedBy(GetPCSpeaker(), "TAG oggetto"), "evoca9"))
                       SetCustomToken(1609, "Da selezionare");
                     if(GetLocalString(GetItemPossessedBy(GetPCSpeaker(), "TAG oggetto"), "evoca10"))
                       SetCustomToken(1610, "Da selezionare");
    }


    Un grosso grazie a chi potrà aiutarmi! :)

    Edited by Shadow02 - 23/9/2023, 23:24
     
    .
  2.     Top   Top
     
    .
    Avatar

    granatiere granitico

    Group
    Member
    Posts
    22,909
    Location
    La prima capitale d'Italia

    Status
    EMOT_3_0
     
    .
  3.     Top   Top
     
    .
    Avatar

    Paladino Planare

    Group
    Administrator
    Posts
    8,591
    Location
    Da qualche parte nel multiverso

    Status
    :52:

    premesso che non no nwn installato e non lo apro da un anno....
    Per fare questa modifica devi trovare la conversazione e aggiungere i token in questo modo:

    <custom2125> Salve bla bla<custom2099>

    2125 è il token di riferimento
    il 2099 serve come interruzione o chiusura altrimenti se metti solo quello iniziale tutto il testo viene colorato, funziona allo stesso modo dei tag colore di questo forum.

    in testo appare quando uno script che genera i colori dei token, il valore del token è un codisce ASCII che rappresenta un colore

    CODICE
    void main()
    {
    SetCustomToken(2099,"</c>");//CHIUSO
    SetCustomToken(2100,"<c@  >");
    SetCustomToken(2101,"<c€  >");
    SetCustomToken(2102,"<cÀ  >");
    SetCustomToken(2103,"<cÿ  >");
    SetCustomToken(2104,"<cÿ@ >");
    SetCustomToken(2105,"<cÿ€ >");
    SetCustomToken(2106,"<cÿÀ >");
    SetCustomToken(2107,"<cÿÿ >");
    SetCustomToken(2108,"<cÀÀ >");
    SetCustomToken(2109,"<c€€ >");
    SetCustomToken(2110,"<c@@ >");
    SetCustomToken(2111,"<cÀÿ >");
    SetCustomToken(2112,"<c€ÿ >");
    SetCustomToken(2113,"<c@ÿ >");
    SetCustomToken(2114,"<c ÿ >");
    SetCustomToken(2115,"<c À >");
    SetCustomToken(2116,"<c € >");
    SetCustomToken(2117,"<c @ >");
    SetCustomToken(2118,"<c ÿ@>");
    SetCustomToken(2119,"<c ÿ€>");
    SetCustomToken(2120,"<c ÿÀ>");
    SetCustomToken(2121,"<c ÿÿ>");
    SetCustomToken(2122,"<c ÀÀ>");
    SetCustomToken(2123,"<c €€>");
    SetCustomToken(2124,"<c @@>");
    SetCustomToken(2125,"<c Àÿ>");
    SetCustomToken(2126,"<c €ÿ>");
    SetCustomToken(2127,"<c @ÿ>");
    SetCustomToken(2128,"<c  ÿ>");
    SetCustomToken(2129,"<c  À>");
    SetCustomToken(2130,"<c  €>");
    SetCustomToken(2131,"<c  @>");
    SetCustomToken(2132,"<c@ ÿ>");
    SetCustomToken(2133,"<c€ ÿ>");
    SetCustomToken(2134,"<cÀ ÿ>");
    SetCustomToken(2135,"<cÿ ÿ>");
    SetCustomToken(2136,"<cÀ À>");
    SetCustomToken(2137,"<c€ €>");
    SetCustomToken(2138,"<c@ @>");
    SetCustomToken(2139,"<cÿ À>");
    SetCustomToken(2140,"<cÿ €>");
    SetCustomToken(2141,"<cÿ @>");
    SetCustomToken(2142,"<cÿÿÿ>");
    SetCustomToken(2143,"<cÀÀÀ>");
    SetCustomToken(2144,"<c€€€>");
    SetCustomToken(2145,"<c@@@>");
    SetCustomToken(2146,"<c   >");
    }


    i colori di riferimento
    <CUSTOM2101>
    <CUSTOM2102>
    <CUSTOM2103>
    <CUSTOM2104>
    <CUSTOM2105>
    <CUSTOM2106>
    <CUSTOM2107>
    <CUSTOM2108>
    <CUSTOM2109>
    <CUSTOM2111>
    <CUSTOM2112>
    <CUSTOM2113>
    <CUSTOM2114>
    <CUSTOM2115>
    <CUSTOM2116>
    <CUSTOM2117>
    <CUSTOM2118>
    <CUSTOM2119>
    <CUSTOM2121>
    <CUSTOM2122>
    <CUSTOM2123>
    <CUSTOM2124>
    <CUSTOM2125>
    <CUSTOM2126>
    <CUSTOM2127>
    <CUSTOM2128>
    <CUSTOM2129>
    <CUSTOM2131>
    <CUSTOM2132>
    <CUSTOM2133>
    <CUSTOM2134>
    <CUSTOM2135>
    <CUSTOM2136>
    <CUSTOM2137>
    <CUSTOM2138>
    <CUSTOM2139>
    <CUSTOM2141>
    <CUSTOM2142>
    <CUSTOM2143>
    <CUSTOM2144>
    <CUSTOM2145>
    <CUSTOM2146>


    in questo modo hai delle conversazioni colorate.

    Con questi token che hai messo

    SetCustomToken(1601, "Da selezionare");
    SetCustomToken(1602, "Da selezionare");

    hai solo la scritta bianca, dovresti cambiarlo con SetCustomToken(2125,"<c Àÿ>Da selezionare"); o SetCustomToken(1601,"<c Àÿ>Da selezionare");

    i numeri dei token che ho usato sono oltre il 2000 per evitare conflitti con quelli di nwn

    la variabile della creatura puoi leggerla usando https://nwnlexicon.com/index.php?title=GetAssociate

    con lo script in user defined non ci fai nulla se non lo leghi da un evento specifico e indichi quale è l'evento

    p.s. per esperienza ti posso dire che è meglio ricaricare i token ad ogni conversazione
     
    .
  4.     Top   Top
     
    .
    Avatar

    Utente

    Group
    Member
    Posts
    18

    Status
    Ciao Lord, grazie della risposta!

    In verità, quello di cui avrei bisogno è proprio un aiuto sul funzionamento dello script "tag-based".
    Mi spiego meglio: il "custom token" non è utilizzato per colorare, ma per indicare quale evocazione si ha scelto per il livello (ricordare una stringa).
    Esempio:
    - nella conversazione si visualizza subito un elenco con tutti i livelli di evocazione;
    - vicino ad ogni livello si vede l'evocazione selezionata (tramite "custom token").
    - se non si ha ancora selezionato un'evocazione appare la scritta "Da scegliere".

    Struttura conversazione:
    Livello 1 (Unicorno) --> se uno clicca su "livello 1" accede all'elenco delle evocazioni disponibili dove può scegliere unicorno/tasso/ecc...
    Livello 2 (Grizzly)
    Livello 3 (Elementale dell'Aria)

    Quando uno sceglie l'evocazione salva una stringa sull'oggetto tramite variabile locale.

    Non capisco cosa non vada nello script. L'ho rivisto, ma non funziona ancora...

    Ovviamente:
    - ho inserito il "custom token" del rispettivo livello per ogni scelta di evocazione (quindi dovrebbe richiamare il codice giusto);
    - ho nominato lo script con il tag dell'oggetto (che è tutto minuscolo).

    CODICE
    #include "x2_inc_switches"

    void main()

    {
       int nEvent =GetUserDefinedItemEventNumber();

       if(nEvent !=  X2_ITEM_EVENT_ACTIVATE)
       return;

       //Define the parameters
       object oItem = GetItemActivated();
       string sTag = GetTag(oItem);

       if ( sTag == "TAG OGGETTO ATTIVATO" )

       //Book of livello: set predefined custom token, if no summon has been chosen yet.
       if(GetLocalString(oItem, "livello1") == "")
           SetCustomToken(20001, "Da scegliere");
       if(GetLocalString(oItem, "livello2") == "")
           SetCustomToken(20002, "Da scegliere");
       if(GetLocalString(oItem, "livello3") == "")
           SetCustomToken(20003, "Da scegliere");
       if(GetLocalString(oItem, "livello4") == "")
           SetCustomToken(20004, "Da scegliere");
       if(GetLocalString(oItem, "livello5") == "")
           SetCustomToken(20005, "Da scegliere");
       if(GetLocalString(oItem, "livello6") == "")
           SetCustomToken(20006, "Da scegliere");
       if(GetLocalString(oItem, "livello7") == "")
           SetCustomToken(20007, "Da scegliere");
       if(GetLocalString(oItem, "livello8") == "")
           SetCustomToken(20008, "Da scegliere");
       if(GetLocalString(oItem, "livello9") == "")
           SetCustomToken(20009, "Da scegliere");
       if(GetLocalString(oItem, "livello10") == "")
           SetCustomToken(20010, "Da scegliere");

       //Start conversation
       AssignCommand(GetItemActivator(), ActionStartConversation(GetItemActivator(), "NOME CONVERSAZIONE", TRUE, FALSE));
    }
     
    .
  5.     Top   Top
     
    .
    Avatar

    Paladino Planare

    Group
    Administrator
    Posts
    8,591
    Location
    Da qualche parte nel multiverso

    Status
    innanzi tutto inizierei a mettere qualche parentesi { dato che dopo un if o un else viene eseguita solo la prima istruzione più vicina, quando ci sono due o più istruzioni può dare problemi, ma non essere indicato come errore.

    Questo if ( sTag == "TAG OGGETTO ATTIVATO" ) mi sa che non corrisponde al vero oggetto attivato :14:
     
    .
4 replies since 23/9/2023, 21:05   107 views
  Share  
.