Concetti basilari del coding


Programmi: Sanny Builder
Autore: Wesser

Attraverso tale guida cercherò di analizzare una parte di codice e tutte le funzioni in esso comprese attraverso una spiegazione semplice (a mio avviso) sui concetti basilari del coding.

Prima di tutto occorre sapere un bel po' l'inglese per potersi muovere senza problemi. Di conseguenza scaricare il Mission Builder anche se io preferisco il Sanny Builder, il programma su cui il medesimo tutorial si basa. Aprire il file main.scm presente nella cartella data\script selezionando prima la directory del gioco come il programma richiede. Incominciamo a focalizzare i punti e la predisposizione dei thread e delle missioni.

Quello che occorre per ora è creare un thread che non è altro che una parte del codice in cui ci sono diversi jumps (plurale di jump) che si riferiscono (non tutti) al label di partenza, ossia il nome di ogni singola parte di codice preceduta dai ":" cui fanno riferimento i jumps. Ogni thread è formato da innumerevoli conditionals (condizioni), che descrivono la cause per far si che il rispettivo effetto si verificasse di conseguenza, ed opcodes (plurale di opcode), che presentano parametri di vario numero ed una parte descrittiva (disponibile non per tutti perchè alcuni parametri sono ancora unknown, sconosciuti, per ora).

Detto questo, passiamo alla pratica per mettere a frutto quanto detto. Sempre nel programma, fare una ricerca della linea 004F: create_thread @ e sotto tutte quelle che hanno la stessa ed inequivocabile dicitura aggiungere quella quì di sotto riportata: 004F: create_thread @CARMOVE Ora, invece, passiamo alla creazione del thread da inserire sotto tutti gli altri ma prima della dicitura "mission 0 (//-//)". :CARMOVE
thread 'CARMOVE'

:CARMOVE_11
if
not Model.Available(#PONY)
jf @CARMOVE_19
Model.Load(#PONY)
wait 0
jump @CARMOVE_11

:CARMOVE_19
1@ = 0.0 // car x pos
2@ = 0.0 // car y pos
3@ = 0.0 // car z pos
0@ = Car.Create(#PONY, 1@, 2@, 3@)
19@ = Car.Model(0@)

:CARMOVE_24
wait 0
if
056E: car 0@ defined
jf @CARMOVE_19
Model.Load(#NULL)
if
Model.Available(#NULL)
jf @CARMOVE_24
5@ = Actor.Create(CivMale, #NULL, 1@, 2@, 3@)
036A: put_actor 5@ in_car 0@
0337: set_actor 5@ visibility 0

:CARMOVE_36
wait 0
if and
not Actor.Dead(5@)
not Car.Wrecked(0@)
jf @CARMOVE_62
if
00FE: actor $PLAYER_ACTOR sphere 0 in_sphere 1@ 2@ 3@ radius 10.0 10.0 10.0
jf @CARMOVE_36
9@ = 0.0 // place x pos
10@ = 0.0 // place y pos
11@ = 0.0 // place z pos
05D1: AS_actor 5@ drive_car 0@ to 9@ 10@ 11@ speed 0.0 mode 2 model 19@ behaviour 3

:CARMOVE_48
if
01AF: car 0@ sphere 0 in_sphere 9@ 10@ 11@ radius 1.0 1.0 1.0
jf @CARMOVE_36
Actor.DestroyWithFade(5@)
Car.RemoveReferences(0@)
end_thread

:CARMOVE_62
Actor.DestroyWithFade(5@)
Car.RemoveReferences(0@)
jump @CARMOVE_11
Ora analizziamo il codice con tutte le varie spiegazioni in merito agli opcode ed al perché. :CARMOVE La prima dicitura per ogni sezione del codice è il label che, come ho già citato in precedenza, indica o, in un certo senso, raggruppa tutti gli opcodes (gli effetti) che si vogliono far verificare dopo il richiamo delle conditionals (le condizioni) e non. thread 'CARMOVE' Non è indispensabile ma serve per conferire al thread un nome perchè poi durante la compilazione senza di esso comparirà la dicitura "NONAME". Se si vuol utilizzare gli apici ('') bisogna considerare che il numero massimo di chars (caratteri = char) da inserire è di 7 lettere mentre i doppi apici ("") se si vuol inserire più di 7 caratteri. if E' il comando che visualizza una o più condizioni. Nel secondo caso può diventare "if and" se si vuol inserire un effetto (opcode) dopo l'avvenire di più di una causa (conditional) nello stesso tempo; mentre "if or" se le conditionals da prendere in considerazione devono essere o l'una o l'altra. not Model.Available(#PONY) Questo conditional è indispensabile se il modello richiesto è disponibile. E' caratterizzato da una class (classe = class). Model.Load(#PONY) E' indispensabile quando si vuol creare un modello che, come da descrizione, indica il caricamento di quest'ultimo così da renderlo disponibile e "spawnabile". In questo caso si riferisce al modello dell'auto e, come vedremo in seguito, il secondo opcode simile si riferisce a quello dell'attore. wait 0 E' uno degli opcode più importanti che rappresenta una pausa di un millisecondo (credo che sia così), indispensabile quando il jump si riferisce allo stesso label in cui è contenuto. jf @CARMOVE_11 E' l'abbreviativo di "jump_if_true" (raramente utilizzato) o "jump_if_false" che se la condizione è falsa si passa al label prescritto e dipende dalle condizioni. 1@ = 0.0
2@ = 0.0
3@ = 0.0
Queste sono le variabili (variables) a cui è attribuito un valore che in questo caso si verifica alle coordinate (coords) X, Y, Z, (1@, 2@, 3@) dell'auto che si vuol "spawnare". Possono essere identificate in diverso modo: ad esempio se le si indica con il segno "@" vuol dire che la variabile sarà locale (local variable) che non rimane in memoria e deve essere sempre richiamata, specialmente se viene richiesta da un altro thread o qualsivoglia codice esterno; mentre se le si indica con il segno "$" significa che la variabile sarà globale (global variable) che rimane in memoria e può essere tranquillamente richiesto da un thread o un codice esterno. Possono essere precedute anche con il segno "&" che svolge più o meno le stesse funzioni o le medesime, ma non ne sono sicuro. I valori delle variabili possono essere integer (interi = int) o float (con la virgola = float). In questo caso si tratta di coordinate che devono essere precise ed il valore deve essere un float. 0@ = Car.Create(#PONY, 1@, 2@, 3@) Ora compaiono 5 parametri da analizzare uno per volta. Il primo indica la variabile che si riferisce all'auto, il secondo indica il nome ID del modello (ID model), mentre i restanti parametri indicano le coordinate float, ma io ho voluto che esse si riferiscano alle variabili comparse precedentemente. Come è traducibile dalla descrizione tale opcode serve per creare un'auto. 19@ = Car.Model(0@) Questo opcode funge da variabile in cui compaiono due parametri dove il primo indica la variabile del modello dell'auto (19@) che a sua volta è contrassegnata dalla variabile "0@". E' un po' difficile da spiegare e non riesco a dire altro! 056E: car 0@ defined Tale conditional indica che se l'auto è stata correttamente definita o semplicemente caricata, si procederà per la visualizzazione del codice che segue. 5@ = Actor.Create(CivMale, #NULL, 1@, 2@, 3@) E' molto simile all'opcode dell'auto precedentemente analizzato in cui compaiono ancora una volta rispettivamente la variabile dell'attore (5@), il valore che indica il comportamento assunto dai ped (che lo si può trovare assieme ad altri nel manuale del SB), il modello ID (#NULL = nulla) e le relative coordinate che si riferiscono ancora una volta alle relative variabili prima citate (1@, 2@, 3@). 036A: put_actor 5@ in_car 0@ E' indicato da 2 variabili di cui la prima indica quella dell'attore (5@) e la seconda quella dell'auto (0@). Quindi l'attore viene automaticamente teletrasportato nell'auto richiesta. 0337: set_actor 5@ visibility 0 Ora compaiono una variabile che ancora una volta si riferisce all'attore (è inutile spiegarlo nuovamente) ed un valore che indica la visibilità e funziona solamente, per quanto ho potuto constatare, per gli altri attori non per CJ le cui variabili sono "$PLAYER_CHAR" e "$PLAYER_ACTOR" che rispettivamente indicano quella attribuibile al player e all'actor. Ovviamente essa è uguale a 1 = ON e 0 = OFF. if and
not Actor.Dead(5@)
not Car.Wrecked(0@)
jf @CARMOVE_62
Rispettivamente significano che se l'attore "5@" muore e l'auto "0@" rimane fuori uso successivamente si passa al label "CARMOVE_62". 00FE: actor $PLAYER_ACTOR sphere 0 in_sphere 1@ 2@ 3@ radius 10.0 10.0 10.0 E' uno degli opcode più utilizzati in secondo piano caratterizzato dalla variabile dell'attore, dalle coordinate e dal radius half_height, half_width e half_depth, ovvero la larghezza, la lunghezza e l'altezza della zona in cui si vuol far fermare l'auto. Per vedere visibilmente la zona presa in considerazione cambiare il secondo valore (0) in 1. In genere per i normali spheres (i marker rossi) i valori radius sono uguali a 1.0 1.0 1.0. 05D1: AS_actor 5@ drive_car 0@ to 9@ 10@ 11@ speed 0.0 mode 2 model 19@ behaviour 3 Qui compaiono numerosi parametri e, a dir la verità, ho modificato un po' la descrizione siccome, come di default, non era presente. Il sesto parametro indica la velocità (credo sia un valore compreso tra 0.0 e 60.0), il seguente non so cosa indichi, il successivo indica il nome ID del modello contrassegnato dalla variabile che si riferiva all'opcode che svolgeva la funzione di variabile, perché era in riferimento al nome ID che a sua volta si riferiva al modello dell'auto; l'ultimo, invece, indica l'aggressività dell'attore durante i sorpassi, vale a dire la modalità. 01AF: car 0@ sphere 0 in_sphere 9@ 10@ 11@ radius 1.0 1.0 1.0 E' molto simile all'opcode precedentemente analizzato per l'attore che ha come unico parametro in antitesi la variabile dell'auto da sostituire con quella dell'attore. Actor.DestroyWithFade(5@) Car.RemoveReferences(0@) Ennesimo opcode indispensabile per il corretto funzionamento del gioco siccome è stato imposto dalla R* un limite di auto e pedoni caricati, quindi occorre eliminare il riferimento del gioco quando un'auto o un attore non ci servono più. Il primo opcode serve per eliminare l'attore con il fade (la dissolvenza) e di conseguenza elimina in automatico il riferimento del gioco perché il modello non è più disponibile. end_thread E' adibito solamente alla terminazione di un thread per non essere più caricato. jump @CARMOVE_11 E' diverso dal "jump_if_false" e consiste solamente nel collegarsi ad un altro label indipendentemente dalla\e condizione\i.

Chiedo scusa per la ripetitività delle parole perché il coding si basa anche, ma non oso dire soprattutto, sulla ripetitività.


Advertisements