| Una interessante guida scritta da Beho che aiuta nelle fasi iniziali del modding su Neverwinter Nights.
FAQ (Frequently Asked Questions) Aurora Toolset - mini guida ai comandi e allo scripting di free.it.giochi.neverwinternights
v 1.5 del 03/01/2004
a cura di: Gruppo di Coordinamento free.it.giochi.neverwinternights +------------------------------------------+ | Prima stesura curata da: Beho | | Revisione a cura di: Beho | | Hanno collaborato: | | Daedalus | Z.E.R.O. | Beho | Gazza | +------------------------------------------+ Indice:
1) Prefazione
2) Il manifesto
3) Che cosa è l'Aurora toolset
3.1) Sezioni dello schermo
3.2) Terminologia di base 3.2.a) Modulo 3.2.b) Area 3.2.c) PNG / NPC 3.2.d) PG / PC 3.2.e) DM 3.2.f) Palette 3.2.g) Tile 3.2.h) Tileset 3.2.i) ResRef 3.2.l) TAG 3.2.m) Differenze tra TAG e ResRef 3.2.n) Blueprint 3.2.o) Custom Blueprint 3.2.p) Come si crea un Custom Blueprint 3.2.q) Trigger/Attivatori 3.2.r) Custom Content
3.3) Conversazioni 3.3.a) Possibilità di Conversazione 3.3.b) Token e Action 3.3.c) Come colorare una parte di conversazione
3.4) Il Diario 3.4.a) Come creare un diario delle quest 3.4.b) Come collegare un evento del diario ad una conversazione
4) Tipi di file modificabili in NWN
4.1)Estensioni 4.1.a) ERF 4.1.b) 2DA
4.2) HakPack 4.2.a) Come si inserisce un hakpack in un modulo 4.2.b) Come si crea un HakPack 4.2.c) Come si aggiorna un HakPack 4.2.d) Strumenti utili
4.3) Filmati 4.3.a) Come si crea e converte un filmato per NWN 4.3.b) Strumenti utili
5) Cosa è l'aurora scripting
5.1) Eventi 5.1.a) Eventi del modulo 5.1.b) Eventi dell'area 5.1.c) Eventi della creatura 5.1.d) Eventi dei posizionabili 5.1.e) Eventi degli attivatori 5.1.f) Evento custom: OnUserDefined
5.2) Errori comuni di compilazione
-----------------------------------------------------------
3) Che cosa è Aurora Sebbene Aurora stia ad indicare il motore grafico 3d isometrico di NWN (Bioware Aurora Engine), si usa questo termine per considerare gli attrezzi di creazione di campagne e moduli che sfruttano a pieno regime questo motore grafico (Bioware Aurora Toolset). Oltre ad essere il primo motore grafico 3d che Bioware pubblica (tutti gli altri titoli Bioware usano il motore 2d isometrico "Infinity"), Aurora ha una caratteristica molto importante, che fa perdonare il fatto che non sia tra i migliori motori 3d in circolazione dal punto di vista grafico: è totalmente modulabile. Questo significa che chiunque può aggiungergli qualcosa, come nuove creature, nuove texture, e poi applicarli con la massima semplicità. Un uomo, in Aurora, non è intero: gli si possono staccare/cambiare braccia, corpo, bacino, gambe, piedi, testa e altro. Stessa cosa vale per i vestiti e per le armature, per le armi e in genere per ogni cosa. Personalizzare la propria armatura è molto facile, grazie all'interfaccia a portata di qualsiasi utente. Le creazioni guidate (dei mercanti, delle conversazioni, ecc.) permettono di creare la propria avventura senza grosse difficoltà. Il linguaggio degli script è basato sul C, cosa che rende relativamente semplice la composizione dei comandi, ma nello stesso tempo li rende capaci anche di sovvertire molte regole di AD&D 3ª ed. Per i principianti è incluso lo Script Wizard, una creazione guidata che guiderà i "neofiti" alle creazioni di semplici avventure. C'è solo un difetto esistente in Aurora: è che non supporta bene l'asse Z, quindi non si possono creare terreni totalmente irregolari o far volare il proprio personaggio. Da un punto di vista tecnico, Aurora è tra i motori grafici che usano maggiormente 3dsMax (www.discreet.com/products/3dsmax) Ciononostante, grazie allo zelo di molti fans, esistono script di importazione/esportazione anche per GMax (www.discreet.com/products/gmax , versione ridotta e gratuita di 3dsMax), per Milkshape 3d (www.swissquake.ch/chumbalum-soft , progettato inizialmente per Half-Life) e per Lightwave 3d (www.lightwave3d.com/ , forse il migliore programma esistente). Con uno dei programmi descritti sopra, e con un po' di pratica, chiunque potrà disegnare nuove armi, nuovi oggetti e nuove creature al di fuori dei contenuti ufficiali che Bioware rilascia. Una volta appresa la logica degli script e imparato a modellare in 3d, l'unico limite effettivo, in Aurora, è la fantasia. Beho 07 May 2004, 23:49 3.1) Sezioni dello schermo All'apertura del toolset ci si ritroverà davanti ad una serie di sezioni ognune delle quali ha una sua utilità nell'ambito della creazione del modulo. L'area è divisa in 4 sezioni, ognuna con una usa funzione specifica:
A. Barra strumenti - Lista di comandi e preferenze - In alto nello schermo. B. Tavolozza - Dove sono elencati tutti i contenuti che è possibile collocare nel modulo - A Destra dello schermo. C. Contenuto del modulo - Una lista ordinata di tutto ciò che hai già inserito all'interno del tuo modulo - A destra dello Schermo. D. Visualizzazione dell'area - Dove svolgi la maggior parte del lavoro sul tuo modulo - Nel Centro dello schermo.
Per una spiegazione più approfondita delle barre visitate questo link: http://nwn.bioware.com/builders/toolsetintro3.html
3.2) Terminologia di base
3.2.a) Modulo l'intera avventura che hai creato. Contiene tutte le locazioni, le aree e le creature che hai incluso nella tua avventura.
3.2.b) Area Un luogo determinato all'interno del modulo, come per esempio la locanda, il castello malvagio o le caverne sotterranee.
3.2.c) PNG / NPC Personaggio Non Giocante (Non Player Character). Qualsiasi personaggio che non sia controllato da un giocatore: un venditore, un bandito, un monello di strada e così via.
3.2.d) PG / PC Personaggio Giocante (Playing Character). Un personaggio dell'avventura controllato da un giocatore vero e proprio.
3.2.e) DM Dungeon Master. La persona che controlla il gioco e tutto ciò che contiene. Il DM è una cosa diversa dal Creatore del Modulo, dato che questi costruisce materialmente il Modulo, mentre il DM lo controlla intanto che i giocatori lo stanno giocando. Naturalmente il Creatore del Modulo e il DM possono anche essere la stessa persona: crei un modulo e poi lo giochi assieme a degli amici.
3.2.f) Palette In italiano Palette si traduce come "Tavolozza". Il termine tavolozza viene usato per indicare il pannello dove ogni cosa che puoi aggiungere o 'disegnare' in un'area viene conservato. Per esempio, nel Gruppo Strumenti compare una lista di mostri, raccolti in un punto specifico dello schermo, dalla quale puoi scegliere quali inserire in un'area del tuo modulo; quella è la tavolozza dei mostri. Devi selezionare un mostro dalla tavolozza per inserirlo nel tuo modulo.
3.2.g) Tile L'elemento più piccolo di un set di riquadri che può essere disegnato in un'area. Per esempio, la locanda è un riquadro separato del set di riquadri rurali che puoi disegnare nella tua area rurale.
3.2.h) Tileset Un gruppo di riquadri che segue un tema conduttore. Per esempio, il set di riquadri della foresta comprende i riquadri degli alberi, delle rovine di pietra, del corso d'acqua, dell'accampamento ecc., insomma tutto ciò che è possibile trovare in una foresta.
3.2.i) ResRef ResRef = RESource REFerence. Il ResRef è univoco per ogni "progetto" già presente o creato nel toolset. Questa univocità è indispensabile per il motore grafico per gestire correttamente posizionamento, respawn, comportamento degli oggetti (inteso a livello di grafica 3d, non di intelligenza artificiale). Un ResRef non può superare i 16 caratteri di lunghezza altrimenti tronca il nome e può contenere solo caratteri minuscoli compresi tra a_z e 0_9 e il caratterespeciale _ (underscore). Un ResRef è modificalbile solo al momento della creazione di un nuovo progetto o durante la modifica di un progetto preesistente.
3.2.l) TAG Il TAG è un Nome identificativo utile per identificare più istanze dello stesso progetto. Il TAG Non è univoco ed è normalmente modificabile nel corso dello sviluppo del modulo. Il TAG di ogni singola istanza dello stesso ResRef può essere diverso.
3.2.m) Differenze tra TAG e ResRef Il ResRef è univoco per ogni blueprint sia che sia scelto tra quelli di default dell'aurora toolset sia se viene creato ad hoc...quindi se si creano più istanze dello stesso blueprint hanno, per forza, lo stesso ResRef. Mentre il tag di ogni singola istanza dello stesso ResRef può essere diverso.
3.2.n) Blueprint In italiano si traduce come Progetto e sta ad indicare tutti quelli oggetti comunemente chiamati "posizionabili" tra quelli che offre il toolset (dai mostri agli oggetti, dai generatori di incontri a quelli di mercanti e così via).
3.2.o) Custom Blueprint Letteralmente= Progetto Personalizzato. Viene usato per indicare tutti quelli oggeti posizionabli che sono stati modificati o creati da zero partendo da un progetto (blueprint) presente nel toolset.
3.2.p) Come si crea un Custom Blueprint Fondamentalmente esistono 3 sistemi per creare un blueprint.
A. Modificando un progetto già inserito nel modulo B. Modificando un progetto già esistente tra quelli esistenti nella Tavolozza (punto 3.1) C. Creandolo da zero usando i tool messi a disposizione da Aurora. ---- A. Modificando un progetto già inserito nel modulo 1. Selezionare un qualsiasi modello di mostro o png che già è stato inserito nell'area di lavoro (punto 3.1) 2. Puntare col Mouse sul modello scelto e premere il dasto destro, dal menu che ne esce fuori scelgere il comando "aggiungi alla tavolozza". Questa cosa attiverà il pannello delle proprietà del modello. 3. Un nome unico per il blueprint (ResRef) verrà generato automaticamente, mentre il resto rimarrà uguale a quanto prestabilito in precedenza. 4. A questo punto bisognerà scegliere dove memorizzare il nuovo blueprint all'interno della tavolozza personalizzata di quel tipo particolare di progetti. 5. Volendo è possibile tornare nelle proprietà del Blueprint per modificare altri valori, ma non il ResRef.
B. Modificando un progetto già esistente tra quelli esistenti nella Tavolozza (punto 3.1) 1. Se non è già visualizzata passare alla "standard Palette" (tavolozza standard). 2. Selezionare un progetto tra quelli presenti tra i vari contenuti (per esempio il Capo degli Zingari nel menu "disegna creature" sotto la voce PNG/Umani) 3. Selzionare "Modifica copia" (Edit Copy) dal menù contestuale che appare premendo sul nome del progetto con il tasto destro. Questo attiverà il pannello delle proprietà del modello. 4. Cambiare il nome dell'oggetto con uno a proprio piacimento (in caso di creature, nome e cognome possono essere genrati automaticamente premendo l'apposito pusante accanto ai box dove vanno scritti questi dati). 5. Cambiare il nome del TAG Con uno di proprio piacere, ma facilmente ricordabile e assimilabile al tipo di progetto (per es. volendo fare un ranger si potrebbe chiamare il TAG "PNG_RANGER" o "RNG_BEhO", senza virgolette chiaramente). 6. Memorizzare il progetto nella tavolozza personalizzata. 7. Premete "OK" e noterete che apparirà immediatamente la tavolozza dove avete memorizzato il progetto e selezionerà il modello ppena creato. 8. A questo punto potete posizionare il Blueprint dove volete nell'area di lavoro.
C. Creandolo da zero usando i tool messi a disposizione da Aurora. (supponendo di voler creare una nuova creatura) 1. Dalla Tavolozza personalizzata delle creature cliccare col tasto destro tenendo il puntatore del mouse su una delle voci del menù e selezionare nuovo. Oppure Selezionare "Creazione guidata delle Creature" (CTRL+ALT+C) dal menù "Creazioni Guidate" (in alto nello schermo). Apparirà la schermata per la creazione di una nuova creatura. 2. Premere "Avanti" (Next) per cominciare. Selezionare la razza su "Umano" e di nuovo premere "Avanti". 3. Scelgiere la classe e il livello preferito (meglio scegliere una sola classe e un livello basso per ora). Premendo la "X" vicino al box della classe questa verrà eliminata per quel persoanggio (tranquilli non è perenne potete aggiungerla di nuovo se vi siete sbagliati). Premere "Avanti" per continuare. 4. Lasciando "Umano" come ASPETTO provare a vedere le differenze tra "Maschio" e "Femmina" tra le opzioni della voce SESSO. Volendo è possibile selezionare uno degli aspetti predefiniti del toolset, ma poi non sarà possibile modificare il modello a livello di vestiario (si può equipaggiarlo, ma non mostrarà le nuove vesti dategli in cambio di quelle presenti di default) e colore della pelle. 5. Scelgiere uno tra i ritratti a piacimento e premere "Avanti". ATTENZIONE: tutte le creature, le porte e gli oggeti posizionabili richiedono un ritratto per continuare nella creazione del Blueprint. 6. Lasciare la fazione a "Ostile" e proseguire avanti. Le fazioni di Default sono. Ostile, Difensore, Popolano, Mercante (quest'ultima indispensabile per creare i seguaci) 7. Scegliere nome e cognome e premere il tasto "Avanti" 8. Memorizzate il progetto in un posto che vi sia facile da ricordare e trovare (ad esempio Speciale | Personalizzato 1). Premete "Avanti". 9. COntrollare sul sommario che appare che tutto sia coerente con quanto è stato creato e premere ancora "Avanti". 10. A questo punto apparirà il tasto "Fine" che potrà essere premuto per finire di lavorare sul progetto. Se su vuole ancora migliorare il progetto del Png è possibile selezionare il checkbox "Lancia Proprietà della creatura" e proseguire a personalizzare il blueprint in questione. 11. Selezionare il blueprint appena creato per metteterlo dove si vuole nell'area di lavoro (in posti raggiungibili però ;-p).
3.2.q) Trigger/Attivatori I triggers (in italiano Attivatori) sono dei progetti particolari che servono per far accadere un determinato evento al passaggio di un PG o un PNG sopra di essi. Un Attivatore può essere una transizione d'area, una trappola o un generatore di mostri, e così via. I trigger sono contraddistinti dal fatto che bisogna disegnare un perimetro all'interno del quale, passandoci sopra, succede quanto previsto dagli script inseriti nei vari eventi del trigger.
3.2.r) Custom Content I custom Contents (contenuti personalizzati) sono modelli 3d, Tileset nuovi o modificati, oggetti nuovi non presenti originariamente nel gioco e nel Toolset.
--------------------------
3.3) Conversazioni E' facilmente intuibile l'importanza delle conversazioni in un gioco di ruolo. Queste permettono il corretto svolgimento della missione da compiere (quest) e di far sì che il giocatore abbia le necessarie informazioni, oltre che per chiedere, impartire ordini, minacciare, e simili.
3.3.a) Possibilità di Conversazione Per le conversazioni tra un PG e un PNG bisogna creare, per l'appunto, delle "conversazioni" ed associarle al PNG (non sempre, ma la maggior parte delle volte). Ci sono due modi:
A- Cliccando su Strumenti --> Creazione Guidata Conversazioni B- Andando sulle proprietà del PNG e nel campo "conversazione" cliccando su Mod. (questa è la soluzione migliore nella maggior parte dei casi perché associa direttamente la conversazione al PNG)
Da come dovreste intuire, sarà il PNG a parlare per primo. Cliccate su "aggiungi" (il tasto più in alto sulla barra in alto a sinistra) e scrivete ciò che il PNG dirà. Comparirà una riga con scritto [Possessore] - (quello che avete scritto). Il Possessore è colui al quale è stata associata la conversazione. Questo termine è molto importante anche nello scripting, dove viene indicato con OBJECT_SELF. Se salvate e nel gioco parlate col PNG, questo vi dirà ciò che avete scritto sotto forma di riga testuale sulla sua testa. Per continuare la conversazione (e quindi usare la finestra di conversazione) cliccate sulla riga del Possessore per selezionarla (dovrebbe apparire in rosso) e quindi ancora su "aggiungi". Adesso sarà il PG a parlare. Poi cliccate sulla riga del PG (dovrebbe apparire in blu) e continuate ad aggiungere righe di dialogo. Quando volete che la conversazione finisca, aggiungete una riga di dialogo del PG vuota. Apparirà un [fine dialogo]. Notate che se aggiungete una risposta del PNG al [fine dialogo], quest'ultimo si trasformerà in [continua], facendo in modo che il PNG continui il suo discorso senza causare una finestra di dialogo troppo lunga (e troppo stancante) da leggere.
Adesso, come fare per fare in modo che il PG abbia più frasi da dire che devono essere selezionate dal giocatore? Basta che aggiungiate frasi per PG alla frase precedente del PNG. Poi continuate ad aggiungere dialogo, sia in una risposta che in un'altra. Se guardate bene, avete creato una diramazione da una frase del PNG da cui derivano frasi del PG. Ogni riga di dialogo si chiama "nodo". Certo, anche una sola risposta del PG causava la creazione di un nodo, ma ora il concetto è più ovvio, no?
Come fare per fare più o meno la stessa cosa, ma ad un PNG? Ovvero, se ilPNG chiede di fare una cosa e il PG la fa, come bisogna procedere per fare in modo che il PNG non dica le stesse cose? Iniziate a scrivere come per le risposte del PG, ma stavolta le create alla radice o ad una risposta del PG. Ora è da quel nodo che parte una diramazione con le risposte del PNG. Ora vi starete chiedendo: "e come fa il PNG a sapere quello che deve dire in quel momento?" Lì ci vogliono gli script, nella sezione "Il testo appare quando.". Ma in che modo? Qui apriamo una postilla su come funziona il core Aurora nella lettura delle conversazioni.
Aurora legge le conversazioni dall'alto verso il basso. Questo non comporta niente per le risposte del PG, ma così il PNG dirà la prima frase che compare in alto. In linguaggio più tecnico, Aurora riporterà il primo che gli riporta "vero" (return TRUE). Se quella riga di dialogo gli riporta "falso" (return FALSE) passa a quello di sotto, e così via. Quindi le risposte multiple di un PNG vanno ordinate, in ordine cronologico, dal basso verso l'alto. Mentre la frase più bassa (quella di benvenuto) deve essere senza script "restrittivi", tutti gli altri ne devono avere. Uno script "restrittivo" richiama una variabile (int ...) e la condizione "se -blah blah blah- allora return TRUE, else return FALSE"
Facciamo un esempio: se un PNG ci chiede di dare 3 pugni ad un manichino e, una volta fatto, ci darà una spada, il dialogo dovrebbe apparire così:
Radice | |------ 1- [possessore] Sei forte! Prendi questa spada. |------ 2- [possessore] Che aspetti? Picchia quel manichino! |------ 3- [possessore] Ciao! Ti va di dare 2 pugni al manichino? |------- 3.1- [pg] Ok, guarda come lo stendo!
Quindi, nel nodo 3 (o meglio in 3.1) metterete uno script in "azioni compiute" che assegna una variabile per il fatto che avete parlato col PNG. (ad esempio "parlatoprimavolta") Nel nodo 2 metterete in "Il testo appare quando" una richiesta della variabile "parlatoprimavolta" (non tremate, potete usare lo Script Wizard!) Nel nodo 1. beh, questo è scripting, e quindi vi rimando agli innumerevoli tutorial che ci sono sulla rete, oltre che alle sane domande sul newsgroup. L'importante, però, è che abbiate capito come Aurora legge le conversazioni.
3.3.b) Token e Action
Anche in una conversazione ci possono essere delle componenti variabili. Quando un PNG saluta un PG, deve sapere se dare il buongiorno o la buonanotte, se il PG è maschio o femmina, elfo o gnomo, mago o bardo, a quale divinità crede, e così via. Invece di creare 3000 nodi con 3000 script, potete usare i Token, una specie di segnale che lascia decidere Aurora che parola utilizzare.
Per inserire un token, potete: 1- cliccare sulla [A] a destra del riquadro Testo e sceglierne uno tra gli elencati, lasciandosi guidare anche dagli esempi. 2- una volta imparati i token a disposizione, scriverli direttamente (sono tutti inclusi in <>).
Quindi, se scriverete una frase del tipo:
Radice |-------[possessore] , lascia che guidi il tuo cammino
a seconda che il PG sia maschio o femmina, al posto di sarà sostituito "Fratello" o "Sorella".
Possono essere tranquillamente usati più token insieme, come nell'esempio:
Radice |------ [possessore] Tu devi essere <firstname>. <fullname>, giusto?
Allora, se il PG si chiamasse Kalisto Borinson, la frase sarebbe: "Tu devi essere Kalisto. Kalisto Borinson, giusto?"
Sicuramente avrete notato, tra i Token, quattro cose che non sono propriamente tokens: <startcheck>, <startaction>, <starthighlight> e . Questi servono solo per colorare, rispettivamente con rosso, verde e blu, parte della conversazione inclusa tra uno dei tre "token" e . E, secondo la convenzione Bioware, dovrebbero essere usati così:
• StartCheck per segnalare una prova in qualche abilità o simili, ad
esempio:
Radice |------ [possessore] No, non ti voglio dare quell'anello! | |--------- <startcheck>[persuadere] Ma che valore ha per te? | |--------- <startcheck>[minacciare] Dammelo o ti spiezzo in due!
Naturalmente è solo un colore. Per fare veramente prove di abilità, di punteggio e/o alterazioni all'allineamento, ci vuole la potenza degli script.
• StartAction per descrivere un'azione che sta avvenendo.
Radice |------ [possessore] Woof, bau! <startaction>Il cane ti lecca la mano
3.4) Il Diario Nel diario sono elencate sia le varie missioni da compiere, principali e secondarie, che le missioni compiute. Si possono ordinare per nome, per data o per priorità. I noltre è possibile scrivere note personali, cosa che si può rivelare molto utile quando si gioca sessioni in multiplayer a distanza di tempo l'una dall'altra.
3.4.a) Come creare un diario delle quest Andate su Strumenti --> Creazione Diario (o premete CTRL+ALT+J). Proprio come nelle conversazioni, cliccate su Aggiungi per creare delle "categorie". In ogni categoria potete modificare:
- il nome, che sarebbe il titolo di ogni quest - il tag, che in alcuni script è importante - la priorità, per soddisfare i giocatori che ordinano così il diario - i PE (Punti Esperienza, PX, XP o come volete chiamarli) dichiarati * - il commento *
*ATTENZIONE - queste due voci servono solo per dare una guida a chi apre il vostro modulo con il toolset. Assegnare un valore ai PE non darà più esperienza al giocatore, perché la sua funzione è solo dichiarativa. L'esperienza deve essere data al PG attraverso gli scripts.
Adesso selezionate una categoria e cliccate su Aggiungi per creare i "nodi". In ogni nodo potete modificare il testo e il numero identificativo o ID (segnatevelo questo!). L'opzione "Completa categoria" va attivata al nodo che termina la missione. Sarebbe ciò che causa nel gioco il motivetto di fine missione.
3.4.b) Come collegare un evento del diario ad una conversazione Andate all'editor delle conversazioni e cliccate sul nodo dove volete che ci sia un evento del diario. Cliccate sulla scheda "Altre azioni" e nel campo Diario selezionate la categoria e l'ID del nodo del diario. Questa è la soluzione più semplice. Se volete collegare un evento del diario ad altro dovete usare gli script. La funzione è AddJournalQuestEntry. buona fortuna :-] 4) Tipi di file modificabili in NWN I file che usa NWN comprendono tabelle di dati, hakpacks, moduli, suoni, ritratti, personaggi, filmati, colonne sonore e raccolte di istanze. In realtà ce ne sono anche altri, ma o non sono facilmente modificabili, come il database esterno (.dbf) o è meglio non modificarli, come il dialog.tlk.
4.1)Estensioni - Modulo = .mod - Modulo della campagna ufficiale = .nwm * - Hakpack = .hak - Raccolte ufficiali Bioware = .bif - Ritratti = .tga (Targa Bitmap NON compresso) - Colonne sonore = .bmu - Filmati = .bik - Personaggi = .bic - Raccolte di istanze = .erf (approfondimento nel punto 4.1.a)
* Questi moduli possono essere aperti solo in "sola lettura", e comunque non prima di averli completati nel gioco.
Files con queste estensioni, di solito, li troverete in un hakpack o nei files .bif: - Textures = .tga - Textures "dinamiche" (possono cambiare colore) =.plt - Textures DirectDraw Surface = .dss - Suoni = .ssf - Modelli =.mdl (ascii e binari) - Tabelle di dati = .2da (approfondimento nel punto 4.1.b) - dichiarazione di tile= .itp (modificabile tramite tool apposito)
- altre estensioni che difficilmente sono utili modificandoli (se si possono modificare).
4.1.a) ERF Questo file racchiude varie istanze che possono essere esportate in unmodulo.
Può contenere progetti di: - Aree (.are) - Scripts (.nss) - Conversazioni (.dlg) - Creature (.utc) - Porte (.utd) - Incontri (.ute) - Oggetti (.uti) - Oggetti posizionabili (.utp) - Suoni (.uts) - Mercanti e negozi (.utm) - Attivatori (.utt) - Tappe (.utw) - Modelli di trama (.ptt)
Da come dovreste aver capito, un file .erf è una sorta di pacchetto in cui ci possono essere i files suddetti.
Per esportare istanze in un file .erf: 1) Cliccate su File à Esporta. 2) Cliccate su "Aggiungi Risorse" 3) Selezionate il tipo di risorsa, dopodiché i vari progetti. 4) Ripetete dal punto 2 se volete aggiungere altro, oppure ciccate su OK per continuare 5) Scegliete un nome per il vostro file .erf e cliccate su OK. 6) Se volete, aggiungete un commento, altrimenti cliccate subito su OK.
Per importare istanze da un file .erf: 1) Cliccate su File à Importa. 2) Scegliete il file .erf e cliccate su OK. 3) Se esce una finestra di commenti, leggeteli e cliccate su OK.
Potrebbe anche uscire una finestra che dice "risorse mancanti". Succede quando una istanza fa riferimento ad un'altra che non è inclusa nel pacchetto, ma non è presente nemmeno nel modulo. Può essere che nei files scaricati ci sia più di un erf, allora cliccate su OK per continuare l'importazione. Altrimenti significa che l'esportatore è stato maldestro.
4.1.b) 2DA Questi files (2-Dimensional Array) sono delle "semplici" tabelle che contengono le informazioni più importanti. Per esempio, nel file weapons.2da ci sono i danni base, come un'arma va impugnata, a che classe appartiene, ecc. Poi negli altri 2da ci sono magie, effetti visivi, ritratti dei PNG, e tantissime altre cose. Non è semplice, ma se ci riuscirete a modificarli bene, potrete creare nuove magie, nuove classi di armi (niente più tridenti che in realtà sono lance!!!), e fare tantissime svariate cose. Per la loro modifica, vi rimando alle guide presenti in rete. Una buona guida è il "Custom Content Tutorial" di Eligio Sacateca.
4.2) HakPack Un hakpack contiene i Custom Contents (vedi 3.2.r). Tecnicamente, ha la stessa funzionalità della cartella Override, con la differenza che un hakpack ha influenza solo sui moduli associati ad esso, evitando la maggior parte dei conflitti e dei problemi vari, se i custom contents non sono fatti a regola d'arte.
4.2.a) Come si inserisce un hakpack in un modulo Andate su Modifica --> Proprietà del modulo. Scegliete la scheda "contenuto personalizzato" (dalla versione 1.29 in poi). Sotto il riquadro bianco grande, scegliete un hakpack e cliccate su Aggiungi. Potete anche aggiungerne altri. L'opzione "sposta in alto" e "sposta in basso" servono per stabilire la priorità: quando si usano più hakpack, se è presente lo stesso file, viene utilizzato quello dell'hak posto più in alto. Nei files .2da è un problema, in quanto alcuni hakpacks potrebbero non funzionare correttamente. E'necessario, in questi casi, "fondere" gli haks in uno solo (o crearne uno solo per i .2da)
4.2.b) Come si crea un HakPack Bioware ha messo a disposizione l'Hak Pak Editor.(C:\Neverwinternights\NWN\utils\nwhak.exe) Cliccate su Resource --> Add e aggiungete i files che volete. Una volta fatto questo, salvatelo andando su File --> Save (o Save As.)
4.2.c) Come si aggiorna un HakPack Per aggiornare il contenuto di un hakpack è sufficente importare nuovamente la risorsa desiderata all'interno del HP avendo cura che anche il file .2da che la prende in considerazione sia aggiornato con i nuovi riferimenti.
4.2.d) Strumenti utili
--------------------------
4.3) Filmati La ciliegina sulla torta. anzi, sul modulo! Un filmato in codifica BinkVideo (.bik) può valorizzare notevolmente il vostro modulo. sempre se sia bello e non pesante da scaricare ;-)
4.3.a) Come si crea e converte un filmato per NWN
4.3.b) Strumenti utili
5) Cosa è l'aurora scripting Lo scripting è l'anima di un modulo. Dirige tutte le azioni dei PNG (e buona parte di quelle dei PG), così come svariati avvenimenti, da semplici tiri di dado o aperture di porte alla sovversione delle regole di D&D, dai passaggi da un'area all'altra allo sputare frasi di un PNG mentre combatte, dall' aggiungere eventi del diario al terminare il modulo. Uno script è solo una sequenza di righe che descrive logicamente avvenimenti e condizioni, secondo una struttura del tipo [succede 1, 2 e 3] oppure [se succede 1, allora succede 2, altrimenti avviene 3], o tante altre, dalle più semplici alle più complesse. Per diventare scripters non servono tools particolari o capacità innate, né una grande intelligenza, a differenza delle credenze popolari che hanno reso lo scripting l'incubo dei novizi: tutto quello che serve è: • sapere la sintassi corretta (se programmate in C avete già vinto metà battaglia, ma non è difficile impararla) • conoscere alcune funzioni (consigliato disporre del Lexicon che potete trovare qui www.reapers.org/nwn/reference/) • rendere il vostro pensiero razionale e logico (giusto quel poco che serve per compilare uno script) • un po' di pazienza (nel caso il compilatore vi riportasse continuamente errori)
I programmatori Bioware hanno già provveduto a semplificarvi il linguaggio degli script: basterà solo richiamare qualche funzione per crearne correttamente molti. Inoltre, per buona parte di questi, potrete usare lo Script Wizard, sia quello ufficiale che quello "esteso" di Lilac Soul (http://lilacsoul.revility.com/). E, soprattutto, se, oltre a seguire i tutorials, giocate ai moduli con lo spirito del tipo {vedo un avvenimento, mi chiedo "Come ha fatto?", lo apro con il toolset, vedo gli script e apprendo} (consigliati i moduli italiani che non hanno script stracomplicati), vi troverete nel giro di pochi mesi quasi maestri nello scripting!
5.1) Eventi Spesso è necessario definire cosa deve succedere in un determinato momento, ad esempio quando il PG riposa, quando il posizionabile viene distrutto, ecc. Invece di impazzire con script da 10000 "if", Bioware ha messo a disposizione gli Eventi, ossia "cosa succede quando.". Potete lasciare gli script di default, o metterne di vostri. Ricordiamo che quando si parla di "creatura", "oggetto", "un PG", "una magia" "qualcuno" et similia, questi sono tutti da definire, anche con condizioni "if".
5.1.a) Eventi del modulo Questi eventi si riferiscono al modulo intero. I suoi eventi, quindi, comportano per la maggior parte modifiche "globali".
Andate su Modifica --> Proprietà del modulo e selezionate la scheda Eventi.
Gli Eventi a disposizione sono:
- OnAcquireItem Quando un personaggio raccoglie uno o più oggetti
- OnActivateItem Serve per definire il funzionamento delle proprietà speciali di determinati oggetti (il "potere unico" della Pietra del Richiamo ad esempio).
- OnClientEnter Nei server, quando un PG entra nella partita. Nel gioco singolo, quando comincia il gioco.
- OnClientLeave Nei server, quando un PG esce dalla partita.
- Salta scene animate attivate Quando un PG decide di saltare le scene animate (cutscenes) e, soprattutto, è da definire se lo può fare.
- OnHeartbeat Quello che succede continuamente ogni turno di gioco (ogni 6 secondi)
- OnModuleLoad Permette il caricamento di funzioni e variabili globali utili nel resto del modulo
- OnPlayerDeath Quando un PG muore
- OnPlayerDying Mentre un PG sta morendo
- OnPlayerLevelUp Quando un PG sale di livello
- OnPlayerRespawn Quando un PG resuscita
- OnPlayerRest Quando un PG riposa (o vuole riposare)
- OnUnacquireItem Come in OnAcquireItem, ma quando l'oggetto viene lasciato a terra.
- OnUserDefined Evento personalizzabile (vedi punto 5.1.f)
5.1.b) Eventi dell'area Gli script che piazzate in questi eventi si riferiscono alla sola area.
Selezionate un'area, poi andate su Modifica --> Proprietà dell'area e
selezionate la scheda Eventi. Troverete questi eventi:
- OnEnter Quando si entra nell'area
- OnExit Quando si esce dall'area
- OnHeartbeat Quello che succede continuamente ogni turno di gioco (ogni 6 secondi)
- OnUserDefined Evento personalizzabile (vedi punto 5.1.f)
5.1.c) Eventi della creatura Questi script si riferiscono ad una creatura.
Scegliete una creatura e andate su Modifica. Selezionate la scheda Script.
Gli Eventi sono:
- OnBlocked Quando il percorso della creatura è bloccato (da porte, altri PNG, ecc.)
- OnCombatRoundEnd Quello che succede ogni round di combattimento (come in OnHeartbeat, ma mentre combatte)
- OnConversation Quando la creatura inizia (o finisce) una conversazione
- OnDamaged Quando la creatura subisce un danno
- OnDeath Quando la creatura muore
- OnDisturbed Si usa se la creatura viene interrotta mentre sta eseguendo una altra azionne
- OnHeartbeat Quello che succede continuamente ogni turno di gioco (ogni 6 secondi)
- OnPerception Quando la creatura vede qualcuno
- OnPhysicalAttacked Quando la creatura viene attaccata.
- OnRested Quando la creatura ha riposato
- OnSpawn Quando la creatura compare nel gioco
- OnSpellCastAt Quando alla creatura viene lanciata addosso una magia
- OnUserDefined Evento personalizzabile (vedi punto 5.1.f)
5.1.d) Eventi dei posizionabili Gli script in questi eventi si riferiscono ad un posizionabile.
Scegliete un posizionabile e andate su Modifica. Selezionate la schedaScript.
Questi sono gli Eventi:
- OnClose Se il posizionabile ha inventario, quello che succede quando questo viene chiuso (si esce dal suo inventario)
- OnDamaged Quando il posizionabile subisce un danno
- OnDeath Quando il posizionabile viene distrutto.
- OnHeartbeat Quello che succede continuamente ogni turno di gioco (ogni 6 secondi)
- OnDisturbed Si attiva quando viene aggiunto o levato qualcosa dal suo inventario (se l'oggetto è dotato di inventario)
- OnLock Quando il posizionabile, con inventario e/o serratura, viene serrato.
- OnPhysicalAttacked Quando il posizionabile viene attaccato
- OnOpen Se il posizionabile ha inventario e viene aperto si attiva lo script immagazzinanto nell'onopen.
- OnSpellCastAt Quando viene lanciata una magia sul posizionabile.
- OnUnlock Quando la sua serratura viene scassinata
- OnUsed Quando il posizionabile viene usato (cioè cliccandoci sopra)
- OnUserDefined Evento personalizzabile (vedi punto 5.1.f)
5.1.e) Eventi degli attivatori Questi script si riferiscono ad un attivatore (ricordiamo che a questa categoria appartengono anche le trappole.
Scegliete un attivatore e cliccate su Modifica. Selezionate la scheda Script. Gli Eventi sono:
- OnClick Quando si clicca sull'attivatore (se è selezionabile)
- OnEnter Quando una creatura entra nell'area delimitata dall'attivatore
- OnExit Quando la creatura esce dall'area delimitata dall'attivatore
- OnHeartbeat Quello che succede continuamente ogni round di gioco (ogni 6 secondi)
- OnUserDefined Evento personalizzabile (vedi punto 5.1.f)
5.1.f) Evento custom: OnUserDefined Con OnUserDefined si possono definire degli eventi con un codice personalizzato. Essi vanno gestiti tutti in OnUserDefined, in un mega IF molto simile a quello degli script di spawn. Dovrebbe esserci un valore base per gestire gli eventi user defined al quale si possono aggiungere numeri progressivi per ogni evento non standard che si sta definendo. Di solito si usano per oggetti specifici o per fare il trigger su qualche operazione non standard (con questa funzione si possono implementare skill check e skill system alternativi).
Esempio di OnUserDefined:
void main() { int nUser = GetUserDefinedEventNumber();
if(nUser == 1001) //HEARTBEAT {
} else if(nUser == 1002) // PERCEIVE {
} else if(nUser == 1003) // END OF COMBAT {
} else if(nUser == 1004) // ON DIALOGUE {
} else if(nUser == 1005) // ATTACKED {
} else if(nUser == 1006) // DAMAGED {
} else if(nUser == 1007) // DEATH {
} else if(nUser == 1008) // DISTURBED {
} }
Questi sono i primi eventi user-definibili "standard" che NWN supporta anche tramite apposite macro EVENT_HEARTBEAT, EVENT_DISTURBED e così via.
Si possono definire anche altri eventi dopo 1008...
Per creare un evento custom e segnalarlo al modulo:
object oNPC; event eSpecialEvent;
eSpecialEvent = EventUserDefined(1234); SignalEvent(oNPC,eSpecialEvent);
Prima lo si deve creare con EventUserDefined e poi lo si deve segnalare con SignalEvent. ovviamente per gestirlo si deve aggiungere un
else if (nUser == 1234) { //codice per la gestione }
Piuttosto che usare i numeri un buon metodo è creare un file da includere che contenga le dichiarazioni di tante variabili costanti quanti sono gli eventi custom, così non sarà necessario ricordarli per numero tipo
const int EVENTO_ARTEFATTO 1010 const int EVENTO_MORTE 1011
e poi si include il file nell'onUserDefined che si usa (ce ne sono anche per le singole creature). Non abusatene troppo però, molti eventi si riescono a gestire con quelli standard tranquillamente. Beho 07 May 2004, 23:57 5.2) Errori comuni di compilazione Questa sezione è ispirata alla sezione "Common Errors" del tutorial di Robert Straughan che potete trovare sul Lexicon qui:
Home --> Lyceum --> Tutorial --> Writing a Module --> Robert Straughan --> Capture Glory: Miscellaneous/Reference
Di solito, gli errori più comuni sono dovuti per distrazione (mancanza di punto e virgola, parentesi graffe, mancata dichiarazione di variabile) o per ignoranza (sintassi). Il compilatore, indicandovi la riga e comunicandovi messaggi, vi aiuta molto in questo: basta saperlo interpretare.
Qui sotto sono elencati alcuni dei messaggi del compilatore riguardante gli errori più frequenti. Ricordate però che, se per il 97% si riferiscono ad un errore facilmente risolvibile, per il 3% potrebbero riferirsi anche ad errori "seri".
• Analisi lista variabili (Parsing variable list) • Assenza del punto e virgola dopo l'espressione
Se incontrate uno dei due messaggi sopra, probabilmente avete dimenticato il punto e virgola alla fine di una linea.
• La condizione "if" non può essere seguita da un'istruzione null ("if" cannot be followed by null statement)
Si è creata una dichiarazione del tipo "se succede.." interrompendosi lì. Controllate la riga che inizia con "if": avrete sicuramente messo un punto e virgola alla fine di quella riga (se c'è, toglietecelo)
• Variabile definita senza il tipo (Variable defined without type)
La traduzione in italiano è errata: dovrebbe essere "variabile definita senza dichiarazione". Avete usato una variabile nel vostro script, ma molto probabilmente avete dimenticato di dichiararla in precedenza.
• Stato sconosciuto nel compilatore • Tipo di dichiarazione non valida • Istruzione "else" senza "if" • Istruzione composta di fine inaspettata • Stato di variabile errato presente nello stack
Se vi appare uno di questi messaggi significa: o è un errore serio o avete dimenticato qualche parentesi graffa (nel primo messaggio potreste anche aver fatto errori di sintassi, nell'ultimo messaggio potreste aver dimenticato di racchiudere una dichiarazione tra le parentesi graffe)
• Tipi non corrispondenti • L'operazione aritmetica ha degli operandi non validi (Arithmetic operation has invalid operands)
Se state facendo operazioni aritmetiche, probabilmente avete usato operandi diversi tra loro, come ad esempio numeri integrali (int) + numeri razionali (float), oppure Float con una riga di lettere (string).
• L'operazione logica ha degli operandi non validi
Più o meno è la situazione di sopra. se state facendo operazioni logiche.
• Salto della dichiarazione con istruzione "case" non consentito (Skipping declaration via "case" statement disallowed)
Se state usando le istruzioni switch/case, non potete dichiarare variabili lì dentro: dovete dichiararle fuori!
Questi sono le soluzioni per gli errori più comuni. Ma ricordate che a volte uno dei messaggi sopraelencati (o un terribile "assenza della parentesi") può capitare anche per aver mancato un #include o simili. Curate la sintassi prima.
-EOF-
Edited by Tukaram - 8/12/2015, 06:19 |
|