La Zona di esclusione
  30 Km intorno alla centrale nucleare di Chernobyl
  Pripyat
  La città fantasma evacuata dopo il disastro dell'86
  Sul disastro di Chernobyl
  Il più grave incidente nucleare civile della storia...
  S.T.A.L.K.E.R.
  Il videogioco del 2007 che ha unito persone e culture
A causa di mutate condizioni nella mia vita quotidiana, sono temporaneamente impossibilitato ad accedere a Internet in modo regolare. Di conseguenza, "Darimar's Zone" rimarrà priva di aggiornamenti fino a data da destinarsi. Darimar

   Notizie flash
*Darimar's_Zone_News*



 


   Darimar's Zone
  Home page
  Mappa del Sito
  Features & contenuti
  News & Blog  
  Archivio 2008-2009
  Forum
  Sezione multimedia
  Video e filmati
  S.T.A.L.K.E.R. modding
  e-Mail
 


   La Zona
  La Zona di esclusione
  Webcam & meteo
  Visuale satellitare
  La città di Pripyat
  Pripyat: mappe & foto
  Sul disastro di Chernobyl
 


   Video & filmati
  La Zona di esclusione
  La città di Pripyat
  Il disastro di Chernobyl
  Shadow of Chernobyl
  Clear Sky
  Call of Pripyat
  Cortometraggi amatoriali
 


   Info & risorse
  Pripyat.com
  Ambasciata ucraina
  Progetto Humus
  Bambini di Chernobyl
  ChNPP
  Ucraina.it
  Wildlife Exclusion Zone
  Chernobyl Eastern Europe
  Lost places
  Reactor4.be
 
 S.T.A.L.K.E.R. modding
Lettore audio non compatibile



   S.T.A.L.K.E.R.
  S.T.A.L.K.E.R.
   Shadow of Chernobyl
   Clear Sky
   Call of Pripyat

   Lost Alpha
  S.T.A.L.K.E.R. 2

 


   Top secret Area
  Il folklore locale
  Shadow of Chernobyl
  Clear Sky
  Call of Pripyat

 


   Internazionale
   Yastalker.com - .it
   Ya-stalker.ru - .it
   GSC-Fan - .it
   Stalker-epos - .it
   Chernobyl-soul - .it
   Stalkerworld - .it
   Stalker-Zone - .it
   Stalker-GSC - .it
   Stalker Portal - .it
   Bar reaktor - .it
   AP Production - .it
   Stalker Hispano - .it
   Planet Stalker - .it
   Stalker France - .it
   Stalker Scorpions - .it
   Stalker.pl - .it
   Stalker-2 - .it

 

Qui non troverete raccolte di mod già pronti, per i quali vi rimando alle apposite sezioni, rispettivamente per Shadow of Chernobyl, Clear Sky o Call of Pripyat. Questa pagina raccoglie piuttosto guide, consigli e dritte pratiche su come modificare alcune caratteristiche di gioco in ciascun episodio della trilogia di S.T.A.L.K.E.R. al fine di adattare quanto più possibile il gioco al Giocatore... e non viceversa.
Trattandosi di modifiche piuttosto mirate e specifiche, è quasi sempre possibile eseguirle con successo sia sulle versioni vanilla sia, salvo casi particolari, su mod già installati. Ad esempio, potremmo aver installato un megamod che ci piace moltissimo tranne per alcuni piccoli aspetti (es.: movimento della testa eccessivo, peso trasportabile troppo esiguo, eccetera) che, dal nostro personale punto di vista, non lo rendono "perfetto" quanto invece potrebbe essere. Ebbene, qui troverete spiegazioni semplici e dettagliate su come intervenire - senza fare disastri! - per ottimizzare tali aspetti e perfezionare la vostra esperienza di gioco.
Il curatore dei contenuti tecnici di questa pagina è Boris47, cui vanno tutti i crediti per la realizzazione delle guide e la consulenza professionale ad esse relativa nonchè i miei ringraziamenti per la collaborazione che ha deciso di avviare con me e la Darimar's Zone. Per ulteriori chiarimenti tecnici protrete contattare direttamente lui oppure chiedere informazioni sul forum di supporto S.T.A.L.K.E.R.: "L'angolo dello Smanettatore della Zona" - Guide, Consigli e Aiuti!.

Qualsiasi modifica si effettui, dalla più piccola e insignificante al più complesso megamod, essa sarà contenuta nella cartella \gamedata, a sua volta situata nella cartella di installazione del gioco. Una volta installato il gioco, la cartella \gamedata non sarà presente, dovremo crearla noi. Allo stesso modo, dovremo creare tutte le sottocartelle necessarie a contenere il file o i files che saranno oggetto di modifica. Per ottenere il quadro completo della struttura della cartella \gamedata è necessario decompilare il software che, nel suo insieme, costituisce il gioco. A tal fine esiste, per ciascun capitolo della trilogia, un apposito database extractor (qui i link rispettivamente per Shadow of Chernobyl, Clear Sky e Call of Pripyat).
Supponiamo, giusto per esemplificare, di giocare a Shadow of Chernobyl e di voler modificare solamente la musica nel menu principale. Quest'ultima è contenuta nei files gamedata\sounds\music\wasteland2_l.ogg e gamedata\sounds\music\wasteland2_r.ogg; quindi dovremo creare il percorso gamedata\sounds\music\ e piazzarci dentro i due nuovi .ogg che andranno a sostituire gli originali.
Naturalmente, per far sì che il gioco "si renda conto" delle nostre modifiche, dovremo sempre e comunque modificare il file fsgame.ltx presente nella cartella di installazione del gioco, modificando la riga relativa alla cartella \gamedata da:

$game_data$ = false| true| $fs_root$| gamedata\

a:

$game_data$ = true| true| $fs_root$| gamedata\

A questo punto, non ci resta che augurarvi "buon modding!".







Le guide presenti in questa sezione sono valide per tutti i tre capitoli di S.T.A.L.K.E.R. perchè riguardano files praticamente identici, presenti in ciascun titolo, oppure perchè affrontano considerazioni relative al linguaggio di programmazione del gioco stesso.



Introduzione

ATTENZIONE: è di estrema importanza che tu abbia S.T.A.L.K.E.R. con la patch installata più adatta.

  • Per S.T.A.L.K.E.R.: Shadow Of Chernobyl la migliore patch è la 1.0004;
  • Per S.T.A.L.K.E.R.: Clear Sky la migliore patch è la 1.5.10;
  • Per S.T.A.L.K.E.R.: Call of Pripyat la migliore patch è la 1.6.02;

Per poter modificare i file di stalker, dovrai estrarli da pacchetti compressi e, per fare ciò, oggi vi sono a disposizione dei tools facili da usare, i cosiddetti "unpacker". Questi eseguibili ti permetteranno di estrarre i file di S.T.A.L.K.E.R. in una cartella definita.
Una volta scaricato il file (qui i link rispettivamente per Shadow of Chernobyl, Clear Sky e Call of Pripyat):

  • Se hai S.T.A.L.K.E.R.: Shadow Of Chernobyl estrai il contenuto dell'archivio nella cartella in Programmi/THQ/S.T.A.L.K.E.R. - Shadow of Chernobyl o, comunque, nella cartella in cui hai installato il gioco.
    Raggiungi la suddetta cartella e clicca due volte sul file "Unpack". Si aprirà una schermata con delle scritte, è tutto normale e l'operazione può durare diversi minuti. Quando l'operzione sarà terminata, vai nell cartella superiore (es.: THQ) e dovresti trovare una nuova cartella "Estratti".
  • Se hai S.T.A.L.K.E.R.: Clear Sky estrai il contenuto dell'archivio nella cartella in Programmi/Deep Silver/S.T.A.L.K.E.R. - Clear Sky/resources o, comunque, nella cartella in cui hai installato il gioco.
    Raggiungi la suddetta cartella e clicca due volte sul file "Unpack". Si aprirà una schermata con delle scritte, è tutto normale e l'operazione può durare diversi minuti. Quando l'operzione sarà terminata, vai nell cartella superiore (es.: Deep Silver) e dovresti trovare una nuova cartella "Estratti".
  • Se hai S.T.A.L.K.E.R.: Call of Pripyat estrai il contenuto dell'archivio nella cartella in Programmi/bitComposer Games/S.T.A.L.K.E.R. - Call of Pripyat/resources o, comunque, nella cartella in cui hai installato il gioco.
    Raggiungi la suddetta cartella e clicca due volte sul file "Unpack". Si aprirà una schermata con delle scritte, è tutto normale e l'operazione può durare diversi minuti. Quando l'operzione sarà terminata vai nell cartella superiore (es.: bitComposer Games) e dovresti trovare una nuova cartella "Estratti".

Adesso hai la massima potenzialità per modificare il gioco.
Per prima cosa, nella cartella principale di S.T.A.L.K.E.R., apri il file "fsgame.ltx" con il blocco note, troverai una riga come questa:

$game_data$ = false| true| $fs_root$| gamedata\

Devi sostituire il "false" con "true" per ottenere questa riga:

$game_data$ = true| true| $fs_root$| gamedata\

Fatto ciò, nella cartella principale di S.T.A.L.K.E.R. crea una cartella e nominala "gamedata" (senza le virgolette!). Adesso la creazione di una mod consiste nel prendere i file dalla cartella "Estratti" creata precedentemente e copiarli nella cartella \gamedata appena creata.

Cos'è una mod?

Una mod consiste in una vera modifica, aggiunta o sottrazione di caratteristiche (d)al prodotto originale (o meglio "Versione Vanilla"). Un buon modder possiede:

  1. Gli attrezzi del mestiere:
    • Notepad++: ottimo strumento con cui poter modificare i files di S.T.A.L.K.E.R.. Supporta la corretta identazione di molti linguaggi ed è gratuito.
    • WinMerge: il più usato per scovare le differenze tra due file simili. (Nota: questo programma paragona non l'intero testo del file ma solo ogni singola riga).

  2. Le conoscenze: una buona dose di conoscenza sul LUA ti renderà un perfetto modder di S.T.A.L.K.E.R. (il LUA è pratico e facile da imparare).

  3. L'interesse (!!!): l'interesse nel fare una cosa è sempre un'ottima motivazione per farla e, se ci tieni davvero a fare di S.T.A.L.K.E.R. il gioco che hai sempre desiderato, allora devi convincerti che, pur se non sarà facilissimo, alla fine avrai una cosa fatta interamente da te e avrai acquisito delle conoscenze pur sempre utili al giorno d'oggi alla tua persona.

Guida rapida Notepad++

Il notepad++ è un ottimo strumento con cui potrete modificare i file di S.T.A.L.K.E.R.
I file in questione si trovano nella cartella \scripts (con esternsione .script) e nella cartella \config (con estensione .ltx).
Questi tipi di file all'inizio non sono riconosciuti come apribili con il notepad++. Per associare i file al programma clicka su un file con il tasto destro e seleziona la voce "apri con". Nella nuova finestra clicka su "sfoglia" e segui il percorso "Programmi/Notepad++", seleziona il file "notepad++.exe" e clicka su "OK".
Esegui questa operazione sia su un file ".ltx", sia su uno ".script". Adesso, clickando due volte con il pultante sinistro del mouse potrai aprire questi tipi di file.
Quando apri un file ".script", in esso viene usato il linguaggio di programmazione LUA e, per poter avere una coretta visualizzazione delle parole chiave del linguaggio, vai in "Configurazione" -> "Configura gli stili". Qui scendi nella colonna più a sinistra fino a trovare la voce "LUA" e clickaci sopra con il pulsante sinistro. Nella stessa schermata, adesso vedrai la casella di testo "Estensioni utente": insericisci "script" (senza le virgolette!!!) e premi "Salva & Chiudi".
Se prima dell'operazione avevi aperto un file "script" noterai che, con questa modica, il testo ha assunto un'identazione differente.

Guida rapida WinMerge

Con WinMerge avrai la possibilità di paragonare due file simili scovando le differenze. Ciò è utile nel momento in cui vuoi usare una caratteristica di una mod già esistene e vuoi quindi capire quale parte di codice ti serve per poter integrare quella caratteristica nella tua mod.
Per questo programma non servono particolari configurazioni. Il suo utilizzo è piuttosto semplice: avendo a disposizione i due file da comparare, clicka su uno di essi con il tasto destro e scegli la voce "WinMerge". Apertasi una nuova finestra, noterai tre barre di indirizzo: la prima fa riferimento al file selezionato prima, la seconda ti serve per far capire dove si trova il secondo file con cui fare il paragone. Quindi clicka sul secondo sfoglia e naviga fino a localizzare il secondo file, selezionalo e premi "Apri". Torna alla finestra con le barre degli indirizzi, premi "OK" e voilà, i file sono messi a nudo di fronte a te con tutte le differenze esposte.
Quando avrai di fronte i due file paragonati ci saranno diversi tipi di colori che identificano le somiglianze e le differenze. Nella fattispecie:

  • Il giallo chiaro indica le vere differenze;
  • Il giallo più scuro indica le macro selezioni di testo già fatte dal programma separate o da righe grigie (che sarebbero spazi mancanti dal file di riferimento) o da righe senza colore.
  • Le righe che non hanno assunto alcun colore particolare sono quelle comuni a entrambi i files.

Se vuoi spostare una parte di codice da un file all'altro, clicka con il destro e seleziona il "Copia a" di riferimento:


Boris47



Il tuo primo mod

Per poter cominciare ad entrare nel mondo del modding di S.T.A.L.K.E.R. proverai tu stesso, seguendi questi passi, a vedere com'è facile personalizzare questo grande gioco.
Da sempre una delle mod più richiese comporta la modifica del peso massimo trasportabile. Nella Versione Vanilla il peso massimo è 60 Kg, oltre il quale non puoi più muoverti ma, adesso, vedremo come rendere il tuo personaggio capace di trasportare ben 100 Kg di roba.

  • Vai nella cartella "Estratti/config/creatures". Sul file "actor.ltx" clicka con il pulsante dx e seleziona "copia";
  • Adesso vai nella cartella /gamedata da te creata nella cartella di S.T.A.L.K.E.R.;
  • Crea una nuova cartella e chiamala "config";
  • Al suo interno crea un altra cartella e chiamala "creatures" (da notare che stai ricostruendo il percorso che hai fatto prima (/config/creatures));
  • Incolla al suo interno il file actor.ltx;
  • Adesso torna in "Estratti/config" e copia il file "system.ltx";
  • Ritorna nella tua /gamedata in "/config" ed incolla il file "system.ltx".

Facendo il punto, adesso nella tua /gamedata dovrebbero esserci i file "system.ltx", e "/creatures/actor.ltx";

  • Se ti ritrovi con i file, apri il file "system.ltx" (ricorda che se hai già associato il file con il Notepad++ esso riconoscerà l'associazione da solo);
  • Premi CTRL + F e cerca il parametro "max_weight" che dovrebbe avere valore associato di 50;
  • Adesso sostituisci al 50 il valore di 90, salva con CTRL + S e chiudi;
  • Ora apri il file "actor.ltx" in "/creature" e cerca il parametro "max_item_mass", il cui valore associato da 50 dovrai cambiare a 90;
  • Cerca nello stesso file il parametro "max_walk_weight", il cui valore di 60 dovrai cambiare in 100, salva ed esci;

Adesso entra nel gioco e racatta quanta più roba possibile: vedrai che fino al peso di 90 Kg non avrai problemi ma al peso di 100 Kg resterai bloccato.
Complimenti, hai fatto la tua prima Mod! Lascia perdere se ti ho detto io come fare, tante altre cose dovrai farle tu!


Boris47



Gli scripts (I)

Nel capitolo precedente abbiamo visto come, cambiando qualche numero, si possa influenzare anche tutto il gioco ma, se volessimo cambiare il gioco, se volessimo arricchirlo con qualcosa che non c'è, qualcosa che a noi piacerebbe ci fosse... ebbene, dobbiamo integrarlo tramite gli scripts.
Gli scripts sono file di testo usati dall'engine di S.T.A.L.K.E.R. per ricevere le direttive su come gestire gli elementi del gioco: gli animali, gli stalker, gli eventi, il tempo atmosferico, eccetera. Negli script le "direttive" di cui parlavo sono espresse tramite un linguaggio di programmazione molto usato per i videogames: il LUA. Qui userò esempi e immagini per cercare di farvi apprendere le basi sulle quali tu stesso dovrai costruire la tua mod.
Partiamo da una cosa semplice, tipo far comparire un messaggio sullo schermo, una di quelle notifiche che compaiono in basso a sinistra nel menu principale. Lo faremo in maniera tale che, una volta in-game, ossia quando avrai avviato la partita, potrai andare nel menu principale e, premendo un pulsante, vedrai il messaggio.
Prima di tutto forniamoci del file "Estratti/scripts/ui_main_menu.script" copiandolo nella \gamedata, nella sottocartella che creeremo "scripts". Adesso incolliamo il file e apriamo.

Dove nell'immagine qui sopravi è la striscia rossa noi inseriremo una "funzione". Una funzione rappresenta una parte di codice che contiene delle istruzioni che il nostro gioco vogliamo esegua.
function Esempio() è una funzione che si chiama Esempio. Alla funzione Esempio possiamo dare degli Argomenti che vanno inseriti nelle parentesi. In questo caso non ne avremo bisogno quindi le parentesi ci sono ma sono vuote. Una volta definita la funzione in questo modo, vanno inseriti all'interno gli elementi che andranno a formale il cosiddetto corpo della funzione, ossia l'insieme di istruzioni che vengono eseguite quando il gioco chiama la funzione.
In pratica la funzione serve a raggruppare determinate istruzioni, che solitamente fanno riferimento al nome dato dalla funzione tipo:

Questa funzione esegue un calcolo, ossia la somma di 2 e riporta indietro il valore di 4. Più avanti capiremo il significato di return. Non necessariamente il nome della funzione deve far riferimento al suo scopo ma è per avere le idee chiare su cosa faccia quella funzione. Come prime istruzioni inseriamo questi righi:

SPIEGAZIONE: con local creiamo una via più rapida al dato che lo segue. Qui con "local actor" facciamo in modo che, ogni volta che utilizziamo "actor", usiamo una via più veloce rispetto a dover scrive sempre "db.actor" e risulta più leggero come metodo per il motore di S.T.A.L.K.E.R. "db.actor" rappresenta la nostra entità in-game e vine definita come una table. Una table la si può immaginare come una scatola in cui ci metti quello che vuoi (poi vedremo come) oppure come un pettine, visto in verticale, dove sulla punta di ogni dente si trova quello che tu inserisci.
Per ora rimaniamo nell'ordine di idee che sia una scatola al cui interno ci sono tante cose. Quando in una funzione dovremo prendere gli elementi di una stessa table più volte, è più comodo per l'engine che si usi la seguente forma:

local "nome da abbianare" = oggetto di riferimento.

Nel secondo rigo noi stiamo utilizzando un elemento presente in "actor", che fa riferimento alla table "db.actor". In genere gli elementi di una table, quindi ciò che di solito è contenuto in essa, o sono variabili o sono altre funzioni.

  • Le variabili sono entità a cui noi abbiniamo un valore che nel tempo potrebbe variare, come per esempio il tempo trascorso da un istante preciso.
  • Le funzioni, come in questo caso, vengono chiamate ed eseguono delle istruzioni.

"Il mio messaggio", "ui\\ui_iconsTotal", Frect():set(x,y,83,47), 0, 5000 sono tutti chiamati "Argomenti" in informatica, cioè danno informazioni utili alla funzione affinchè essa possa eseguire bene le sue istruzioni interne.
"Il mio messaggio" rappresenta la scritta che comparirà nel menu di gioco: queste sono chiamate "stringhe" e vanno scritte incluse nelle virgolette. L'ultimo numero, (5000), rappresenta il numero di millessimi di secondo (secondo/1000) per i quali il messaggio rimarrà visibile sullo schermo. In informatica molto spesso si lavora con i millisecondi poichè serve la massima precisione nella cronologia degli eventi di un programma (esempio banale: il doppio click del mouse in Windows è valido solo se il tempo trascorso tra un click e l'altro è minore o uguale ad un certo valore, oltre il quale vale solo come un singolo click. Quindi qui ben si capisci di parlare di quantità di tempo inferiori al secondo, ossia i millesimi). Per gli altri Argomenti ne parleremo meglio più avanti.
Tornando al nostro discorso, con queste due righe abbiamo fatto il corpo della funzione "Esempio". Ogni funzione, in LUA, ha un inizio "function NOME FUNZIONE" ed una fine "end". Con l'end chiudiamo la funzione.
Quindi alla fine ciò che dovremo ottenere sarà questo:

Se vuoi aiutarti a capire scrivendo promemorie o dettagli vari puoi farlo anche sul file script anticipando la tua frase con due trattini "--". In questo modo potresti fare un lavoro simile:

Perfetto, adesso hai scritto la tua prima funzione! Ora vediamo di collegarla al gioco. Non è detto che, solo stando scritta lì, essa venga chiamata! Quindi scendiamo giù per il file fino a trovare questa riga:

function main_menu:OnKeyboard(dik, keyboard_action)

Questa funzione è chiamata automaticamente dal gioco quando si preme un pulsante mentre si visualizza il menu principale. Scendiamo nel corpo della funzione fino a:

if keyboard_action == ui_events.WINDOW_KEY_PRESSED then

Qui incontriamo un elemento molto utile, l'if.
L'"if" ci serve nel momento in cui, in una funzione, vogliamo che una parte del corpo di questa venga eseguita solo ad una certa condizione. La condizione può essere una qualsiasi (es.: che una variabile abbia un certo valore, che una table non sia vuota oppure che contenga un determinato elemento, eccetera). In questo caso chiede al computer e dice: se la variabile di nome "keyboard_action" è uguale (==) a "ui_events.WINDOW_KEY_PRESSED", ALLORA esegui quello che c'è dopo.
Come la funzione, anche gli "if" devono avere un punto di chiusura ("end") per far capire che solo quella parte di codice deve essere soggetta a quella condizione. Quindi adesso creiamo il nostro pirmo "if".
Dopo if keyboard_action == ui_events.WINDOW_KEY_PRESSED then"" andiamo a capo e incolliamo questo codice:

Se hai fatto tutto correttamente, una volta avviato il gioco (caricato un salvataggio o iniziato una nuova partita) prova a premere ESC per aprire il menu principale e poi premi il tasto P: se ti si chiude il menu e, in basso a sinistra, vedi la notifica vuol dire che sei sulla strada giusta per diventare un modder professionista!


Boris47



Gli scripts (II)

Qui ci si prepara ad affrontare quello che rappresenta il cuore pulsante di stalker: l' Alife. L'Alife è da immaginare come un grosso cervello che recepisce tutte le istruzioni che gli vengono date, le elabora e ne dà una risposta che, nel nostro caso, è rappresentata da tutte ciò che avviene nel mondo di S.T.A.L.K.E.R.:

  • Gli scontri a fuoco;
  • La vita di ogni singolo essere vivente;
  • Gli eventi, come per esempio le tempeste radioattive (i blowout);
  • Il sistema di missioni (accettate, completate, in atto);
  • E tutto quelo che noi vediamo quando giochiamo;

Modificare l'Alife non è semplice perchè, sebbene in-game sia rappresentato da questi piccoli elementi, negli scripts ci sono migliaglia di righe di codice che danno continuamente istruzioni all'Alife. Qui vedremo come creare un'entità affianco al nostro personaggio, come ad esempio un "cane cieco".
Sfruttiamo lo stesso esempio della notifica (capitolo precedente), quindi andiamo nel file main_menu.script e creiamo una nuova funzione.
ATTENZIONE: ricorda che l'inizio di una funzione (function) deve essere sempre successivo all'"end" della precedente oppure precedente al "function" successivo, quindi questo esempio non è valido:

Quindi dobbiamo creare una nuova funzione: la chiameremo CreaCane(). Senza troppa fantasia!

Adesso abbiniamo questa funzione, come abbiamo fatto per la funzione Esempio nel capitolo precedente. Andiamo giù fino alla funzione "function main_menu:OnKeyboard(dik, keyboard_action)" e al posto di Esempio() inseriamo CreaCane(). Questa volta, per non incombere in errori, creeremo un if che lascierà che la funzione CreaCane() venga chiamata soltanto se è stata avviata la partita. Quindi modifichiamo la stringa "if dik == DIK_keys.DIK_P then" in questa:

if dik == DIK_keys.DIK_P and (level.present() and (db.actor ~= nil) and db.actor:alive()) then

L'if può verificare sia una condizioni che più condizioni: infatti, in questo caso, questa riga verrebbe letta dal gioco come:

SE la variabile "dik" è uguale al valore della variabile "DIK_P" nella table "DIK_keys" E (se il livello è caricato E se esiste il giocatore E se il giocatore è vivo) ALLORA

Qui solo quando tutte le condizioni sono verificate allora verrà chiamata la funzione CreaCane(). Alla fine dovremmo avere il codice simile a questo:

Indi salvate e chiudete, avviate il gioco e, una volta caricato il livello, premete ESC e poi P.


Boris47



Gli scripts (III)

Adesso è arrivato il momento di approfondire le nostre conoscenze sul LUA. Abbiamo incontrato la "function", la "local", l'"if" e abbiamo capito cosa vuol dire "chiamare una funzione". Prima di proseguire è meglio spiegare cosa vuol dire che una funzione "ritorna" qualcosa. Una funzione può non solo eseguire le istruzioni al suo interno ma anche far tornare uno o più elementi dal punto dove è stata chiamata. Un esempio può essere:

Qui vediamo come alla variabile "Verifica" non associamo un riferimento alla funzione "Maggioredidue", bensì, in quel punto, la funzione viene chiamata ed eseguita e, secondo la sua sintassi, fa tornare come valore o un "true", quindi vero, o un "false", quindi falso. "True" e "false" vengono chiamati valori booleani. La medesima funzione può ritornare anche delle stringhe se scritta così:

Oppure può ritornare un oggetto qualsiasi, tipo un suo argomento, se è vefificato, o nulla, nel caso contrario:

Oppure può ritornare elementi esterni alla funzione stessa:

Adesso dobbiamo addentrarci in un uso più "professionale" del LUA negli scripts. Esaminiamo la seguente funzione:

Cerchiamo di comprendere ogni rigo:

La spiegazione di ciò che accade è semplice: in S.T.A.L.K.E.R. esistono due tipo di entità. Ci sono quelle "on-line" e quelle "offline". Se esse sono on-line (cioè ad una certa distanza dall'attore) allora sono controllate da un gestore del motore del gioco chiamato object_binder e da classi da lui derivate. Oltre una certa distanza dall'attore, tutte le entità sono in off-line e, quindi, non sono presenti nel gioco. Grazie alla nostra funzione forziamo l'Alife a mettere offline tutte le entità che sono on-line, quindi che sono distanti da noi una certa distanza.
La distanza in questione è un valore numerico che si trova nel file Estratti/config/alife.ltx, al parametro "switch_distance" che di default (normalmente) dovrebbe essere di 150 (metri).

Boris47



Gli scripts (IV)

Come detto, ci sono due tipi di entità: quelle on-line e quelle off-line. Solitamente, per essere certi di manipolare le informazioni dell'entità giusta, la si ottiene tramite il suo "id", un numero non superiore a 65534 che identifica univocamente quell'entità.
Ammettiamo, per esempio, che un png da noi scelto nel mondo di S.T.A.L.K.E.R. abbia id = 56. Rifacendoci alla distanza vista nel precedente capitolo nel file alife.ltx, questo png è "on-line" quando è distante da noi non più di 150 metri ma risulta "off-line" se più distante. Per manipolare le sue informazioni quando è nello stato di "on-line" facciamo riferimento alla funzione "level.object_by_id" come da esempio:

local NPC = level.object_by_id(56) -- 56 è l'id nel png che vogliamo manipolare;

Qui NPC è un riferimento alla classe del nostro png, quindi noi adesso potremmo chiamare tutti i metodi e modificare le proprietà di quel png. Per esempio:

  • Per sapere se è vivo: local Vivo = NPC:alive();
  • Per sapere il livello di radiazioni: local Radiazioni = NPC.radiation; --(Da 0 a 100)
  • Per sapere se vede l'attore (questa funzione ritorna o true o false): local Visto = NPC:see(db.actor);

La lista completa di proprietà e metodi la si trova in "Estratti/scripts/lua_help.script" e comincia dalla voce "C++ class game_object {" e finisce alla chiusura della graffa "};". Nello stesso file si trovano tutte le classi con i metodi e le proprietà: se conosciuto bene, questo file vi permetterà di fare quasi tutto in S.T.A.L.K.E.R. tramite gli scripts. ATTENZIONE: S.T.A.L.K.E.R. nella sua versione Vanilla sforza in maniera equilibrata la CPU del computer, in modo tale da ottenere le prestazioni migliori. Man mano che gli scripts aumentano e le funzioni diventano sempre più impegnative il gioco richiederà sempre maggiori risorse.
Ecco perchè alcuni mod, un pò perchè sfruttano textures ad una risoluzione più elevata, un pò perchè vi sono stati implementati nuovi scripts abbastanza corposi, magari vi faranno andare il gioco un pò più lento e addirittura male. Il segreto sta nel trovare la giusta via di mezzo:

  • Riducendo al minimo gli elementi che richiedono più risorse come valanghe di codice che possono essere ottimizzate a poche righe;
  • Texture di medie risoluzioni;
  • Suoni non di troppa elevata qualità.
  • Ma anche una giusta etica in-game;

Infatti creare, per esempio, 200 cani in un solo punto farebbe impazzire l'engine che, suo malgrado, non riuscirebbe forse a gestirli, pur avendo un hardware di tutto rispetto.


Boris47



Le sezioni (I)

Come accenato in precedenza, ogni entità possiede una "Sezione", ossia un grosso contenitore al cui interno vi sono tutti i parametri e le informazioni della sezione stessa. Prima abbiamo visto come poter creare un "Cane cieco", inserendo nel metodo alife:create() il nome della sezione "dog_weak".
Quindi "dog_weak" è, a tutti gli effetti, una sezione ma andiamo a vedere cosa contiene questa sezione. La sezione in questione si trova nel file "config\creature\m_dog.ltx". Aprendo questo file, come quasi tutti i file in questa carella, notiamo una macro-sezione nominata in questo modo:

["Nome-Macro-Sezione"]:monster_base

Il "Nome-Macro-Sezione" è il nome della macro-sezione e definisce una sezione in cui tutti i parametri e le informazioni serviranno da base per le sezioni figlie. Nel caso del nostro file la sezione madre è "m_dog_e". All'interno di questa sezione possiamo trovare molti tipi di parametri come, per esempio:

  • Health = 100 ;Il valore della vita di default;
  • script_binding = bind_monster.bind ;Il nome della funzione ed il nome dello script che la contiene, che gestisce l'entità una volta in-game;
  • eye_range = 30 ;La distanza di visione;

e tantissimi altri parametri. Una descrizione completa la trovi a questa pagina. Tramite questi parametri noi definiamo una classe madre che, come ho detto, servirà alle sezioni figlie. Una sezione figlia è proprio la sezione "dog_weak" perchè definita nel seguente modo:

[dog_weak]:m_dog_e

In preatica la sezione "dog_weak", così facendo, eredita, si dice, tutti i parametri della sezione "m_dog_e" e, oltre che ereditarli tutti, può contenerne di nuovi o gli stessi ma modificati. Infatti la classe madre, per esempio, definisce le sue immunità con la sotto-sezione "dog_immunities" che, nella sezione figlia "dog_weak", vengono sostituite da "dog_immunities_weak". In S.T.A.L.K.E.R. esistono quindi "sezioni madri", "sezioni figlie" e "sottosezioni". Le sottoserioni contengono informazioni utili alle sezioni madri e figlie ma non sono sezioni a tutti gli effetti. Per dirla tutta, anche quelle che noi abbiamo definito sezioni madri sono, in realtà, sezioni figlie di altre sezioni e queste macro sezioni sono:

  • "monster_base", per tutte le creature (stalker, mostri);
  • "identity_immunities", per tutti gli oggetti (artefatti, items, parti del corpo dei mostri, items delle missioni, armi, munizioni);

In definitiva, se vedi una sezione scritta in questo modo:

["Nome_Sezione"]:monster_base oppure ["identity_immunities"]:monster_base

allora hai a che fare con una sezione madre.
Il mio consiglio è di non modificare i parametri della sezione madre quanto piuttosto di modificare o aggiungere i parametri delle sezioni figlie.
Cimentiamoci un pò nel creare una nuova sezione figlia per poter quindi creare un cane praticamente morente, cosìcche con un sol colpo possa essere ucciso. Nel file "config\creatures\m_dog.ltx", andiamo sotto sotto ed inseriamo questi righi:

Salviamo e chiudiamo. Adesso torniamo nel file ui_main_menu.script e, nella funzione CreaCane(), sostituiamo "cane_morente" a "dog_weak", salva e chiudi. Adesso, andando in-game, apri il menu e premi P. Il tuo cane sarà più debole e facile da abbattere!


Boris47



Le sezioni (II)


Dato che adesso hai abbastanza conoscenze, prova a usare quersta funzione nel menu:

In pratica questa funzione crea cinque entità "cane_morente" sopra qualunque anomalia presente nel raggio di 30m che possa creare artefatti. Esatto: le anomalie possono creare gli artefatti e solo in determinate condizioni e solo alcune possono. Le anomalie hanno come file di configurazione tutti quei file .ltx che iniziano con "zone_". Anche il fuoco tra gli stalker sarebbe un'anomalia, solo che ha come raggio d'azione il diametro la grandezza delle fiamme. Passandoci sopra, ovviamente ed infatti, ci si brucia ma, dato che quei fuochi non hanno il parametro "artefact_spawn_idle", essi vengono scartati dalla funzione. In questa funzione incontriamo una funzione di S.T.A.L.K.E.R., "system_ini()". Questa funzione ci permette di accedere in "sola lettura" ai parametri definiti nei file .ltx.
Infatti scrivere:

rappresenta, nella maggiorparte dei casi, un modo sicuro per leggere un parametro di una sezione. IN QUESTO CASO stiamo andando a leggere il valore di un parametro, e ci aspettiamo che esso sia una stringa. Elenco qui i metodi da usare in baso a ciò che si vuol leggere:

  • line_count(Sezione), ritorna il numero di righe contenute in "Sezione";
  • r_bool(Sezione, Parametro), ritorna il valore boleano di "Parametro" in "Sezione";
  • section_exist(Sezione), verifica l'eistenza di "Sezione"; Ritorna true se si, altrimenti false;
  • r_float(Sezione, Parametro), ritorna il valore numerico di "Parametro" in "Sezione";
  • r_line(Sezione, Rigo), ritorna il parametro presenta in "Sezione" al "Rigo" ed il suo valore;
  • r_u32(Sezione, Parametro), ritorna il valore numerico di "Parametro" in "Sezione"; ATTENZIONE: questo metodo è usato solo per leggere numeri molto grandi ma inferiori a 4294967296, l'uso eccessivo di questo metodo consumerebbe molta memoria;
  • r_string(Sezione, Parametro), ritorna il valore (che deve essere una stringa) di "Parametro" in "Sezione";
  • line_exist(Sezione, Parametro), ritorna true se "Parametro" esiste all'interno di "Sezione", altrimenti false;

Per la massima sicurezza nella lettura di uno o più parametri, di regola si dovrebbe:

Molti modders, però, non usano fare tanti controlli perchè sicuri che la sezione e i parametri da loro richiesti siano presenti.


Boris47



Il file actor.ltx


Quel che segue è l'intero contenuto del file actor.ltx commentato e spiegato. Commenti e spiegazioni sono stati riportati in modo tale che se ne possa copia/incollare qualsiasi parte direttamente nel file actor.ltx della propria \gamedata. Per scorrere le righe verso destra è sufficiente clickare col tasto sx del mouse sullo sfondo grigio e trascinare il cursore verso destra. In fondo al documento è comunque presente il solito scroller orizzontale.


Boris47



Configurazione delle armi


Quel che segue è l'intero contenuto del file w_abacan.ltx, cioè del file che configura tutti i parametri relativi al fucile d'assalto AN96 Abakan. Ovviamente, esiste un file di tal genere per ciascuna arma.
ATTENZIONE: il file è stato preso da Call of Pripyat ma indicherò via via ciò che non va usato in Shadow of Chernobyl.


Boris47

Un tocco di realismo in più


Ora vedremo come dare un tocco di realismo alla nostra mod.
Per prima cosa andremo a modificare dei valori tali che quando si prenda la mira la traiettoria subisca dei continui cambiamenti (comunque minimi), così da simulare la reale oscillazione dell'arma imbracciata.
Per fare ciò basterà andare ad aprire il file gamedata\configs\misc\effectors.ltx, trovare la sezione zoom_inertion_effector e modificare i seguenti parametri, magari usando come riferimento proprio quelli che vi fornisco qui:


Boris47