-
.
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. -
..
-
.
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 coloreCODICEvoid 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 riferimentoSPOILER (clicca per visualizzare)<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. -
.
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));
}. -
.
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.