passiamo ora alla parte piu’ difficile ma che una volta appresa rendera’ possibile creare qualsiasi cosa
Ogni volta che in un iterazione dle pannello Events (il simbolo col fulmine sopra alle tabelle di oggetti, personaggi, bottoni ecc.) viene aprta un afunzione o nel Global Script o nella Room specifica in caso di un elemento della Room stessa
questo perche’ tutto cio’ che e’ presente nel Global Script e’ presente in tutto il gioco mentre tutta la programmazione delle interazioni della stanza e’ limitata alla stanza stessa percio’ quando si scrive l’interazione di un personaggio (global script) non si puo’ influire su un elemento della stanza come un hotspot o un object (script della stanza in cui si trova)
La programmazione ha delle semplici regole di punteggiatura, ogni parentesi deve avere una chiusura e ogni frase deve finire con un punto e virgola ; per poter passare alla prossima riga
Ora elenchero’ gli script piu’ comuni, che useremo per creare la nostra avventure, sono faicli da memorizzare e facilmente reperibili nel caro DYNAMIC HELP
"script name personaggio".ChangeRoom(int room, int x, inty);
questo comando teletrasporta un personaggio (funziona su personaggi giocanti e non e in qualsiasi momento e luogo) nella stanza indicata tra parentesi e nelle coordinate x e y sempre indicate tra parentesi
"scriptnamepersonaggio".Say("");
Questo comando indica che il tale personaggio pronuncia la frase scritta tra le virgolette (in cas il perosnaggio non sia nella nostra stessa stanza, la frase appare al centro dello schermo)
"scriptname personaggio".AddInventory("scriptname oggetto");
"scriptname personaggio".LoseInventory("scriptnameroggetto");
Aggiunge/toglie un oggetto dall’inventario del personaggio scelto (protagonista o altro personaggio in caso di giochi come Maniac Mansion dove ci sono piu’ personaggi e piu’ inventari)
"scriptname musica".Play();
viene eseguita una musica o un suono
"scriptname dialogo".Start();
Parte il dialogo indicato
"script name gui".Visible = True;
"script name gui".Visible = false;
Rende visibile/invisibile una GUI
"script name object".Visible = True;
"script name object".Visible = false;
Rende Visibile/invisibile l’object di una mappa
"scriptname hotspot".Enable = true;
"scriptname hotspot".Enable = false;
Rende Visibile/invisibile un hotspot
Wait();
Pausa tra uno script e l’altro di un numero di fps a seconda del numero inserito tra parentesi
"scriptname personaggio".ChangeView();
Cambia la view di base di un personaggio (nel caso del protagonista e’ quella della camminata)
"scriptname personaggio".SpeechView = int ;
Cambia la talk view del personaggio
"script name perosnaggio".SetIdleView( int view, int delay);
Da a un personaggio una determinata dileview, ovvero una view che viene in caso di inattivita’ ripetuta ogni tot, la pausa e’ determinata dal numero inserito al posto di “int delay”
Un esempio puo’ essere Simon The Sorcere che se non viene mosso per un po’ inizia giochicchiare col cappello
object[0].Animate(2, 5);
Anima un oggetto della mappa contrassegnato dal suo numero, il primo numero tra parentesi indica la view mentre il secondo il loop
cMan.FollowCharacter(cEgo, 5, 80);
Il personaggio specifico seguira’ il personaggio tra parentesi (in questo caso il protagonista), 5 rappresenta la distanza in pixel trai due e 80 quanto aspetta il personaggio che segue a partire dopo che l’altro si e’ mosso
Un esempio dell’effetto di questo script e’ Max di Sam e Max o Bagaglio di DiscWorld
PlayVideo("intro.mpg", eVideoSkipEscKey, 1);
Indica il video da mostrare, come e se poter skippare il video (per vedere le varie opzioni usate il dynami help alla voce video)
ShakeScreen(5);
Scuote lo schermo creando un effetto terremoto per un tempo determinato dla numero tra parentesi
Ci sono molti altri script ma questi sono quelli basilari per avere un’avventura classica
Ora parlaimo di come creare una struttura per un enigma e delle condizioni
CONDIZIONI
le condizioni piu’ comuni sono due, usare un determinato oggetto e possdere un determinato oggetto
una condizione del tipo “possedere un oggetto” appare cosi’
if (player.HasInventory("script name dell'oggetto")){
}
else { }
dentro alla prima parentesi graffa andra quello che acacde se abbiamo l’oggetto specificato
mentre nella parentesi graffa dopo else (altrimenti) ci andra’ cosa succede se non lo abbiamo, dopo nel dettaglio vedremo un esempio
Mentre questa e’ una condizione del tipo “usare un oggetto”, funziona allo stesso modo ma e’ un po diversa nella prima riga
if (player.ActiveInventory == "scriptname dell'oggetto"){
}
else { }
Possiamo anche non mettere l’opzione else ma in quel caso se non rispettiamo l’esigenza della condizzione non succedera’ niente
Ora passiamo a qualche esmpio che potete provare a programmare come esercizio
ESEMPIO ZERBINO-CHIAVE-PORTA
Allora ci troviamo in una stanza con una porta chiusa e uno zerbino
il nostro protagonista vara’ lo script name cEGO come negli esempi di AGS
Creiamo un oggetto dell’inventario nell’apposita sezione e chiamiamolo come vogliamo, sara’ la nostra chiave, qui nel esempio lo chiameremo iKEY
Sia che lo zerbino sia un Hotspot (lo chiameremo hZERB) sia che sia un Object (lo chiameremo oZERB), andiamo nella sua pagina EVENTS (fulmine sopra la tabella dei suoi dati) e clicchiamo sull’interazione che vogliamo mettere per trovare la chiave nascosta sotto, direi o Look o Interact
Cliccato sul tasto […] vicino all’interazione apparira l’apposito spazio nel room script dove inseriremo
cEGO.AddInventory(iKEY);
ora guardando i spostando lo zerbino abbiamo agigunto la chiave all’inventario, il problema e’ che s elo rifacciamo otterremo un’altra chiave
ci sono tre modi per risolvere questo problema
se lo zerbino e’ un hotspot possiamo disabilitarlo
sempre subito dopo aver ottneuto l’oggetto nella setssa funzione
hZERB.Enabled = false;
Se e’ un oggetto possiamo creare un altro oggetto zerbino uguale e nell asetssa posizione ma che pero’ parte con Visibility “false” in questo modo quando avremo preso al chiave quello che da’ le chiavi scomparira’ e comparira’ quello invece che dara’ un messaggio del tipo “non c’e’ piu’ niente”
avremo una cosa simile quindi
cEGO.AddInventory(iKey);
oZERB.Visible = false;
oZERB2.Visible = true;
poi nella stessa funzione ma dello zerbino numero due metteremo
cEGO.Say("oltre alla chiave non c'era nient'altro");
Infine possiamo usare una condizione (sia che sia un hotspot che sia un object)
if (player.HasInventory(iKEY)) {
cEGO.Say("oltre alla chiave non c'era nient'altro");
}
else { cEGO.AddInventory(iKEY);
cEGO.Say("hey! c'e' una chiave sotto allo zerbino");}
in questo caso prima va messo cosa succede se l’abbiamo e quinid la frase d’ordinanza, e dopo l’else cosa succede se non l’abbiamo e quindi la raccolta della chiave.
Il problema di questo sistema e’ che una volta che abbiamo usato l’oggetto se c’e’ la possibilita’ di reinteragire lo possiamo riottenere
ora vediamo come si comporta la porta
creiamo due oggetti nella mappa uno e’ la porta apert oPOR2 e l’altro la porta chiusa oPOR
la porta chiusa parte visibile quella aperta no
Ora nella funzione della porta chiusa “Use inventory on object”
scriviamo
if (player.ActiveInventory == iKEY){
cEGO.Say("bene si e' aperta");
oPOR.Visible = false;
oPOR2.Visible = true;
}
else { cEGO.Say("non e' cosi' che si apre una porta);}
infine nell’object porta aperta, POR2 mettermo nella funzione “interact”
cEGO.ChangeRoom( 2, 100, 100);
e avremo creato il nostro sistema di porte (unilaterale)
fate in modo che il personaggio finisca in una walkablearea altrimenti rimarra’ bloccato, le coordinate fanno come sempre riferimento alla linea di terra dle personaggio
questo sistema puo’ essere riutilizztao per i personaggi e l’unione degli oggetti dell’inventario
Si ringrazia WarioPunk del forum di Arena80 per la guida.