La più grande comunità italiana sui videogiochi Total War di Creative Assembly
  

Total War: Warhammer | Total War: Attila | Total War: Rome 2 | Total War: Shogun 2
Napoleon: Total War | Empire: Total War | Medieval II: Total War | Rome: Total War

LEGGETE IL NOSTRO REGOLAMENTO PRIMA DI PARTECIPARE. PER FARE RICHIESTE DI SUPPORTO, LEGGETE PRIMA QUESTA DISCUSSIONE.

 

 
Stampa | Notifica email    
Autore

Empire: Total War - Guida: Gli script. Concetti di base

Ultimo Aggiornamento: 07/06/2009 13:00
26/04/2009 18:52

Prerequisiti: nessuno

Premetto, per evitare future critiche, di aver descritto in questa guida l'informatica in modo molto semplice per permettere anche ai "profani" di capire le basi di programmazione in LUA.
I concetti qui spiegati vi permettono di CAPIRE in generale anche tutti gli altri linguaggi di programmazione ad alto livello (in modo particolare python, simile al lua, ma anche C++, Java, Basic, Pascal...). Un linguaggio ad alto livello è un linguaggio di programmazione che permette ad un essere umano di comprendere il codice, più il livello è "alto" più sarà leggibile e comprensibile ma meno potrete fare, mentre con linguaggi di basso livello come l'assembly e il codice macchina potete fare di tutto, se riuscite a districarvi tra quei linguaggi.

Detto questo possiamo iniziare!

N.B. Quasi tutti i comandi che uso non sono quelli veri in Empire, per quelli farò un altra guida (spero in breve tempo), ma servono per capire meglio il linguaggio.

- UN NUOVO LINGUAGGIO

Con l'arrivo di Empire Total War, la CA ha sostituito il precedente linguaggio di scripting con un famoso linguaggio di programmazione, il Lua.
Questo linguaggio, ideato nel 1993 a Rio de Janeiro, è usato principalmente come linguaggio di scripting.

Potete aprirlo con il semplice Blocco Note di Windows, oppure potete liberamente scaricare un IDE che vi permettera di verificare la sintassi del codice. Per chi non lo sapesse un IDE, che sta per Integrated development environment (ambiente integrato di sviluppo), è un software che aiuta i programmatori nello sviluppo del software, come il celebre Visual Studio della Microsoft.
Ricordatevi che Lua è un linguaggio interpretato, e a differenza di quelli compilati come il C++, se volete provare il codice vi serve usare una Virtual Machine come in Python e Java.
Potete scaricarla da qui code.google.com/p/luaforwindows/downloads/list N.B. suo interno troverete anche lo SCiTE, un ottimo IDE per Lua

- IL LINGUAGGIO

Da qui inizia la guida vera e propria che spieghera come funziona il lua. Se conoscete un minimo di programmazione queste cose le saprete gia.

--Tipi

Da Wikipedia:
In informatica un tipo di dato (o semplicemente tipo) è un nome che indica l'insieme di valori che una variabile, o il risultato di un'espressione, possono assumere e le operazioni che su tali valori si possono effettuare. Dire per esempio che la variabile X è di tipo "numero intero" significa affermare che X può assumere come valori solo numeri interi (appartenenti ad un certo intervallo) e che su tali valori sono ammesse solo certe operazioni (ad esempio le operazioni aritmetiche elementari).
Ogni linguaggio di programmazione consente di usare, in modo più o meno esplicito, un certo numero di tipi di dati predefiniti di uso generale. Inoltre, ogni linguaggio di programmazione fornisce di solito un certo insieme di strumenti per definire nuovi tipi sulla base delle necessità specifiche di un programma.

In informatica, una variabile identifica una porzione di memoria destinata a contenere dei dati, che possono essere modificati nel corso dell'esecuzione di un programma.
Per dichiarare (creare) una variabile dovete usare questa sintassi (senza > e <;):

<Nome_Veriabile> = <Valore_variabile>

x=2000

Nei linguaggi come il c++ e Java, oltre al nome della variabile dovreste dichiararne anche il suo tipo, che non può cambiare nel corso del programma (Tipizzazione statica). Il LUA invece è un linguaggio che utilizza la Tipizzazione dinamica, quindi non dovrete dire che la variabile A è un intero e B un carattere, e posso tranquillamente trasformare A da intero a float o a stringa. Tuttavia vi conviene imparare i tipi fondamentali per gestire il codice ed evitare errori, quindi eccovi un elenco dei più importanti:

Intero: I numeri interi sono formati dall'unione dei numeri naturali (0, 1, 2, ...) e dei numeri negativi (-1, -2, -3,...) in un insieme che i matematici chiamano con molta fantasia Z (perché è la lettera iniziale di "Zahl" che in tedesco significa numero). Nel mondo reale, come ben sapete, i numeri sono infiniti, ma non è così anche in informatica. Come tutto in questo "mondo", il numero più grande è una potenza di 2. I nostri classici processori, se lavorano in ambienti a 32 bit (come Empire) sarebbero tecnicamente in grado di contare fino a 2^32 (4294967296) ma dato che sono presenti anche i numeri negativi, di fatto i numeri si dimezzano, e potete contare da -2147483648 a 2147483647 (0 incluso). Se avete 2147483647 e aggiungete 1 cosa succede? I numeri in informatica formano un anello chiuso, quindi 2147483647 + 1 = -2147483648, se aggiungete ancora un altro 1 ottenete -2147483647 e così via fino ad ottenere 0 e di nuovo 2147483647 in un ciclo infinito (adesso avete capito perchè quando inserivate numeri troppo grandi con i trucchi in Medieval II nelle vostre finanza anziche aggiungere soldi li toglievate). Questo meccanismo può sembrare strano a primo impatto, ma diventa chiarissimo se si osserva il numero in binario. Nei registri interni del processore 2147483647 equivale a 01111111111111111111111111111111. Dato che in binario 1+1=10, se aggiungete un 1 otterrete (con i riporti) 10000000000000000000000000000000, che con una conversione diretta equivarrebbe a 2147483648; come abbiamo detto precedentemente però, il processore utilizza anche i numeri negativi, ottenuti tramite il cosidetto "Complemento a 2", e 10000000000000000000000000000000 è il più piccolo numero negativo possibile(-2147483648). Se aggiungete ancora 1, ottenete 10000000000000000000000000000001, che tradotto in decimale equivale a -2147483647. Si va avanti così fino ad arrivare a 11111111111111111111111111111111, che in complemento a 2 equivale a -1; a questo punto aggiungendo ancora 1 il numero diventerebbe grande 33 cifre, ma i registri con i 32 bit non sono così lunghi, e quindi la cifra più significativa viene persa e si ottiene 00000000000000000000000000000000 ossia 0, e da qui il ciclo può ricominciare.

Booleano: dal nome del "creatore" dell'algebre di Bool (George Boole), un booleano in informatica può assumere semplicemente 1 o 0, rispettivamente true o false. Questo è quasi tutto quello che dovete sapere con i booleani, il resto verrà fuori nelle condizioni, meglio evitare di dilungarci troppo perchè questi argomenti sono davvero vastissimi con miriadi di intrecci con la matematica, così come molto altro sugli interi e sui prossimi tipi, non basterebbero pagine intere per descriverli in maniera soddisfacente.

Float e Double: Questi 2 tipi indicano i numeri con la virgola, in particolare il secondo è due volte più preciso del primo, ma non credo vi servano a molto numeri con oltre 30 cifre decimali. Non utilizzateli se non quando è esplicitamente richiesto, dato che ha effetti imprevedibili negli altri casi.

Vettore o Array: un array è una struttura dati usata in molti linguaggi di programmazione e chiaramente ispirata alla nozione matematica di vettore. Più precisamente, l'array è in genere classificato come un costruttore di tipo: in altre parole, esso consente di definire nuovi tipi di dati a partire da tipi preesistenti. In parole povere un array non è altro che un contenitore di dimensione N in cui ogni elemento è dello stesso tipo: un array di interi sara formato cosi {1,4,6,23,456,123,634524,331,123,545252}, uno di float così {234.324523 , 234231.5434354 , .5434534, -0,432423}. Normalmente si possono fare array di qualsiasi cosa (nel gioco anche le fazioni sono memorizzate in un array di oggetti fazione), ma qui vengono utilizzati, per esempio, per dare le coordinate alla telecamera. Potete fare anche array di array, formando così una matrice.

Carattere: un carattere è un'unità minima di informazione che, semplificando, corrisponde a un grafema, o a un simbolo, della forma scritta di un linguaggio naturale. Non conosco la codifica utilizzata da Empire, credo sia l'ASCII a 8 bit, ma potete tranquillamente usare tutti i caratteri della tastiera con accenti inclusi, probabilmente avrete dei problemi con simboli come ڇ╠●ᵬ, se mai li userete. Se volete sapere un po' di più sui caratteri guardate questa discussione: totalwargamesitalia.freeforumzone.leonardo.it/discussione.aspx?idd...

Stringa: Adesso che sapete che cos'è un vettore e cos'è un carattere siete pronti per la stringa, uno dei tipi fondamentali per noi. Una stringa in informatica è un vettore di caratteri. Viene solitamente racchiusa in "", per esempio "Empire Total War" è una stringa. Ricordate che anche i numeri possono essere caratteri, e che è completamente diverso scrivere "1234567" da 1234567. oltretutto una stringa non ha limiti (in realtà dovrebbe essere circa 1 000 000 000 di caratteri da quello che so, spero vi basti), e potete scrivere "579857342075634890574985739764639876034763908753409754923" dato che non è un intero.

Su alcuni di questi tipi, come gli interi, potete eseguire delle operazioni per modoficare il valore contenuto della variabile.
Prima abbiamo dichiarato una variabile x di valore 2000, se adesso volessimo possiamo cambiare il suo valore in questo semplice modo:

x=1000

adesso x varrà 1000.

Mettiamo che adesso nel corso del programma ci sia un contatore che registra, per esempio, gli anni bisestili (è un esempio stupido ma è tanto per fare un esempio)

if  ...(questo lo vediamo dopo)... then
    x = x + 1
end


Se all'inizio del programma x valeva 1, il giro successivo x vale 2, poi 3 e così via. Avete appena utilizzato un "Operatore Aritmetico"
Potete anche fare modifiche utilizzando altre variabili: se abbiamo Turno = 2 e Anno = 1700, potete benissimo scrivere

x = Anno * Turno (3400)
x = Anno - Turno (1698)
x = Anno / Turno (850)
x = Anno % Turno (0)

% da il resto della divisione.

N.B. Ho scritto Anno e Turno con la maiuscola, e dato che Lua è Case Sensitive (riconosce le differenze tra maiuscole e minuscole) Anno è diverso da anno che è a sua volta diverso da ANNO, anNo, aNno...

--Commenti

Finchè il vostro script assume le dimensioni di poche righe e lo utilizzate solo voi non avrete problemi a sapere cosa fa un particolare set di istruzioni, ma con il crescere delle dimensioni del file e con lo sviluppo congiunto con altre persono diventa necessario "mettere degli appunti" per sapere cosa fa un determinato frammento di codice.

Se io vi mettessi per esempio questo codice (preso dagli script di Empire):
if camera_pan == 11 then
    CampaignUI.ScrollCamera(11,	{  49.000,332.000, 0.95},
                                {  8.000, 324.000, 0.95},
                                {-31.000, 282.000, 0.85})
    camera_pan = 12
end


Non credo che a prima vista possiate capire che cosa fa, al massimo potete intuire che questa funzione (che definiremo dopo) permette di muovere la telecamera, ma non credo abbiate una mappa mentale con tutte le coodinate di empire, e non sapete quindi dove va a finire.
Tuttavia se scrivo sopra:
--1001_Campaign_Advice_Britain_Initial_Turns_Thread

Potete capire che indica le coordinate dove si posizionerà la telecamera all'inizio del primo turno di gioco (la presentazione iniziale)

Quei due -- iniziali indicano che da quel momento in poi tutto quello che c'è nella riga è un commento e il gioco non lo leggerà durante durante l'eseguzione dello script.
Se vi servono commenti da più di una riga potete usare la formula --[[...]]--
--[[questo è un commento
    su più righe
    il Lua
]]--

Niente di tutto quello all'interno di questo blocco verrà letto dall'interprete del gioco.


--Strutture di controllo

Un qualsiasi programma (con delle varianti per quanto riguada la programmazione ad eventi), esegue le istruzioni in un flusso ordinato di dati che vanno dalla prima all'ultima istruzione, quindi, se scrivo:

x = 1
x = x + 1
x = x / 2
x = x * 10

x alla fine varrà quindi 10.
Mettiamo sia però necessario che la seconda e la terza istruzione avvengano soltanto nel caso la variabile Turno valga 15.
In informatica esistono dei particolari costrutti chiamati "Strutture di controllo" che vi permettono di specificare se, quando, in quale ordine e quante volte devono essere eseguite le istruzioni che lo compongono.

---IF

l'if è un comando estremamente semplice, traducibile come in italiano come "se". Il comando è composto in questo modo:
if <condizione/i> then
    <comandi>
end

Per esempio per rispondere alla domanda di prima:
if Turno == 15 then
	x = x + 1
	x = x / 2		
end

Ho usato ==, un "Operatore relazionale", che in informatica serve a paragonare 2 variabili e restituirà il valore booleano true se la condizione è verificata.
Esistono vari altri operatori che potete utilizzare:

x == y : restituirà true nel caso x e y siano uguali, false in tutti gli altri
x ~= y : restituirà false nel caso x e y siano uguali, true in tutti gli altri
x < y : restituirà true nel caso x sia minore di y, false in tutti gli altri
x > y : restituirà true nel caso y sia maggiore di x, false in tutti gli altri
x <= y : restituirà true nel caso x sia minore o uguale ad y, false in tutti gli altri
x >= y : restituirà true nel caso x sia maggiore o uguale ad y, false in tutti gli altri

Potete usarne anche di più tutti insieme, per esempio per sapere se il turno è compreso tra 20 e 40 estremi inclusi:
if Turno >= 20 and Turno <= 40 then
...
end

and è un "Operatore Logico" che controlla che tutte le condizioni siano rispettate.
La discussione su questi operatori potrebbe essere lunga, ma ci possiamo limitare a questi casi

Turno >= 20 and Turno <= 40 : restituirà true nel caso TUTTE le condizioni siano rispettate, false in tutti gli altri
Turno >= 20 or Turno <= 40 : restituirà true nel caso ALMENO UNA condizione sia rispettata, false in tutti gli altri
not(Turno >= 20 and Turno <= 40) : restituirà false nel caso TUTTE le condizioni siano rispettate, true in tutti gli altri
not(Turno >= 20 or Turno <= 40) : restituirà false nel caso ALMENO UNA condizione sia rispettata, true in tutti gli altri

---IF--ELSE

Può servire che nel caso non faccia una cosa il programma ne debba fare un'altra. Il comando è else (altrimenti) composto in questo modo:
if <condizione/i> then
    <comandi>
else
    <comandi>
end

---IF--ELSEIF

Può servire che nel caso non faccia una cosa il programma ne debba fare un'altra se rispetta un altra condizione. Il comando è elseif (altrimenti se) composto in questo modo:
if <condizione/i> then
    <comandi>
elseif  <condizione/i> then
    <comandi>
end

Può esserci un else finale:
if <condizione/i> then
    <comandi>
elseif  <condizione/i> then
    <comandi>
else
    <comandi>
end

Potete mettere quandi elseif volete.

---WHILE

In italiano possiamo considerare il ciclo while come "fintanto che", e ripete una serie di istruzioni finchè le condizioni sono vere.
Possiamo per esempio incrementare una variabile fino a quando non raggiunge un determinato valore:
i=0
while i<10 do
    i=i+1
end

Alla fine i varrà 10

---REPEAT

Repeat è molto simile ad un ciclo while, ma a differenza di quest'ultimo controlla le condizioni solo dal secondo giro
repeat
    <istruzioni>
until <condizioni>

---BREAK
Talvolta bisogna fermare un ciclo anzitempo per varie motivazioni, per esempio una divisione per 0. Per bloccare un ciclo si usa il comando break, che interromperà immediatamente il ciclo e vi farà proseguire con il programma.
i=-10
while i<10 do
    if i==0 then --Le divisioni per 0 danno sempre problemi
         break
    end

    a=5/i
	print(a)
    i=i+1
end

N.B. print serve a mettere a video qualcosa, utilizzatelo solo per fare prove, mai in Empire

--FOR

Veniamo infine ai cicli for, che hanno molto a che fare con i vettori.
Un ciclo for è così composto:
for <variabile> = <inizio>, <fine>, <passo> do
    <istruzioni>
end

Il ciclo crea una variabile che ha inizialmente il valore stabilito in inizio, e incrementa ogni giro il suo valore di quanto vale passo fino a raggiungere o superare valore di fine.
for z = 0, 1000, 1 do -- questo ciclo metterà a video tutti i numeri dallo 0 a 1000 
    print(z)
end

--ANNIDAMENTO

Posso a volte essere necessari più livello di controllo per fare una determinata cosa. Mettiamo che serva per esempio che l'Anno sia maggiore di 1700 e che soccedano 2 cose diverse nel caso il Tesoro_Reale (non ci vanno MAI spazi tra i nomi in informatica) valga più o meno di 30000; il codice sarebbe il seguente:
if <condizione/i> then
    if <condizione/i> then
	<comandi>
    else
	<comandi>
    end
end

Applicandolo al nostro esempio:
if Anno>1700 then
    if Tesoro_Reale>=30000 then
        ...
    else
        ...
    end
end

Questo inserire condizioni dentro altre condizioni viene definito come "Annidamento", e possono anche incrementare la leggibilità del codice.

--Funzioni e Oggetti

In informatica, una funzione (detta anche subroutine, routine, procedura o sottoprogramma) è un costrutto che permette di raggruppare una sequenza di istruzioni che fanno parte di un programma. Una funzione può essere "chiamata" ("richiamata", "invocata", "attivata") in diversi punti del programma di cui fa parte come se fosse una singola istruzione. Nella programmazione orientata agli oggetti, il ruolo della funzione è assunto dal metodo. Il metodo è l'equivalente delle funzioni negli oggetti. Generalmente una metodo viene indicato così: nomeOggetto.nomeProcedura(Parametri).

Ma che cos'è un oggetto?
La definizione, per i non addetti al settore, sarà più o meno equiventa all'arabo, ma ve la metto lo stesso:

Da Wikipedia:

Nella sua più semplice definizione un oggetto è una regione di memoria allocata. Poiché i linguaggi di programmazione usano variabili per accedere agli oggetti, i termini oggetto e variabile sono spesso usati in alternativa. In ogni caso, finché un'area di memoria non è allocata nessun oggetto può esistere.

In particolare nella programmazione orientata agli oggetti, è un esemplare (in inglese: instance, comunemente anche se impropriamente tradotto con istanza) di una classe, unico e separato da altri oggetti (secondo il concetto di incapsulamento) con i quali può tuttavia "comunicare".

Generalmente si considerano come oggetti tutte quelle entità dotate di una propria identità. Tuttavia non tutte le entità di un problema devono essere necessariamente oggetti, dipende dalla natura del problema, che può consentire o richiedere di trascurare o meno certe entità perché non significative per il problema stesso. Gli oggetti, inoltre, possono anche essere composti da altri oggetti, in tal caso si deve approfondire l'analisi ed individuare i singoli componenti sino a che il livello più basso contenga soltanto oggetti atomici.

In un linguaggio ad oggetti ogni elemento del linguaggio è chiamato oggetto perché lo si intende come una astrazione del medesimo oggetto del mondo reale. Un oggetto per essere tale può avere delle proprietà (variabili di istanza) e può compiere delle azioni, solitamente denominate metodi. Se si utilizza come esempio il cane, l'oggetto cane potrà avere come proprietà il numero di zampe, la tipologia del pelo, il colore, mentre i suoi metodi potrebbero essere mangia, abbaia, scodinzola.

In lua gli oggetti non esistono "in natura" ma possono essere implementati; noi non creeremo oggetti, useremo quello gia presenti nel gioco.

Generalmente una funzione ha uno o più valori di ingresso, che vengono detti parametri, e uno o nessun valore in uscita (cioè fa una cosa e basta, tipo muove una bandiera), ossia quello che la funzione restituisce. Per esempio, se consideriamo la funzione (o meglio il metodo)
	effect.adjust_treasury(-1000,context)

questa diminuirà di 1000 il tesoro della fazione che viene utilizzata in questo momento (context o contesto appunto). Quindi -1000 e context sono valori di entrata, mentre il valore di uscita è la somma tra la variabile del tesoro e il primo parametro. Concettualmente succede questo (mettendo che il tesoro equivale a 5000): tesoro = tesoro + (-1000) => 4000.

Empire ho una vasta libreria di funzioni, che non descriverò qui adesso, e che potete trovare nello Script-o-Rama di alpaca www.twcenter.net/forums/showthread.php?t=243427#usecases e in questa lista www.twcenter.net/forums/showthread.php?t=243201

Essendo ancora agli inizi dello scripting Empire, la comunità non conosce ancora i parametri della stragrande maggioranza delle funzioni, tuttavia potete scoprirle utilizzando questo metodo:

What you need to know about calling those functions:
- When you give too few arguments you get CTD.
- When you give enough or too many arguments you might get: "bad argument #1 to 'IsCharacterPlayerControlled' (Pointer<CHARACTER> expected, got userdata)"

So, for each function that exists you do (in a Lua script):
- use pcall to call that function with say 9 arguments that are likely of the wrong type.
- It should give an error, parse the error message, change the first argument to the right one, then try again, change second, etc (there is also chance that the first argument is already of the right type and the error message is about the second argument, be sure to handle that case as well).
- Once the function succeeds remove all extraneous arguments, and try again. If it CTDs you removed too much, which means that the argument type you removed was of the right type and required.
- Be sure to log before and after each action what was succeeded, if empire CTDs restart empire (have it set to automatically start a campaign) and read the logs to find where you were when it crashed and skip that or fix what you did wrong.

For the program you write to auto restart Empire there something you need to be aware of:
- When you start empire.exe it will activate steam (or start it if it's disabled) then quit empire, then steam will restart empire. So take that into account when you check if empire is still running.

--Creare una funzione

Potete crearvi anche voi delle funzioni che facciano una determinata cosa utilizzando le funzioni preesistenti.

Una funzione segue questa sintassi:
function <nomeFunzione>(<parametri>;)
   <istruzioni>
   return <valore di restituzione>
end

Analizziamo riga per riga:

La prima riga indica che state creando una funzione, con il nome che volete, e che utilizzi alcune delle variabili del programma principale.

sotto mettete tutti i comandi che deve svolgere

Se deve restituire un valore, lo mettete dopo return.

Ecco un esempio che può aiutare a comprendere:

Vogliamo creare una funzione che modifichi il valore del tesoro di una fazione.
Questo è il programma principale:
x=1000
Tesoro=3000
Tesoro = sottrazione(Tesoro,x)

Come vedete richiama una funzione sottrazione gli passa i valori Tesoro e x.
in seguito troviamo la definizione di questa funzione
function sottrazione(tesoro,quantita)
	tesoro=tesoro-quantita
	return tesoro
end

La funzione riceve in ingresso i parametri tesoro e quantita, li sottrae e restituisce il nuovo valore di tesoro, che tramite il return va a finire dentro la variabile Tesoro nel programma principale.
Tesoro adesso varrà 2000.
Tesoro e tesoro sono 2 variabili diverse e non in relazione tra di loro, semplicemente copio il valore di Tesoro dentro la nuova variabile tesoro, (lo stesso faccio tra x e quantita).
Qualsiasi modifica faccio a tesoro, non si riperquote anche su Tesoro, e questo è chiamato passaggio per valore o per copia.



Con questo finisce, sperando di non aver dimenticato qualcosa, la guida dedicata alla programmazione generale, che servirà in preparazione allo scripting di Empire vero e proprio. Con quello che sapere adesso dovreste essere in grado di lavorare con il lua. Se usate un IDE, potete provare a lanciare il codice da voi eseguito per prova, e potete leggere i risultato con la funzione print().

Il miglior metodo per imparare a programmare è fare esperimenti, e sbagliando magari per vedere cosa succede. Se avete un problema da risolvere non buttate codice a caso nella speranza di ottenere risultati, tentate piuttosto di ragionare e di trovare una soluzione logica.

Se avete domande non esitate a farne, cercherò di rispondervi.

26/04/2009 19:17
OFFLINE
Post: 492
Registrato il: 08/04/2007
Sesso: Maschile
Principalis
bravissim Lucio!
wow si possono creare addirittura le funzioni
un bel passo in avanti rispetto a med2
[Modificato da The Housekeeper 26/04/2009 19:17]
26/04/2009 19:20
Grazie, Empire ha davvero rivoluzionato lo scripting rispetto a med2, ci sono funzioni, si possono importare moduli, funzionano i cicli iterativi e molte altre belle cosucce dei veri linguaggi di programmazione. Adesso sto ancora facendo delle prove, sembra davvero ottimo solo che non ci sono gli argomenti per tantissime funzioni.
[Modificato da Lucio Settimio Severo 26/04/2009 19:21]
26/04/2009 21:02
OFFLINE
Post: 5.573
Registrato il: 29/10/2007
Sesso: Maschile
Praefectus Castrorum
Il padrino
Bhe che dire, un grazie sarebbe riduttivo :) Infinite grazie Lucio per questa guida :)

messo in evidenza ovviamente [SM=g8335]
[Modificato da siculo-calabrese 26/04/2009 21:02]
____________________________________________________




26/04/2009 21:06
Re:
siculo-calabrese, 26/04/2009 21.02:

Bhe che dire, un grazie sarebbe riduttivo :) Infinite grazie Lucio per questa guida :)

messo in evidenza ovviamente [SM=g8335]




Grazie siculo [SM=g8335]
06/06/2009 00:25
OFFLINE
Post: 1.855
Registrato il: 29/04/2008
Città: TORINO
Età: 31
Sesso: Maschile
Tribunus
quindi ETW che per i piccoli modder sembra un casino da moddare, in realtà ha delle possibilità enormi rispetto alle precedenti versioni che però erano + semplici da usare. no?
07/06/2009 13:00
Re:
Sean Cappone, 06/06/2009 0.25:

quindi ETW che per i piccoli modder sembra un casino da moddare, in realtà ha delle possibilità enormi rispetto alle precedenti versioni che però erano + semplici da usare. no?




Almeno nella parte degli script questo è completamente vero, può essere complicato per chi non ha mai programmato, ma per chi ha un po' di esperienza, grazie a tutte queste nuove implementazioni, potrà fare miracoli senza appesantire troppo il codice e magari riuscendo anche ad ottimizzare meglio.
Amministra Discussione: | Chiudi | Sposta | Cancella | Modifica | Notifica email Pagina precedente | 1 | Pagina successiva
Nuova Discussione
 | 
Rispondi

Feed | Forum | Bacheca | Utenti | Cerca | Login | Registrati | Amministra
Crea forum gratis, gestisci la tua comunità! Iscriviti a FreeForumZone
FreeForumZone [v.6.1] - Leggendo la pagina si accettano regolamento e privacy
Tutti gli orari sono GMT+01:00. Adesso sono le 17:08. Versione: Stampabile | Mobile
Copyright © 2000-2024 FFZ srl - www.freeforumzone.com


© The Creative Assembly Limited.
All trade marks and game content are the property of The Creative Assembly Limited and its group companies.
All rights reserved.