Versione Stampabile della Discussione

Clicca qui per visualizzare questa discussione nel suo formato originale

OldGamesItalia _ Aiuti tecnici _ PRIMI PASSI

Inviato da: LargoLagrandeil 23 Feb 2014, 00:33

Qui potete postare tutte le domande generiche e più frequenti relative all'utilizzo di AGS. Riservato a chi muove i primi passi.

Qualche utente più esperto vi risponderà. in bocca al lupo!

Inviato da: Squall_Leonheartil 14 Nov 2014, 16:44

Ragazzi ho un problema, nonostante come da screen abbia selezionato le aree giuste per il movimento del personaggio, non clicca il "vai a" quando la sua posizione è più in alto del cursore :( come mai?



Inviato da: AprilSkiesil 14 Nov 2014, 17:12

Intendi dire che se clicchi al di fuori dell'area "camminabile" non ti cammina?
Oppure intendi dire che se il personaggio è più in alto del cursore?

Stai usando una interfaccia standard? Se sì che tipo? (sierra, 9verbs, verb-coin)?

Non è che dove clicchi ci sono hotspot?

Dammi qualche info in più.

Inviato da: Squall_Leonheartil 14 Nov 2014, 20:13

No non ci sono hotspot in quel punto. Praticamente se clicco sulla parte della parete (che come vedi non ho impostato come walkable areas) si muove verso l'alto, va anche verso Barman. Ma nel resto non si muovo. Sono partito dal Default, l'unica modifica è stata quella di predisporre la visualizzazione della GUI solo quando il mouse scorre nella parte alta.
Anche la Baseline e le edge sembrano apposto. Ti posto vari screen :



Le Regions non sono proprie settate.

Inviato da: AprilSkiesil 15 Nov 2014, 10:35

E' un comportamento abbastanza strano, per come lo descrivi.

Visto che sei all'inizio del gioco, immagino hai fatto abbastanza poco, per cui se vuoi, potresti uppare i file "sorgente" (non il gioco compilato) su qualche sharing (tipo dropboz o altro) così gli do un'occhiata.

perché detto così non so proprio a cosa pensare. Non ho mai riscontrato cose strane di questo tipo.

Inviato da: Squall_Leonheartil 17 Nov 2014, 15:58

Dimmi i file che ti servono e te li mando in mp

Comunque per essere più specifico, non clicca tutta la zona in basso in cui normalmente è presente la Gui. Ora nonostante l'abbia impostata in al alto quando il mouse passa lì. Non è che qualche opzione è rimasta in basso e quindi non posso proprio cliccarci?

Inviato da: AprilSkiesil 17 Nov 2014, 19:00

A-Ah!

Allora c'era qualcosa in basso!!!

La GUI per esempio!
Quella è una spiegazione!!!

Prima di passarmi i file, fammi uno screenshot dei menù di impostazione delle GUI e scopriamo subito se c'è qualche cose che rimane in basso!

Se non risolviamo ti mando un MP con i fileche mi servono.

Inviato da: Squall_Leonheartil 17 Nov 2014, 20:56

Perdonami ho appena risolto nel gDialogsGui avevo rimasto il valore top a 142 quindi leggeva quello in basso!
Ora ho un altro problema, se voglio rendere la gui visibile attraverso un pulsante, ad esempio la classica Gui di Monkey Island attivata con la barra spaziatrice. Inoltre volevo sapere come accelerare l'animazione della camminata oltre il valore Delay che sta nelle Views, visto che utilizzo un 50 frame blush.gif
Grazie mille per l'aiuto blush.gif!

Inviato da: AprilSkiesil 18 Nov 2014, 18:07

Per attivare una GUI con la barra spaziatrice, nulla di più facile.
Vai nel global script e sotto la funzione
on_key_press (che dovresti già avere bell'è pronta se usi il gioco default) scrivi:

if (keycode == eKeySpace)
{
// qui metti il tuo script che fa comparire la gui se è invisibile e, sempre premendo spazio la fa scomparire se visibile
// supponiamo la gui si chiami gPROVA
if (gPROVA.Visible == true) gPROVA.Visible = false;
else gPROVA.Visible = true;
}

Per la camminata, attenzione: il valore "delay" che sta nelle view non influisce sulla camminata. quello serve solo per vedere l'animazione così ti rendi conto.
Il valore del delay usato "in game" si imposta nel menù del personaggio (menù a destra) Lì devi impostare due valori:
Animation Delay e Movement Speed.
Variali finchè non becchi i valori che ti aggradano l'occhio ;-)

Inviato da: Squall_Leonheartil 18 Nov 2014, 22:31

Aggiustato tutto, ma una curiosità :
Se voglio utilizzare mappe più grandi del 320 x 200 come posso fare? :(
Rimanendo la stessa risoluzione però

Inviato da: AprilSkiesil 19 Nov 2014, 09:48

CITAZIONE (Squall_Leonheart @ 18 Nov 2014, 22:31) *
Aggiustato tutto, ma una curiosità :
Se voglio utilizzare mappe più grandi del 320 x 200 come posso fare? :(
Rimanendo la stessa risoluzione però


Molto semplice:

Disegna lo sfondo grande a piacimento (ad esempio 1000 x 1000).
Importa lo sfondo nella room.
E fai tutto normalmente (occhio ad una sola cosa: le coordinate degli oggetti sono riferiti alla mappa 1000x1000 - le coordinate del mouse, qualora usi funzioni tipo GetAtScreenX o Y sono riferite allo "schermo" 320x200).
Noterai, testando che il gioco "scrolla" automaticamente seguendo il personaggio biggrin2a.gif

Ovviamente lo scrolling di default è abbastanza rigido e segue il personaggio in maniera fissa.

Se vuoi effetti più "cinematografici" nello scrolling puoi usare il "parallax module" scaricabile sul sito di AGS tra i moduli e plug-ins oppure puoi scriptare un tuo "modulo" di scrolling (ad esempio come quello che ho creato io nel mio gioco in produzione "TALES").
Ma per questo magari aspetta di essere un po' pratico.
Per il momento vapiù che bene lo scrolling di default.

Inviato da: AprilSkiesil 19 Nov 2014, 09:49

Edit: avevo erroneamente inviato due risposte identiche.

Inviato da: Squall_Leonheartil 19 Nov 2014, 21:50

Ok, ti ringrazio di tutto.
Lo so che rompo, ma ora ho un nuovo problema XD
Praticamente piazzato l'oggetto, mi si vede così poi in gioco:




Inviato da: AprilSkiesil 20 Nov 2014, 08:59

Si vede così perché hai impostato un "walkbehind" sul tavolo che ha un "baseline" maggiore del punto base dell'oggetto, per cui dovresti, nel menù a destra relativo all'oggetto impostare "BaselineOveridden" su true a poi inserire un baseline maggiore del baseline della tua walk-behind area.

Inviato da: Squall_Leonheartil 20 Nov 2014, 11:00

Ho provato a mettere true e baseline 2, dove non ho disegnato le aree ma continua a sovrapporsi il tavolo.

Inviato da: AprilSkiesil 20 Nov 2014, 11:42

Metti baseline 300 e vedrai che non si sovrappone più. Prova biggrin2a.gif
probabilmente ci sono disegnate delle walkbehind areas o, in alternativa, il tavolo in questione è un oggetto, e come ogni oggetto ha una baseline, che in tal caso è maggiore della coppa blu ^^

Inviato da: Squall_Leonheartil 20 Nov 2014, 18:36

Ho optato per la baseline 300 xD Scusami ma c'è un modo per spostare la scritta vai etc sopra il cursore?

Inviato da: AprilSkiesil 21 Nov 2014, 11:08

Beh, per quello che vuoi fare tu, non c'è una funzione "build-in". Andrebbe "scriptata".
Io ho creato uno script di questo tipo nel mio gioco in produzione "Tales" in ui le descrizioni degli oggetti seguono il cursore.

Ora visto che stai iniziando adesso te ne fornisco uno, spero tu riesca a farlo funzionare. Magari ne approfitti per cercare di capire come funziona e quindi per cercare di capire come usare AGS.

Allora prima cosa: individua (o crea) la GUI che contiene il testo che varia a seconda di quello che fai (quindi il tuo famoso testo "vai verso".. usa questo" ecc.)
Se mi chiedi come posizionarla sul mouse, evidentemente l'hai già bella e pronta e nel gioco default.
Ora, non so come tu l'hai chiamata, ma supponiamo si chiami: gSQUALL_OVER_HOTSPOT

Bene, Operazioni preliminari:
1) Tale gui, che conterrà una "label" il cui testo varia a seconda di cosa c'è sotto il mouse, andrebbe ridimensionata, di dimensioni tali da non essere troppo grande, soprattutto in altezza. Io per sempio credoche l'ho fatta grande tipo 150 x 50. Cmq fai un po' di prove.
2) Imposto lo sfondo e il bordo della gui "TRASPARENTE" (colore 0).
3) POSIZIONA la label TUTTA A SINISTRA rispetto alla gui. Inoltre imposta il testo della label TUTTO A SINISTRA (TopLeft, nel menù di impostazone del centraggio scritta)
4) Fai la label bella larga, anche come la GUI, in modo che il testo, anche se lungo, non vada a capo.

Fatto?

OK. Ora creiamo gli script:

Nel menù a destra, cerca "Scripts". Clicca col destro su "Scripts" e crea un nuovo script.
Chiamalo and esempio MOUSE_FOLLOWER
si creeranno due files:
MOUSE_FOLLOWER.asc e MOUSE_FOLLOWER.ash

Apri MOUSE_FOLLOWER.asc

Lo troverai vuoto (a parte un commento in alto)
NOTA: i commenti sono cose che sono precedute da "//" e non vengono lette dal "compilatore" quindi puoi scriverci ciò che vuoi.
NOTA2: i tuoi codici cerca di commentarli MOLTO, così quando poi li riapri sai cosa fa una parte di codice.

Bene, ora dentro il file MOUSE_FOLLOWER.asc, sotto il commento di intestazione incolla, esattamente, quanto segue:
(copia integralmente)

// COPIA DA QUI ==================================================================
function repeatedly_execute()
{
// di seguito metteremo un operatore logico IF-THEN-ELSE per capire se il mouse si trova o no sopra un oggetto/hotspot/personaggio/item di inventario

if (Hotspot.GetAtScreenXY(mouse.x, mouse.y) == hotspot[0] && Object.GetAtScreenXY(mouse.x, mouse.y) == null && Character.GetAtScreenXY(mouse.x, mouse.y) == null && InventoryItem.GetAtScreenXY(mouse.x, mouse.y) == null)
{
// in questa parte del codice puoi mettere qualcosa che avviene se il mouse NON è sopra nessun oggetto, personaggio oppure hotspot.
// ad esempio puoi fare sì che la GUI scompaia
gSQUALL_OVER_HOTSPOT.Visible = false;
}
else
{
//in questa parte del codice scrivi ciò che avviene se il mouse E' sopra nessun oggetto, personaggio oppure hotspot
// innanzitutto la GUI è visibile
gSQUALL_OVER_HOTSPOT.Visible = true;
//===============
// ricava la larghezza del testo contenuto nella label della GUI
// non so come l'hai chiamata, ma supponiamo tu l'abba chiamata "LABEL_SQUALL_OVER_HOTSPOT"
String TESTO_TEMP; // dichiaro una variabile di tipo stringa
TESTO_TEMP = LABEL_SQUALL_OVER_HOTSPOT.Text; // assegno alla stringa il contenuto della label della gui che vogliamo far seguire il mouse
int TESTO_Width = GetTextWidth(TESTO_TEMP, eFontNormal); //dichiaro una variabile integer e contestualmente ricavo la larghezza del testo. Qui suppongo che abbia usato il font "Normal". se hai usato un altro font, metti il font che hai usato.
int label_position = TESTO_Width / 2; //dichiaro una variabile integer e contestualmente gli assegno il valore pari a metà della larghezza testo
// la "label_position" in pratica mi identifica il punto centrale del testo. Mi servirà per posizionarlo sopra il mouse.
//===============
// Ora devo stare attento che, se il mouse va vicino ai bordi, la scritta non esca fuori dallo schermo.
int label_offset; //dichiaro una variabile di offset
if (mouse.x - label_position < 0) label_offset = 5; //bordo sinistro 5 pixel
else if (mouse.x + label_position > 315) label_offset = 315 - TESTO_Width; //qui suppongo tu abbia la risoluzione larga 320 pixel
else label_offset = mouse.x - label_position;
//===============
//ora posso posizionare la gui, che ricordiamo si chiama gSQUALL_OVER_HOTSPOT
// nel farlo, attenzione, devo far sì che se sposto il mouse troppo in alto, la scritta vada sotto. negli altri casi sta sopra:
//a tal fine individuo una fascia di 50 pixel in alto
if (mouse.y > 50)
{
// sritta sopra, perché il mouse va in basso. ricorda che la Y cresce se vai verso il,basso.
gSQUALL_OVER_HOTSPOT.SetPosition(label_offset, mouse.y - 20); //gli do 20 pixel in alto. poi vedi tu. varia il "20" e vedi come si vede.
}
else
{
//scritta sotto perché il mouse si trova nella parte alta, nella fascia di 50 pixel in alto
gSQUALL_OVER_HOTSPOT.SetPosition(label_offset, mouse.y + 30); //gli do 30 pixel in basso. poi vedi tu. varia il "30" e vedi come si vede.
}
}
}
// COPIA FINO QUI ==========================================

Dovrebbe funzionare, se non ho commesso refusi e se imposti BENE i nomi delle GUI e delle LABEL.
SE CAMBI I LORO NOMI RISPETTO A QUELLO CHE HO SCRITTO IO, MODIFICA IL MIO SCRIPT DI CONSEGUENZA, ALTRIMENTI DARA' ERRORE.



Inviato da: Squall_Leonheartil 21 Nov 2014, 15:29

Mi da un errore qui, ma credo sia io in errore. Ti posto degli screen.
TESTO_TEMP = LABEL_SQUALL_OVER_HOTSPOT.Text;


Mi sembra di aver messo tutti i valori bene, top left etc. Ma credo di sbagliare nome quando richiamo la label, che sta scritto ID 0 ActionLine

Inviato da: AprilSkiesil 21 Nov 2014, 17:14

Attenzione, i nomi che ho usato io sono nomi che ho inventato al momento,
Quindi io ho usato, per esempio LABEL_SQUALL_OVER_HOTSPOT ... ma se nel tuo caso la label si chiama ActionLine,
come ti ho scritto, devi rimpiazzare sul mio script LABEL_SQUALL_OVER_HOTSPOT con ActionLine

Stessa cosa per la GUI dentro cui la label si trova, che io chiamato PER ESEMPIO gSQUALL_OVER_HOTSPOT
se a te si chiama diverso devi mettere il nome della GUI reale.

Capito?

Inviato da: Squall_Leonheartil 21 Nov 2014, 19:14

Il font era FontFont0, ho risolto anche i nomi. Però la scritta non si visualizza :(

Inviato da: AprilSkiesil 21 Nov 2014, 19:26

Scusa ma nella "label" che utilizzi, cosa hai scritto??

c'è scritto @OVERHOTSPOT@ ?

che label stai utilizzando? è quella del gioco di default che serve per visualizzare il nome delle cose su cui sei sopra con il mouse?
perché dovresti usare quella.

Se l'hai eliminata e se quella che stai usando è vuota, scrivici dentro: @OVERHOTSPOT@

altra cosa che pure devi controllare: ai assegnato dei nomi agli oggetti? perché quella cosa visualizza i "nomi" degli oggetti.

Inviato da: Squall_Leonheartil 21 Nov 2014, 19:39

Tenevo scritto Text, ti mostro uno screen:



Poi ecco il codice dentro MOUSE_FOLLOWER.asc che ho messo nel gioco

function repeatedly_execute()
{
// di seguito metteremo un operatore logico IF-THEN-ELSE per capire se il mouse si trova o no sopra un oggetto/hotspot/personaggio/item di inventario

if (Hotspot.GetAtScreenXY(mouse.x, mouse.y) == hotspot[0] && Object.GetAtScreenXY(mouse.x, mouse.y) == null && Character.GetAtScreenXY(mouse.x, mouse.y) == null && InventoryItem.GetAtScreenXY(mouse.x, mouse.y) == null)
{
// in questa parte del codice puoi mettere qualcosa che avviene se il mouse NON è sopra nessun oggetto, personaggio oppure hotspot.
// ad esempio puoi fare sì che la GUI scompaia
gAction.Visible = false;
}
else
{
//in questa parte del codice scrivi ciò che avviene se il mouse E' sopra nessun oggetto, personaggio oppure hotspot
// innanzitutto la GUI è visibile
gAction.Visible = true;
//===============
// ricava la larghezza del testo contenuto nella label della GUI
// non so come l'hai chiamata, ma supponiamo tu l'abba chiamata "LABEL_SQUALL_OVER_HOTSPOT"
String TESTO_TEMP; // dichiaro una variabile di tipo stringa
TESTO_TEMP = ActionLine.Text; // assegno alla stringa il contenuto della label della gui che vogliamo far seguire il mouse
int TESTO_Width = GetTextWidth(TESTO_TEMP, eFontFont0); //dichiaro una variabile integer e contestualmente ricavo la larghezza del testo. Qui suppongo che abbia usato il font "Normal". se hai usato un altro font, metti il font che hai usato.
int label_position = TESTO_Width / 2; //dichiaro una variabile integer e contestualmente gli assegno il valore pari a metà della larghezza testo
// la "label_position" in pratica mi identifica il punto centrale del testo. Mi servirà per posizionarlo sopra il mouse.
//===============
// Ora devo stare attento che, se il mouse va vicino ai bordi, la scritta non esca fuori dallo schermo.
int label_offset; //dichiaro una variabile di offset
if (mouse.x - label_position < 0) label_offset = 5; //bordo sinistro 5 pixel
else if (mouse.x + label_position > 315) label_offset = 315 - TESTO_Width; //qui suppongo tu abbia la risoluzione larga 320 pixel
else label_offset = mouse.x - label_position;
//===============
//ora posso posizionare la gui, che ricordiamo si chiama gSQUALL_OVER_HOTSPOT
// nel farlo, attenzione, devo far sì che se sposto il mouse troppo in alto, la scritta vada sotto. negli altri casi sta sopra:
//a tal fine individuo una fascia di 50 pixel in alto
if (mouse.y > 50)
{
// sritta sopra, perché il mouse va in basso. ricorda che la Y cresce se vai verso il,basso.
gAction.SetPosition(label_offset, mouse.y - 20); //gli do 20 pixel in alto. poi vedi tu. varia il "20" e vedi come si vede.
}
else
{
//scritta sotto perché il mouse si trova nella parte alta, nella fascia di 50 pixel in alto
gAction.SetPosition(label_offset, mouse.y + 30); //gli do 30 pixel in basso. poi vedi tu. varia il "30" e vedi come si vede.
}
}
}

Gli oggetti nel gioco li ho semplicemente tradotti : bluecup coppablu etc.. Non saprei :/

Inviato da: AprilSkiesil 21 Nov 2014, 19:59

Che proprietà hai messo alla GUI gAction?
gli hai messo la proprietà "normal, initially on"?


Mi è venuta in mente una cosa:
POVA A FARE COSI':

1) Assicurati che la GUI gAction sia Normal, initially on

2) Cancella @OVERHOTSOP@, lascia la label VUOTA e IMPOSTA IL ETSTO ALLINEATO A SINISTRA (TOP-LEFT non TOP CENTER)

3) MODIFICA LO SCRIPT COSI':

function repeatedly_execute()
{
// di seguito metteremo un operatore logico IF-THEN-ELSE per capire se il mouse si trova o no sopra un oggetto/hotspot/personaggio/item di inventario

if (Hotspot.GetAtScreenXY(mouse.x, mouse.y) == hotspot[0] && Object.GetAtScreenXY(mouse.x, mouse.y) == null && Character.GetAtScreenXY(mouse.x, mouse.y) == null && InventoryItem.GetAtScreenXY(mouse.x, mouse.y) == null)
{
// in questa parte del codice puoi mettere qualcosa che avviene se il mouse NON è sopra nessun oggetto, personaggio oppure hotspot.
// ad esempio la label è vuota
ActionLine.Text = "";
}
else
{
//in questa parte del codice scrivi ciò che avviene se il mouse E' sopra nessun oggetto, personaggio oppure hotspot
//===============
// ricava la larghezza del testo contenuto nella label della GUI
// non so come l'hai chiamata, ma supponiamo tu l'abba chiamata "LABEL_SQUALL_OVER_HOTSPOT"
String TESTO_TEMP = Game.GetLocationName(mouse.x, mouse.y); // dichiaro una variabile di tipo stringa e gli assegno il nome dell'oggetto su cui è
ActionLine.Text = TESTO_TEMP; // assegno alla label il contenuto di text temp
int TESTO_Width = GetTextWidth(TESTO_TEMP, eFontFont0); //dichiaro una variabile integer e contestualmente ricavo la larghezza del testo. Qui suppongo che abbia usato il font "Normal". se hai usato un altro font, metti il font che hai usato.
int label_position = TESTO_Width / 2; //dichiaro una variabile integer e contestualmente gli assegno il valore pari a metà della larghezza testo
// la "label_position" in pratica mi identifica il punto centrale del testo. Mi servirà per posizionarlo sopra il mouse.
//===============
// Ora devo stare attento che, se il mouse va vicino ai bordi, la scritta non esca fuori dallo schermo.
int label_offset; //dichiaro una variabile di offset
if (mouse.x - label_position < 0) label_offset = 5; //bordo sinistro 5 pixel
else if (mouse.x + label_position > 315) label_offset = 315 - TESTO_Width; //qui suppongo tu abbia la risoluzione larga 320 pixel
else label_offset = mouse.x - label_position;
//===============
//ora posso posizionare la gui, che ricordiamo si chiama gAction
// nel farlo, attenzione, devo far sì che se sposto il mouse troppo in alto, la scritta vada sotto. negli altri casi sta sopra:
//a tal fine individuo una fascia di 50 pixel in alto
if (mouse.y > 50)
{
// sritta sopra, perché il mouse va in basso. ricorda che la Y cresce se vai verso il,basso.
gAction.SetPosition(label_offset, mouse.y - 20); //gli do 20 pixel in alto. poi vedi tu. varia il "20" e vedi come si vede.
}
else
{
//scritta sotto perché il mouse si trova nella parte alta, nella fascia di 50 pixel in alto
gAction.SetPosition(label_offset, mouse.y + 30); //gli do 30 pixel in basso. poi vedi tu. varia il "30" e vedi come si vede.
}
}
}

VEDI SE VA

Inviato da: Squall_Leonheartil 21 Nov 2014, 20:42

Ora si muove col cursore, però non mi legge gli oggetti nella mappa :(
E comunque non è precisa sopra il cursore

Inviato da: AprilSkiesil 21 Nov 2014, 20:53

in che senso non ti legge?
spiegati meglio.
Cosa appare scritto?

Inviato da: Squall_Leonheartil 21 Nov 2014, 21:05



Questo sulla coppa blu e sull'armadio invece proprio niente, mentre prima dello script usciva tranquillamente

Inviato da: AprilSkiesil 21 Nov 2014, 21:18

fai questa prova:
Crea un'altra gui e un'altra label, con altri nomi e usa quelle nello script.
Vedi cosa succede.

Inviato da: Squall_Leonheartil 21 Nov 2014, 21:28

Ma ora che ci penso, non faccio prima a mettere nella stessa immagine con quella del cursore?

Inviato da: AprilSkiesil 21 Nov 2014, 21:36

No.
Cmq ora ho visto l'immagine, prima non la vedevo.
Stai usando i 9-verbs!!!!!!

Ora ho capito perché non ti va.

Cmq, ora devo uscire, proseguiamo domani.

Nel frattempo fai la prova che ti ho detto (crea altra GUI e altra label e metti quelle nello script), così capisci cosa fa lo script.
(e così inizi ad imparare il linguaggio)

Poi domani lo modifichiamo in modo che vada bene anche il 9-Verbs ;-)

a domani

Inviato da: Squall_Leonheartil 21 Nov 2014, 21:38

Va bene, aspetto una tua risposta, intanto testo e nel caso edito blush.gif

Inviato da: AprilSkiesil 22 Nov 2014, 10:59

Ho appena provato lo script che ti avevo dato la prima volta....

in realtà.. FUNZIONAVA PERFETTAMENTE!

A te non funzionava per un semplice motivo..... che è lo stesso per cui all'inizio non ti cliccava l'area camminabile: ovverosia la GUI.

La gui che ti portavi a spasso con il mouse era troppo grande e andava a finire sopra al puntatore.

ORA segui attentamente queste piccole istruzioni:

CANCELLA LO SCRIPT CHE HAI ADESSO E INCOLLA QUESTO SCRIPT (che poi era quello originario), senza cambiare nulla:

//COPIA DA QUI ==============
function repeatedly_execute()
{
if (Hotspot.GetAtScreenXY(mouse.x, mouse.y) == hotspot[0] && Object.GetAtScreenXY(mouse.x, mouse.y) == null && Character.GetAtScreenXY(mouse.x, mouse.y) == null && InventoryItem.GetAtScreenXY(mouse.x, mouse.y) == null)
{
gAction.Visible = false;
}
else
{
gAction.Visible = true;
String TESTO_TEMP; // dichiaro una variabile di tipo stringa
TESTO_TEMP = ActionLine.Text; // assegno alla stringa il contenuto della label della gui che vogliamo far seguire il mouse
int TESTO_Width = GetTextWidth(TESTO_TEMP, eFontFont0); //dichiaro una variabile integer e contestualmente ricavo la larghezza del testo. Qui suppongo che abbia usato il font "Normal". se hai usato un altro font, metti il font che hai usato.
int label_position = TESTO_Width / 2; //dichiaro una variabile integer e contestualmente gli assegno il valore pari a metà della larghezza testo
int label_offset; //dichiaro una variabile di offset
if (mouse.x - label_position < 0) label_offset = 5; //bordo sinistro 5 pixel
else if (mouse.x + label_position > 315) label_offset = 315 - TESTO_Width; //qui suppongo tu abbia la risoluzione larga 320 pixel
else label_offset = mouse.x - label_position;
if (mouse.y > 50)
{
gAction.SetPosition(label_offset, mouse.y - 20); //gli do 20 pixel in alto. poi vedi tu. varia il "20" e vedi come si vede.
}
else
{
gAction.SetPosition(label_offset, mouse.y + 10); //gli do 30 pixel in basso. poi vedi tu. varia il "30" e vedi come si vede.
}
}
}
//COPIA FINO QUI ==============

POI IMPORTANTE:

VAI NELLA GUI gAction
e cambia questi parametri:
gAction ----> MENU a destra HEIGHT di default il valore è 57, tu portalo a 10 <---- molto importante
label ActionLine ----> MENU a destra TextAlignement di default è "topMiddle" , tu portalo a TOP-LEFT <---- molto importante

Inviato da: Squall_Leonheartil 22 Nov 2014, 13:01

Il risultato purtroppo è questo, avevo dimenticato di dirti che all'inizio la GUI non è visibile, la tolgo e metto attraverso il tasto F


Inviato da: AprilSkiesil 22 Nov 2014, 13:13

Metti l label all'interno della GUI in alto, il più alto possible.
E poi ricorda: metti l'allineamento a SINISTRA

Ti fa così perché hai lasciato il testo centrato.

Inviato da: Squall_Leonheartil 22 Nov 2014, 16:06

Bene adesso va con tranquillità blush.gif Grazie mille, se avrò ancora problemi riposterò!

Inviato da: Squall_Leonheartil 24 Nov 2014, 15:57

Eccomi di nuovo, non mi è chiara una cosa.
Cercavo di creare un animazione della porta che si apre, ora ho capito il comando per riprodurre un suono e quello per muovere il personaggio nella stanza e per fargliela cambiare. Però non riesco a far muovere un oggetto. Per creare questa piccola animazione, avevo pensato funzionasse questo comando "MoveObject (1, 15, 100, 0) ;" Ma mi sbagliavo. Quindi mi chiedevo innanzitutto se la mia scelta, ossia quella di muovere la porta e poi cambiarle grafica fosse giusta, e nel caso anche quale comando si usa per intendere il movimento di un oggetto. Consigli?

Inviato da: AprilSkiesil 24 Nov 2014, 18:58

Allora bisogna distinguere due casi:

- Animazione propriamente detta, ovverosia una sequenza di immagini (una sequenza di sprites) che si susseguono ad una certa velocità (esattamente come l'animazione del personaggio che cammina)

- Movimento di un oggetto su schermo, ovverosia il traslare quest'ultimo da una posizione ad un'altra, ad una certa velocità.

NOTA: le due cose si possono anche "combinare" ovvero un oggetto mentre si muove può anche essere animato.

Nel primo caso, Animazione propriamente detta, è necessario creare una "view" a all'interno della view uno o più "loop" di animazioni.
Quindi si "assegna" preliminarmente una "vista all'oggetto, tramite script: Esempio oCup.SetView(..., ..., ..) VEDI MANUALE PER MAGGIORI DETTAGLI
Poi si può eseguire l'animazione. Il comando è oCup.Animate(..........) VEDI MANUALE PER MAGGIORI DETTAGLI

Nel secondo caso, il comando è oCup.Move(X, Y, velocità ecc. ecc.....) VEDI MANUALE PER MAGGIORI DETTAGLI

Inviato da: Squall_Leonheartil 25 Nov 2014, 12:19

Grazie blush.gif
Ora purtroppo ho un altro problema, avevo creato un interruttore della luce, poi avevo pensato di renderlo interaggibile e quindi di cambiare frame del background per luce accesa o spenta.. Però mi succede che il gioco si blocca. Se metto Background 0 invece non fa nulla. Vi posto lo script :

function hLuce_AnyClick()
{
if(UsedAction(eGA_LookAt)) {
player.Say("L'interrutore della luce.");
}
else if(UsedAction(eGA_Use)) {
SetBackgroundFrame(2);
}
else Unhandled();
}



Inviato da: AprilSkiesil 25 Nov 2014, 16:48

Prova:

function hLuce_AnyClick()
{
if(UsedAction(eGA_LookAt)) {
player.Say("L'interrutore della luce.");
}
else if(UsedAction(eGA_Use))
{
if (GetBackgroundFrame()==0) SetBackgroundFrame(1);
else SetBackgroundFrame(0);
}
else Unhandled();
}

Inviato da: Squall_Leonheartil 25 Nov 2014, 19:52

Ma come si disattiva l'animazione della stanza? Perché ora è animata.

Inviato da: AprilSkiesil 25 Nov 2014, 21:31

devi bloccarla all'inizio, in RoomLoad scrivendo SetBackgroundFrame(0)

Inviato da: Squall_Leonheartil 25 Nov 2014, 23:33

Riuscito blush.gif!

Inviato da: Squall_Leonheartil 26 Nov 2014, 16:25

Aspetta dimenticavo di dirti che accendevo e spegnevo delle REgions..
if (GetBackgroundFrame()==0) SetBackgroundFrame(1);
else SetBackgroundFrame(0);
region[1].Enabled = true;
region[2].Enabled = true;
region[0].Enabled = false;
}
else Unhandled();
}
Così quando la uso si muovono quelle regions però quando ho bisogno di invertirle di nuovo mi da un errore se le affianco a Get..

Inviato da: AprilSkiesil 26 Nov 2014, 17:45

Occhio che così non le accendi spegni correttamente biggrin2a.gif

dovresti fare una cosa del genere:

.....
if (GetBackgroundFrame()==0)
{
SetBackgroundFrame(1);
region[1].Enabled = true;
region[2].Enabled = true;
region[0].Enabled = false;
}
else
{
SetBackgroundFrame(0);
region[1].Enabled = false;
region[2].Enabled = false;
region[0].Enabled = true;
}
}
else Unhandled();
}

Inviato da: Squall_Leonheartil 26 Nov 2014, 18:18

Una curiosità, associando una Region e quindi uno schiarimento del pg in base all'apertura o meno della porta, scrivendo il codice in questo modo sarebbe corretto?

if (GetBackgroundFrame()==0)
{
SetBackgroundFrame(1);
region[1].Enabled = true;
region[2].Enabled = true;
region[0].Enabled = false;
if (hPorta.Enabled ()==true) {
region[3].Enabled = true;
}
else
{
region[3].Enabled = false;
}
}
else
{
SetBackgroundFrame(0);
region[1].Enabled = false;
region[2].Enabled = false;
region[3].Enabled = false;
region[0].Enabled = true;
}
}
else Unhandled();
}

Inviato da: AprilSkiesil 27 Nov 2014, 18:17

Ciao SQ
Scusa il ritardo.

Detto così faccio un po' fatica a seguirti.
Spiegami meglio cosa vuoi fare. L'ideale sarebbe che tu editassi il post precedente aggiungendo dei commenti per spiegare, in ogni riga, cosa vorresti fare. Così riesco a dirti se il codice fa o meno quello che hai in mente. E, in caso contrario, ti dico come fare.
I commenti sono importanti. Cerca di prendere "il vizio" di metterli.

P.S. C'è cmq un errore di sintassi togli () da hPorta.Enabled
Si scrive hPorta.Enabled e basta.

Inviato da: Squall_Leonheartil 27 Nov 2014, 19:45

Ti spiego subito , ho due problemi. Il primo è che avendo la porta all'ingresso che si apre, se a luce spenta nella stanza la apro, dovrebbe attivarsi la region che gestisce la luce proveniente da fuori.
Due, Gestisco la stessa stanza in due room. Una per una metà e una per l'altra. Quindi volevo attribuire il cambio sfondo in due stanze per quel solo interruttore. Ora riflettendoci credo che bisognerebbe attribuirlo ad una variabile e scriptare questo:
// dichiaro variabile
int LUCE

LUCE == 0

Se comando usa su interrutore della luce
se sfondo zero passa ad uno e fissa LUCE a 1
Altrimenti
sfondo zero e luce a 0

E poi nell'altra stanza mettere la condizione :
Se luce è 0 sfondo zero, se luce e 1 sfondo 1.

Sono stato comprensibile?

Inviato da: AprilSkiesil 27 Nov 2014, 20:26

Quella della variabile è un'ottima idea, però attento ad una cosa:
Se dichiari una variabile in una stanza essa non viene letta nell'altra stanza.
Nel vecchio AGS (versione 2.7 e precedenti) bisognava "esportare" le variabili il che era fastidioso.
Ora, dalla versione 3 in poi, per fortuna esiste una cosa utilissima che si chiama "GLOBAL VARIABLE" ... ecco scoperto a cosa serve, nel menù a destra la voce "global variables". vai lì e crea lì dentro una variabile globale che si chiama "luce" biggrin2a.gif

A quel punto sì, la tua idea può funzionare!

IMPORTANTE:
ogni volta che entri in una stanza, in RoomLoad
metti uno script che se luce == 1 imposta le regions e gli sfondi in modo giusto ;-)

Inviato da: Squall_Leonheartil 27 Nov 2014, 20:58

Ho fatto così ma mi da un errore di sintassi :/

function hLuce_AnyClick()
{
if(UsedAction(eGA_LookAt)) {
player.Say("L'interrutore della luce.");
}
else if(UsedAction(eGA_Use))
{
MovePlayer(20, 167);
if (GetBackgroundFrame()==0)
{
SetBackgroundFrame(1);
Luce = 1;
region[1].Enabled = true;
region[2].Enabled = true;
region[0].Enabled = false;
if hPorta.Enabled = true
region[3].Enabled = true;
}
else
region[3].Enabled = false;
}
else
{
SetBackgroundFrame(0);
Luce = 0;
region[1].Enabled = false;
region[2].Enabled = false;
region[0].Enabled = true;
}
}
else Unhandled();
}

Inviato da: AprilSkiesil 27 Nov 2014, 22:07

Quando ti da errore di sintassi, però devi annotarti in quale riga te lo da e magari evidenziarmela...
cmq ce n'è uno abbastanza lampante:
RICORDA: gli operatori logici come IF, WHILE ecc. Vogliono l'argomento tra parentesi,
inoltre quando attribuisci un valore ad un variabile si usa "=" quando vuoi verificare un'ugualianza, invece, devi scrivere "=="

tu ad esempio hai scritto:
if hPorta.Enabled = true
invece dovrebbe essere if (hPorta.Enabled == true)

inoltre move player non esiste, al più è player.Move... e cmq è meglio usare la funzione "walk" così se hai il walkcycle lo usa automaticamente.

CITAZIONE (Squall_Leonheart @ 27 Nov 2014, 20:58) *
Ho fatto così ma mi da un errore di sintassi :/

function hLuce_AnyClick()
{
if(UsedAction(eGA_LookAt)) {
player.Say("L'interrutore della luce.");
}
else if(UsedAction(eGA_Use))
{
Player.Walk(20, 167,eBlock,eWalkableArea);
if (GetBackgroundFrame()==0)
{
SetBackgroundFrame(1);
Luce = 1;
region[1].Enabled = true;
region[2].Enabled = true;
region[0].Enabled = false;
if (hPorta.Enabled == true) region[3].Enabled = true;
}
else region[3].Enabled = false;
// DA QUI IN POI HAI FATTO UN PASTICCIO CON LE PARENTESI GRAFFE c'è un else che chiude le if delle azioni e poi else unhandled.....
}
else
{
SetBackgroundFrame(0);
Luce = 0;
region[1].Enabled = false;
region[2].Enabled = false;
region[0].Enabled = true;
}
}
else Unhandled();
}


TI PREGO, METTI I COMMENTI PRIMA DI OGNI BLOCCO E SPIEGAMI COSA VUOI FARE
Così controllo se il codice lo fa o meno.


Inviato da: Squall_Leonheartil 27 Nov 2014, 22:53

Dunque la funzione move player comunque mi va O.o
Allora ecco qui con i commenti:

function hLuce_AnyClick()
{
if(UsedAction(eGA_LookAt)) {
player.Say("L'interrutore della luce.");
}
else if(UsedAction(eGA_Use))
{
MovePlayer(20, 167);
// Qui imposto il cambio background accendendo e spegnendo la luce
if (GetBackgroundFrame()==0)
{
SetBackgroundFrame(1);
// do il valore alla variabile luce così da ritrovarmela nel caso nell'altra stanza
Luce = 1;
// setto le regioni che devono cambiare e basta
region[1].Enabled = true;
region[2].Enabled = true;
region[0].Enabled = false;
// qui metto che se l'hotspot del teletrasporto (che si attiva solo se è la porta è aperta) la regione 3 si attiva, altrimenti si disattiva.
if (hPorta.Enabled == true)
{
region[3].Enabled = true;
}
else
{
region[3].Enabled = false;
}
}
else
{
// se devo rimanere a luce accesa metti Luce ad 1 per l'altra stanza e riattiva le regioni della luce accesa
SetBackgroundFrame(0);
Luce = 0;
region[1].Enabled = false;
region[2].Enabled = false;
region[0].Enabled = true;
}
}
else Unhandled();
}




Ora il problema è questo, questa stringa non va bene : if (hPorta.Enabled == true)
{
region[3].Enabled = true;
}
else
{
region[3].Enabled = false;
}

Perché punto 1 è una cosa che verifica solo se spengo ed accendo la luce, quindi se a luce spenta apro la porta non si aggiorna e punto 2.. Non mi funziona e basta ç_ç

Inviato da: AprilSkiesil 28 Nov 2014, 10:49

MovePlayer non esiste più.. o meglio probabilmente nel codice sorgente di AGS è rimasto per cui funziona ma ti consiglio vivamente di NON UTILIZZARLO, fidati.
Ti consiglio di leggere attentamente il manuale di AGS, di cui ti riporto un estratto:

Walk
(Formerly known as MoveCharacter, which is now obsolete)
(Formerly known as MoveCharacterBlocking, which is now obsolete)
(Formerly known as MoveCharacterDirect, which is now obsolete)
Character.Walk(int x, int y, optional BlockingStyle, optional WalkWhere);


Detto questo, il tuo codice fallo così, COPIA E INCOLLA SENZA CAMBIARE NULLA:

CODICE
function hLuce_AnyClick()
{
   if(UsedAction(eGA_LookAt)) player.Say("L'interrutore della luce.");
   else if(UsedAction(eGA_Use))
   {
      Player.Walk(20, 167, eBlock, eWalkableAreas);
      if (Luce == 1) Luce = 0; else Luce = 1;
          if (Luce == 1)
          {
           SetBackgroundFrame(1);
           region[1].Enabled = true;
           region[2].Enabled = true;
           region[0].Enabled = false;
           if (hPorta.Enabled == true) region[3].Enabled = true;
           else region[3].Enabled = false;
           }
          else
          {
           SetBackgroundFrame(0);
           region[1].Enabled = false;
           region[2].Enabled = false;
           region[0].Enabled = true;
           //qui suppongo debba scomparire la region.
           region[3].Enabled = false;
           }
   }
   else Unhandled();
}



POI, quando apri o chiudi la porta:


CODICE
function hPorta_AnyClick()
{
   if(UsedAction(eGA_LookAt)) player.Say("La porta."); //qui non so la frase che hai messo, il mio è un esempio
   else if(UsedAction(eGA_Use))
   {
      //qui fai camminare verso la porta
      //Player.Walk...... metti le coordinate della porta
      //
      //qui verifica se invertire true con false oppure o no, visto che non so esattamente a cosa corrisponde tale region
      if (Luce == 1) region[3].Enabled = true;
      else region[3].Enabled = false;
   }
   else Unhandled();
}

Inviato da: Squall_Leonheartil 28 Nov 2014, 11:56

Allora, ti copio tutto il mio script della stanza perché mi da l'errore sia a player che a tale.

// room script file
function room_FirstLoad()
{
// Lock door on startup when entering the room
// set_door_state(20, 2);
// init_object(20, oDoor.ID);
}
function room_BeforeFadeIn()
{
hPorta.Enabled = false;
oPorta.Visible = false;
}
function room_AfterFadeIn()
{
region[0].Enabled = true;
region[1].Enabled = false;
region[2].Enabled = false;
region[3].Enabled = false;
SetBackgroundFrame(0);
oPorta.Visible = true;
gMaingui.Visible = true;
// Se la porta è stata sbloccata, dì qualcosa al ritorno nella stanza.
// if (get_door_state(20)<2) {
// player.FaceDirection(eDir_Down);
// player.Say("Well, that's it. Nothing more to do.");
// player.Say("Now get started with your own game.");
// cBman.Say("Have fun!");
//
}
function oPorta_AnyClick()
{
if (MovePlayer(108, 100))
{
// Usa
if(UsedAction(eGA_Use)) {
player.Say("Chiusa.");
}
// OPEN
else if(UsedAction(eGA_Open)) {
oPorta.Graphic = 217;
oPorta.Move (38, 154, 0, eBlock, eAnywhere);
hPorta.Enabled = true;
tale region
if (Luce == 1) region[3].Enabled = true;
else region[3].Enabled = false;
}
// CLOSE
else if(UsedAction(eGA_Close)) {
oPorta.Graphic = 12;
oPorta.Move (10, 166, 0, eBlock, eAnywhere);
hPorta.Enabled = false;
tale region
if (Luce == 1) region[3].Enabled = true;
else region[3].Enabled = false;
}
// Guarda
else if(UsedAction(eGA_LookAt)) {
player.Say("La porta d'uscita.");
}
// Push
else if(UsedAction(eGA_Push)) {
player.Say("Si romperebbe.");
}
// Pull
else if(UsedAction(eGA_Pull)) {
player.Say("No.");
Unhandled();
}
// PICKUP
else if(UsedAction(eGA_PickUp)) {
// player.Say("Si dai.");
// any_click_walk_look_pick(108, 100, eDir_Down, "Ehehe",oCup.ID, iCup);
}
//USE INV
else if(UsedAction(eGA_UseInv)) {
Unhandled();
}
// don't forget this
else Unhandled();
}
}

function cup_AnyClick()
{
if (MovePlayer(108, 100)) {
// LOOK AT
if(UsedAction(eGA_LookAt)) {
player.Say("Una coppa blu.");
}
// USE
else if(UsedAction(eGA_Use)) {
player.Say("Senza nulla?.");
}
// Push
else if(UsedAction(eGA_Push)) {
player.Say("Si romperebbe.");
}
// Pull
else if(UsedAction(eGA_Pull)) {
Unhandled();
}
// PICKUP
else if(UsedAction(eGA_PickUp)) {
player.Say("Si dai.");
any_click_walk_look_pick(108, 100, eDir_Down, "Ehehe",oCup.ID, iCup);
}
//USE INV
else if(UsedAction(eGA_UseInv)) {
Unhandled();
}
// don't forget this
else Unhandled();
}
}

function hPorta_AnyClick()
{
cBastian.ChangeRoom(2, 100, 100);
// if (any_click_on_door_special(20, oDoor.ID, 61, 104, eDir_Left, 2, 180, 88, eDir_Left, null, null, 4, 0)==0) Unhandled();

}

function hArmadio_AnyClick()
{
MovePlayer(250, 158);
if(UsedAction(eGA_LookAt)) {
player.Say("Il mio armadio, pieno di costumi.");
}
else if(UsedAction(eGA_Use)) {
player.Say("Non ho voglia di cambiarmi.");
}
else Unhandled();
}

function hLuce_AnyClick()
{
if(UsedAction(eGA_LookAt)) player.Say("L'interrutore della luce.");
else if(UsedAction(eGA_Use))
{
Player.Walk(20, 167, eBlock, eWalkableAreas);
if (Luce == 1) Luce = 0; else Luce = 1;
if (Luce == 1)
{
SetBackgroundFrame(1);
region[1].Enabled = true;
region[2].Enabled = true;
region[0].Enabled = false;
if (hPorta.Enabled == true) region[3].Enabled = true;
else region[3].Enabled = false;
}
else
{
SetBackgroundFrame(0);
region[1].Enabled = false;
region[2].Enabled = false;
region[0].Enabled = true;
//qui suppongo debba scomparire la region.
region[3].Enabled = false;
}
}
else Unhandled();
}
function Bidone_AnyClick()
{
MovePlayer(212, 150);
// LOOK AT
if(UsedAction(eGA_LookAt)) {
player.Say("Si tratta di un bidone.");
}
// USE
else if(UsedAction(eGA_Use)) {
player.Say("Non ho nulla da buttare.");
}
// Push
else if(UsedAction(eGA_Push)) {
player.Say("No.");
}
// Pull
else if(UsedAction(eGA_Open)) {
player.Say("Mamm e l'arc no.");
}
else if(UsedAction(eGA_Open)) {
player.Say("Lo è già.");
}
// PICKUP
else if(UsedAction(eGA_PickUp)) {
player.Say("Si dai, portare un bidone dell'immondizia in tasca può comodo... Si, come no.");
}
// don't forget this
else Unhandled();
}

Inviato da: AprilSkiesil 28 Nov 2014, 13:03

Quale pleyer ti da errore?
Mi puoi evidenziare la linea?

e soprattutto cos'è "tale" ?????
non è un comando di ags. cancellalo.

ma, per curiosità, dove l'hai copiato questo script? ci sono parti in inglese ... attento a fare i copia incolla brutali.

Inviato da: Squall_Leonheartil 28 Nov 2014, 14:07

Perdonami avevo copiato erroneamente il tuo script, comunque mi da l'errore alla linea 138

// room script file
function room_FirstLoad()
{
// Lock door on startup when entering the room
// set_door_state(20, 2);
// init_object(20, oDoor.ID);
}
function room_BeforeFadeIn()
{
hPorta.Enabled = false;
oPorta.Visible = false;
}
function room_AfterFadeIn()
{
region[0].Enabled = true;
region[1].Enabled = false;
region[2].Enabled = false;
region[3].Enabled = false;
SetBackgroundFrame(0);
oPorta.Visible = true;
gMaingui.Visible = true;
// Se la porta è stata sbloccata, dì qualcosa al ritorno nella stanza.
// if (get_door_state(20)<2) {
// player.FaceDirection(eDir_Down);
// player.Say("Well, that's it. Nothing more to do.");
// player.Say("Now get started with your own game.");
// cBman.Say("Have fun!");
//
}
function oPorta_AnyClick()
{
if (MovePlayer(108, 100))
{
// Usa
if(UsedAction(eGA_Use)) {
player.Say("Chiusa.");
}
// OPEN
else if(UsedAction(eGA_Open)) {
oPorta.Graphic = 217;
oPorta.Move (38, 154, 0, eBlock, eAnywhere);
hPorta.Enabled = true;
if (Luce == 1) region[3].Enabled = true;
else region[3].Enabled = false;
}
// CLOSE
else if(UsedAction(eGA_Close)) {
oPorta.Graphic = 12;
oPorta.Move (10, 166, 0, eBlock, eAnywhere);
hPorta.Enabled = false;
if (Luce == 1) region[3].Enabled = true;
else region[3].Enabled = false;
}
// Guarda
else if(UsedAction(eGA_LookAt)) {
player.Say("La porta d'uscita.");
}
// Push
else if(UsedAction(eGA_Push)) {
player.Say("Si romperebbe.");
}
// Pull
else if(UsedAction(eGA_Pull)) {
player.Say("No.");
Unhandled();
}
// PICKUP
else if(UsedAction(eGA_PickUp)) {
// player.Say("Si dai.");
// any_click_walk_look_pick(108, 100, eDir_Down, "Ehehe",oCup.ID, iCup);
}
//USE INV
else if(UsedAction(eGA_UseInv)) {
Unhandled();
}
// don't forget this
else Unhandled();
}
}

function cup_AnyClick()
{
if (MovePlayer(108, 100)) {
// LOOK AT
if(UsedAction(eGA_LookAt)) {
player.Say("Una coppa blu.");
}
// USE
else if(UsedAction(eGA_Use)) {
player.Say("Senza nulla?.");
}
// Push
else if(UsedAction(eGA_Push)) {
player.Say("Si romperebbe.");
}
// Pull
else if(UsedAction(eGA_Pull)) {
Unhandled();
}
// PICKUP
else if(UsedAction(eGA_PickUp)) {
player.Say("Si dai.");
any_click_walk_look_pick(108, 100, eDir_Down, "Ehehe",oCup.ID, iCup);
}
//USE INV
else if(UsedAction(eGA_UseInv)) {
Unhandled();
}
// don't forget this
else Unhandled();
}
}

function hPorta_AnyClick()
{
cBastian.ChangeRoom(2, 100, 100);
// if (any_click_on_door_special(20, oDoor.ID, 61, 104, eDir_Left, 2, 180, 88, eDir_Left, null, null, 4, 0)==0) Unhandled();

}

function hArmadio_AnyClick()
{
MovePlayer(250, 158);
if(UsedAction(eGA_LookAt)) {
player.Say("Il mio armadio, pieno di costumi.");
}
else if(UsedAction(eGA_Use)) {
player.Say("Non ho voglia di cambiarmi.");
}
else Unhandled();
}

function hLuce_AnyClick()
{
if(UsedAction(eGA_LookAt)) player.Say("L'interrutore della luce.");
else if(UsedAction(eGA_Use))
{

CITAZIONE
Player.Walk(20, 167, eBlock, eWalkableAreas);

if (Luce == 1) Luce = 0; else Luce = 1;
if (Luce == 1)
{
SetBackgroundFrame(1);
region[1].Enabled = true;
region[2].Enabled = true;
region[0].Enabled = false;
if (hPorta.Enabled == true) region[3].Enabled = true;
else region[3].Enabled = false;
}
else
{
SetBackgroundFrame(0);
region[1].Enabled = false;
region[2].Enabled = false;
region[0].Enabled = true;
//qui suppongo debba scomparire la region.
region[3].Enabled = false;
}
}
else Unhandled();
}
function Bidone_AnyClick()
{
MovePlayer(212, 150);
// LOOK AT
if(UsedAction(eGA_LookAt)) {
player.Say("Si tratta di un bidone.");
}
// USE
else if(UsedAction(eGA_Use)) {
player.Say("Non ho nulla da buttare.");
}
// Push
else if(UsedAction(eGA_Push)) {
player.Say("No.");
}
// Pull
else if(UsedAction(eGA_Open)) {
player.Say("Mamm e l'arc no.");
}
else if(UsedAction(eGA_Open)) {
player.Say("Lo è già.");
}
// PICKUP
else if(UsedAction(eGA_PickUp)) {
player.Say("Si dai, portare un bidone dell'immondizia in tasca può comodo... Si, come no.");
}
// don't forget this
else Unhandled();
}



Comunque non ho copiato nulla, ho semplicemente iniziato dal template del 9-verb. Infatti più avanti modificherò anche la grafica e le funzioni della Gui.. Piano piano. Grazie mille per gli aiuti che mi stai dando blush.gif

Inviato da: AprilSkiesil 28 Nov 2014, 14:37

player lettera piccola biggrin2a.gif

forse è stato un refuso da parte mia.

Sostituisci Player con player


Inviato da: Squall_Leonheartil 28 Nov 2014, 16:51

La region 3 rimane attiva indifferentemente dalla porta aperta o chiusa a luce spenta :/

Inviato da: AprilSkiesil 28 Nov 2014, 17:14

Disattivala la prima volta che entri nella stanza.

Da quel momento in poi se luce == 1 si attiva altrimenti no.

Inviato da: Squall_Leonheartil 28 Nov 2014, 18:49

Niente, continua a non disattivarsi al primo avvio. Quando entra nella camera, comunque dovrebbe verificare se uno aveva rimasto la luce accesa e la porta aperta.. Quindi avevo fatto così.. Ma niente. La region non si disattiva.

CODICE
// room script file
function room_FirstLoad()
{
  // Lock door on startup when entering the room  
// set_door_state(20, 2);
//  init_object(20, oDoor.ID);  
}
function room_BeforeFadeIn()
{  
  hPorta.Enabled = false;
  oPorta.Visible = false;
}
function room_AfterFadeIn()
{  
  region[0].Enabled = true;
  region[1].Enabled = false;
  region[2].Enabled = false;
  Luce = 0;
  if (hPorta.Enabled == true) region[3].Enabled = true;
  else region[3].Enabled = false;
  SetBackgroundFrame(0);
  oPorta.Visible = true;
  gMaingui.Visible = true;
  
  // Se la porta è stata sbloccata, dì qualcosa al ritorno nella stanza.
//  if (get_door_state(20)<2) {
  //   player.FaceDirection(eDir_Down);
   //  player.Say("Well, that's it. Nothing more to do.");
   //  player.Say("Now get started with your own game.");
   //  cBman.Say("Have fun!");
  //
  }
function oPorta_AnyClick()
{
  if (MovePlayer(108, 100))
{
    // Usa
    if(UsedAction(eGA_Use)) {
      player.Say("Chiusa.");
    }
     // OPEN
  else if(UsedAction(eGA_Open)) {
      oPorta.Graphic = 217;
      oPorta.Move (38, 154, 0, eBlock, eAnywhere);
      hPorta.Enabled = true;  
      if (Luce == 1) region[3].Enabled = true;
      else region[3].Enabled = false;    
  }  
  // CLOSE
  else if(UsedAction(eGA_Close)) {
     oPorta.Graphic = 12;
     oPorta.Move (10, 166, 0, eBlock, eAnywhere);
     hPorta.Enabled = false;
     region[3].Enabled = false;
    }  
    // Guarda
   else if(UsedAction(eGA_LookAt)) {
      player.Say("La porta d'uscita.");
    }
    // Push
    else if(UsedAction(eGA_Push)) {
      player.Say("Si romperebbe.");
    }
    // Pull
    else if(UsedAction(eGA_Pull)) {
      player.Say("No.");
      Unhandled();
    }  
    // PICKUP
    else if(UsedAction(eGA_PickUp)) {
    //  player.Say("Si dai.");
     // any_click_walk_look_pick(108, 100, eDir_Down, "Ehehe",oCup.ID, iCup);
    }
    //USE INV
    else if(UsedAction(eGA_UseInv)) {
      Unhandled();
    }
    // don't forget this
    else Unhandled();
  }
}

function cup_AnyClick()
{
  if (MovePlayer(108, 100)) {
    // LOOK AT
    if(UsedAction(eGA_LookAt)) {
      player.Say("Una coppa blu.");
    }
    // USE
    else if(UsedAction(eGA_Use)) {
      player.Say("Senza nulla?.");
    }
    // Push
    else if(UsedAction(eGA_Push)) {
      player.Say("Si romperebbe.");
    }
    // Pull
    else if(UsedAction(eGA_Pull)) {
      Unhandled();
    }  
    // PICKUP
    else if(UsedAction(eGA_PickUp)) {
      player.Say("Si dai.");
      any_click_walk_look_pick(108, 100, eDir_Down, "Ehehe",oCup.ID, iCup);
    }
    //USE INV
    else if(UsedAction(eGA_UseInv)) {
      Unhandled();
    }
    // don't forget this
    else Unhandled();
  }
}

function hPorta_AnyClick()
{
cBastian.ChangeRoom(2, 100, 100);
  // if (any_click_on_door_special(20, oDoor.ID, 61, 104, eDir_Left, 2, 180, 88, eDir_Left, null, null, 4, 0)==0) Unhandled();

}

function hArmadio_AnyClick()
{
  MovePlayer(250, 158);
  if(UsedAction(eGA_LookAt)) {
    player.Say("Il mio armadio, pieno di costumi.");
  }
      else if(UsedAction(eGA_Use)) {
      player.Say("Non ho voglia di cambiarmi.");
    }
  else Unhandled();
}

function hLuce_AnyClick()
{
   if(UsedAction(eGA_LookAt)) player.Say("L'interrutore della luce.");
   else if(UsedAction(eGA_Use))
   {
      player.Walk(20, 167, eBlock, eWalkableAreas);
      if (Luce == 1) Luce = 0; else Luce = 1;
          if (Luce == 1)
          {
           SetBackgroundFrame(1);
           region[1].Enabled = true;
           region[2].Enabled = true;
           region[0].Enabled = false;
           if (hPorta.Enabled == true) region[3].Enabled = true;
           else region[3].Enabled = false;
           }
          else
          {
           SetBackgroundFrame(0);
           region[1].Enabled = false;
           region[2].Enabled = false;
           region[0].Enabled = true;
           region[3].Enabled = false;
           }
   }
   else Unhandled();
}
function Bidone_AnyClick()
{
  MovePlayer(212, 150);
    // LOOK AT
    if(UsedAction(eGA_LookAt)) {
      player.Say("Si tratta di un bidone.");
    }
    // USE
    else if(UsedAction(eGA_Use)) {
      player.Say("Non ho nulla da buttare.");
    }
    // Push
    else if(UsedAction(eGA_Push)) {
      player.Say("No.");
    }
    // Pull
     else if(UsedAction(eGA_Open)) {
      player.Say("Mamm e l'arc no.");
    }  
     else if(UsedAction(eGA_Open)) {
      player.Say("Lo è già.");
    }  
    // PICKUP
    else if(UsedAction(eGA_PickUp)) {
      player.Say("Si dai, portare un bidone dell'immondizia in tasca può comodo... Si, come no.");
    }
    // don't forget this
    else Unhandled();
  }

Inviato da: AprilSkiesil 28 Nov 2014, 19:16

sei sicuro che ti stai riferendo alla region giusta?

così come è scritto, la region 3 dovrebbe trovarsi su false, quindi il suo effetto non dovrebbe essere visibile.

Cosa succede se entri nela region 3 qundo è attivata, cioè quando è su true? come l'hai impostata? cosa avviene al personaggio?

Mi viene il sospetto che tu la stia usando al contrario.... cioè che quando dici "attivata" non significa che si trovi su true...

prova a scambiare true con false in TUTTI gli script e vedi cosa succede.

Inviato da: Squall_Leonheartil 28 Nov 2014, 19:24

No sono sicuro che la region sia giusta. Ti spiego la region 3 deve attivarsi a porta aperta (hPorta.Enabled = true) e a Luce spenta (Luce 1). Ora tutto funziona bene solo che quando carica la prima stanza è già attiva nonostante nel roomload abbia messo

CODICE
   if (hPorta.Enabled == true) region[3].Enabled = true;
  else region[3].Enabled = false;

Inviato da: AprilSkiesil 28 Nov 2014, 19:43

hPorta è enabled appena carica?
verificalo mettendo oPorta non visibile (che lo copre)

Altra cosa. region[0] che cos'è?

Me ne sono accorto ora!

Le regioni partono da uno!
Leggi il manuale!
Cancella la region[0]

Inviato da: Squall_Leonheartil 28 Nov 2014, 20:42

Ah finalmente ci sono riuscito!
Potresti dirmi come cambiare la room dove inizia il gioco? Vorrei iniziare a creare una schermata per i crediti e una per i titoli.

Inviato da: AprilSkiesil 28 Nov 2014, 21:10

devi cambiare la start room del personaggio principale. Menù a destra.
La start room del personaggio è la prima che carica.


Inviato da: Squall_Leonheartil 29 Nov 2014, 16:44

Ora sto avendo un problema col 9-Verb.
Cambio la grafica alle view e al cursore stesso ma quando clicco col tasto destro su un oggetto mi ritorna quello vecchio. Non riesco a trovare la stringa che gestisce questa cosa :/

Inviato da: AprilSkiesil 29 Nov 2014, 20:10

Dovrebbe trovarsi nel GUIScript.
in uno script che si chiama "On Mouse Click" in cui è codato cosa avviene quando clicchi con i diversi pulsanti del mouse

Inviato da: Squall_Leonheartil 29 Nov 2014, 22:39

Non la trovo, ti copio lo script:


CODICE
function on_mouse_click(MouseButton button) {
  
  if (!is_gui_disabled()) {
    int mrx=mouse.x+GetViewportX();
    int mry=mouse.y+GetViewportY();
    int x=mouse.x;
    int y=mouse.y;
    // get location under mouse cursor
    GSloctype=GetLocationType(x, y);
    GSlocname=Game.GetLocationName(x, y);
    GSagsusedmode=Mouse.Mode;
    used_action=global_action;
    
    InventoryItem*ii = InventoryItem.GetAtScreenXY(x, y);
    if (GSloctype==eLocationHotspot) {
      Hotspot*h=Hotspot.GetAtScreenXY(x, y);
      GSlocid=h.ID;
      
    }
    else if (GSloctype==eLocationCharacter) {
      Character*c=Character.GetAtScreenXY(x, y);
      GSlocid=c.ID;
    }
    else if (GSloctype==eLocationObject) {
      Object*o=Object.GetAtScreenXY(x, y);
      GSlocid=o.ID;
    }
    else if (ii!=null) GSlocid=ii.ID;
    
    
    
    
    if (IsGamePaused()) {
      // Game is paused, so do nothing (ie. don't allow mouse click)
    }
    // Mousebutton Left
    else if (button==eMouseLeft)
    {
        
      if (GlobalCondition(2) || GlobalCondition(3) || GlobalCondition(4)) {
        // Do nothing, if:
        // the mode is useinv and the mouse is over the active inv (like "use knife on knife")
        // or the mode is talk, or "Give", and the mouse isnt over a character
        // or its GIVE and the mouse isnt over a inv.item

      }
      else if (ExtensionEx(1, GSlocname)=='e') {
        UpdateActionBar();
        ActionLine.TextColor=ActionLabelColorHighlighted;
        WalkOffScreen();
      }
      // walk to
      else if (GSagsusedmode==eModeUsermode2) {
        ActionLine.TextColor=ActionLabelColorHighlighted;
        if (IsInteractionAvailable(x, y, GSagsusedmode)) ProcessClick (x, y, GSagsusedmode);
        else ProcessClick(x, y, eModeWalkto);
      }  
      // talkto
      else if (GSagsusedmode==eModeTalkto && IsInteractionAvailable(x, y, GSagsusedmode) && GSloctype==eLocationCharacter) {
        ActionLine.TextColor=ActionLabelColorHighlighted;
        if (GoToCharacter(character[GSlocid], eDir_None, NPC_facing_player, 1)) character[GSlocid].RunInteraction(GSagsusedmode);
        SetAction(eMA_Default);
      }
      // Giveto
      else if ((GSagsusedmode == eModeUseinv) && GSloctype==eLocationCharacter && isAction(eGA_GiveTo)) {
        ActionLine.TextColor=ActionLabelColorHighlighted;
        ItemGiven=player.ActiveInventory;
        
        if (GoToCharacter(character[GSlocid], eDir_None, NPC_facing_player, 2)) {
          if (IsInteractionAvailable (mrx - GetViewportX (), mry - GetViewportY (), eModeUseinv) == 1) {
            character[GSlocid].RunInteraction(eModeUseinv);        
          }
        }
        SetAction (eMA_Default);
      }    
      else {
        UpdateActionBar();
        ActionLine.TextColor=ActionLabelColorHighlighted;
        ProcessClick(x, y, GSagsusedmode);
        SetAction(eMA_Default);
        ItemGiven=null;
      }
    }
    // Mousebutton Right
    else if (button==eMouseRight) {
      if (alternative_action==eMA_Default) {
        SetAction(eMA_Default);
        ActionLine.TextColor=ActionLabelColorHighlighted;
        if (Mouse.Mode==eModeUsermode2) {
          if (ExtensionEx(1, GSlocname)=='e') {
            UpdateActionBar();
            ActionLine.TextColor=ActionLabelColorHighlighted;
            WalkOffScreen();
          }          
          else ProcessClick(x, y, eModeWalkto);
        }
        else ProcessClick(x, y, Mouse.Mode);
      }
      else
      {
        SetAction(alternative_action);
        used_action=global_action;
        UpdateActionBar();
        ActionLine.TextColor=ActionLabelColorHighlighted;
        GSagsusedmode=Mouse.Mode;
        if (GSagsusedmode==eModeTalkto && IsInteractionAvailable(x, y, GSagsusedmode) && GSloctype==eLocationCharacter) { //(GetCharacterAt (mouse.x, mouse.y) < 7))
          if (GoToCharacter(character[GSlocid], eDir_None, NPC_facing_player,2 )) character[GSlocid].RunInteraction(GSagsusedmode);
        }
        else ProcessClick(x, y, GSagsusedmode);
        SetAction(eMA_Default);
      }
    }
    //left click in inventory
    else if (button==eMouseLeftInv) {
      if (!isAction(eGA_GiveTo))ItemGiven= null;
  
      if (GlobalCondition (1)) {
        // if the mouse is in the inventory and modes Walk or pickup are selected
        SetAction (eGA_Use);
        location=GSinvloc;    
        if (Extension()=='u' && ii.IsInteractionAvailable(eModeInteract)) {
          // use it immediately (not with anything else)
          used_action=global_action;
          ii.RunInteraction(eModeInteract);
          SetAction(eMA_Default);
        }
        else {
          if (oldschool_inv_clicks) {
            SetAction (eGA_LookAt);
            used_action=global_action;
            ii.RunInteraction(eModeLookat);  
            SetAction(eMA_Default);
          }
          else player.ActiveInventory=ii;
        }
      }
      else  if (GlobalCondition (2) == 1) {
        // if the mode is useinv and the mouse is over the active inv (like "use knife on knife")
        // so do nothing again
      }
      else {
        used_action=global_action;
        if (Mouse.Mode==eModeInteract) {
          if (isAction(eGA_Use) && ii.IsInteractionAvailable(eModeInteract)) {
            ActionLine.TextColor=ActionLabelColorHighlighted;
            ii.RunInteraction(eModeInteract);
            SetAction(eMA_Default);
          }
          else player.ActiveInventory=ii;
        }
        else {
          if ( (Mouse.Mode >0 && Mouse.Mode <10 )&& ii != null) {
                GSagsusedmode=Mouse.Mode;
                ActionLine.TextColor=ActionLabelColorHighlighted;
                ii.RunInteraction(Mouse.Mode);
                SetAction(eMA_Default);
          }
        }
      }
    }
    //right click in inventory
    else if (button==eMouseRightInv) {
      if (alternative_action==eMA_Default) {
        SetAction(eMA_Default);
      }
      else {
        SetAction(alternative_action);
        used_action=global_action;
        GSagsusedmode=Mouse.Mode;
        if (Mouse.Mode==eModeInteract) {
          if (isAction(eGA_Use) && ii.IsInteractionAvailable(eModeInteract)) {
            UpdateActionBar();
            ActionLine.TextColor=ActionLabelColorHighlighted;
            ii.RunInteraction(eModeInteract);
            SetAction(eMA_Default);
          }
          else player.ActiveInventory=ii;
        }
        else {
          UpdateActionBar();
          ActionLine.TextColor=ActionLabelColorHighlighted;
          inventory[game.inv_activated].RunInteraction(Mouse.Mode);
          SetAction(eMA_Default);
        }
      }
    }
  }
}

function repeatedly_execute_always() {
  // Doubleclick Timer
  if (!IsGamePaused() && !is_gui_disabled()) {
    if (timer_run == true)
    {
      timer_click++;
      if (timer_click >= dc_speed){
        timer_click = 0;
        timer_run = false;
      }
    }
  }
}

function repeatedly_execute() {  
  if (!IsGamePaused() && !is_gui_disabled())
  {
    
    // --- for the MovePlayer function ---
    if (GScancelable==1) {
      GScancelable=0;
      if (InventoryItem.GetAtScreenXY(mouse.x, mouse.y)==null) on_mouse_click(eMouseLeft);
      else on_mouse_click(eMouseLeftInv);
    }
    else if (GScancelable==2) {
      GScancelable=0;
      CheckDefaultAction();
      if (InventoryItem.GetAtScreenXY(mouse.x, mouse.y)==null) on_mouse_click(eMouseRight);
      else on_mouse_click(eMouseRightInv);
    }
    CheckDefaultAction();
    UpdateActionBar();
  }
  // change the arrows in the inventory to show if you
  // can scroll the inventory:
  if (MainInv.TopItem>0) {
    // if inventory can scroll up
    InvUp.NormalGraphic=invUparrowONsprite;
    InvUp.MouseOverGraphic=invUparrowHIsprite;
    
    if (InventoryItem.GetAtScreenXY(gMaingui.X+MainInv.X+1, gMaingui.Y+MainInv.Y+1)==null) MainInv.TopItem-=MainInv.ItemsPerRow;
  }
  else {
    InvUp.NormalGraphic=invUparrowOFFsprite;
    InvUp.MouseOverGraphic=invUparrowOFFsprite;
  }
  //if inv can scroll down
  if (MainInv.TopItem<MainInv.ItemCount-(MainInv.ItemsPerRow * MainInv.RowCount)) {
    InvDown.NormalGraphic=invDownarrowONsprite;
    InvDown.MouseOverGraphic=invDownarrowHIsprite;
  }
  else{
    InvDown.NormalGraphic=invDownarrowOFFsprite;
    InvDown.MouseOverGraphic=invDownarrowOFFsprite;
  }
  
}

Inviato da: AprilSkiesil 30 Nov 2014, 10:19

Il codice relativo alla pressione del pulsante destro del mouse è quello che segue

CODICE
    // Mousebutton Right
    else if (button==eMouseRight) {
         ....... tutto quello che è scritto da qui in poi, fino al successivo "ELSE" è ciò che è codato per il pulsante destro


^^

Inviato da: Squall_Leonheartil 30 Nov 2014, 14:39

Si quello l'avevo trovato, il problema è che nello script non vedo nessun posto dove imposta le immagini..
Ho provato a fermare anche le actioncolor del testo ma neanche quelle si modificano.. Solo cancellando tutte le cose si rimuovono. Ma p'er il resto il nome delle immagini coincidono ma continua. Che fare?

Inviato da: AprilSkiesil 30 Nov 2014, 14:59

eh?

Non ho capito. Se cancelli tutto va bene o no?

Inviato da: Squall_Leonheartil 30 Nov 2014, 17:00

Praticamente, cancellando queste stringhe

CODICE
   else if (button==eMouseRight) {
      if (alternative_action==eMA_Default) {
        SetAction(eMA_Default);
        ActionLine.TextColor=ActionLabelColorHighlighted;
        if (Mouse.Mode==eModeUsermode2) {
          if (ExtensionEx(1, GSlocname)=='e') {
            UpdateActionBar();
            ActionLine.TextColor=ActionLabelColorHighlighted;
            WalkOffScreen();
          }          
         else ProcessClick(x, y, eModeWalkto);
        }
        else ProcessClick(x, y, Mouse.Mode);
      }
      else
      {
        SetAction(alternative_action);
        used_action=global_action;
        UpdateActionBar();
        ActionLine.TextColor=ActionLabelColorHighlighted;
        GSagsusedmode=Mouse.Mode;
        if (GSagsusedmode==eModeTalkto && IsInteractionAvailable(x, y, GSagsusedmode) && GSloctype==eLocationCharacter) { //(GetCharacterAt (mouse.x, mouse.y) < 7))
          if (GoToCharacter(character[GSlocid], eDir_None, NPC_facing_player,2 )) character[GSlocid].RunInteraction(GSagsusedmode);
        }
        else ProcessClick(x, y, GSagsusedmode);
        SetAction(eMA_Default);
      }
    }



Il tasto destro non fa più alcuna azione, invece io vorrei che rimanesse il cursore che ho impostato nella grafica, non quello del 9 verb!
Aggiungendo questo cursorspritenumber = 265; sotto SetAction(eMA_Default)
Mi mette il cursore con la giusta immagine, però non animato!

Inviato da: AprilSkiesil 30 Nov 2014, 17:58

Scusa, ma una domanda... se semplicemente quello che vuoi fare è cambiare la grafica del cursore...
perché non vai in "cursors" e cambi la grafica nell'apposito menù a destra... e se lo vuoi animato, perché non cambi semplicemente la view numero 100 che è quella richiamata da default nei 9-verbs? Assegna alla view in questione la successione di frames della tua animazione... e hai finito.
non c'è motivo di cambiare lo script del mouse, se devi fare solo quello!

Inviato da: Squall_Leonheartil 30 Nov 2014, 19:48

Ma il problema è proprio che cambiando tutti gli sprites e le view dai menù continua il difetto!

Inviato da: Squall_Leonheartil 30 Nov 2014, 19:48

Ma il problema è proprio che cambiando tutti gli sprites e le view dai menù continua il difetto!

Inviato da: AprilSkiesil 30 Nov 2014, 21:07

In ogni cursore imposta, nel menù a destra, IMAGE e VIEW il tuo sprite e la tua view. In ogni cursore intendo OGNI (dallo 0 fino a user mode 2).

POI, DEVI DIRLO ALLA GUI
quindi vai nello script della GUI e alla riga N.27
troverai,
cursorspritenumber = ...,
METTI Lì il tuo numero di SPRITE.

vedrai che ti funziona.

Inviato da: Squall_Leonheartil 1 Dec 2014, 14:02

Sono riuscito a risolvere tutto grazie blush.gif
Ma una cosa, avendo programmato uno schermo dei titoli in una room, ho costruito i bottoni etc. Ci sono riuscito. Però non so come disabilitare la pausa e la gui in quella stanza.. Il problema è che pecco parecchio di sintassi di Ags.

Su carta dovrebbe essere :

CODICE
function on_key_press(eKeyCode keycode) {
  //Qui dovrei mettere la condizione se non è la stanza 301
             if (keycode == eKeyF){
               if (!IsGamePaused()){
if (gMaingui.Visible == true)
gMaingui.Visible = false;
else
gMaingui.Visible = true;
}
}
  // --- PAUSE-GUI ---
//Qui dovrei mettere la condizione se non è la stanza 301
  if (keycode == eKeySpace)
  {
    // SPACEBAR
    if (!IsGamePaused()) {
      PauseGame();
      AdjustGUIText();
      gMaingui.Visible = false;
      gPaused.Visible=true;
      
    }
    else {
      gPaused.Visible=false;
      UnPauseGame();
      SetAction(eMA_Default);
      ActionLine.TextColor=ActionLabelColorHighlighted;      
      CheckDefaultAction();
      UpdateActionBar();
      gMaingui.Visible = false;
    }
  }




Ma come faccio?? Nella guida non trovo nulla riguardo questa opzione

Inviato da: AprilSkiesil 1 Dec 2014, 14:34

La condizione "NON E' NELLA STANZA 301" si scrive:

CODICE
if (player.Room != 301)
  {
  //......
   }

Inviato da: Squall_Leonheartil 4 Dec 2014, 21:09

Ok, rieccomi XD Stavo cercando di far illuminare delle scritte al momento del passaggio del mouse su di esse.. O meglio dei bottoni nel title. Come posso fare?
Inoltre non riesco ad aggiungere gli oggetti all'inventario e a cambiare font con il 9 verb..

Inviato da: AprilSkiesil 5 Dec 2014, 12:11

Allora, scritte che cambiano colore al passaggio del mouse:

Vai negli script e, quindi vai nel "GlobalScript".

Qui troverai una funzione che si chiama
repeatedly_execute_always()

dentro devi mettere il codice per fare quello che dici.
Facciamo un esempio: supponiamo di voler cambiare il colore della scritta relativa a "Button1"
(nel tuo caso non so come si chiama la scritta, quindi sostituisci Button1 con la tua!)

CODICE
if (GUIControl.GetAtScreenXY(mouse.x, mouse.y) == Button1) Button1.TextColor = 45055;
   else Button1.TextColor = 65535;


45055 è un colore
65535 è un altro colore

Nel tuo caso devi scrivere i codici dei colori che vuoi.
Per calcolare il codice di un colore vai nel menù COLORS di AGS.

Per aggiungere un oggetto in inventario:

Per mettere un oggetto in inventario devi prima di tutto crearlo:
Inventory Items ----> New inventory item
lo crei, gli assegni un'immagine, gli dai un nome...

Poi:

se vuoi far partire il personaggio con già quell'oggetto, metti PlayerStartsWithItem su TRUE (nel menù)

se vuoi prenderlo nel gioco, quando crei lo script che lo fa prendere basta che scrivi:
(SUPPONIAMO CHE L'OGGETTO SI CHIAMA iCOLTELLO)
CODICE
player.AddInventory(iCOLTELLO);



Per cambiare il font dei verbs...:
Se non ricordo male, controlla, i verbs non sono scritte .......
ma delle immagini biggrin2a.gif
quindi devi modificare le immagini da fuori... con paint ad esempio ... ROFLMAO!
questo è un limite del gioco "default".
però, ripeto, se ricordo bene... controlla.

Inviato da: Squall_Leonheartil 5 Dec 2014, 13:05

Scusami ma del bottone volevo cambiare l'immagine, non il testo! Quello è il comando che non trovo!
Comunque si nella gui utilizza delle immagini il 9 verbo, ma tipo sul mouse ha un font, anche nei menù.

Inviato da: AprilSkiesil 5 Dec 2014, 15:24

Per far cambiare l'immagine quando passi sopra un pulsante, è semplice.
Devi impostarla nell'apposito menù a destra della GUI:

Image = immagine che il bottone ha normalmente.
MouseOver Image = metti il numero di sprite del bottone illuminato (assumerà quello sprite quando ci passi sopra)
Pushed Image = metti lo sprite del bottone premuto

Se vuoi cambiare un "font" qualsiasi nel gioco, vai nel menù a destra ---> fonts

se clicchi su un font puoi sostituirlo (import over this font)

Puoi anche inserire un nuovo font per usarlo all'occorrenza (new font)

Per cambiare un font di una gui o di umenù.. sempre menù a destra e lo imposti

Inviato da: Squall_Leonheartil 5 Dec 2014, 19:44

Ma perché a me non c'è questa opzione?





Edit : Cavolo ci sono arrivato da solo, creavo una GUI anzichè dei bottoni >.<
Ora provo il resto e nel caso edito

Inviato da: AprilSkiesil 6 Dec 2014, 08:49

CITAZIONE (Squall_Leonheart @ 5 Dec 2014, 19:44) *
Edit : Cavolo ci sono arrivato da solo, creavo una GUI anzichè dei bottoni >.<
Ora provo il resto e nel caso edito


biggrin.gif

Inviato da: Squall_Leonheartil 8 Dec 2014, 15:29

Eccomi di nuovo!
Dunque modificando la Gui è insorto questo problema:
Vorrei avere uno sfondo trasparente e i bottoni sempre visibili quando attivi, però modificando la trasparenza della maingui si modifica tutto e i bottoni non hanno una propria trasparenza! Come fare?
Ci tengo a precisare che non contengono alcun testo i bottoni, difatti sono scritte a picture!

Inviato da: Squall_Leonheartil 9 Dec 2014, 22:33

Ho visto che lo sfondo della GUI è il button 12.. Quindi la domanda è : come modificare la trasparenza di un bottone?

Inviato da: AprilSkiesil 10 Dec 2014, 20:32

Ciao SQ!
Scusa il ritardo!!!
Ero a Londra e non potevo rispondere ^^

Allora ho capito di cosa hai bisogno.

La trasparenza di una gui o di un qualsiasi bottone nella gui si imposta così:

button12.Transparency = .....

se metti 0 è normale, se metti 100 è tutta trasparente.
Se metti 50 è una trasparenza "a metà"puoi mettere qualsiasi numero tra 0 e 99 (nel caso delle gui)

Inviato da: Squall_Leonheartil 10 Dec 2014, 23:32

Figurati, ti invidio XD
Comunque ho provato, ma non funziona. Mi da un errore sul button. Siccome è una situazione che deve essere perenne all'attivazione della Gui, dove mi conviene mettere l'ìstruzione?

Inviato da: Squall_Leonheartil 11 Dec 2014, 14:38

L'errore che mi da è quello che transparency non è un public member.

Inviato da: AprilSkiesil 11 Dec 2014, 19:30

Ahah, scusami SQ ^^ errore mio.

La Transparency infatti non è applicabile al singolo bottone biggrin2a.gif
Devi applicarla a tutta la GUI (ovviamente la GUI che contiene il tuo bottone) biggrin2a.gif

quindi è:

LA_TUA_GUI.Transparency = ... lettera maiuscola esattamente come l'ho scritta.

Inviato da: Squall_Leonheartil 11 Dec 2014, 20:49

Avevo cercato di evitare il problema accavaLLANDO un altra gui, però non riesco a decidere quale deve stare sopra l'altra :/

Inviato da: AprilSkiesil 11 Dec 2014, 20:55

Per decidere chi sta sopra e chi sta sotto devi usare Z-ORDER nel menù di impostazione delle GUI.

La gui con Z order maggiore sta sopra biggrin2a.gif

Inviato da: Squall_Leonheartil 14 Dec 2014, 17:46

Eccomi di nuovo biggrin2a.gif
Volevo usare nel title un immagine, al di fuori del background come si mostra uno sprite?

Inviato da: AprilSkiesil 15 Dec 2014, 12:44

Ti conviene creare un oggetto.

Inviato da: Squall_Leonheartil 15 Dec 2014, 16:08

Ma per animarlo poi mi conviene fare wait e cambio grafica?

Inviato da: AprilSkiesil 15 Dec 2014, 16:52

Per animare un oggetto:

crea una VIEW animata. Come quella del cursore (ricordi?).

Poi all'inizio della stanza, scrivi Oggetto(nome dell'oggetto).Set View(......); e gli assegni la view.

Poi scrivi OGGETTO(nome).Animate(LOOP[scrivi il loop], VELOCITA'/DELAY, eNoBlock, eForward);
poi metti Wait(TEMPO CHE VUOI FAR DURARE L'ANIMAZIONE);
poi fermi l'animazione :-)

Inviato da: Squall_Leonheartil 15 Dec 2014, 18:56

Mi da l'errore ad oSipario, non capisco perché visto che i nomi combaciano.. Ti scrivo il mio codice:

CODICE
function room_FirstLoad()
{  
  StartCutscene(1);
  mouse.DisableMode(eModeWait);
  Display("Buon divertimento");
  oSipario.SetView(20);
  oSipario.Animate(0, 5, eNoBlock,eDir_Down);
  Wait(1);
  oSipario.Visible = false;
  gTitolo.Visible = true;
  EndCutscene();
}



EDIT: Ok, mi sono messo a spulciare bene la guida e sembra che abbia trovato una soluzione!

Ora il codice mi funziona :

CODICE
  StartCutscene(1);
  mouse.DisableMode(eModeWait);
  Display("Buon divertimento");
  oSipario.SetView(20);
  object[0].Animate(0, 5);
  Wait(1);
  oSipario.Visible = false;
  gTitolo.Visible = true;
  EndCutscene();

Inviato da: AprilSkiesil 16 Dec 2014, 08:48

Bravo! Il manuale fornisce sempre una spiegazione ^^
cmq credo che l'errore fosse mettere eDir_Down.
anziché scrivere object[0], puoi tranquillamente riscrivere oSipario cmq

Inviato da: Squall_Leonheartil 16 Dec 2014, 20:47

Però creando un oggetto, passandoci sopra esce vai a etc, cosa che vorrei non uscisse almeno nella stanza dei titoli 301! Avendo il 9verb come posso fare a disattivare la scritta del cursore solo in quella stanza?

Inviato da: AprilSkiesil 16 Dec 2014, 21:31

Il modo più veloce è metterci sopra una bella GUI trasparente (trasparente vuol dire colore background e colore bordo = 0) (normal intially on), che attivi e disattivi all'occorrenza in casi come questo ;-)

Inviato da: Squall_Leonheartil 16 Dec 2014, 23:29

Ho risolto togliendo il vai a proprio dalla Gui principale che non mi serviva. Comunque ho notato un bug del 9Verb. Qualsiasi comando utilizzo per interagire con un oggetto, mi aggiorna sempre il bottone dell'esamina. Esempio:

Se dico parla con dalla Gui e clicco poi su Bman, anziché rimanere la mouse overimage del parla, si setta quella dell'esamina. Come mai? Non trovo il comando negli script..

Inviato da: AprilSkiesil 17 Dec 2014, 11:41

CITAZIONE (Squall_Leonheart @ 16 Dec 2014, 23:29) *
Ho risolto togliendo il vai a proprio dalla Gui principale che non mi serviva. Comunque ho notato un bug del 9Verb. Qualsiasi comando utilizzo per interagire con un oggetto, mi aggiorna sempre il bottone dell'esamina. Esempio:

Se dico parla con dalla Gui e clicco poi su Bman, anziché rimanere la mouse overimage del parla, si setta quella dell'esamina. Come mai? Non trovo il comando negli script..


Non ricordo bene, ma credo che nella nove verbi dopo ogni azione venga lanciato un comando SetAction (...); che riporta le azione alle azioni di default, che nel tuo caso credo sia esamina. Guarda nella GUIscript, in "on mouse-click".

Inviato da: Squall_Leonheartil 17 Dec 2014, 16:39

Aspetta, ti posto il codice che non riesco a trovarla :S


CODICE
function on_mouse_click(MouseButton button) {
  
  if (!is_gui_disabled()) {
    int mrx=mouse.x+GetViewportX();
    int mry=mouse.y+GetViewportY();
    int x=mouse.x;
    int y=mouse.y;
    // get location under mouse cursor
    GSloctype=GetLocationType(x, y);
    GSlocname=Game.GetLocationName(x, y);
    GSagsusedmode=Mouse.Mode;
    used_action=global_action;
    
    InventoryItem*ii = InventoryItem.GetAtScreenXY(x, y);
    if (GSloctype==eLocationHotspot) {
      Hotspot*h=Hotspot.GetAtScreenXY(x, y);
      GSlocid=h.ID;
      
    }
    else if (GSloctype==eLocationCharacter) {
      Character*c=Character.GetAtScreenXY(x, y);
      GSlocid=c.ID;
    }
    else if (GSloctype==eLocationObject) {
      Object*o=Object.GetAtScreenXY(x, y);
      GSlocid=o.ID;
    }
    else if (ii!=null) GSlocid=ii.ID;
    
    
    
    
    if (IsGamePaused()) {
      // Game is paused, so do nothing (ie. don't allow mouse click)
    }
    // Mousebutton Left
    else if (button==eMouseLeft)
    {
        
      if (GlobalCondition(2) || GlobalCondition(3) || GlobalCondition(4)) {
        // Do nothing, if:
        // the mode is useinv and the mouse is over the active inv (like "use knife on knife")
        // or the mode is talk, or "Give", and the mouse isnt over a character
        // or its GIVE and the mouse isnt over a inv.item

      }
      else if (ExtensionEx(1, GSlocname)=='e') {
        UpdateActionBar();
        ActionLine.TextColor=ActionLabelColorHighlighted;
        WalkOffScreen();
      }
      // walk to
      else if (GSagsusedmode==eModeUsermode2) {
        ActionLine.TextColor=ActionLabelColorHighlighted;
        if (IsInteractionAvailable(x, y, GSagsusedmode)) ProcessClick (x, y, GSagsusedmode);
        else ProcessClick(x, y, eModeWalkto);
      }  
      // talkto
      else if (GSagsusedmode==eModeTalkto && IsInteractionAvailable(x, y, GSagsusedmode) && GSloctype==eLocationCharacter) {
        ActionLine.TextColor=ActionLabelColorHighlighted;
        if (GoToCharacter(character[GSlocid], eDir_None, NPC_facing_player, 1)) character[GSlocid].RunInteraction(GSagsusedmode);
        SetAction(eMA_Default);
      }
      // Giveto
      else if ((GSagsusedmode == eModeUseinv) && GSloctype==eLocationCharacter && isAction(eGA_GiveTo)) {
        ActionLine.TextColor=ActionLabelColorHighlighted;
        ItemGiven=player.ActiveInventory;
        
        if (GoToCharacter(character[GSlocid], eDir_None, NPC_facing_player, 2)) {
          if (IsInteractionAvailable (mrx - GetViewportX (), mry - GetViewportY (), eModeUseinv) == 1) {
            character[GSlocid].RunInteraction(eModeUseinv);        
          }
        }
        SetAction (eMA_Default);
      }    
      else {
        UpdateActionBar();
        ActionLine.TextColor=ActionLabelColorHighlighted;
        ProcessClick(x, y, GSagsusedmode);
        SetAction(eMA_Default);
        ItemGiven=null;
      }
    }
    // Mousebutton Right
     else if (button==eMouseRight) {
      if (alternative_action==eMA_Default) {
        SetAction(eMA_Default);
        ActionLine.TextColor=ActionLabelColorHighlighted;
        if (Mouse.Mode==eModeUsermode2) {
          if (ExtensionEx(1, GSlocname)=='e') {
            UpdateActionBar();
            ActionLine.TextColor=ActionLabelColorHighlighted;
            WalkOffScreen();
          }          
         else ProcessClick(x, y, eModeWalkto);
        }
        else ProcessClick(x, y, Mouse.Mode);
      }
      else
      {
        SetAction(alternative_action);
        used_action=global_action;
        UpdateActionBar();
        ActionLine.TextColor=ActionLabelColorHighlighted;
        GSagsusedmode=Mouse.Mode;
        if (GSagsusedmode==eModeTalkto && IsInteractionAvailable(x, y, GSagsusedmode) && GSloctype==eLocationCharacter) { //(GetCharacterAt (mouse.x, mouse.y) < 7))
          if (GoToCharacter(character[GSlocid], eDir_None, NPC_facing_player,2 )) character[GSlocid].RunInteraction(GSagsusedmode);
        }
        else ProcessClick(x, y, GSagsusedmode);
        SetAction(eMA_Default);
      }
    }
    //left click in inventory
    else if (button==eMouseLeftInv) {
      if (!isAction(eGA_GiveTo))ItemGiven= null;
  
      if (GlobalCondition (1)) {
        // if the mouse is in the inventory and modes Walk or pickup are selected
        SetAction (eGA_Use);
        location=GSinvloc;    
        if (Extension()=='u' && ii.IsInteractionAvailable(eModeInteract)) {
          // use it immediately (not with anything else)
          used_action=global_action;
          ii.RunInteraction(eModeInteract);
          SetAction(eMA_Default);
        }
        else {
          if (oldschool_inv_clicks) {
            SetAction (eGA_LookAt);
            used_action=global_action;
            ii.RunInteraction(eModeLookat);  
            SetAction(eMA_Default);
          }
          else player.ActiveInventory=ii;
        }
      }
      else  if (GlobalCondition (2) == 1) {
        // if the mode is useinv and the mouse is over the active inv (like "use knife on knife")
        // so do nothing again
      }
      else {
        used_action=global_action;
        if (Mouse.Mode==eModeInteract) {
          if (isAction(eGA_Use) && ii.IsInteractionAvailable(eModeInteract)) {
            ActionLine.TextColor=ActionLabelColorHighlighted;
            ii.RunInteraction(eModeInteract);
            SetAction(eMA_Default);
          }
          else player.ActiveInventory=ii;
        }
        else {
          if ( (Mouse.Mode >0 && Mouse.Mode <10 )&& ii != null) {
                GSagsusedmode=Mouse.Mode;
                ActionLine.TextColor=ActionLabelColorHighlighted;
                ii.RunInteraction(Mouse.Mode);
                SetAction(eMA_Default);
          }
        }
      }
    }
    //right click in inventory
    else if (button==eMouseRightInv) {
      if (alternative_action==eMA_Default) {
        SetAction(eMA_Default);
      }
      else {
        SetAction(alternative_action);
        used_action=global_action;
        GSagsusedmode=Mouse.Mode;
        if (Mouse.Mode==eModeInteract) {
          if (isAction(eGA_Use) && ii.IsInteractionAvailable(eModeInteract)) {
            UpdateActionBar();
            ActionLine.TextColor=ActionLabelColorHighlighted;
            ii.RunInteraction(eModeInteract);
            SetAction(eMA_Default);
          }
          else player.ActiveInventory=ii;
        }
        else {
          UpdateActionBar();
          ActionLine.TextColor=ActionLabelColorHighlighted;
          inventory[game.inv_activated].RunInteraction(Mouse.Mode);
          SetAction(eMA_Default);
        }
      }
    }
  }
}

function repeatedly_execute_always() {
  // Doubleclick Timer
  if (!IsGamePaused() && !is_gui_disabled()) {
    if (timer_run == true)
    {
      timer_click++;
      if (timer_click >= dc_speed){
        timer_click = 0;
        timer_run = false;
      }
    }
  }
}

function repeatedly_execute() {  
  if (!IsGamePaused() && !is_gui_disabled())
  {
    
    // --- for the MovePlayer function ---
    if (GScancelable==1) {
      GScancelable=0;
      if (InventoryItem.GetAtScreenXY(mouse.x, mouse.y)==null) on_mouse_click(eMouseLeft);
      else on_mouse_click(eMouseLeftInv);
    }
    else if (GScancelable==2) {
      GScancelable=0;
      CheckDefaultAction();
      if (InventoryItem.GetAtScreenXY(mouse.x, mouse.y)==null) on_mouse_click(eMouseRight);
      else on_mouse_click(eMouseRightInv);
    }
    CheckDefaultAction();
    UpdateActionBar();
  }
  // change the arrows in the inventory to show if you
  // can scroll the inventory:
  if (MainInv.TopItem>0) {
    // if inventory can scroll up
    InvUp.NormalGraphic=invUparrowONsprite;
    InvUp.MouseOverGraphic=invUparrowHIsprite;
    
    if (InventoryItem.GetAtScreenXY(gMaingui.X+MainInv.X+1, gMaingui.Y+MainInv.Y+1)==null) MainInv.TopItem-=MainInv.ItemsPerRow;
  }
  else {
    InvUp.NormalGraphic=invUparrowOFFsprite;
    InvUp.MouseOverGraphic=invUparrowOFFsprite;
  }
  //if inv can scroll down
  if (MainInv.TopItem<MainInv.ItemCount-(MainInv.ItemsPerRow * MainInv.RowCount)) {
    InvDown.NormalGraphic=invDownarrowONsprite;
    InvDown.MouseOverGraphic=invDownarrowHIsprite;
  }
  else{
    InvDown.NormalGraphic=invDownarrowOFFsprite;
    InvDown.MouseOverGraphic=invDownarrowOFFsprite;
  }
  
}

Inviato da: AprilSkiesil 17 Dec 2014, 18:18

SetAction(eMA_Default) ??

Prova a cambiare quello (o a toglierlo)
//SetAction(eMA_Default)

Se non va gli do un'occhiata appena torno a casa dal lavoro ^^

Inviato da: Squall_Leonheartil 17 Dec 2014, 19:53

Niente, continua :/

Inviato da: AprilSkiesil 18 Dec 2014, 11:38

CITAZIONE (Squall_Leonheart @ 17 Dec 2014, 19:53) *
Niente, continua :/


Probabilmente il comando è presente anche in altri punti.

non solo in mouse click.

USA lo strumento CERCA e sostituisci

SOSTITUISCI
SetAction(eMA_Default)
e anche SetAction (eMA_Default) (sia con lo spazio sia senza)

CON:

//SetAction(eMA_Default)



Inviato da: Squall_Leonheartil 18 Dec 2014, 14:24

Fatto, ma niente continua e, se modifico quelle negli if poi mi va in errore.. Ti posto tutto il guiscript.asc


CODICE
// Gui Script
// ================================ OPTIONS ===============================================
// ============================= EDIT FROM HERE ===========================================

// Setup the default Language (only affects the provided GUIs)
// Unhandled events can directly be changed in the function Unhandled()
// Currently supported languages:
// eLangEN (English)
// eLangDE (German)
// eLangES (Spanish)
// eLangFR (French)
// eLangIT (Italian)
int lang = eLangIT;          

int
ActionLabelColorNormal          = 15219,  // Colore usato dalla barra d'azio9ne
ActionLabelColorHighlighted     = 38555,  // highlighted colour used in action bar
invUparrowONsprite              = 124,    // sprite slot of the upper inv arrow / normal
invUparrowOFFsprite             = 0,    // sprite slot of the upper inv arrow / disabled
invUparrowHIsprite              = 137,    // sprite slot of the upper inv arrow / highlighted
invDownarrowONsprite            = 128,    //  "   "      "      lower   "   "      
invDownarrowOFFsprite           = 0,    //  "   "      "      lower   "   "
invDownarrowHIsprite            = 141,    //  "   "      "      lower   "   "
walkoffscreen_offset            = 30,     // offset used by WalkOffScreen and exit extensions
cursorspritenumber              = 265,     // used for semi-blockable movement
blankcursorspritenumber         = 266;     // used for semi-blockable movement
bool openDoorDoubleclick        = true;   // doubleclick on open doors changes room instantly
bool NPC_facing_player          = true;  // Non playable characters are facing
                                          // the player before talk-to and give-to
bool oldschool_inv_clicks       = true;  // turned on: right-click on inv items is lookat
                                          // turned off: right-click on inv items is use
              
// You can define Audioclips, which are being used in the doorscripts
#ifndef USE_OBJECT_ORIENTED_AUDIO
// In AGS 3.1 you have to assign a number:
//   openDoorSound = 15;
int openDoorSound   = 0,
    closeDoorSound  = 0,
    unlockDoorSound = 0;
#endif

#ifdef USE_OBJECT_ORIENTED_AUDIO
// In AGS 3.2 you do it this way:
//   Audioclip *openDoorSound = aDoorsound;
AudioClip*  openDoorSound,  
            closeDoorSound,
            unlockDoorSound;    
#endif

// ============================= EDIT UNTIL HERE ===========================================


// ========================== variables (not to edit) ======================================

String madetext;          // String that is shown in the action bar
String numbers;           // used by getInteger() to convert strings
String door_strings[6];   // default messages for the door script

int global_action;        // containing the current clicked action
int default_action;       // default action (most likely walk-to)
int alternative_action;   // right-click action
int used_action;          // used_action = global_action, if not cancelled
int GSagsusedmode;        // on_mouse_click -> unhandled_event
int GSloctype;            // the result of GetLocationType
int GSlocid;              // on_mouse_click ->
int GScancelable;         // MovePlayer
String GSlocname;         // on_mouse_click -> unhandled_event
String GSinvloc;          // locationname>extension
String SHOWNlocation;     // location translated
String location;          // The location name underneath the cursor
bool player_frozen;       // player can't move
bool disabled_gui;        // GUI disabled
int door_state[MAX_DOORS];              // Array for the door script
int action_button[A_COUNT_];            // Array containing the verb button Ids
int action_button_normal[A_COUNT_];     // contains the verb button sprites
int action_button_highlight[A_COUNT_];  // Contains the highlighted verb button sprites
int button_action[A_COUNT_];            // Array containg the related actions like eGA_LookAt

String tresult;           // translated result of the action mode, eg. "Look at %s"
String act_object;        // action_object - object used in action
String item;              // inventory item to be used or given
int GStopsaveitem = 0;    // top savegame element of the save GUI
int listBoxGap;           // used in the save-game dialog to determine a list-item's height
int dc_speed;             // double click speed, set in the game start section


int action_l_keycode[A_COUNT_]; // lower case keycodes for the verbs
int action_u_keycode[A_COUNT_]; // upper case keycodes for the verbs
InventoryItem*ItemGiven;        // Item given to a character
char key_l_yes, key_u_yes, key_l_no, key_u_no; // translated keys for yes and no
bool doubleclick;               // doubleclick occured
bool timer_run;                 // is doubleclick timer running
int timer_click;                // double click timer



// ============================= Helper functions ===========================================
function set_door_state(int door_id, int value) {
  door_state[door_id] = value;
}

int get_door_state(int door_id) {
  return door_state[door_id];
}

function init_object (int door_id, int obj){
  if (get_door_state(door_id) == 1) {
    object[obj].Visible=true;
    object[obj].Clickable=false;
  }
  else {
    object[obj].Visible=false;
    object[obj].Clickable=false;
  }
}

int Absolute(int value) {
  if (value<0) return -value;
  return value;
}

int Offset(int point1, int point2) {
  return Absolute(point1 - point2);
}

int getButtonAction(int action) {
  return button_action[action];
}

function disable_gui()
{
  disabled_gui=true;
  gMaingui.Visible=false;
  gAction.Visible=false;
}

function enable_gui()
{  
  disabled_gui=false;
  gMaingui.Visible=true;
  gAction.Visible=true;
  Wait(1);
}

bool is_gui_disabled() {
  return disabled_gui;
}

function set_double_click_speed(int speed){
dc_speed = speed;
}

// ============================= verb action functions ===========================================
function TranslateAction(int action, int tr_lang) {
  if (tr_lang == eLangDE) {
    if (action == eMA_WalkTo)   tresult="Gehe zu %s";
    else if (action == eGA_LookAt)   tresult="Schau %s an";
    else if (action == eGA_TalkTo)   tresult="Rede mit %s";
    else if (action == eGA_GiveTo) {
      if (item.Length>0)             tresult="Gib !s an %s";
      else                           tresult="Gib %s";
    }
    else if (action == eGA_PickUp)   tresult="Nimm %s";
    else if (action == eGA_Use) {
      if (item.Length>0)             tresult="Benutze !s mit %s";
      else                           tresult="Benutze %s";
    }
    else if (action == eGA_Open)     tresult="Öffne %s";
    else if (action == eGA_Close)    tresult="Schließe %s";
    else if (action == eGA_Push)     tresult="Drücke %s";
    else if (action == eGA_Pull)     tresult="Ziehe %s";
    else tresult=" ";  
  }
  else if (tr_lang == eLangES) {
    if (action == eMA_WalkTo)   tresult="Ir a %s";
    else if (action == eGA_LookAt)   tresult="Mirar %s";
    else if (action == eGA_TalkTo)   tresult="Hablar con %s";
    else if (action == eGA_GiveTo) {
      if (item.Length>0)             tresult="Dar !s a %s";
      else                           tresult="Dar %s";
    }
    else if (action == eGA_PickUp)   tresult="Coger %s";
    else if (action == eGA_Use) {
      if (item.Length>0)             tresult="Usar !s con %s";
      else                           tresult="Usar %s";
    }
    else if (action == eGA_Open)     tresult="Abrir %s";
    else if (action == eGA_Close)    tresult="Cerrar %s";
    else if (action == eGA_Push)     tresult="Empujar %s";
    else if (action == eGA_Pull)     tresult="Tirar de %s";
    else tresult=" ";    
  }
  else if (tr_lang == eLangFR) {
    if (action == eMA_WalkTo)   tresult="Aller vers %s";
    else if (action == eGA_LookAt)   tresult="Regarder %s";
    else if (action == eGA_TalkTo)   tresult="Parler à %s";
    else if (action == eGA_GiveTo) {
      if (item.Length>0)             tresult="Donner !s à %s";
      else                           tresult="Donner %s";
    }
    else if (action == eGA_PickUp)   tresult="Prendre %s";
    else if (action == eGA_Use) {
      if (item.Length>0)             tresult="Utiliser !s sur %s";
      else                           tresult="Utiliser %s";
    }
    else if (action == eGA_Open)     tresult="Ouvrir %s";
    else if (action == eGA_Close)    tresult="Fermer %s";
    else if (action == eGA_Push)     tresult="Pousser %s";
    else if (action == eGA_Pull)     tresult="Tirer %s";
    else tresult=" ";
  }  
  else if (tr_lang == eLangIT) {
    if (action == eMA_WalkTo)   tresult="%s";
    else if (action == eGA_LookAt)   tresult="Esamina %s";
    else if (action == eGA_TalkTo)   tresult="Parla con %s";
    else if (action == eGA_GiveTo) {
    if (item.Length>0)               tresult="Dai !s a %s";
    else                             tresult="Dai %s";
    }
    else if (action == eGA_PickUp)   tresult="Raccogli %s";
    else if (action == eGA_Use) {
    if (item.Length>0)               tresult="Usa !s con %s";
    else                             tresult="Usa %s";
    }
    else if (action == eGA_Open)     tresult="Apri %s";
    else if (action == eGA_Close)    tresult="Chiudi %s";
    else if (action == eGA_Push)     tresult="Premi %s";
    else if (action == eGA_Pull)     tresult="Tira %s";
    else tresult=" ";
  }    
  else {
    if (action == eMA_WalkTo)   tresult="Go to %s";
    else if (action == eGA_LookAt)   tresult="Look at %s";
    else if (action == eGA_TalkTo)   tresult="Talk to %s";
    else if (action == eGA_GiveTo) {
      if (item.Length>0)             tresult="Give !s to %s";
      else                           tresult="Give %s";
    }
    else if (action == eGA_PickUp)   tresult="Pick up %s";
    else if (action == eGA_Use) {
      if (item.Length>0)             tresult="Use !s with %s";
      else                           tresult="Use %s";
    }
    else if (action == eGA_Open)     tresult="Open %s";
    else if (action == eGA_Close)    tresult="Close %s";
    else if (action == eGA_Push)     tresult="Push %s";
    else if (action == eGA_Pull)     tresult="Pull %s";
    else tresult=" ";    
  }
  // fill object and item into action template
  tresult=GetTranslation(tresult);
  int ip=tresult.IndexOf("!s");
  if (ip>=0) {
    int op=tresult.Contains("%s");
    tresult=tresult.ReplaceCharAt(ip, '%');
    if (ip<op) tresult=String.Format(tresult, item, act_object);
    else       tresult=String.Format(tresult, act_object, item);
  }
  else         tresult=String.Format(tresult, act_object);
}

bool isAction(Action test_action) {
  return global_action == test_action;
}

function UsedAction(Action test_action) {
  return ((used_action == test_action) && (GSagsusedmode != eModeUseinv)) ||
         ((test_action == eGA_UseInv)  && (used_action == eGA_Use) && (GSagsusedmode == eModeUseinv)) ||
         ((test_action == eGA_GiveTo)  && (used_action == eGA_GiveTo) && (GSagsusedmode == eModeUseinv) && ItemGiven!=null);
}

function SetAction(Action new_action) {
  // set default action
//  if (new_action == eMA_Default) new_action=default_action;
  // set corresponding cursormode
       if (new_action == eMA_WalkTo) mouse.Mode=eModeUsermode2;
  else if (new_action == eGA_LookAt) mouse.Mode=eModeLookat;
  else if (new_action == eGA_TalkTo) mouse.Mode=eModeTalkto;
  else if (new_action == eGA_GiveTo) mouse.Mode=eModeInteract;
  else if (new_action == eGA_PickUp) mouse.Mode=eModePickup;
  else if (new_action == eGA_Use)    mouse.Mode=eModeInteract;
  else if (new_action == eGA_Open)   mouse.Mode=eModeUsermode1;
  else if (new_action == eGA_Close)  mouse.Mode=eModeUsermode1;
  else if (new_action == eGA_Push)   mouse.Mode=eModeUsermode1;
  else if (new_action == eGA_Pull)   mouse.Mode=eModeUsermode1;
  // save action
  global_action=new_action;
}
function SetDefaultAction(Action def_action) {
  default_action=def_action;
// SetAction(eMA_Default);
}

// ============================= Load/Save game ===========================================

function GetLucasSavegameListBox(ListBox*lb) {
  // stores savegames in slots 100-199
  String buffer, sgdesc;
  int maxsavegames, counter=0;
  maxsavegames=99;
  lb.Clear();
  while (counter<maxsavegames) {
    buffer=String.Format("%d.", counter+1);
    sgdesc=Game.GetSaveSlotDescription(counter+100);
    if (sgdesc==null) sgdesc="";
    buffer=buffer.Append(sgdesc);
    lb.AddItem(buffer);
    counter++;
  }
  lb.TopItem=GStopsaveitem;
  lb.SelectedIndex=-1;
}

// ============================= GlobalCondition ===========================================
int GlobalCondition(int parameter) {
  // here are some conditions that are used many times in the script
  int cond;
  InventoryItem*ii=InventoryItem.GetAtScreenXY(mouse.x, mouse.y);
  GUIControl*gc=GUIControl.GetAtScreenXY(mouse.x, mouse.y);
  int gcid=-1;
  if (gc!=null) gcid=gc.ID;
  // if the mouse is in the inventory and modes Walk or pickup are selected
  if (parameter == 1)
    cond = (ii != null && (isAction(eMA_WalkTo) || isAction(eGA_PickUp)));
  // if the mode is useinv and the mouse is over the active inv (like "use knife on knife")  
  else if (parameter == 2)
    cond =(player.ActiveInventory == ii && Mouse.Mode == eModeUseinv);
  // if the mode is talk, or "Give", and the mouse isnt over a character
  else if (parameter == 3)
    cond =((isAction(eGA_TalkTo) || (isAction(eGA_GiveTo) && (Mouse.Mode == eModeUseinv))) && (GetLocationType(mouse.x, mouse.y) != eLocationCharacter));
  // if its GIVE and the mouse isnt over a inv.item
  else if (parameter == 4)
    cond = ((Mouse.Mode == eModeInteract) && isAction(eGA_GiveTo) && (ii == null));
  return cond;
}
// ============================= Verb Extensions and actions ===========================================

char ExtensionEx(int index, String name){
  //returns the extension in the position 'index' of the string 'name'.
  //returns 0 if the name has no extension or if you passed an empty string.
  if (name.Length==0) return 0;//if you passed an empty string
  int pos;
  pos=name.IndexOf(">");
  if (pos==-1) return 0;
  else if (pos+index<name.Length) return name.Chars[pos+index];
  else return 0;
}

char Extension(){
  // Check the (first) extension (>*) of a string
  return ExtensionEx(1,location);
}

function RemoveExtension(){
  //removes the extension of a string  
  int pos = location.IndexOf(">");
  int length=location.Length;
  if (Extension()!=0)location=location.Truncate(pos);
  return pos;
}

function AddExtension(char extension) {
  //adds an extension to a thing that doesn't have one
  int length=location.Length;
  if (Extension()==0) {
    location=location.Append(">n");
    location=location.ReplaceCharAt(length+1, extension);
  }
}

function SetAlternativeAction(char extension, Action alt_action) {
  if (alt_action==eMA_Default) {
    if (Extension()==extension)
      alternative_action = alt_action;
  }
  else {
    int button=action_button[alt_action];
    int normalbuttonpic=action_button_normal[alt_action];
    int overbuttonpic=action_button_highlight[alt_action];
    // used for setting the default action given the extension.
    GUIControl*gc=gMaingui.Controls[button];
    Button*b=gc.AsButton;
    if (Extension()==extension) {
      b.NormalGraphic=overbuttonpic;
      alternative_action=alt_action;
    }
    else b.NormalGraphic=normalbuttonpic;
    b.MouseOverGraphic=overbuttonpic;
  }
}

// Door extension for Open/Close
function OpenCloseExtension(int door_id) {
  if ((get_door_state(door_id)==0) || (get_door_state(door_id)==2)) AddExtension('o');
  else AddExtension('c');
}

function VariableExtensions() {
  // define here, which things will use a variable extension (>v)
  // by default, it's only used for doors.
  int r=player.Room;
  Object*oo=Object.GetAtScreenXY(mouse.x, mouse.y);
  int o=0;
  if (oo!=null) o=oo.ID;
  Hotspot*hh=Hotspot.GetAtScreenXY(mouse.x, mouse.y);
  int h=hh.ID;
  
  // Open/Close Extension:
  // Room | Hotspot |(Door_id)
       if (r==1 && h == 1)  OpenCloseExtension (20);
  //else if (r==2  && h == 2)  OpenCloseExtension (3);
  
  // Other possible extensions could be: Turn On/Turn Off
}

function CheckDefaultAction() {
  // you could want to change which extension activates which default action, or which button sprite
  // it changes. The extensions are characters, so remember to put them with single ', not ".
  int x=mouse.x;
  int y=mouse.y;
  location=Game.GetLocationName(x, y);
  if (Extension()==0) {
    // Setting default modes if the thing has no extension:
    if (GetLocationType(x, y)==eLocationCharacter) // if it is a character
      AddExtension('t'); // set default action "talk to"
    else if ((GetLocationType(x, y)!=eLocationNothing) || (InventoryItem.GetAtScreenXY(x, y)!=null))
      // if its an inv item, a hotspot or an object
      AddExtension('l'); // set default action "look at"
    else
      AddExtension('n'); // set default action "none"
  }
  else if (Extension()=='v') { // if the default action depends on some events
    RemoveExtension();
    VariableExtensions();
  }
  if (GlobalCondition(2) || GlobalCondition(3) || GlobalCondition(4) || GlobalCondition(5))
    //Dont send the name of the hotspt/obj/char/inv to the action bar and set default action "none"
    location=">n";

  GSinvloc=location;
  
  // Set "Look" as default action for Inv items
  if ((Extension()=='u') && (InventoryItem.GetAtScreenXY(x, y) != null)) {
    // it's an inv item
    RemoveExtension();
    AddExtension('l'); // set default action "look at"
  }
  
// SetAlternativeAction('n', eMA_Default);
  SetAlternativeAction('g', eGA_GiveTo);
  SetAlternativeAction('p', eGA_PickUp);
  SetAlternativeAction('u', eGA_Use);
  SetAlternativeAction('o', eGA_Open);
  SetAlternativeAction('l', eGA_LookAt);
  SetAlternativeAction('s', eGA_Push);
  SetAlternativeAction('c', eGA_Close);
  SetAlternativeAction('t', eGA_TalkTo);
  SetAlternativeAction('y', eGA_Pull);  
  RemoveExtension();
  SHOWNlocation=location;
}
// ============================= ActionBar ===========================================

function UpdateActionBar (){
  // set the text in the action bar
  int action = global_action;

  act_object=SHOWNlocation;
  item="";
  if (Mouse.Mode==eModeUseinv) { // use or give inventory item
    item=player.ActiveInventory.Name;
    location=item;
    RemoveExtension();
    item=location;
  }
  else if (GlobalCondition (1)) { // if the mouse is in the inventory and modes Walk or pickup are selected
    if (oldschool_inv_clicks) action=eGA_LookAt;
    else action=eGA_Use;
  }
  
  TranslateAction(action, lang);
  madetext=tresult;
  // show action text
  ActionLine.Text=madetext;
  ActionLine.TextColor=ActionLabelColorNormal;
}


// ============================= translation ===========================================

String clearToSpace(String text) {
  int p=0;
  // ignore white spaces at the beginning
  while (p<text.Length && text.Chars[p]==' ') {
    p++;
  }
  // write white spaces until next white space
  while (p<text.Length && text.Chars[p]!=' ') {
    text=text.ReplaceCharAt(p, ' ');
    p++;
  }
  return text;
}

int getInteger() {
  int r=numbers.AsInt;
  numbers=clearToSpace(numbers);
  return r;
}

function SetActionButtons(Action action, String button_definition) {
  // extract data from button_definition
  String bd;
  
  if (IsTranslationAvailable ())
    bd=GetTranslation(button_definition);
  else {
    bd=button_definition;
  }
  
  bd=clearToSpace(bd);
  numbers=bd;
  action_button[action]=getInteger();
  action_button_normal[action]=getInteger();
  action_button_highlight[action]=getInteger();
  bd=numbers;
  int p=bd.Length-1;
  while (p>0) {
    action_l_keycode[action]=bd.Chars[p];
    p--;
    action_u_keycode[action]=bd.Chars[p];
    if (action_l_keycode[action]!=' ') p=0;
  }
  button_action[action_button[action]]=action;

}

function AdjustLanguage() {
  
  // English
  if (lang == eLangEN){
    // yes/no-keys
    key_u_yes= 'Y';
    key_l_yes= 'y';
    key_u_no= 'N';
    key_l_no= 'n';
    
    // (eNum Name, Name, GUI Button ID, Sprite-Normal, Sprite-Highlight, Keyboard-Shortcut)
    SetActionButtons(eGA_GiveTo, "a_button_give    0  125  138 Qq");
    SetActionButtons(eGA_PickUp, "a_button_pick_up 1  126  139 Ww");
    SetActionButtons(eGA_Use,    "a_button_use     2  127  140 Ee");
    SetActionButtons(eGA_Open,   "a_button_open    3  129  142 Aa");
    SetActionButtons(eGA_LookAt, "a_button_look_at 4  134  147 Ss");
    SetActionButtons(eGA_Push,   "a_button_push    5  131  144 Dd");
    SetActionButtons(eGA_Close,  "a_button_close   6  133  146 Zz");
    SetActionButtons(eGA_TalkTo, "a_button_talk_to 7  130  143 Xx");
    SetActionButtons(eGA_Pull,   "a_button_pull    8  135  148 Cc");  
  }
  // German
  else if (lang == eLangDE) {
    // yes/no-keys
    key_u_yes= 'J';
    key_l_yes= 'j';
    key_u_no= 'N';
    key_l_no= 'n';    
    // (eNum Name, Name, GUI Button ID, Sprite-Normal, Sprite-Highlight, Keyboard-Shortcut)
    SetActionButtons(eGA_GiveTo, "a_button_give    0 157 166 Qq");
    SetActionButtons(eGA_Use,    "a_button_use     1 158 167 Ww");
    SetActionButtons(eGA_PickUp, "a_button_pick_up 2 159 168 Ee");
    SetActionButtons(eGA_Open,   "a_button_open    3 160 169 Aa");
    SetActionButtons(eGA_Close,  "a_button_close   4 161 170 Ss");  
    SetActionButtons(eGA_TalkTo, "a_button_talk_to 5 162 171 Dd");
    SetActionButtons(eGA_LookAt, "a_button_look_at 6 163 172 Yy");
    SetActionButtons(eGA_Push,   "a_button_push    7 164 173 Xx");
    SetActionButtons(eGA_Pull,   "a_button_pull    8 165 174 Cc");
  }
  // Spanish
  else if (lang == eLangES) {
    // yes/no-keys
    key_u_yes= 'S';
    key_l_yes= 's';
    key_u_no= 'N';
    key_l_no= 'n';    
    // (eNum Name, Name, GUI Button ID, Sprite-Normal, Sprite-Highlight, Keyboard-Shortcut)
    SetActionButtons(eGA_GiveTo, "a_button_give    0  6    11  Qq");
    SetActionButtons(eGA_TalkTo, "a_button_talk_to 1  18   17  Ww");
    SetActionButtons(eGA_Use,    "a_button_use     2  4    145 Ee");
    SetActionButtons(eGA_Open,   "a_button_open    3  5    2   Aa");
    SetActionButtons(eGA_Close,  "a_button_close   4  8    7   Ss");
    SetActionButtons(eGA_PickUp, "a_button_pick_up 5  10   9   Dd");
    SetActionButtons(eGA_LookAt, "a_button_look_at 6  122  75  Zz");
    SetActionButtons(eGA_Push,   "a_button_push    7  14   13  Xx");
    SetActionButtons(eGA_Pull,   "a_button_pull    8  16   15  Cc");  
  }  
  // French
  else if (lang == eLangFR) {
    // yes/no-keys
    key_u_yes= 'O';
    key_l_yes= 'o';
    key_u_no= 'N';
    key_l_no= 'n';    
    // (eNum Name, Name, GUI Button ID, Sprite-Normal, Sprite-Highlight, Keyboard-Shortcut)
    SetActionButtons(eGA_GiveTo, "a_button_give    0  149  184 Qq");
    SetActionButtons(eGA_PickUp, "a_button_pick_up 1  176  185 Ww");
    SetActionButtons(eGA_Use,    "a_button_use     2  177  186 Ee");
    SetActionButtons(eGA_Open,   "a_button_open    3  178  187 Aa");
    SetActionButtons(eGA_TalkTo, "a_button_talk_to 4  179  188 Xx");
    SetActionButtons(eGA_Push,   "a_button_push    5  180  189 Dd");
    SetActionButtons(eGA_Close,  "a_button_close   6  181  190 Zz");
    SetActionButtons(eGA_LookAt, "a_button_look_at 7  182  191 Ss");
    SetActionButtons(eGA_Pull,   "a_button_pull    8  183  175 Cc");  
  }    
  // Italian
  else if (lang == eLangIT) {
    // yes/no-keys
    key_u_yes= 'S';
    key_l_yes= 's';
    key_u_no= 'N';
    key_l_no= 'n';    
    // (eNum Name, Name, GUI Button ID, Sprite-Normal, Sprite-Highlight, Keyboard-Shortcut)
    SetActionButtons(eGA_GiveTo, "a_button_give    0  193  200 Qq");
    SetActionButtons(eGA_PickUp, "a_button_pick_up 1  195  203 Ww");
    SetActionButtons(eGA_Use,    "a_button_use     2  196  204 Ee");
    SetActionButtons(eGA_Open,   "a_button_open    3  197  205 Aa");
    SetActionButtons(eGA_TalkTo, "a_button_talk_to 4  198  206 Xx");
    SetActionButtons(eGA_Push,   "a_button_push    5  199  207 Dd");
    SetActionButtons(eGA_Close,  "a_button_close   6  201  213 Zz");
    SetActionButtons(eGA_LookAt, "a_button_look_at 7  202  214 Ss");
    SetActionButtons(eGA_Pull,   "a_button_pull    8  194  215 Cc");  
  }    
  
  // --- load font corresponding to language and screen width ---
  String font_info;
  if (System.ScreenWidth<640)
    font_info=GetTranslation("font_lowres: 4  4  4  4  4  4  4  4  4  4  4  4  4  4  4  4  4  4  4  4");
  else
    font_info=GetTranslation("font_hires: 4  4  4  4  4  4  4  4  4  4  4  4  4  4  4  4  4  4  4  4");
    //Game.NormalFont
    //    font_info=GetTranslation("font_lowres: 1  0  0  0  0  0  0  0  3  0  0  0  0  0  0  0  0  0  3  3");
  //else
    //font_info=GetTranslation("font_hires: 1  0  0  0  0  0  0  0  3  0  0  0  0  0  0  0  0  0  3  3");
  font_info=clearToSpace(font_info);
  numbers=font_info;
  
  // Setting the fonts from the string: font_info
  Game.SpeechFont       = getInteger(); // Speech
  ActionLine.Font       = getInteger(); // Status-Line
  Game.NormalFont       = getInteger(); // Dialog GUI
  OptionsTitle.Font     = getInteger(); // Options-GUI Title
  OptionsSave.Font      = getInteger(); // Options-GUI Save Button
  OptionsLoad.Font      = getInteger(); // Options-GUI Load Button
  OptionsQuit.Font      = getInteger(); // Options-GUI Quit Button
  OptionsPlay.Font      = getInteger(); // Options-GUI Play Button
  gPausedText.Font      = getInteger(); // Game Paused Message
  OptionsDefault.Font   = getInteger(); // Options-GUI Default Button
  OptionsMusic.Font     = getInteger(); // Options-GUI Music Label
  OptionsSpeed.Font     = getInteger(); // Options-GUI Gamespeed Label
  OptionsRestart.Font   = getInteger(); // Options-GUI Restart Button
  RestoreTitle.Font     = getInteger(); // Restore-GUI Title
  RestoreCancel.Font    = getInteger(); // Restore-GUI Cancel Button
  SaveTitle.Font        = getInteger(); // Save-GUI Title
  SaveOK.Font           = getInteger(); // Save-GUI Okay Button
  SaveCancel.Font       = getInteger(); // Save-GUI Cancel Button
  gConfirmexitText.Font = getInteger(); // Confirm Exit Message
  gRestartText.Font     = getInteger(); // Restart Game Message
}

function AdjustGUIText() {

  // English
  if (lang == eLangEN){
    // english is the default language, nothing to adjust
    return;
  }
  else if (lang == eLangDE) {
    // German
    OptionsTitle.Text   = "Optionen";
    OptionsMusic.Text   = "Musik Lautstärke";
    OptionsSound.Text   = "Sound Effekte";
    OptionsSpeed.Text   = "Geschwindigkeit";
    OptionsDefault.Text = "Standard";
    OptionsSave.Text    = "Speichern";
    OptionsLoad.Text    = "Laden";
    OptionsRestart.Text = "Neustart";
    OptionsQuit.Text    = "Beenden";
    OptionsPlay.Text    = "Weiter";
    gPausedText.Text    = "Pause. Leertaste für weiter";
    RestoreTitle.Text   = "Wählen Sie ein Spiel zum Laden";
    RestoreCancel.Text  = "Abbruch";
    SaveTitle.Text      = "Name für das Spiel";
    SaveOK.Text         = "Speichern";
    SaveCancel.Text     = "Abbruch";
    gConfirmexitText.Text = "Möchten Sie das Spiel beenden? (J/N)";
    gRestartText.Text   = "Möchten Sie das Spiel neu starten? (J/N)";
  }
  else if (lang == eLangES) {
    // Spanish
    OptionsTitle.Text   = "Opciones";
    OptionsMusic.Text   = "Volumen de la música";
    OptionsSound.Text   = "Efectos de sonido ";
    OptionsSpeed.Text   = "Velocidad de juego";
    OptionsDefault.Text = "Restablecer";
    OptionsSave.Text    = "Guardar";
    OptionsLoad.Text    = "Cargar";
    OptionsRestart.Text = "Reiniciar";
    OptionsQuit.Text    = "Salir";
    OptionsPlay.Text    = "Volver";
    gPausedText.Text    = "Juego en pausa. Pulsa Espacio para continuar";
    RestoreTitle.Text   = "Por favor, elige el juego a cargar";
    RestoreCancel.Text  = "Cancelar";
    SaveTitle.Text      = "Por favor, introduce un nombre";
    SaveOK.Text         = "Guardar";
    SaveCancel.Text     = "Cancelar";
    gConfirmexitText.Text = "¿Seguro que quieres salir? (S/N)";
    gRestartText.Text   = "¿Seguro que quieres reiniciar? (S/N)";  
  }
  else if (lang == eLangFR) {
    // French
    OptionsTitle.Text   = "Paramètres";
    OptionsMusic.Text   = "Volume de la musique";
    OptionsSound.Text   = "Volume des sons";
    OptionsSpeed.Text   = "Vitesse du jeu";
    OptionsDefault.Text = "Réinitialiser";
    OptionsSave.Text    = "Sauver";
    OptionsLoad.Text    = "Charger";
    OptionsRestart.Text = "Redémarrer";
    OptionsQuit.Text    = "Quitter";
    OptionsPlay.Text    = "Reprendre";
    gPausedText.Text    = "PAUSE. Appuyez sur la barre d'espacement pour reprendre";
    RestoreTitle.Text   = "Choisissez une partie à charger";
    RestoreCancel.Text  = "Annuler";
    SaveTitle.Text      = "Saisissez un nom";
    SaveOK.Text         = "Sauver";
    SaveCancel.Text     = "Annuler";
    gConfirmexitText.Text = "Voulez-vous vraiment quitter? (O/N)";
    gRestartText.Text   = "Voulez-vous vraiment redémarrer? (O/N)";
  }  
  else if (lang == eLangIT) {
    // Italian
   OptionsTitle.Text   = "Opzioni";
   OptionsMusic.Text   = "Volume della Musica";
   OptionsSound.Text   = "Effetti Sonori";
   OptionsSpeed.Text   = "Velocita' del Gioco";
   OptionsDefault.Text = "Default";
   OptionsSave.Text    = "Salva";
   OptionsLoad.Text    = "Carica";
   OptionsRestart.Text = "Ricomincia";
   OptionsQuit.Text    = "Esci";
   OptionsPlay.Text    = "Continua";
   gPausedText.Text    = "Partita in Pausa. Premi Spazio per Continuare";
   RestoreTitle.Text   = "Scegli una partita da caricare";
   RestoreCancel.Text  = "Cancella";
   SaveTitle.Text      = "Inserisci un nome";
   SaveOK.Text         = "Salva";
   SaveCancel.Text     = "Cancella";
   gConfirmexitText.Text = "Vuoi davvero uscire? (S/N)";
   gRestartText.Text   = "Vuoi davvero ricominciare? (S/N)";
  }  
}
// ============================= Player function ===========================================
function freeze_player(){player_frozen = true;}

function unfreeze_player(){player_frozen = false;}

function FaceDirection(this Character*, eDirection dir) {
  int dx;
  if (dir==eDir_Left) dx=-1;
  if (dir==eDir_Right) dx=1;
  int dy;
  if (dir==eDir_Up) dy=-1;
  else if (dir==eDir_Down) dy=1;
  this.FaceLocation(this.x+dx, this.y+dy);

}


function SetPlayer(Character*ch) {
  //use this instead of SetPlayerCharacter function.
  if (player.Room==ch.Room) { // if old and new player character are in the same room then scroll room
    int x=GetViewportX();
    int tx=ch.x-160;
    if (tx<0) tx = 0;
    else if (tx>Room.Width-320) tx=Room.Width-320;
    SetViewport(x, GetViewportY());
    while (x<tx) {
      x+=X_SPEED;
      if (x>tx) x=tx;
      SetViewport(x, GetViewportY());
      Wait(1);
    }
    while (x>tx) {
      x -= X_SPEED;
      if (x<tx) x=tx;
      SetViewport(x, GetViewportY());
      Wait (1);
    }
  }
  else // if they are in different rooms
    player.StopMoving();
    player.Clickable=true;
    ch.Clickable=false;
    ch.SetAsPlayer();
    ReleaseViewport();
}

int MovePlayerEx(int x, int y, WalkWhere direct) {
  // Move the player character to x,y coords, waiting until he/she gets there,
  // but allowing to cancel the action by pressing a mouse button.
  if (player_frozen==false) {
    //mouse.ChangeModeGraphic(eModeWait, cursorspritenumber);
    mouse.ChangeModeView(eModeWait, 21);
    GScancelable = 0;
    player.Walk(x, y, eBlock,  direct);  
    //player.Walk(x, y, eNoBlock, direct);
    // wait for release of mouse button
    while (player.Moving && (mouse.IsButtonDown(eMouseLeft) || mouse.IsButtonDown(eMouseRight))) {
      Wait(1);
      mouse.Update();
      CheckDefaultAction();
    }
    // abort moving on new mouse down
    while (player.Moving) {
      int xm=mouse.x;
      int ym=mouse.y;
      InventoryItem*ii=InventoryItem.GetAtScreenXY(xm, ym);
      if (mouse.IsButtonDown(eMouseLeft) && (GUI.GetAtScreenXY(xm, ym)==null || ii!=null)) {
        player.StopMoving();
        GScancelable = 1;
      }
      else if (mouse.IsButtonDown(eMouseRight) && (GUI.GetAtScreenXY(xm, ym)==null || ii!=null)) {
        player.StopMoving();
        GScancelable = 2;
      }
      else {
        Wait(1);
        mouse.Update();
        CheckDefaultAction ();
      }
    }
    mouse.ChangeModeGraphic(eModeWait, blankcursorspritenumber);
    //if (GScancelable==0) return 1;
    //BUG FIX: AdventureTreff:
    if (GScancelable==0 && player.x==x && player.y==y) return 2;
    else if (GScancelable == 0) return 1;
    else return 0;
  }
  else return 0;
}

int MovePlayer(int x, int y) {
  //Move the player character to x,y coords, waiting until he/she gets there, but allowing to cancel the action
  //by pressing a mouse button.
  return MovePlayerEx (x, y, eWalkableAreas);
}

// ============================= Go ===========================================
int GoToCharacterEx(Character*chwhogoes, Character*ch, eDirection dir, int xoffset, int yoffset, bool NPCfacesplayer, int blocking) {
  //Goes to a character staying at the side defined by 'direction': 1 up, 2 right, 3 down, 4 left
  //and it stays at xoffset or yofsset from the character. NPCfacesplayer self-explained.;)
  // blocking: 0=non-blocking; 1=blocking; 2=semi-blocking
  Character*pl=chwhogoes;
  int chx, chy;
  chx=ch.x;
  chy=ch.y;
  int arrived=1;
  if (Offset(pl.x, chx)>xoffset || Offset(pl.y, chy)>yoffset) {
    if (dir==eDir_None) {
      // get the nearest position
      if (Offset (chx, pl.x)>=Offset(chy, pl.y)) {
        // right or left
        if (pl.x>=chx) dir=eDir_Right; //right
        else dir=eDir_Left; //left
      }
      else {
        if (pl.y>=chy) dir=eDir_Down; //abajo
        else dir=eDir_Up;
      }
    }
    // calculate target position
    if (dir==eDir_Up) chy-=yoffset;
    else if (dir==eDir_Right) chx+=xoffset;
    else if (dir==eDir_Down) chy+=yoffset;
    else if (dir==eDir_Left) chx-=xoffset;
    // move character
    if (blocking==0) {
      pl.Walk(chx, chy);
      arrived=0;
    }
    else if (blocking==1) {
      pl.Walk(chx, chy, eBlock, eWalkableAreas);
      arrived=1;
    }
    else if (blocking==2) arrived=MovePlayer(chx, chy);
  }
  if (arrived>0) {
    // characters only face each other after the moving character arrived at the target point
    if (NPCfacesplayer) ch.FaceCharacter(pl, eBlock);
    pl.FaceCharacter(ch, eBlock);
  }
  return arrived;
}

int NPCGoToCharacter(Character*chwhogoes, Character*chtogoto, eDirection dir, bool NPCfacesplayer, int blocking) {
  // same as above but with default x and y offset.
  int defaultxoffset=35;
  int defaultyoffset=20;
  return GoToCharacterEx (chwhogoes, chtogoto, dir, defaultxoffset, defaultyoffset, NPCfacesplayer, blocking);
}

int GoToCharacter(Character*ch, eDirection dir, bool NPCfacesplayer, int blocking) {
  // same as above but with default x and y offset.
  int defaultxoffset=35;
  int defaultyoffset=20;
  return GoToCharacterEx (player, ch, dir, defaultxoffset, defaultyoffset, NPCfacesplayer, blocking);
}

function GoTo(int blocking) {
  // Goes to whatever the player clicked on.
  // blocking: 0=non-blocking; 1=blocking; 2=semi-blocking
  int xtogo, ytogo;
  int locationtype=GetLocationType(mouse.x, mouse.y);
  Hotspot*hot_spot=Hotspot.GetAtScreenXY(mouse.x, mouse.y);
  int arrived=0;
  if (locationtype==eLocationCharacter)
    arrived=GoToCharacter(Character.GetAtScreenXY(mouse.x, mouse.y), eDir_None, false, blocking);
  else {
    if (locationtype==eLocationHotspot && hot_spot.ID>0) {
      xtogo=hot_spot.WalkToX;
      ytogo=hot_spot.WalkToY;
    }
    if (locationtype==eLocationObject) {
      Object*obj=Object.GetAtScreenXY(mouse.x, mouse.y);
      xtogo=obj.X;
      ytogo=obj.Y;
    }
    if (hot_spot==hotspot[0]) {
      xtogo=mouse.x;
      ytogo=mouse.y;
    }
    else {
      xtogo=mouse.x;
      ytogo=mouse.y;
    }
    xtogo+=GetViewportX ();
    ytogo+=GetViewportY ();
    if (blocking==0) player.Walk(xtogo, ytogo);
    else if (blocking==1) {
      player.Walk(xtogo, ytogo, eBlock);
      arrived=1;
    }
    else if (blocking==2) arrived=MovePlayer(xtogo, ytogo);
  }
  return arrived;
}

function Go() {
  // Go to whatever the player clicked on. You can cancel the action, and returns 1 if the player has gone to it.
  return GoTo(2);
}

function WalkOffScreen(){
//handles the action of hotspots with exit extension ('>e').
//double click in such hotspots/objects... will make the player skip
//walking to it. Look the documentation for more information on exits.
  
  // doubleclick
  if (UsedAction(eMA_WalkTo)) {
    if (timer_run == true)
    {
      timer_run=false;
      if (MovePlayerEx(player.x,player.y,eWalkableAreas)>0) hotspot[GSlocid].RunInteraction(eModeUsermode1);
    }
    else
    {
      //doubleclick = false;
      timer_run = true;
      if (Go()){
        int x=player.x,y=player.y;
        int offset=walkoffscreen_offset;
        int dir=ExtensionEx(2,GSlocname);
        if      (dir=='u') y-=offset;
        else if (dir=='d') y+=offset;
        else if (dir=='l') x-=offset;
        else if (dir=='r') x+=offset;
        if (MovePlayerEx(x,y,eAnywhere)>0){
          hotspot[GSlocid].RunInteraction(eModeUsermode1);
        }
      }    
    }
  }
}

// ============================= Unhandled Events ===========================================

  // Please check this section and replace the boring default values with your own.
  // If you courious, how it all works, keep on reading this comment ;-)
  //
  //Check modes with: if(UsedAction(A_???)), check types by if(type==#). types:
  // 1   a hotspot
  // 2   a character
  // 3   an object
  // 4   an inventory item.
  // 5   inv. item on hotspot
  // 6   inv. item on character
  // 7   inv. item on object
  // 8   inv. item on inv. item
  //
  // You have the string "locationname" that is the name of
  // what you clicked on, and the string "usedinvname" that is
  // the name of the item that was used on where you clicked (only for types 5,6,7,8)
    
function Unhandled(int door_script) {
  InventoryItem*ii=InventoryItem.GetAtScreenXY(mouse.x, mouse.y);
  int type=0;
  if (GSloctype==eLocationHotspot) type=1;
  if (GSloctype==eLocationCharacter) type=2;
  if (GSloctype==eLocationObject) type=3;
  String locationname=GSlocname;
  String usedinvname;
  String translation;
  translation=Game.TranslationFilename;
  location=locationname;
  RemoveExtension();
  locationname=location;
  if (ii!=null) type = 4;
  if (GSagsusedmode == eModeUseinv) {
    if (ii!=null) {
      usedinvname=ii.Name;
      location=usedinvname;
      RemoveExtension();
      usedinvname=location;
      if (type>0) type+=4;
    }
  }
  if (GSagsusedmode!=eModeUsermode2 && type!=0) {
    if (type==2 || type==6) player.FaceCharacter(character[GSlocid], eBlock);

    // unhandled USE
    if (UsedAction(eGA_Use)) {
      // use inv on inv
      if (type >= 5) player.Say("That won't do any good.");
      // use
      else player.Say("I can't use that.");
    }
    
    // unhandled LOOK AT  
    else if (UsedAction(eGA_LookAt)) {
      // look at hotspots, objects etc.
      if (type!=2) player.Say ("Nice %s", locationname);
      // look at characters
      else player.Say("It's %s",locationname);
    }
    
    // unhandled PUSH
    else if (UsedAction(eGA_Push)) {
      // push everything except characters
      if (type!=2) player.Say("I can't push that.");
      // push characters
      else player.Say("I can't push %s",locationname);
    }
    
    // unhandled PULL
    else if (UsedAction(eGA_Pull)){
      // pull everything except characters
      if (type!=2) player.Say("I can't pull that.");
      // pull characters
      else player.Say("I can't pull %s",locationname);
    }
    
    // unhandled CLOSE
    else if (UsedAction(eGA_Close)){
      if (door_script == 1) player.Say("It has already been closed.");
      else if (type == 2) player.Say("Doing that with %s is not a good idea.",locationname);
      else player.Say("I can't close that.");
    }
    
    // unhandled OPEN
    else if (UsedAction(eGA_Open)) {
      if (door_script == 1) player.Say("It is already open.");
      else if (type ==2) player.Say("%s would not like it.",locationname);
      else player.Say("I can't open that.");
    }
    
    // unhandled PICKUP
    else if (UsedAction(eGA_PickUp)) {
      if (type!=2) player.Say("I don't need that.");
      else player.Say("I don't want to pick %s up.",locationname);
    }

    // unhandled TALK TO
    else if (UsedAction(eGA_TalkTo)) {
      if (type==2) player.Say("I don't want to talk to %s", locationname);
      else player.Say("I have nothing to say.");
    }
    
    // unhandled USE INV
    else if (UsedAction(eGA_UseInv)) player.Say("That won't do any good.");
    
    // unhandled GIVE
    else if (ItemGiven != null) player.Say("I'd rather keep it.");  
    
    // unhandled DEFAULT
    else if (type==4) player.Say("I can't do that.");

  }
}

// ============================= interaction functions ===========================================
function EnterRoom(this Character*, int newRoom, int x, int y, eDirection dir, bool onWalkable) {
  this.ChangeRoom(newRoom, x, y);
  if (onWalkable) this.PlaceOnWalkableArea();
  this.FaceDirection(dir);
}

function any_click_move (int x, int y, eDirection dir) {
  int result=MovePlayer(x, y);
  if (result) {
    player.FaceDirection(dir);
    Wait(5);
  }
  return result;
}

function any_click_walk(int x, int y, eDirection dir){
  int result=1;
  if (UsedAction(eMA_WalkTo)) any_click_move(x, y, dir);
  else result=0;
  return result;
  // 0 = unhandled
  // 1 = handled
}

function any_click_walk_look(int x, int y, eDirection dir, String lookat){
  int result=any_click_walk(x, y, dir);
  //if (result==0 && UsedAction(eGA_LookAt) && lookat.Length>0) {
  if (result==0 && lookat.Length>0) {
    result=1;
    if (any_click_move(x, y, dir)) {
      player.Say(lookat);
    }
  }
  return result;
  // 0 = unhandled
  // 1 = handled
}

function any_click_use_inv(InventoryItem*iitem, int x, int y, eDirection dir) {
  int result=0;
  if (UsedAction(eGA_UseInv)) {
    if (player.ActiveInventory==iitem) {
      if (any_click_move (x, y, dir)) result = 2;
      else                            result = 1;
    }
  }
  return result;
  // 0 = unhandled
  // 1 = handled, but canceled
  // 2 = use this item
}

#ifdef USE_OBJECT_ORIENTED_AUDIO
function any_click_walk_look_pick(int x, int y, eDirection dir, String lookat, int obj, InventoryItem*iitem, AudioClip *sound) {
  AudioChannel *chan;
  int result=MovePlayer(x, y);
  if (result>0 && UsedAction(eGA_PickUp)) {
    if (any_click_move (x, y, dir)) {
      if (lookat.Length>0) player.Say(lookat);
      if (sound != null)chan = sound.Play();
      if (obj>=0) object[obj].Visible=false;
      if (iitem!=null) player.AddInventory(iitem);
      result=2;
    }
  }
  return result;
  // 0 = unhandled
  // 1 = handled, but canceled
  // 2 = picked up
}
#endif

#ifndef USE_OBJECT_ORIENTED_AUDIO
function any_click_walk_look_pick(int x, int y, eDirection dir, String lookat, int obj, InventoryItem*iitem, int sound) {
  int result=MovePlayer(x, y);
  if (result>0 && UsedAction(eGA_PickUp)) {
    if (any_click_move (x, y, dir)) {
      if (lookat.Length>0) player.Say(lookat);
      if (sound != 0)PlaySound(sound);
      if (obj>=0) object[obj].Visible=false;
      if (iitem!=null) player.AddInventory(iitem);
      result=2;
    }
  }
  return result;
  // 0 = unhandled
  // 1 = handled, but canceled
  // 2 = picked up
}
#endif
// ============================= Door functions ==========================================

function set_door_strings(String lookat, String islocked, String wrongitem, String closefirst, String unlock, String relock) {
  door_strings[0]=lookat;
  door_strings[1]=islocked;
  door_strings[2]=wrongitem;
  door_strings[3]=closefirst;
  door_strings[4]=unlock;
  door_strings[5]=relock;

}

String get_door_strings(String what_type) {
  String ret_value;
  
       if (what_type == "lookat")     ret_value= door_strings[0];
  else if (what_type == "islocked")   ret_value= door_strings[1];
  else if (what_type == "wrongitem")  ret_value= door_strings[2];
  else if (what_type == "closefirst") ret_value= door_strings[3];
  else if (what_type == "unlock")     ret_value= door_strings[4];
  else if (what_type == "relock")     ret_value= door_strings[5];
  else ret_value= "INVALID STRING";
  
  if (String.IsNullOrEmpty(ret_value) || ret_value =="0") return "";
  else return ret_value;
}

#ifdef USE_OBJECT_ORIENTED_AUDIO
function any_click_on_door_special(int door_id, int obj, int x, int y, eDirection dir, int nr_room, int nr_x, int nr_y, eDirection nr_dir, AudioClip *opensound, AudioClip *closesound, int key, int closevalue) {
  // key = -1: masterkey - even locked doors will be opened
  // key = -2: door can't be unlocked (like rusted)
  AudioChannel *chan;
  int result=1;
  
  if (UsedAction(eGA_Close)) {
    if (get_door_state(door_id)==0 || get_door_state(door_id)==2)
      Unhandled(1);
    else if (get_door_state(door_id)==1) {
      if (any_click_move (x, y, dir)) {
        if (closesound != null) chan = closesound.Play();
        // Play default sound
        else if (closeDoorSound != null) chan = closeDoorSound.Play();
        object[obj].Visible=false;
        set_door_state(door_id, closevalue);
      }
    }
  }
  else if (UsedAction(eGA_Open)) {
    if (get_door_state(door_id)==0 || (get_door_state(door_id)==2 && key==-1)) {
      if (any_click_move (x, y, dir))
      {
        if (opensound != null) chan = opensound.Play();
        // Play default sound
        else if (openDoorSound != null) chan = openDoorSound.Play();    
        
        object[obj].Visible=true;
        set_door_state(door_id, 1);
      }
    }
    else if (get_door_state(door_id)==1) Unhandled(1);
    else if (get_door_state(door_id)==2) {
      if (any_click_move (x, y, dir)) if (!String.IsNullOrEmpty(get_door_strings("islocked"))) player.Say(get_door_strings("islocked"));
    }
  }
  else if (UsedAction(eMA_WalkTo))
  {
    
    if (get_door_state(door_id)==1) {
      if (timer_run == true && openDoorDoubleclick==true)
      {
        timer_run = false;
        if (MovePlayerEx(player.x,player.y,eWalkableAreas)>0) player.EnterRoom(nr_room, nr_x, nr_y, nr_dir, true);
        result = 2;
      }
      else
      {
        //doubleclick = false;
        if (openDoorDoubleclick)timer_run = true;
        if (Go()){
          player.EnterRoom(nr_room, nr_x, nr_y, nr_dir, true);
          result=2;          
        }
        
      }
    }else any_click_move(x, y, dir);

  }
  else if (UsedAction (eGA_LookAt) && !String.IsNullOrEmpty(get_door_strings("lookat"))) {
    if (any_click_move (x, y, dir)) if (!String.IsNullOrEmpty(get_door_strings("lookat")))player.Say(get_door_strings("lookat"));
  }
  else if (UsedAction(eGA_UseInv) && key>=0) {
    if (any_click_move (x, y, dir)) {
      if (player.ActiveInventory==inventory[key]) {
        if (get_door_state(door_id)==1) {
          if (!String.IsNullOrEmpty(get_door_strings("closefirst"))) player.Say(get_door_strings("closefirst"));
        }
        else if (get_door_state(door_id)==2) {
          if (unlockDoorSound != null) chan = unlockDoorSound.Play();
          if (!String.IsNullOrEmpty(get_door_strings("unlock"))) player.Say(get_door_strings("unlock"));
          set_door_state(door_id, closevalue);
        }
        else if (get_door_state(door_id)==0) {
          object[obj].Visible=false;
          set_door_state(door_id, 2);
          if (!String.IsNullOrEmpty(get_door_strings("relock"))) player.Say(get_door_strings("relock"));
        }
      }
      else if (!String.IsNullOrEmpty(get_door_strings("wrongitem"))) player.Say(get_door_strings("wrongitem"));
    }
  }
  else result=0;
  
  return result;
  // 0 = unhandled
  // 1 = handled
  // 2 = NewRoom
}
#endif

#ifnver 3.2
function any_click_on_door_special(int door_id, int obj, int x, int y, eDirection dir, int nr_room, int nr_x, int nr_y, eDirection nr_dir, int opensound, int closesound, int key, int closevalue) {
  // key = -1: masterkey - even locked doors will be opened
  // key = -2: door can't be unlocked (like rusted)
  int result=1;
  
  if (UsedAction(eGA_Close)) {
    if (get_door_state(door_id)==0 || get_door_state(door_id)==2)
      Unhandled(1);
    else if (get_door_state(door_id)==1) {
      if (any_click_move (x, y, dir)) {
        if (closesound != 0) PlaySound(closesound);
        // Play default sound
        else if (closeDoorSound != 0) PlaySound(closeDoorSound);
        object[obj].Visible=false;
        set_door_state(door_id, closevalue);
      }
    }
  }
  else if (UsedAction(eGA_Open)) {
    if (get_door_state(door_id)==0 || (get_door_state(door_id)==2 && key==-1)) {
      if (any_click_move (x, y, dir))
      {
        if (opensound != 0) PlaySound(opensound);
        // Play default sound
        else if (openDoorSound != 0) PlaySound(openDoorSound);    
        
        object[obj].Visible=true;
        set_door_state(door_id, 1);
      }
    }
    else if (get_door_state(door_id)==1) Unhandled(1);
    else if (get_door_state(door_id)==2) {
      if (any_click_move (x, y, dir)) if (!String.IsNullOrEmpty(get_door_strings("islocked"))) player.Say(get_door_strings("islocked"));
    }
  }
  else if (UsedAction(eMA_WalkTo))
  {
    
    if (get_door_state(door_id)==1) {
      if (timer_run == true && openDoorDoubleclick==true)
      {
        timer_run = false;
        if (MovePlayerEx(player.x,player.y,eWalkableAreas)>0) player.EnterRoom(nr_room, nr_x, nr_y, nr_dir, true);
        result = 2;
      }
      else
      {
        //doubleclick = false;
        if (openDoorDoubleclick)timer_run = true;
        if (Go()){
          player.EnterRoom(nr_room, nr_x, nr_y, nr_dir, true);
          result=2;          
        }
        
      }
    }else any_click_move(x, y, dir);

  }
  else if (UsedAction (eGA_LookAt) && !String.IsNullOrEmpty(get_door_strings("lookat"))) {
    if (any_click_move (x, y, dir)) if (!String.IsNullOrEmpty(get_door_strings("lookat")))player.Say(get_door_strings("lookat"));
  }
  else if (UsedAction(eGA_UseInv) && key>=0) {
    if (any_click_move (x, y, dir)) {
      if (player.ActiveInventory==inventory[key]) {
        if (get_door_state(door_id)==1) {
          if (!String.IsNullOrEmpty(get_door_strings("closefirst"))) player.Say(get_door_strings("closefirst"));
        }
        else if (get_door_state(door_id)==2) {
          if (unlockDoorSound != 0) PlaySound(unlockDoorSound);
          if (!String.IsNullOrEmpty(get_door_strings("unlock"))) player.Say(get_door_strings("unlock"));
          set_door_state(door_id, closevalue);
        }
        else if (get_door_state(door_id)==0) {
          object[obj].Visible=false;
          set_door_state(door_id, 2);
          if (!String.IsNullOrEmpty(get_door_strings("relock"))) player.Say(get_door_strings("relock"));
        }
      }
      else if (!String.IsNullOrEmpty(get_door_strings("wrongitem"))) player.Say(get_door_strings("wrongitem"));
    }
  }
  else result=0;
  
  return result;
  // 0 = unhandled
  // 1 = handled
  // 2 = NewRoom
}
#endif

function any_click_on_door(int door_id, int obj, int x, int y, eDirection dir, int nr_room, int nr_x, int nr_y, eDirection nr_dir) {
#ifdef USE_OBJECT_ORIENTED_AUDIO
return any_click_on_door_special (door_id, obj, x, y, dir, nr_room, nr_x, nr_y, nr_dir, null, null, 0, 0);
#endif

#ifndef USE_OBJECT_ORIENTED_AUDIO
return any_click_on_door_special (door_id, obj, x, y, dir, nr_room, nr_x, nr_y, nr_dir, 0, 0, 0, 0);
#endif
}

// ============================= AGS internal functions ==========================================

function on_mouse_click(MouseButton button) {
  
  if (!is_gui_disabled()) {
    int mrx=mouse.x+GetViewportX();
    int mry=mouse.y+GetViewportY();
    int x=mouse.x;
    int y=mouse.y;
    // get location under mouse cursor
    GSloctype=GetLocationType(x, y);
    GSlocname=Game.GetLocationName(x, y);
    GSagsusedmode=Mouse.Mode;
    used_action=global_action;
    
    InventoryItem*ii = InventoryItem.GetAtScreenXY(x, y);
    if (GSloctype==eLocationHotspot) {
      Hotspot*h=Hotspot.GetAtScreenXY(x, y);
      GSlocid=h.ID;
      
    }
    else if (GSloctype==eLocationCharacter) {
      Character*c=Character.GetAtScreenXY(x, y);
      GSlocid=c.ID;
    }
    else if (GSloctype==eLocationObject) {
      Object*o=Object.GetAtScreenXY(x, y);
      GSlocid=o.ID;
    }
    else if (ii!=null) GSlocid=ii.ID;
    
    
    
    
    if (IsGamePaused()) {
      // Game is paused, so do nothing (ie. don't allow mouse click)
    }
    // Mousebutton Left
    else if (button==eMouseLeft)
    {
        
      if (GlobalCondition(2) || GlobalCondition(3) || GlobalCondition(4)) {
        // Do nothing, if:
        // the mode is useinv and the mouse is over the active inv (like "use knife on knife")
        // or the mode is talk, or "Give", and the mouse isnt over a character
        // or its GIVE and the mouse isnt over a inv.item

      }
      else if (ExtensionEx(1, GSlocname)=='e') {
        UpdateActionBar();
        ActionLine.TextColor=ActionLabelColorHighlighted;
        WalkOffScreen();
      }
      // walk to
      else if (GSagsusedmode==eModeUsermode2) {
        ActionLine.TextColor=ActionLabelColorHighlighted;
        if (IsInteractionAvailable(x, y, GSagsusedmode)) ProcessClick (x, y, GSagsusedmode);
        else ProcessClick(x, y, eModeWalkto);
      }  
      // talkto
      else if (GSagsusedmode==eModeTalkto && IsInteractionAvailable(x, y, GSagsusedmode) && GSloctype==eLocationCharacter) {
        ActionLine.TextColor=ActionLabelColorHighlighted;
        if (GoToCharacter(character[GSlocid], eDir_None, NPC_facing_player, 1)) character[GSlocid].RunInteraction(GSagsusedmode);
      //  SetAction(eMA_Default);
      }
      // Giveto
      else if ((GSagsusedmode == eModeUseinv) && GSloctype==eLocationCharacter && isAction(eGA_GiveTo)) {
        ActionLine.TextColor=ActionLabelColorHighlighted;
        ItemGiven=player.ActiveInventory;
        
        if (GoToCharacter(character[GSlocid], eDir_None, NPC_facing_player, 2)) {
          if (IsInteractionAvailable (mrx - GetViewportX (), mry - GetViewportY (), eModeUseinv) == 1) {
            character[GSlocid].RunInteraction(eModeUseinv);        
          }
        }
//       SetAction (eMA_Default);
      }    
      else {
        UpdateActionBar();
        ActionLine.TextColor=ActionLabelColorHighlighted;
        ProcessClick(x, y, GSagsusedmode);
   //     SetAction(eMA_Default);
        ItemGiven=null;
      }
    }
    // Mousebutton Right
     else if (button==eMouseRight) {
      if (alternative_action==eMA_Default) {
      //  SetAction(eMA_Default);
        ActionLine.TextColor=ActionLabelColorHighlighted;
        if (Mouse.Mode==eModeUsermode2) {
          if (ExtensionEx(1, GSlocname)=='e') {
            UpdateActionBar();
            ActionLine.TextColor=ActionLabelColorHighlighted;
            WalkOffScreen();
          }          
         else ProcessClick(x, y, eModeWalkto);
        }
        else ProcessClick(x, y, Mouse.Mode);
      }
      else
      {
        SetAction(alternative_action);
        used_action=global_action;
        UpdateActionBar();
        ActionLine.TextColor=ActionLabelColorHighlighted;
        GSagsusedmode=Mouse.Mode;
        if (GSagsusedmode==eModeTalkto && IsInteractionAvailable(x, y, GSagsusedmode) && GSloctype==eLocationCharacter) { //(GetCharacterAt (mouse.x, mouse.y) < 7))
          if (GoToCharacter(character[GSlocid], eDir_None, NPC_facing_player,2 )) character[GSlocid].RunInteraction(GSagsusedmode);
        }
        else ProcessClick(x, y, GSagsusedmode);
     //   SetAction(eMA_Default);
      }
    }
    //left click in inventory
    else if (button==eMouseLeftInv) {
      if (!isAction(eGA_GiveTo))ItemGiven= null;
  
      if (GlobalCondition (1)) {
        // if the mouse is in the inventory and modes Walk or pickup are selected
        SetAction (eGA_Use);
        location=GSinvloc;    
        if (Extension()=='u' && ii.IsInteractionAvailable(eModeInteract)) {
          // use it immediately (not with anything else)
          used_action=global_action;
          ii.RunInteraction(eModeInteract);
       //   SetAction(eMA_Default);
        }
        else {
          if (oldschool_inv_clicks) {
            SetAction (eGA_LookAt);
            used_action=global_action;
            ii.RunInteraction(eModeLookat);  
         //   SetAction(eMA_Default);
          }
          else player.ActiveInventory=ii;
        }
      }
      else  if (GlobalCondition (2) == 1) {
        // if the mode is useinv and the mouse is over the active inv (like "use knife on knife")
        // so do nothing again
      }
      else {
        used_action=global_action;
        if (Mouse.Mode==eModeInteract) {
          if (isAction(eGA_Use) && ii.IsInteractionAvailable(eModeInteract)) {
            ActionLine.TextColor=ActionLabelColorHighlighted;
            ii.RunInteraction(eModeInteract);
           // SetAction(eMA_Default);
          }
          else player.ActiveInventory=ii;
        }
        else {
          if ( (Mouse.Mode >0 && Mouse.Mode <10 )&& ii != null) {
                GSagsusedmode=Mouse.Mode;
                ActionLine.TextColor=ActionLabelColorHighlighted;
                ii.RunInteraction(Mouse.Mode);
             //   SetAction(eMA_Default);
          }
        }
      }
    }
    //right click in inventory
    else if (button==eMouseRightInv) {
      if (alternative_action==eMA_Default) {
     //   SetAction(eMA_Default);
      }
      else {
        SetAction(alternative_action);
        used_action=global_action;
        GSagsusedmode=Mouse.Mode;
        if (Mouse.Mode==eModeInteract) {
          if (isAction(eGA_Use) && ii.IsInteractionAvailable(eModeInteract)) {
            UpdateActionBar();
            ActionLine.TextColor=ActionLabelColorHighlighted;
            ii.RunInteraction(eModeInteract);
       //     SetAction(eMA_Default);
          }
          else player.ActiveInventory=ii;
        }
        else {
          UpdateActionBar();
          ActionLine.TextColor=ActionLabelColorHighlighted;
          inventory[game.inv_activated].RunInteraction(Mouse.Mode);
         // SetAction(eMA_Default);
        }
      }
    }
  }
}

function repeatedly_execute_always() {
  // Doubleclick Timer
  if (!IsGamePaused() && !is_gui_disabled()) {
    if (timer_run == true)
    {
      timer_click++;
      if (timer_click >= dc_speed){
        timer_click = 0;
        timer_run = false;
      }
    }
  }
}

function repeatedly_execute() {  
  if (!IsGamePaused() && !is_gui_disabled())
  {
    
    // --- for the MovePlayer function ---
    if (GScancelable==1) {
      GScancelable=0;
      if (InventoryItem.GetAtScreenXY(mouse.x, mouse.y)==null) on_mouse_click(eMouseLeft);
      else on_mouse_click(eMouseLeftInv);
    }
    else if (GScancelable==2) {
      GScancelable=0;
      CheckDefaultAction();
      if (InventoryItem.GetAtScreenXY(mouse.x, mouse.y)==null) on_mouse_click(eMouseRight);
      else on_mouse_click(eMouseRightInv);
    }
    CheckDefaultAction();
    UpdateActionBar();
  }
  // change the arrows in the inventory to show if you
  // can scroll the inventory:
  if (MainInv.TopItem>0) {
    // if inventory can scroll up
    InvUp.NormalGraphic=invUparrowONsprite;
    InvUp.MouseOverGraphic=invUparrowHIsprite;
    
    if (InventoryItem.GetAtScreenXY(gMaingui.X+MainInv.X+1, gMaingui.Y+MainInv.Y+1)==null) MainInv.TopItem-=MainInv.ItemsPerRow;
  }
  else {
    InvUp.NormalGraphic=invUparrowOFFsprite;
    InvUp.MouseOverGraphic=invUparrowOFFsprite;
  }
  //if inv can scroll down
  if (MainInv.TopItem<MainInv.ItemCount-(MainInv.ItemsPerRow * MainInv.RowCount)) {
    InvDown.NormalGraphic=invDownarrowONsprite;
    InvDown.MouseOverGraphic=invDownarrowHIsprite;
  }
  else{
    InvDown.NormalGraphic=invDownarrowOFFsprite;
    InvDown.MouseOverGraphic=invDownarrowOFFsprite;
  }
  
}

// ============================= Exports GUI Things===========================================
export ActionLabelColorHighlighted;
export key_l_yes, key_u_yes, key_l_no, key_u_no;
export action_l_keycode;
export action_u_keycode;
export GStopsaveitem;
export listBoxGap;
export ItemGiven;
export lang;

Inviato da: Squall_Leonheartil 18 Dec 2014, 14:29

Fatto, ma niente continua e, se modifico quelle negli if poi mi va in errore.. Ti posto tutto il guiscript.asc


CODICE
// Gui Script
// ================================ OPTIONS ===============================================
// ============================= EDIT FROM HERE ===========================================

// Setup the default Language (only affects the provided GUIs)
// Unhandled events can directly be changed in the function Unhandled()
// Currently supported languages:
// eLangEN (English)
// eLangDE (German)
// eLangES (Spanish)
// eLangFR (French)
// eLangIT (Italian)
int lang = eLangIT;          

int
ActionLabelColorNormal          = 15219,  // Colore usato dalla barra d'azio9ne
ActionLabelColorHighlighted     = 38555,  // highlighted colour used in action bar
invUparrowONsprite              = 124,    // sprite slot of the upper inv arrow / normal
invUparrowOFFsprite             = 0,    // sprite slot of the upper inv arrow / disabled
invUparrowHIsprite              = 137,    // sprite slot of the upper inv arrow / highlighted
invDownarrowONsprite            = 128,    //  "   "      "      lower   "   "      
invDownarrowOFFsprite           = 0,    //  "   "      "      lower   "   "
invDownarrowHIsprite            = 141,    //  "   "      "      lower   "   "
walkoffscreen_offset            = 30,     // offset used by WalkOffScreen and exit extensions
cursorspritenumber              = 265,     // used for semi-blockable movement
blankcursorspritenumber         = 266;     // used for semi-blockable movement
bool openDoorDoubleclick        = true;   // doubleclick on open doors changes room instantly
bool NPC_facing_player          = true;  // Non playable characters are facing
                                          // the player before talk-to and give-to
bool oldschool_inv_clicks       = true;  // turned on: right-click on inv items is lookat
                                          // turned off: right-click on inv items is use
              
// You can define Audioclips, which are being used in the doorscripts
#ifndef USE_OBJECT_ORIENTED_AUDIO
// In AGS 3.1 you have to assign a number:
//   openDoorSound = 15;
int openDoorSound   = 0,
    closeDoorSound  = 0,
    unlockDoorSound = 0;
#endif

#ifdef USE_OBJECT_ORIENTED_AUDIO
// In AGS 3.2 you do it this way:
//   Audioclip *openDoorSound = aDoorsound;
AudioClip*  openDoorSound,  
            closeDoorSound,
            unlockDoorSound;    
#endif

// ============================= EDIT UNTIL HERE ===========================================


// ========================== variables (not to edit) ======================================

String madetext;          // String that is shown in the action bar
String numbers;           // used by getInteger() to convert strings
String door_strings[6];   // default messages for the door script

int global_action;        // containing the current clicked action
int default_action;       // default action (most likely walk-to)
int alternative_action;   // right-click action
int used_action;          // used_action = global_action, if not cancelled
int GSagsusedmode;        // on_mouse_click -> unhandled_event
int GSloctype;            // the result of GetLocationType
int GSlocid;              // on_mouse_click ->
int GScancelable;         // MovePlayer
String GSlocname;         // on_mouse_click -> unhandled_event
String GSinvloc;          // locationname>extension
String SHOWNlocation;     // location translated
String location;          // The location name underneath the cursor
bool player_frozen;       // player can't move
bool disabled_gui;        // GUI disabled
int door_state[MAX_DOORS];              // Array for the door script
int action_button[A_COUNT_];            // Array containing the verb button Ids
int action_button_normal[A_COUNT_];     // contains the verb button sprites
int action_button_highlight[A_COUNT_];  // Contains the highlighted verb button sprites
int button_action[A_COUNT_];            // Array containg the related actions like eGA_LookAt

String tresult;           // translated result of the action mode, eg. "Look at %s"
String act_object;        // action_object - object used in action
String item;              // inventory item to be used or given
int GStopsaveitem = 0;    // top savegame element of the save GUI
int listBoxGap;           // used in the save-game dialog to determine a list-item's height
int dc_speed;             // double click speed, set in the game start section


int action_l_keycode[A_COUNT_]; // lower case keycodes for the verbs
int action_u_keycode[A_COUNT_]; // upper case keycodes for the verbs
InventoryItem*ItemGiven;        // Item given to a character
char key_l_yes, key_u_yes, key_l_no, key_u_no; // translated keys for yes and no
bool doubleclick;               // doubleclick occured
bool timer_run;                 // is doubleclick timer running
int timer_click;                // double click timer



// ============================= Helper functions ===========================================
function set_door_state(int door_id, int value) {
  door_state[door_id] = value;
}

int get_door_state(int door_id) {
  return door_state[door_id];
}

function init_object (int door_id, int obj){
  if (get_door_state(door_id) == 1) {
    object[obj].Visible=true;
    object[obj].Clickable=false;
  }
  else {
    object[obj].Visible=false;
    object[obj].Clickable=false;
  }
}

int Absolute(int value) {
  if (value<0) return -value;
  return value;
}

int Offset(int point1, int point2) {
  return Absolute(point1 - point2);
}

int getButtonAction(int action) {
  return button_action[action];
}

function disable_gui()
{
  disabled_gui=true;
  gMaingui.Visible=false;
  gAction.Visible=false;
}

function enable_gui()
{  
  disabled_gui=false;
  gMaingui.Visible=true;
  gAction.Visible=true;
  Wait(1);
}

bool is_gui_disabled() {
  return disabled_gui;
}

function set_double_click_speed(int speed){
dc_speed = speed;
}

// ============================= verb action functions ===========================================
function TranslateAction(int action, int tr_lang) {
  if (tr_lang == eLangDE) {
    if (action == eMA_WalkTo)   tresult="Gehe zu %s";
    else if (action == eGA_LookAt)   tresult="Schau %s an";
    else if (action == eGA_TalkTo)   tresult="Rede mit %s";
    else if (action == eGA_GiveTo) {
      if (item.Length>0)             tresult="Gib !s an %s";
      else                           tresult="Gib %s";
    }
    else if (action == eGA_PickUp)   tresult="Nimm %s";
    else if (action == eGA_Use) {
      if (item.Length>0)             tresult="Benutze !s mit %s";
      else                           tresult="Benutze %s";
    }
    else if (action == eGA_Open)     tresult="Öffne %s";
    else if (action == eGA_Close)    tresult="Schließe %s";
    else if (action == eGA_Push)     tresult="Drücke %s";
    else if (action == eGA_Pull)     tresult="Ziehe %s";
    else tresult=" ";  
  }
  else if (tr_lang == eLangES) {
    if (action == eMA_WalkTo)   tresult="Ir a %s";
    else if (action == eGA_LookAt)   tresult="Mirar %s";
    else if (action == eGA_TalkTo)   tresult="Hablar con %s";
    else if (action == eGA_GiveTo) {
      if (item.Length>0)             tresult="Dar !s a %s";
      else                           tresult="Dar %s";
    }
    else if (action == eGA_PickUp)   tresult="Coger %s";
    else if (action == eGA_Use) {
      if (item.Length>0)             tresult="Usar !s con %s";
      else                           tresult="Usar %s";
    }
    else if (action == eGA_Open)     tresult="Abrir %s";
    else if (action == eGA_Close)    tresult="Cerrar %s";
    else if (action == eGA_Push)     tresult="Empujar %s";
    else if (action == eGA_Pull)     tresult="Tirar de %s";
    else tresult=" ";    
  }
  else if (tr_lang == eLangFR) {
    if (action == eMA_WalkTo)   tresult="Aller vers %s";
    else if (action == eGA_LookAt)   tresult="Regarder %s";
    else if (action == eGA_TalkTo)   tresult="Parler à %s";
    else if (action == eGA_GiveTo) {
      if (item.Length>0)             tresult="Donner !s à %s";
      else                           tresult="Donner %s";
    }
    else if (action == eGA_PickUp)   tresult="Prendre %s";
    else if (action == eGA_Use) {
      if (item.Length>0)             tresult="Utiliser !s sur %s";
      else                           tresult="Utiliser %s";
    }
    else if (action == eGA_Open)     tresult="Ouvrir %s";
    else if (action == eGA_Close)    tresult="Fermer %s";
    else if (action == eGA_Push)     tresult="Pousser %s";
    else if (action == eGA_Pull)     tresult="Tirer %s";
    else tresult=" ";
  }  
  else if (tr_lang == eLangIT) {
    if (action == eMA_WalkTo)   tresult="%s";
    else if (action == eGA_LookAt)   tresult="Esamina %s";
    else if (action == eGA_TalkTo)   tresult="Parla con %s";
    else if (action == eGA_GiveTo) {
    if (item.Length>0)               tresult="Dai !s a %s";
    else                             tresult="Dai %s";
    }
    else if (action == eGA_PickUp)   tresult="Raccogli %s";
    else if (action == eGA_Use) {
    if (item.Length>0)               tresult="Usa !s con %s";
    else                             tresult="Usa %s";
    }
    else if (action == eGA_Open)     tresult="Apri %s";
    else if (action == eGA_Close)    tresult="Chiudi %s";
    else if (action == eGA_Push)     tresult="Premi %s";
    else if (action == eGA_Pull)     tresult="Tira %s";
    else tresult=" ";
  }    
  else {
    if (action == eMA_WalkTo)   tresult="Go to %s";
    else if (action == eGA_LookAt)   tresult="Look at %s";
    else if (action == eGA_TalkTo)   tresult="Talk to %s";
    else if (action == eGA_GiveTo) {
      if (item.Length>0)             tresult="Give !s to %s";
      else                           tresult="Give %s";
    }
    else if (action == eGA_PickUp)   tresult="Pick up %s";
    else if (action == eGA_Use) {
      if (item.Length>0)             tresult="Use !s with %s";
      else                           tresult="Use %s";
    }
    else if (action == eGA_Open)     tresult="Open %s";
    else if (action == eGA_Close)    tresult="Close %s";
    else if (action == eGA_Push)     tresult="Push %s";
    else if (action == eGA_Pull)     tresult="Pull %s";
    else tresult=" ";    
  }
  // fill object and item into action template
  tresult=GetTranslation(tresult);
  int ip=tresult.IndexOf("!s");
  if (ip>=0) {
    int op=tresult.Contains("%s");
    tresult=tresult.ReplaceCharAt(ip, '%');
    if (ip<op) tresult=String.Format(tresult, item, act_object);
    else       tresult=String.Format(tresult, act_object, item);
  }
  else         tresult=String.Format(tresult, act_object);
}

bool isAction(Action test_action) {
  return global_action == test_action;
}

function UsedAction(Action test_action) {
  return ((used_action == test_action) && (GSagsusedmode != eModeUseinv)) ||
         ((test_action == eGA_UseInv)  && (used_action == eGA_Use) && (GSagsusedmode == eModeUseinv)) ||
         ((test_action == eGA_GiveTo)  && (used_action == eGA_GiveTo) && (GSagsusedmode == eModeUseinv) && ItemGiven!=null);
}

function SetAction(Action new_action) {
  // set default action
//  if (new_action == eMA_Default) new_action=default_action;
  // set corresponding cursormode
       if (new_action == eMA_WalkTo) mouse.Mode=eModeUsermode2;
  else if (new_action == eGA_LookAt) mouse.Mode=eModeLookat;
  else if (new_action == eGA_TalkTo) mouse.Mode=eModeTalkto;
  else if (new_action == eGA_GiveTo) mouse.Mode=eModeInteract;
  else if (new_action == eGA_PickUp) mouse.Mode=eModePickup;
  else if (new_action == eGA_Use)    mouse.Mode=eModeInteract;
  else if (new_action == eGA_Open)   mouse.Mode=eModeUsermode1;
  else if (new_action == eGA_Close)  mouse.Mode=eModeUsermode1;
  else if (new_action == eGA_Push)   mouse.Mode=eModeUsermode1;
  else if (new_action == eGA_Pull)   mouse.Mode=eModeUsermode1;
  // save action
  global_action=new_action;
}
function SetDefaultAction(Action def_action) {
  default_action=def_action;
// SetAction(eMA_Default);
}

// ============================= Load/Save game ===========================================

function GetLucasSavegameListBox(ListBox*lb) {
  // stores savegames in slots 100-199
  String buffer, sgdesc;
  int maxsavegames, counter=0;
  maxsavegames=99;
  lb.Clear();
  while (counter<maxsavegames) {
    buffer=String.Format("%d.", counter+1);
    sgdesc=Game.GetSaveSlotDescription(counter+100);
    if (sgdesc==null) sgdesc="";
    buffer=buffer.Append(sgdesc);
    lb.AddItem(buffer);
    counter++;
  }
  lb.TopItem=GStopsaveitem;
  lb.SelectedIndex=-1;
}

// ============================= GlobalCondition ===========================================
int GlobalCondition(int parameter) {
  // here are some conditions that are used many times in the script
  int cond;
  InventoryItem*ii=InventoryItem.GetAtScreenXY(mouse.x, mouse.y);
  GUIControl*gc=GUIControl.GetAtScreenXY(mouse.x, mouse.y);
  int gcid=-1;
  if (gc!=null) gcid=gc.ID;
  // if the mouse is in the inventory and modes Walk or pickup are selected
  if (parameter == 1)
    cond = (ii != null && (isAction(eMA_WalkTo) || isAction(eGA_PickUp)));
  // if the mode is useinv and the mouse is over the active inv (like "use knife on knife")  
  else if (parameter == 2)
    cond =(player.ActiveInventory == ii && Mouse.Mode == eModeUseinv);
  // if the mode is talk, or "Give", and the mouse isnt over a character
  else if (parameter == 3)
    cond =((isAction(eGA_TalkTo) || (isAction(eGA_GiveTo) && (Mouse.Mode == eModeUseinv))) && (GetLocationType(mouse.x, mouse.y) != eLocationCharacter));
  // if its GIVE and the mouse isnt over a inv.item
  else if (parameter == 4)
    cond = ((Mouse.Mode == eModeInteract) && isAction(eGA_GiveTo) && (ii == null));
  return cond;
}
// ============================= Verb Extensions and actions ===========================================

char ExtensionEx(int index, String name){
  //returns the extension in the position 'index' of the string 'name'.
  //returns 0 if the name has no extension or if you passed an empty string.
  if (name.Length==0) return 0;//if you passed an empty string
  int pos;
  pos=name.IndexOf(">");
  if (pos==-1) return 0;
  else if (pos+index<name.Length) return name.Chars[pos+index];
  else return 0;
}

char Extension(){
  // Check the (first) extension (>*) of a string
  return ExtensionEx(1,location);
}

function RemoveExtension(){
  //removes the extension of a string  
  int pos = location.IndexOf(">");
  int length=location.Length;
  if (Extension()!=0)location=location.Truncate(pos);
  return pos;
}

function AddExtension(char extension) {
  //adds an extension to a thing that doesn't have one
  int length=location.Length;
  if (Extension()==0) {
    location=location.Append(">n");
    location=location.ReplaceCharAt(length+1, extension);
  }
}

function SetAlternativeAction(char extension, Action alt_action) {
  if (alt_action==eMA_Default) {
    if (Extension()==extension)
      alternative_action = alt_action;
  }
  else {
    int button=action_button[alt_action];
    int normalbuttonpic=action_button_normal[alt_action];
    int overbuttonpic=action_button_highlight[alt_action];
    // used for setting the default action given the extension.
    GUIControl*gc=gMaingui.Controls[button];
    Button*b=gc.AsButton;
    if (Extension()==extension) {
      b.NormalGraphic=overbuttonpic;
      alternative_action=alt_action;
    }
    else b.NormalGraphic=normalbuttonpic;
    b.MouseOverGraphic=overbuttonpic;
  }
}

// Door extension for Open/Close
function OpenCloseExtension(int door_id) {
  if ((get_door_state(door_id)==0) || (get_door_state(door_id)==2)) AddExtension('o');
  else AddExtension('c');
}

function VariableExtensions() {
  // define here, which things will use a variable extension (>v)
  // by default, it's only used for doors.
  int r=player.Room;
  Object*oo=Object.GetAtScreenXY(mouse.x, mouse.y);
  int o=0;
  if (oo!=null) o=oo.ID;
  Hotspot*hh=Hotspot.GetAtScreenXY(mouse.x, mouse.y);
  int h=hh.ID;
  
  // Open/Close Extension:
  // Room | Hotspot |(Door_id)
       if (r==1 && h == 1)  OpenCloseExtension (20);
  //else if (r==2  && h == 2)  OpenCloseExtension (3);
  
  // Other possible extensions could be: Turn On/Turn Off
}

function CheckDefaultAction() {
  // you could want to change which extension activates which default action, or which button sprite
  // it changes. The extensions are characters, so remember to put them with single ', not ".
  int x=mouse.x;
  int y=mouse.y;
  location=Game.GetLocationName(x, y);
  if (Extension()==0) {
    // Setting default modes if the thing has no extension:
    if (GetLocationType(x, y)==eLocationCharacter) // if it is a character
      AddExtension('t'); // set default action "talk to"
    else if ((GetLocationType(x, y)!=eLocationNothing) || (InventoryItem.GetAtScreenXY(x, y)!=null))
      // if its an inv item, a hotspot or an object
      AddExtension('l'); // set default action "look at"
    else
      AddExtension('n'); // set default action "none"
  }
  else if (Extension()=='v') { // if the default action depends on some events
    RemoveExtension();
    VariableExtensions();
  }
  if (GlobalCondition(2) || GlobalCondition(3) || GlobalCondition(4) || GlobalCondition(5))
    //Dont send the name of the hotspt/obj/char/inv to the action bar and set default action "none"
    location=">n";

  GSinvloc=location;
  
  // Set "Look" as default action for Inv items
  if ((Extension()=='u') && (InventoryItem.GetAtScreenXY(x, y) != null)) {
    // it's an inv item
    RemoveExtension();
    AddExtension('l'); // set default action "look at"
  }
  
// SetAlternativeAction('n', eMA_Default);
  SetAlternativeAction('g', eGA_GiveTo);
  SetAlternativeAction('p', eGA_PickUp);
  SetAlternativeAction('u', eGA_Use);
  SetAlternativeAction('o', eGA_Open);
  SetAlternativeAction('l', eGA_LookAt);
  SetAlternativeAction('s', eGA_Push);
  SetAlternativeAction('c', eGA_Close);
  SetAlternativeAction('t', eGA_TalkTo);
  SetAlternativeAction('y', eGA_Pull);  
  RemoveExtension();
  SHOWNlocation=location;
}
// ============================= ActionBar ===========================================

function UpdateActionBar (){
  // set the text in the action bar
  int action = global_action;

  act_object=SHOWNlocation;
  item="";
  if (Mouse.Mode==eModeUseinv) { // use or give inventory item
    item=player.ActiveInventory.Name;
    location=item;
    RemoveExtension();
    item=location;
  }
  else if (GlobalCondition (1)) { // if the mouse is in the inventory and modes Walk or pickup are selected
    if (oldschool_inv_clicks) action=eGA_LookAt;
    else action=eGA_Use;
  }
  
  TranslateAction(action, lang);
  madetext=tresult;
  // show action text
  ActionLine.Text=madetext;
  ActionLine.TextColor=ActionLabelColorNormal;
}


// ============================= translation ===========================================

String clearToSpace(String text) {
  int p=0;
  // ignore white spaces at the beginning
  while (p<text.Length && text.Chars[p]==' ') {
    p++;
  }
  // write white spaces until next white space
  while (p<text.Length && text.Chars[p]!=' ') {
    text=text.ReplaceCharAt(p, ' ');
    p++;
  }
  return text;
}

int getInteger() {
  int r=numbers.AsInt;
  numbers=clearToSpace(numbers);
  return r;
}

function SetActionButtons(Action action, String button_definition) {
  // extract data from button_definition
  String bd;
  
  if (IsTranslationAvailable ())
    bd=GetTranslation(button_definition);
  else {
    bd=button_definition;
  }
  
  bd=clearToSpace(bd);
  numbers=bd;
  action_button[action]=getInteger();
  action_button_normal[action]=getInteger();
  action_button_highlight[action]=getInteger();
  bd=numbers;
  int p=bd.Length-1;
  while (p>0) {
    action_l_keycode[action]=bd.Chars[p];
    p--;
    action_u_keycode[action]=bd.Chars[p];
    if (action_l_keycode[action]!=' ') p=0;
  }
  button_action[action_button[action]]=action;

}

function AdjustLanguage() {
  
  // English
  if (lang == eLangEN){
    // yes/no-keys
    key_u_yes= 'Y';
    key_l_yes= 'y';
    key_u_no= 'N';
    key_l_no= 'n';
    
    // (eNum Name, Name, GUI Button ID, Sprite-Normal, Sprite-Highlight, Keyboard-Shortcut)
    SetActionButtons(eGA_GiveTo, "a_button_give    0  125  138 Qq");
    SetActionButtons(eGA_PickUp, "a_button_pick_up 1  126  139 Ww");
    SetActionButtons(eGA_Use,    "a_button_use     2  127  140 Ee");
    SetActionButtons(eGA_Open,   "a_button_open    3  129  142 Aa");
    SetActionButtons(eGA_LookAt, "a_button_look_at 4  134  147 Ss");
    SetActionButtons(eGA_Push,   "a_button_push    5  131  144 Dd");
    SetActionButtons(eGA_Close,  "a_button_close   6  133  146 Zz");
    SetActionButtons(eGA_TalkTo, "a_button_talk_to 7  130  143 Xx");
    SetActionButtons(eGA_Pull,   "a_button_pull    8  135  148 Cc");  
  }
  // German
  else if (lang == eLangDE) {
    // yes/no-keys
    key_u_yes= 'J';
    key_l_yes= 'j';
    key_u_no= 'N';
    key_l_no= 'n';    
    // (eNum Name, Name, GUI Button ID, Sprite-Normal, Sprite-Highlight, Keyboard-Shortcut)
    SetActionButtons(eGA_GiveTo, "a_button_give    0 157 166 Qq");
    SetActionButtons(eGA_Use,    "a_button_use     1 158 167 Ww");
    SetActionButtons(eGA_PickUp, "a_button_pick_up 2 159 168 Ee");
    SetActionButtons(eGA_Open,   "a_button_open    3 160 169 Aa");
    SetActionButtons(eGA_Close,  "a_button_close   4 161 170 Ss");  
    SetActionButtons(eGA_TalkTo, "a_button_talk_to 5 162 171 Dd");
    SetActionButtons(eGA_LookAt, "a_button_look_at 6 163 172 Yy");
    SetActionButtons(eGA_Push,   "a_button_push    7 164 173 Xx");
    SetActionButtons(eGA_Pull,   "a_button_pull    8 165 174 Cc");
  }
  // Spanish
  else if (lang == eLangES) {
    // yes/no-keys
    key_u_yes= 'S';
    key_l_yes= 's';
    key_u_no= 'N';
    key_l_no= 'n';    
    // (eNum Name, Name, GUI Button ID, Sprite-Normal, Sprite-Highlight, Keyboard-Shortcut)
    SetActionButtons(eGA_GiveTo, "a_button_give    0  6    11  Qq");
    SetActionButtons(eGA_TalkTo, "a_button_talk_to 1  18   17  Ww");
    SetActionButtons(eGA_Use,    "a_button_use     2  4    145 Ee");
    SetActionButtons(eGA_Open,   "a_button_open    3  5    2   Aa");
    SetActionButtons(eGA_Close,  "a_button_close   4  8    7   Ss");
    SetActionButtons(eGA_PickUp, "a_button_pick_up 5  10   9   Dd");
    SetActionButtons(eGA_LookAt, "a_button_look_at 6  122  75  Zz");
    SetActionButtons(eGA_Push,   "a_button_push    7  14   13  Xx");
    SetActionButtons(eGA_Pull,   "a_button_pull    8  16   15  Cc");  
  }  
  // French
  else if (lang == eLangFR) {
    // yes/no-keys
    key_u_yes= 'O';
    key_l_yes= 'o';
    key_u_no= 'N';
    key_l_no= 'n';    
    // (eNum Name, Name, GUI Button ID, Sprite-Normal, Sprite-Highlight, Keyboard-Shortcut)
    SetActionButtons(eGA_GiveTo, "a_button_give    0  149  184 Qq");
    SetActionButtons(eGA_PickUp, "a_button_pick_up 1  176  185 Ww");
    SetActionButtons(eGA_Use,    "a_button_use     2  177  186 Ee");
    SetActionButtons(eGA_Open,   "a_button_open    3  178  187 Aa");
    SetActionButtons(eGA_TalkTo, "a_button_talk_to 4  179  188 Xx");
    SetActionButtons(eGA_Push,   "a_button_push    5  180  189 Dd");
    SetActionButtons(eGA_Close,  "a_button_close   6  181  190 Zz");
    SetActionButtons(eGA_LookAt, "a_button_look_at 7  182  191 Ss");
    SetActionButtons(eGA_Pull,   "a_button_pull    8  183  175 Cc");  
  }    
  // Italian
  else if (lang == eLangIT) {
    // yes/no-keys
    key_u_yes= 'S';
    key_l_yes= 's';
    key_u_no= 'N';
    key_l_no= 'n';    
    // (eNum Name, Name, GUI Button ID, Sprite-Normal, Sprite-Highlight, Keyboard-Shortcut)
    SetActionButtons(eGA_GiveTo, "a_button_give    0  193  200 Qq");
    SetActionButtons(eGA_PickUp, "a_button_pick_up 1  195  203 Ww");
    SetActionButtons(eGA_Use,    "a_button_use     2  196  204 Ee");
    SetActionButtons(eGA_Open,   "a_button_open    3  197  205 Aa");
    SetActionButtons(eGA_TalkTo, "a_button_talk_to 4  198  206 Xx");
    SetActionButtons(eGA_Push,   "a_button_push    5  199  207 Dd");
    SetActionButtons(eGA_Close,  "a_button_close   6  201  213 Zz");
    SetActionButtons(eGA_LookAt, "a_button_look_at 7  202  214 Ss");
    SetActionButtons(eGA_Pull,   "a_button_pull    8  194  215 Cc");  
  }    
  
  // --- load font corresponding to language and screen width ---
  String font_info;
  if (System.ScreenWidth<640)
    font_info=GetTranslation("font_lowres: 4  4  4  4  4  4  4  4  4  4  4  4  4  4  4  4  4  4  4  4");
  else
    font_info=GetTranslation("font_hires: 4  4  4  4  4  4  4  4  4  4  4  4  4  4  4  4  4  4  4  4");
    //Game.NormalFont
    //    font_info=GetTranslation("font_lowres: 1  0  0  0  0  0  0  0  3  0  0  0  0  0  0  0  0  0  3  3");
  //else
    //font_info=GetTranslation("font_hires: 1  0  0  0  0  0  0  0  3  0  0  0  0  0  0  0  0  0  3  3");
  font_info=clearToSpace(font_info);
  numbers=font_info;
  
  // Setting the fonts from the string: font_info
  Game.SpeechFont       = getInteger(); // Speech
  ActionLine.Font       = getInteger(); // Status-Line
  Game.NormalFont       = getInteger(); // Dialog GUI
  OptionsTitle.Font     = getInteger(); // Options-GUI Title
  OptionsSave.Font      = getInteger(); // Options-GUI Save Button
  OptionsLoad.Font      = getInteger(); // Options-GUI Load Button
  OptionsQuit.Font      = getInteger(); // Options-GUI Quit Button
  OptionsPlay.Font      = getInteger(); // Options-GUI Play Button
  gPausedText.Font      = getInteger(); // Game Paused Message
  OptionsDefault.Font   = getInteger(); // Options-GUI Default Button
  OptionsMusic.Font     = getInteger(); // Options-GUI Music Label
  OptionsSpeed.Font     = getInteger(); // Options-GUI Gamespeed Label
  OptionsRestart.Font   = getInteger(); // Options-GUI Restart Button
  RestoreTitle.Font     = getInteger(); // Restore-GUI Title
  RestoreCancel.Font    = getInteger(); // Restore-GUI Cancel Button
  SaveTitle.Font        = getInteger(); // Save-GUI Title
  SaveOK.Font           = getInteger(); // Save-GUI Okay Button
  SaveCancel.Font       = getInteger(); // Save-GUI Cancel Button
  gConfirmexitText.Font = getInteger(); // Confirm Exit Message
  gRestartText.Font     = getInteger(); // Restart Game Message
}

function AdjustGUIText() {

  // English
  if (lang == eLangEN){
    // english is the default language, nothing to adjust
    return;
  }
  else if (lang == eLangDE) {
    // German
    OptionsTitle.Text   = "Optionen";
    OptionsMusic.Text   = "Musik Lautstärke";
    OptionsSound.Text   = "Sound Effekte";
    OptionsSpeed.Text   = "Geschwindigkeit";
    OptionsDefault.Text = "Standard";
    OptionsSave.Text    = "Speichern";
    OptionsLoad.Text    = "Laden";
    OptionsRestart.Text = "Neustart";
    OptionsQuit.Text    = "Beenden";
    OptionsPlay.Text    = "Weiter";
    gPausedText.Text    = "Pause. Leertaste für weiter";
    RestoreTitle.Text   = "Wählen Sie ein Spiel zum Laden";
    RestoreCancel.Text  = "Abbruch";
    SaveTitle.Text      = "Name für das Spiel";
    SaveOK.Text         = "Speichern";
    SaveCancel.Text     = "Abbruch";
    gConfirmexitText.Text = "Möchten Sie das Spiel beenden? (J/N)";
    gRestartText.Text   = "Möchten Sie das Spiel neu starten? (J/N)";
  }
  else if (lang == eLangES) {
    // Spanish
    OptionsTitle.Text   = "Opciones";
    OptionsMusic.Text   = "Volumen de la música";
    OptionsSound.Text   = "Efectos de sonido ";
    OptionsSpeed.Text   = "Velocidad de juego";
    OptionsDefault.Text = "Restablecer";
    OptionsSave.Text    = "Guardar";
    OptionsLoad.Text    = "Cargar";
    OptionsRestart.Text = "Reiniciar";
    OptionsQuit.Text    = "Salir";
    OptionsPlay.Text    = "Volver";
    gPausedText.Text    = "Juego en pausa. Pulsa Espacio para continuar";
    RestoreTitle.Text   = "Por favor, elige el juego a cargar";
    RestoreCancel.Text  = "Cancelar";
    SaveTitle.Text      = "Por favor, introduce un nombre";
    SaveOK.Text         = "Guardar";
    SaveCancel.Text     = "Cancelar";
    gConfirmexitText.Text = "¿Seguro que quieres salir? (S/N)";
    gRestartText.Text   = "¿Seguro que quieres reiniciar? (S/N)";  
  }
  else if (lang == eLangFR) {
    // French
    OptionsTitle.Text   = "Paramètres";
    OptionsMusic.Text   = "Volume de la musique";
    OptionsSound.Text   = "Volume des sons";
    OptionsSpeed.Text   = "Vitesse du jeu";
    OptionsDefault.Text = "Réinitialiser";
    OptionsSave.Text    = "Sauver";
    OptionsLoad.Text    = "Charger";
    OptionsRestart.Text = "Redémarrer";
    OptionsQuit.Text    = "Quitter";
    OptionsPlay.Text    = "Reprendre";
    gPausedText.Text    = "PAUSE. Appuyez sur la barre d'espacement pour reprendre";
    RestoreTitle.Text   = "Choisissez une partie à charger";
    RestoreCancel.Text  = "Annuler";
    SaveTitle.Text      = "Saisissez un nom";
    SaveOK.Text         = "Sauver";
    SaveCancel.Text     = "Annuler";
    gConfirmexitText.Text = "Voulez-vous vraiment quitter? (O/N)";
    gRestartText.Text   = "Voulez-vous vraiment redémarrer? (O/N)";
  }  
  else if (lang == eLangIT) {
    // Italian
   OptionsTitle.Text   = "Opzioni";
   OptionsMusic.Text   = "Volume della Musica";
   OptionsSound.Text   = "Effetti Sonori";
   OptionsSpeed.Text   = "Velocita' del Gioco";
   OptionsDefault.Text = "Default";
   OptionsSave.Text    = "Salva";
   OptionsLoad.Text    = "Carica";
   OptionsRestart.Text = "Ricomincia";
   OptionsQuit.Text    = "Esci";
   OptionsPlay.Text    = "Continua";
   gPausedText.Text    = "Partita in Pausa. Premi Spazio per Continuare";
   RestoreTitle.Text   = "Scegli una partita da caricare";
   RestoreCancel.Text  = "Cancella";
   SaveTitle.Text      = "Inserisci un nome";
   SaveOK.Text         = "Salva";
   SaveCancel.Text     = "Cancella";
   gConfirmexitText.Text = "Vuoi davvero uscire? (S/N)";
   gRestartText.Text   = "Vuoi davvero ricominciare? (S/N)";
  }  
}
// ============================= Player function ===========================================
function freeze_player(){player_frozen = true;}

function unfreeze_player(){player_frozen = false;}

function FaceDirection(this Character*, eDirection dir) {
  int dx;
  if (dir==eDir_Left) dx=-1;
  if (dir==eDir_Right) dx=1;
  int dy;
  if (dir==eDir_Up) dy=-1;
  else if (dir==eDir_Down) dy=1;
  this.FaceLocation(this.x+dx, this.y+dy);

}


function SetPlayer(Character*ch) {
  //use this instead of SetPlayerCharacter function.
  if (player.Room==ch.Room) { // if old and new player character are in the same room then scroll room
    int x=GetViewportX();
    int tx=ch.x-160;
    if (tx<0) tx = 0;
    else if (tx>Room.Width-320) tx=Room.Width-320;
    SetViewport(x, GetViewportY());
    while (x<tx) {
      x+=X_SPEED;
      if (x>tx) x=tx;
      SetViewport(x, GetViewportY());
      Wait(1);
    }
    while (x>tx) {
      x -= X_SPEED;
      if (x<tx) x=tx;
      SetViewport(x, GetViewportY());
      Wait (1);
    }
  }
  else // if they are in different rooms
    player.StopMoving();
    player.Clickable=true;
    ch.Clickable=false;
    ch.SetAsPlayer();
    ReleaseViewport();
}

int MovePlayerEx(int x, int y, WalkWhere direct) {
  // Move the player character to x,y coords, waiting until he/she gets there,
  // but allowing to cancel the action by pressing a mouse button.
  if (player_frozen==false) {
    //mouse.ChangeModeGraphic(eModeWait, cursorspritenumber);
    mouse.ChangeModeView(eModeWait, 21);
    GScancelable = 0;
    player.Walk(x, y, eBlock,  direct);  
    //player.Walk(x, y, eNoBlock, direct);
    // wait for release of mouse button
    while (player.Moving && (mouse.IsButtonDown(eMouseLeft) || mouse.IsButtonDown(eMouseRight))) {
      Wait(1);
      mouse.Update();
      CheckDefaultAction();
    }
    // abort moving on new mouse down
    while (player.Moving) {
      int xm=mouse.x;
      int ym=mouse.y;
      InventoryItem*ii=InventoryItem.GetAtScreenXY(xm, ym);
      if (mouse.IsButtonDown(eMouseLeft) && (GUI.GetAtScreenXY(xm, ym)==null || ii!=null)) {
        player.StopMoving();
        GScancelable = 1;
      }
      else if (mouse.IsButtonDown(eMouseRight) && (GUI.GetAtScreenXY(xm, ym)==null || ii!=null)) {
        player.StopMoving();
        GScancelable = 2;
      }
      else {
        Wait(1);
        mouse.Update();
        CheckDefaultAction ();
      }
    }
    mouse.ChangeModeGraphic(eModeWait, blankcursorspritenumber);
    //if (GScancelable==0) return 1;
    //BUG FIX: AdventureTreff:
    if (GScancelable==0 && player.x==x && player.y==y) return 2;
    else if (GScancelable == 0) return 1;
    else return 0;
  }
  else return 0;
}

int MovePlayer(int x, int y) {
  //Move the player character to x,y coords, waiting until he/she gets there, but allowing to cancel the action
  //by pressing a mouse button.
  return MovePlayerEx (x, y, eWalkableAreas);
}

// ============================= Go ===========================================
int GoToCharacterEx(Character*chwhogoes, Character*ch, eDirection dir, int xoffset, int yoffset, bool NPCfacesplayer, int blocking) {
  //Goes to a character staying at the side defined by 'direction': 1 up, 2 right, 3 down, 4 left
  //and it stays at xoffset or yofsset from the character. NPCfacesplayer self-explained.;)
  // blocking: 0=non-blocking; 1=blocking; 2=semi-blocking
  Character*pl=chwhogoes;
  int chx, chy;
  chx=ch.x;
  chy=ch.y;
  int arrived=1;
  if (Offset(pl.x, chx)>xoffset || Offset(pl.y, chy)>yoffset) {
    if (dir==eDir_None) {
      // get the nearest position
      if (Offset (chx, pl.x)>=Offset(chy, pl.y)) {
        // right or left
        if (pl.x>=chx) dir=eDir_Right; //right
        else dir=eDir_Left; //left
      }
      else {
        if (pl.y>=chy) dir=eDir_Down; //abajo
        else dir=eDir_Up;
      }
    }
    // calculate target position
    if (dir==eDir_Up) chy-=yoffset;
    else if (dir==eDir_Right) chx+=xoffset;
    else if (dir==eDir_Down) chy+=yoffset;
    else if (dir==eDir_Left) chx-=xoffset;
    // move character
    if (blocking==0) {
      pl.Walk(chx, chy);
      arrived=0;
    }
    else if (blocking==1) {
      pl.Walk(chx, chy, eBlock, eWalkableAreas);
      arrived=1;
    }
    else if (blocking==2) arrived=MovePlayer(chx, chy);
  }
  if (arrived>0) {
    // characters only face each other after the moving character arrived at the target point
    if (NPCfacesplayer) ch.FaceCharacter(pl, eBlock);
    pl.FaceCharacter(ch, eBlock);
  }
  return arrived;
}

int NPCGoToCharacter(Character*chwhogoes, Character*chtogoto, eDirection dir, bool NPCfacesplayer, int blocking) {
  // same as above but with default x and y offset.
  int defaultxoffset=35;
  int defaultyoffset=20;
  return GoToCharacterEx (chwhogoes, chtogoto, dir, defaultxoffset, defaultyoffset, NPCfacesplayer, blocking);
}

int GoToCharacter(Character*ch, eDirection dir, bool NPCfacesplayer, int blocking) {
  // same as above but with default x and y offset.
  int defaultxoffset=35;
  int defaultyoffset=20;
  return GoToCharacterEx (player, ch, dir, defaultxoffset, defaultyoffset, NPCfacesplayer, blocking);
}

function GoTo(int blocking) {
  // Goes to whatever the player clicked on.
  // blocking: 0=non-blocking; 1=blocking; 2=semi-blocking
  int xtogo, ytogo;
  int locationtype=GetLocationType(mouse.x, mouse.y);
  Hotspot*hot_spot=Hotspot.GetAtScreenXY(mouse.x, mouse.y);
  int arrived=0;
  if (locationtype==eLocationCharacter)
    arrived=GoToCharacter(Character.GetAtScreenXY(mouse.x, mouse.y), eDir_None, false, blocking);
  else {
    if (locationtype==eLocationHotspot && hot_spot.ID>0) {
      xtogo=hot_spot.WalkToX;
      ytogo=hot_spot.WalkToY;
    }
    if (locationtype==eLocationObject) {
      Object*obj=Object.GetAtScreenXY(mouse.x, mouse.y);
      xtogo=obj.X;
      ytogo=obj.Y;
    }
    if (hot_spot==hotspot[0]) {
      xtogo=mouse.x;
      ytogo=mouse.y;
    }
    else {
      xtogo=mouse.x;
      ytogo=mouse.y;
    }
    xtogo+=GetViewportX ();
    ytogo+=GetViewportY ();
    if (blocking==0) player.Walk(xtogo, ytogo);
    else if (blocking==1) {
      player.Walk(xtogo, ytogo, eBlock);
      arrived=1;
    }
    else if (blocking==2) arrived=MovePlayer(xtogo, ytogo);
  }
  return arrived;
}

function Go() {
  // Go to whatever the player clicked on. You can cancel the action, and returns 1 if the player has gone to it.
  return GoTo(2);
}

function WalkOffScreen(){
//handles the action of hotspots with exit extension ('>e').
//double click in such hotspots/objects... will make the player skip
//walking to it. Look the documentation for more information on exits.
  
  // doubleclick
  if (UsedAction(eMA_WalkTo)) {
    if (timer_run == true)
    {
      timer_run=false;
      if (MovePlayerEx(player.x,player.y,eWalkableAreas)>0) hotspot[GSlocid].RunInteraction(eModeUsermode1);
    }
    else
    {
      //doubleclick = false;
      timer_run = true;
      if (Go()){
        int x=player.x,y=player.y;
        int offset=walkoffscreen_offset;
        int dir=ExtensionEx(2,GSlocname);
        if      (dir=='u') y-=offset;
        else if (dir=='d') y+=offset;
        else if (dir=='l') x-=offset;
        else if (dir=='r') x+=offset;
        if (MovePlayerEx(x,y,eAnywhere)>0){
          hotspot[GSlocid].RunInteraction(eModeUsermode1);
        }
      }    
    }
  }
}

// ============================= Unhandled Events ===========================================

  // Please check this section and replace the boring default values with your own.
  // If you courious, how it all works, keep on reading this comment ;-)
  //
  //Check modes with: if(UsedAction(A_???)), check types by if(type==#). types:
  // 1   a hotspot
  // 2   a character
  // 3   an object
  // 4   an inventory item.
  // 5   inv. item on hotspot
  // 6   inv. item on character
  // 7   inv. item on object
  // 8   inv. item on inv. item
  //
  // You have the string "locationname" that is the name of
  // what you clicked on, and the string "usedinvname" that is
  // the name of the item that was used on where you clicked (only for types 5,6,7,8)
    
function Unhandled(int door_script) {
  InventoryItem*ii=InventoryItem.GetAtScreenXY(mouse.x, mouse.y);
  int type=0;
  if (GSloctype==eLocationHotspot) type=1;
  if (GSloctype==eLocationCharacter) type=2;
  if (GSloctype==eLocationObject) type=3;
  String locationname=GSlocname;
  String usedinvname;
  String translation;
  translation=Game.TranslationFilename;
  location=locationname;
  RemoveExtension();
  locationname=location;
  if (ii!=null) type = 4;
  if (GSagsusedmode == eModeUseinv) {
    if (ii!=null) {
      usedinvname=ii.Name;
      location=usedinvname;
      RemoveExtension();
      usedinvname=location;
      if (type>0) type+=4;
    }
  }
  if (GSagsusedmode!=eModeUsermode2 && type!=0) {
    if (type==2 || type==6) player.FaceCharacter(character[GSlocid], eBlock);

    // unhandled USE
    if (UsedAction(eGA_Use)) {
      // use inv on inv
      if (type >= 5) player.Say("That won't do any good.");
      // use
      else player.Say("I can't use that.");
    }
    
    // unhandled LOOK AT  
    else if (UsedAction(eGA_LookAt)) {
      // look at hotspots, objects etc.
      if (type!=2) player.Say ("Nice %s", locationname);
      // look at characters
      else player.Say("It's %s",locationname);
    }
    
    // unhandled PUSH
    else if (UsedAction(eGA_Push)) {
      // push everything except characters
      if (type!=2) player.Say("I can't push that.");
      // push characters
      else player.Say("I can't push %s",locationname);
    }
    
    // unhandled PULL
    else if (UsedAction(eGA_Pull)){
      // pull everything except characters
      if (type!=2) player.Say("I can't pull that.");
      // pull characters
      else player.Say("I can't pull %s",locationname);
    }
    
    // unhandled CLOSE
    else if (UsedAction(eGA_Close)){
      if (door_script == 1) player.Say("It has already been closed.");
      else if (type == 2) player.Say("Doing that with %s is not a good idea.",locationname);
      else player.Say("I can't close that.");
    }
    
    // unhandled OPEN
    else if (UsedAction(eGA_Open)) {
      if (door_script == 1) player.Say("It is already open.");
      else if (type ==2) player.Say("%s would not like it.",locationname);
      else player.Say("I can't open that.");
    }
    
    // unhandled PICKUP
    else if (UsedAction(eGA_PickUp)) {
      if (type!=2) player.Say("I don't need that.");
      else player.Say("I don't want to pick %s up.",locationname);
    }

    // unhandled TALK TO
    else if (UsedAction(eGA_TalkTo)) {
      if (type==2) player.Say("I don't want to talk to %s", locationname);
      else player.Say("I have nothing to say.");
    }
    
    // unhandled USE INV
    else if (UsedAction(eGA_UseInv)) player.Say("That won't do any good.");
    
    // unhandled GIVE
    else if (ItemGiven != null) player.Say("I'd rather keep it.");  
    
    // unhandled DEFAULT
    else if (type==4) player.Say("I can't do that.");

  }
}

// ============================= interaction functions ===========================================
function EnterRoom(this Character*, int newRoom, int x, int y, eDirection dir, bool onWalkable) {
  this.ChangeRoom(newRoom, x, y);
  if (onWalkable) this.PlaceOnWalkableArea();
  this.FaceDirection(dir);
}

function any_click_move (int x, int y, eDirection dir) {
  int result=MovePlayer(x, y);
  if (result) {
    player.FaceDirection(dir);
    Wait(5);
  }
  return result;
}

function any_click_walk(int x, int y, eDirection dir){
  int result=1;
  if (UsedAction(eMA_WalkTo)) any_click_move(x, y, dir);
  else result=0;
  return result;
  // 0 = unhandled
  // 1 = handled
}

function any_click_walk_look(int x, int y, eDirection dir, String lookat){
  int result=any_click_walk(x, y, dir);
  //if (result==0 && UsedAction(eGA_LookAt) && lookat.Length>0) {
  if (result==0 && lookat.Length>0) {
    result=1;
    if (any_click_move(x, y, dir)) {
      player.Say(lookat);
    }
  }
  return result;
  // 0 = unhandled
  // 1 = handled
}

function any_click_use_inv(InventoryItem*iitem, int x, int y, eDirection dir) {
  int result=0;
  if (UsedAction(eGA_UseInv)) {
    if (player.ActiveInventory==iitem) {
      if (any_click_move (x, y, dir)) result = 2;
      else                            result = 1;
    }
  }
  return result;
  // 0 = unhandled
  // 1 = handled, but canceled
  // 2 = use this item
}

#ifdef USE_OBJECT_ORIENTED_AUDIO
function any_click_walk_look_pick(int x, int y, eDirection dir, String lookat, int obj, InventoryItem*iitem, AudioClip *sound) {
  AudioChannel *chan;
  int result=MovePlayer(x, y);
  if (result>0 && UsedAction(eGA_PickUp)) {
    if (any_click_move (x, y, dir)) {
      if (lookat.Length>0) player.Say(lookat);
      if (sound != null)chan = sound.Play();
      if (obj>=0) object[obj].Visible=false;
      if (iitem!=null) player.AddInventory(iitem);
      result=2;
    }
  }
  return result;
  // 0 = unhandled
  // 1 = handled, but canceled
  // 2 = picked up
}
#endif

#ifndef USE_OBJECT_ORIENTED_AUDIO
function any_click_walk_look_pick(int x, int y, eDirection dir, String lookat, int obj, InventoryItem*iitem, int sound) {
  int result=MovePlayer(x, y);
  if (result>0 && UsedAction(eGA_PickUp)) {
    if (any_click_move (x, y, dir)) {
      if (lookat.Length>0) player.Say(lookat);
      if (sound != 0)PlaySound(sound);
      if (obj>=0) object[obj].Visible=false;
      if (iitem!=null) player.AddInventory(iitem);
      result=2;
    }
  }
  return result;
  // 0 = unhandled
  // 1 = handled, but canceled
  // 2 = picked up
}
#endif
// ============================= Door functions ==========================================

function set_door_strings(String lookat, String islocked, String wrongitem, String closefirst, String unlock, String relock) {
  door_strings[0]=lookat;
  door_strings[1]=islocked;
  door_strings[2]=wrongitem;
  door_strings[3]=closefirst;
  door_strings[4]=unlock;
  door_strings[5]=relock;

}

String get_door_strings(String what_type) {
  String ret_value;
  
       if (what_type == "lookat")     ret_value= door_strings[0];
  else if (what_type == "islocked")   ret_value= door_strings[1];
  else if (what_type == "wrongitem")  ret_value= door_strings[2];
  else if (what_type == "closefirst") ret_value= door_strings[3];
  else if (what_type == "unlock")     ret_value= door_strings[4];
  else if (what_type == "relock")     ret_value= door_strings[5];
  else ret_value= "INVALID STRING";
  
  if (String.IsNullOrEmpty(ret_value) || ret_value =="0") return "";
  else return ret_value;
}

#ifdef USE_OBJECT_ORIENTED_AUDIO
function any_click_on_door_special(int door_id, int obj, int x, int y, eDirection dir, int nr_room, int nr_x, int nr_y, eDirection nr_dir, AudioClip *opensound, AudioClip *closesound, int key, int closevalue) {
  // key = -1: masterkey - even locked doors will be opened
  // key = -2: door can't be unlocked (like rusted)
  AudioChannel *chan;
  int result=1;
  
  if (UsedAction(eGA_Close)) {
    if (get_door_state(door_id)==0 || get_door_state(door_id)==2)
      Unhandled(1);
    else if (get_door_state(door_id)==1) {
      if (any_click_move (x, y, dir)) {
        if (closesound != null) chan = closesound.Play();
        // Play default sound
        else if (closeDoorSound != null) chan = closeDoorSound.Play();
        object[obj].Visible=false;
        set_door_state(door_id, closevalue);
      }
    }
  }
  else if (UsedAction(eGA_Open)) {
    if (get_door_state(door_id)==0 || (get_door_state(door_id)==2 && key==-1)) {
      if (any_click_move (x, y, dir))
      {
        if (opensound != null) chan = opensound.Play();
        // Play default sound
        else if (openDoorSound != null) chan = openDoorSound.Play();    
        
        object[obj].Visible=true;
        set_door_state(door_id, 1);
      }
    }
    else if (get_door_state(door_id)==1) Unhandled(1);
    else if (get_door_state(door_id)==2) {
      if (any_click_move (x, y, dir)) if (!String.IsNullOrEmpty(get_door_strings("islocked"))) player.Say(get_door_strings("islocked"));
    }
  }
  else if (UsedAction(eMA_WalkTo))
  {
    
    if (get_door_state(door_id)==1) {
      if (timer_run == true && openDoorDoubleclick==true)
      {
        timer_run = false;
        if (MovePlayerEx(player.x,player.y,eWalkableAreas)>0) player.EnterRoom(nr_room, nr_x, nr_y, nr_dir, true);
        result = 2;
      }
      else
      {
        //doubleclick = false;
        if (openDoorDoubleclick)timer_run = true;
        if (Go()){
          player.EnterRoom(nr_room, nr_x, nr_y, nr_dir, true);
          result=2;          
        }
        
      }
    }else any_click_move(x, y, dir);

  }
  else if (UsedAction (eGA_LookAt) && !String.IsNullOrEmpty(get_door_strings("lookat"))) {
    if (any_click_move (x, y, dir)) if (!String.IsNullOrEmpty(get_door_strings("lookat")))player.Say(get_door_strings("lookat"));
  }
  else if (UsedAction(eGA_UseInv) && key>=0) {
    if (any_click_move (x, y, dir)) {
      if (player.ActiveInventory==inventory[key]) {
        if (get_door_state(door_id)==1) {
          if (!String.IsNullOrEmpty(get_door_strings("closefirst"))) player.Say(get_door_strings("closefirst"));
        }
        else if (get_door_state(door_id)==2) {
          if (unlockDoorSound != null) chan = unlockDoorSound.Play();
          if (!String.IsNullOrEmpty(get_door_strings("unlock"))) player.Say(get_door_strings("unlock"));
          set_door_state(door_id, closevalue);
        }
        else if (get_door_state(door_id)==0) {
          object[obj].Visible=false;
          set_door_state(door_id, 2);
          if (!String.IsNullOrEmpty(get_door_strings("relock"))) player.Say(get_door_strings("relock"));
        }
      }
      else if (!String.IsNullOrEmpty(get_door_strings("wrongitem"))) player.Say(get_door_strings("wrongitem"));
    }
  }
  else result=0;
  
  return result;
  // 0 = unhandled
  // 1 = handled
  // 2 = NewRoom
}
#endif

#ifnver 3.2
function any_click_on_door_special(int door_id, int obj, int x, int y, eDirection dir, int nr_room, int nr_x, int nr_y, eDirection nr_dir, int opensound, int closesound, int key, int closevalue) {
  // key = -1: masterkey - even locked doors will be opened
  // key = -2: door can't be unlocked (like rusted)
  int result=1;
  
  if (UsedAction(eGA_Close)) {
    if (get_door_state(door_id)==0 || get_door_state(door_id)==2)
      Unhandled(1);
    else if (get_door_state(door_id)==1) {
      if (any_click_move (x, y, dir)) {
        if (closesound != 0) PlaySound(closesound);
        // Play default sound
        else if (closeDoorSound != 0) PlaySound(closeDoorSound);
        object[obj].Visible=false;
        set_door_state(door_id, closevalue);
      }
    }
  }
  else if (UsedAction(eGA_Open)) {
    if (get_door_state(door_id)==0 || (get_door_state(door_id)==2 && key==-1)) {
      if (any_click_move (x, y, dir))
      {
        if (opensound != 0) PlaySound(opensound);
        // Play default sound
        else if (openDoorSound != 0) PlaySound(openDoorSound);    
        
        object[obj].Visible=true;
        set_door_state(door_id, 1);
      }
    }
    else if (get_door_state(door_id)==1) Unhandled(1);
    else if (get_door_state(door_id)==2) {
      if (any_click_move (x, y, dir)) if (!String.IsNullOrEmpty(get_door_strings("islocked"))) player.Say(get_door_strings("islocked"));
    }
  }
  else if (UsedAction(eMA_WalkTo))
  {
    
    if (get_door_state(door_id)==1) {
      if (timer_run == true && openDoorDoubleclick==true)
      {
        timer_run = false;
        if (MovePlayerEx(player.x,player.y,eWalkableAreas)>0) player.EnterRoom(nr_room, nr_x, nr_y, nr_dir, true);
        result = 2;
      }
      else
      {
        //doubleclick = false;
        if (openDoorDoubleclick)timer_run = true;
        if (Go()){
          player.EnterRoom(nr_room, nr_x, nr_y, nr_dir, true);
          result=2;          
        }
        
      }
    }else any_click_move(x, y, dir);

  }
  else if (UsedAction (eGA_LookAt) && !String.IsNullOrEmpty(get_door_strings("lookat"))) {
    if (any_click_move (x, y, dir)) if (!String.IsNullOrEmpty(get_door_strings("lookat")))player.Say(get_door_strings("lookat"));
  }
  else if (UsedAction(eGA_UseInv) && key>=0) {
    if (any_click_move (x, y, dir)) {
      if (player.ActiveInventory==inventory[key]) {
        if (get_door_state(door_id)==1) {
          if (!String.IsNullOrEmpty(get_door_strings("closefirst"))) player.Say(get_door_strings("closefirst"));
        }
        else if (get_door_state(door_id)==2) {
          if (unlockDoorSound != 0) PlaySound(unlockDoorSound);
          if (!String.IsNullOrEmpty(get_door_strings("unlock"))) player.Say(get_door_strings("unlock"));
          set_door_state(door_id, closevalue);
        }
        else if (get_door_state(door_id)==0) {
          object[obj].Visible=false;
          set_door_state(door_id, 2);
          if (!String.IsNullOrEmpty(get_door_strings("relock"))) player.Say(get_door_strings("relock"));
        }
      }
      else if (!String.IsNullOrEmpty(get_door_strings("wrongitem"))) player.Say(get_door_strings("wrongitem"));
    }
  }
  else result=0;
  
  return result;
  // 0 = unhandled
  // 1 = handled
  // 2 = NewRoom
}
#endif

function any_click_on_door(int door_id, int obj, int x, int y, eDirection dir, int nr_room, int nr_x, int nr_y, eDirection nr_dir) {
#ifdef USE_OBJECT_ORIENTED_AUDIO
return any_click_on_door_special (door_id, obj, x, y, dir, nr_room, nr_x, nr_y, nr_dir, null, null, 0, 0);
#endif

#ifndef USE_OBJECT_ORIENTED_AUDIO
return any_click_on_door_special (door_id, obj, x, y, dir, nr_room, nr_x, nr_y, nr_dir, 0, 0, 0, 0);
#endif
}

// ============================= AGS internal functions ==========================================

function on_mouse_click(MouseButton button) {
  
  if (!is_gui_disabled()) {
    int mrx=mouse.x+GetViewportX();
    int mry=mouse.y+GetViewportY();
    int x=mouse.x;
    int y=mouse.y;
    // get location under mouse cursor
    GSloctype=GetLocationType(x, y);
    GSlocname=Game.GetLocationName(x, y);
    GSagsusedmode=Mouse.Mode;
    used_action=global_action;
    
    InventoryItem*ii = InventoryItem.GetAtScreenXY(x, y);
    if (GSloctype==eLocationHotspot) {
      Hotspot*h=Hotspot.GetAtScreenXY(x, y);
      GSlocid=h.ID;
      
    }
    else if (GSloctype==eLocationCharacter) {
      Character*c=Character.GetAtScreenXY(x, y);
      GSlocid=c.ID;
    }
    else if (GSloctype==eLocationObject) {
      Object*o=Object.GetAtScreenXY(x, y);
      GSlocid=o.ID;
    }
    else if (ii!=null) GSlocid=ii.ID;
    
    
    
    
    if (IsGamePaused()) {
      // Game is paused, so do nothing (ie. don't allow mouse click)
    }
    // Mousebutton Left
    else if (button==eMouseLeft)
    {
        
      if (GlobalCondition(2) || GlobalCondition(3) || GlobalCondition(4)) {
        // Do nothing, if:
        // the mode is useinv and the mouse is over the active inv (like "use knife on knife")
        // or the mode is talk, or "Give", and the mouse isnt over a character
        // or its GIVE and the mouse isnt over a inv.item

      }
      else if (ExtensionEx(1, GSlocname)=='e') {
        UpdateActionBar();
        ActionLine.TextColor=ActionLabelColorHighlighted;
        WalkOffScreen();
      }
      // walk to
      else if (GSagsusedmode==eModeUsermode2) {
        ActionLine.TextColor=ActionLabelColorHighlighted;
        if (IsInteractionAvailable(x, y, GSagsusedmode)) ProcessClick (x, y, GSagsusedmode);
        else ProcessClick(x, y, eModeWalkto);
      }  
      // talkto
      else if (GSagsusedmode==eModeTalkto && IsInteractionAvailable(x, y, GSagsusedmode) && GSloctype==eLocationCharacter) {
        ActionLine.TextColor=ActionLabelColorHighlighted;
        if (GoToCharacter(character[GSlocid], eDir_None, NPC_facing_player, 1)) character[GSlocid].RunInteraction(GSagsusedmode);
      //  SetAction(eMA_Default);
      }
      // Giveto
      else if ((GSagsusedmode == eModeUseinv) && GSloctype==eLocationCharacter && isAction(eGA_GiveTo)) {
        ActionLine.TextColor=ActionLabelColorHighlighted;
        ItemGiven=player.ActiveInventory;
        
        if (GoToCharacter(character[GSlocid], eDir_None, NPC_facing_player, 2)) {
          if (IsInteractionAvailable (mrx - GetViewportX (), mry - GetViewportY (), eModeUseinv) == 1) {
            character[GSlocid].RunInteraction(eModeUseinv);        
          }
        }
//       SetAction (eMA_Default);
      }    
      else {
        UpdateActionBar();
        ActionLine.TextColor=ActionLabelColorHighlighted;
        ProcessClick(x, y, GSagsusedmode);
   //     SetAction(eMA_Default);
        ItemGiven=null;
      }
    }
    // Mousebutton Right
     else if (button==eMouseRight) {
      if (alternative_action==eMA_Default) {
      //  SetAction(eMA_Default);
        ActionLine.TextColor=ActionLabelColorHighlighted;
        if (Mouse.Mode==eModeUsermode2) {
          if (ExtensionEx(1, GSlocname)=='e') {
            UpdateActionBar();
            ActionLine.TextColor=ActionLabelColorHighlighted;
            WalkOffScreen();
          }          
         else ProcessClick(x, y, eModeWalkto);
        }
        else ProcessClick(x, y, Mouse.Mode);
      }
      else
      {
        SetAction(alternative_action);
        used_action=global_action;
        UpdateActionBar();
        ActionLine.TextColor=ActionLabelColorHighlighted;
        GSagsusedmode=Mouse.Mode;
        if (GSagsusedmode==eModeTalkto && IsInteractionAvailable(x, y, GSagsusedmode) && GSloctype==eLocationCharacter) { //(GetCharacterAt (mouse.x, mouse.y) < 7))
          if (GoToCharacter(character[GSlocid], eDir_None, NPC_facing_player,2 )) character[GSlocid].RunInteraction(GSagsusedmode);
        }
        else ProcessClick(x, y, GSagsusedmode);
     //   SetAction(eMA_Default);
      }
    }
    //left click in inventory
    else if (button==eMouseLeftInv) {
      if (!isAction(eGA_GiveTo))ItemGiven= null;
  
      if (GlobalCondition (1)) {
        // if the mouse is in the inventory and modes Walk or pickup are selected
        SetAction (eGA_Use);
        location=GSinvloc;    
        if (Extension()=='u' && ii.IsInteractionAvailable(eModeInteract)) {
          // use it immediately (not with anything else)
          used_action=global_action;
          ii.RunInteraction(eModeInteract);
       //   SetAction(eMA_Default);
        }
        else {
          if (oldschool_inv_clicks) {
            SetAction (eGA_LookAt);
            used_action=global_action;
            ii.RunInteraction(eModeLookat);  
         //   SetAction(eMA_Default);
          }
          else player.ActiveInventory=ii;
        }
      }
      else  if (GlobalCondition (2) == 1) {
        // if the mode is useinv and the mouse is over the active inv (like "use knife on knife")
        // so do nothing again
      }
      else {
        used_action=global_action;
        if (Mouse.Mode==eModeInteract) {
          if (isAction(eGA_Use) && ii.IsInteractionAvailable(eModeInteract)) {
            ActionLine.TextColor=ActionLabelColorHighlighted;
            ii.RunInteraction(eModeInteract);
           // SetAction(eMA_Default);
          }
          else player.ActiveInventory=ii;
        }
        else {
          if ( (Mouse.Mode >0 && Mouse.Mode <10 )&& ii != null) {
                GSagsusedmode=Mouse.Mode;
                ActionLine.TextColor=ActionLabelColorHighlighted;
                ii.RunInteraction(Mouse.Mode);
             //   SetAction(eMA_Default);
          }
        }
      }
    }
    //right click in inventory
    else if (button==eMouseRightInv) {
      if (alternative_action==eMA_Default) {
     //   SetAction(eMA_Default);
      }
      else {
        SetAction(alternative_action);
        used_action=global_action;
        GSagsusedmode=Mouse.Mode;
        if (Mouse.Mode==eModeInteract) {
          if (isAction(eGA_Use) && ii.IsInteractionAvailable(eModeInteract)) {
            UpdateActionBar();
            ActionLine.TextColor=ActionLabelColorHighlighted;
            ii.RunInteraction(eModeInteract);
       //     SetAction(eMA_Default);
          }
          else player.ActiveInventory=ii;
        }
        else {
          UpdateActionBar();
          ActionLine.TextColor=ActionLabelColorHighlighted;
          inventory[game.inv_activated].RunInteraction(Mouse.Mode);
         // SetAction(eMA_Default);
        }
      }
    }
  }
}

function repeatedly_execute_always() {
  // Doubleclick Timer
  if (!IsGamePaused() && !is_gui_disabled()) {
    if (timer_run == true)
    {
      timer_click++;
      if (timer_click >= dc_speed){
        timer_click = 0;
        timer_run = false;
      }
    }
  }
}

function repeatedly_execute() {  
  if (!IsGamePaused() && !is_gui_disabled())
  {
    
    // --- for the MovePlayer function ---
    if (GScancelable==1) {
      GScancelable=0;
      if (InventoryItem.GetAtScreenXY(mouse.x, mouse.y)==null) on_mouse_click(eMouseLeft);
      else on_mouse_click(eMouseLeftInv);
    }
    else if (GScancelable==2) {
      GScancelable=0;
      CheckDefaultAction();
      if (InventoryItem.GetAtScreenXY(mouse.x, mouse.y)==null) on_mouse_click(eMouseRight);
      else on_mouse_click(eMouseRightInv);
    }
    CheckDefaultAction();
    UpdateActionBar();
  }
  // change the arrows in the inventory to show if you
  // can scroll the inventory:
  if (MainInv.TopItem>0) {
    // if inventory can scroll up
    InvUp.NormalGraphic=invUparrowONsprite;
    InvUp.MouseOverGraphic=invUparrowHIsprite;
    
    if (InventoryItem.GetAtScreenXY(gMaingui.X+MainInv.X+1, gMaingui.Y+MainInv.Y+1)==null) MainInv.TopItem-=MainInv.ItemsPerRow;
  }
  else {
    InvUp.NormalGraphic=invUparrowOFFsprite;
    InvUp.MouseOverGraphic=invUparrowOFFsprite;
  }
  //if inv can scroll down
  if (MainInv.TopItem<MainInv.ItemCount-(MainInv.ItemsPerRow * MainInv.RowCount)) {
    InvDown.NormalGraphic=invDownarrowONsprite;
    InvDown.MouseOverGraphic=invDownarrowHIsprite;
  }
  else{
    InvDown.NormalGraphic=invDownarrowOFFsprite;
    InvDown.MouseOverGraphic=invDownarrowOFFsprite;
  }
  
}

// ============================= Exports GUI Things===========================================
export ActionLabelColorHighlighted;
export key_l_yes, key_u_yes, key_l_no, key_u_no;
export action_l_keycode;
export action_u_keycode;
export GStopsaveitem;
export listBoxGap;
export ItemGiven;
export lang;

Inviato da: AprilSkiesil 19 Dec 2014, 08:49

No nelle if devi lasciarlo. altrimenti va in errore.

Ho appena creato un gioco 9 verbs di default tanto per provare ed ho incollato il tuo global script.

Mi funziona perfettamente. In pratica se uso un'azione e clicco su un oggetto mi rimane settata quell'azione, come prevedevo.
Se era questo quello che volevi fare...
però mi viene un dubbio: non è che tu intendevi che quando vai su un oggetto si "EVIDENZIA" con un highlight il bottone "esamina"??????????????

Se sì, ti sei spiegato un po' male!

Quello lo fa perché, nel 9 verbs, lo fa sempre. Infatti se tu CLICCHI CON IL DESTRO, vedrai, che di default lui ESAMINA.

E' una comodità.

Se lo vuoi togliere... ora mi guardo il codice e ti dico come fare.

Se, invece, il fatto di non far cambiare azione non ti serve, rimetti il codice della GUI com'era prima.

Inviato da: AprilSkiesil 19 Dec 2014, 09:22

OK, ho esaminato tutto il codice e provato:

Rimetti tutto com'era (intendo il SetAction(eMA_Default) )

Poi cerca nella GUIscript la funzione:
function CheckDefaultAction()

Qui troverai questa parte di codice:

CODICE
if (GetLocationType(x, y)==eLocationCharacter) // if it is a character
      AddExtension('t'); // set default action "talk to"
    else if ((GetLocationType(x, y)!=eLocationNothing) || (InventoryItem.GetAtScreenXY(x, y)!=null))
      // if its an inv item, a hotspot or an object
      AddExtension('l'); // set default action "look at"
    else
      AddExtension('n'); // set default action "none"


modificala così:

CODICE
if (GetLocationType(x, y)==eLocationCharacter) // if it is a character
      AddExtension('n'); // set default action "talk to"
    else if ((GetLocationType(x, y)!=eLocationNothing) || (InventoryItem.GetAtScreenXY(x, y)!=null))
      // if its an inv item, a hotspot or an object
      AddExtension('n'); // set default action "look at"
    else
      AddExtension('n'); // set default action "none"

Inviato da: Squall_Leonheartil 19 Dec 2014, 12:32

No, attenzione. Mi sarò espresso male perdonami.
Il problema non è l'azione che compie col tasto destro, quella va bene ed è comoda!
Ma se ad esempio io utilizzo il comando apri, quando poi clicco sulla porta si evidenza il bottone dell'esamina! la stessa cosa accade anche con gli altri comandi, eccetto il comando parla perché in questo punto che mi hai evidenziato è programmato per i personaggi! Quello il problema. Che quando avviene un azione, non si deve illuminare lo stesso il bottone dell'azione default.

Inviato da: AprilSkiesil 19 Dec 2014, 13:29

Ok, fai quella modifica che ti ho scritto ed è ok ;-)
non si evidenzierà più biggrin2a.gif

scrivi quella parte di codice così:

CODICE
if (GetLocationType(x, y)==eLocationCharacter) // if it is a character
      AddExtension('n'); // set default action "talk to"
    else if ((GetLocationType(x, y)!=eLocationNothing) || (InventoryItem.GetAtScreenXY(x, y)!=null))
      // if its an inv item, a hotspot or an object
      AddExtension('n'); // set default action "look at"
    else
      AddExtension('n'); // set default action "none"

Inviato da: Squall_Leonheartil 19 Dec 2014, 13:45

Si però così non si illumina più niente, invece vorrei che rimanesse evidenziata la scritta del comando in corso.

Inviato da: AprilSkiesil 22 Dec 2014, 10:52

in tal caso devi modificare quello script.
Ora sono fuori per lavoro. Rientro dopodomani e te lo modifico.

Nel frattempo vai avanti su altro ^^

Inviato da: Squall_Leonheartil 22 Dec 2014, 22:33

Ho un altra domanda, se voglio importare un immagine, decidendo che il colore trasparente sia quello al centro di essa, come posso fare? Aspetto i suggerimenti per lo script ^^

Inviato da: AprilSkiesil 29 Dec 2014, 15:25

ECCOMI!!!

scusami l'assenza m le vacanze di Natale hanno comportato più impegni del solito ^^

Allora, la risposta all'ultima domanda è semplice:

Crea un file PNG con trasparenza nella zona che ti interessa.
Importa il file PNG e imposta colore trasparente "NONE", poi quando ti chiede se vuoi usare il canale ALPHA (la trasparenza) del PNG rispondi sì.
Ovviamente /IMPORTANTE) devi settare il gioco sulla grafica a 32 bit, nelle impostazioni del gioco ^^

Lo script è in arrivo!

Inviato da: AprilSkiesil 29 Dec 2014, 17:05

Ecco il tuo script:

in pratica vai dentro CheckDefaultAction()
Cancella tutto e copiaci dento questo:

CODICE
function CheckDefaultAction() {
  // you could want to change which extension activates which default action, or which button sprite
  // it changes. The extensions are characters, so remember to put them with single ', not ".
  int x=mouse.x;
  int y=mouse.y;
  location=Game.GetLocationName(x, y);
    
  if (GetLocationType(x, y)!=eLocationNothing)
  {
  RemoveExtension();
  int Azione = global_action;
  if (Azione == eMA_WalkTo) Display("SI");//AddExtension('n');
  else if (Azione == eGA_LookAt) AddExtension('l');
  else if (Azione == eGA_TalkTo) AddExtension('t');
  else if (Azione == eGA_GiveTo) AddExtension('g');
  else if (Azione == eGA_PickUp) AddExtension('p');
  else if (Azione == eGA_Use) AddExtension('u');
  else if (Azione == eGA_Open) AddExtension('o');
  else if (Azione == eGA_Close) AddExtension('c');
  else if (Azione == eGA_Push) AddExtension('s');
  else if (Azione == eGA_Pull) AddExtension('y');
  }
  
  SetAlternativeAction('g', eGA_GiveTo);
  SetAlternativeAction('p', eGA_PickUp);
  SetAlternativeAction('u', eGA_Use);
  SetAlternativeAction('o', eGA_Open);
  SetAlternativeAction('l', eGA_LookAt);
  SetAlternativeAction('s', eGA_Push);
  SetAlternativeAction('c', eGA_Close);
  SetAlternativeAction('t', eGA_TalkTo);
  SetAlternativeAction('y', eGA_Pull);
  
  
  RemoveExtension();
  SHOWNlocation=location;
}

Inviato da: Squall_Leonheartil 1 Jan 2015, 14:15

Ciao scusami se ti rispondo in ritardo, purtroppo c'è un problema.
Mi dice continuamente SI come muovo il mouse :/
E poi se premo il tasto destro non si illumina la casella dell'azione in corso.

Inviato da: AprilSkiesil 1 Jan 2015, 19:44

oddio scusa... un refuso.
if (Azione == eMA_WalkTo) Display("SI");//AddExtension('n');
cancellalo e riscrivi:
if (Azione == eMA_WalkTo) AddExtension('n');

Inviato da: Squall_Leonheartil 3 Jan 2015, 13:56

April grazie mille per il tuo tempo, ma c'è un bug o forse mi ero semplicemente espresso male.
Quando premo il tasto destro si mette il mouse in attesa e il pg va verso l'oggetto, solo che ora non fa nulla.
Invece l'azione default col tasto destro andava bene! Il problema era solo coi cursori.
Come posso rimanere l'azione default avendo però i cursori giusti?

Inviato da: AprilSkiesil 3 Jan 2015, 22:42

se rimetti lo script com'era prima invece le interazioni vanno?
Lo script vecchio è nei post precedenti.

Fammi capire bene ;-)

Inviato da: Squall_Leonheartil 3 Jan 2015, 22:45

Allora prendendo il 9 verb pulito, il problema è questo:

Riguarda solo i bottoni.
Qualsiasi azione venga compiuta cambia il bottone dell'esamina, anche durante l'azione parla o altre.
Quindi non è il comando a dare problemi, ma la gestione della grafica.
Poiché se premo su prendi, andando sull'oggetto e cliccando prendi dovrebbe rimanere quel bottone in azione.. Invece il pg si avvia per compiere l'azione prendi, ma col comando esamina evidenziato!


Edit : ora sto avendo anche un altro problema, vorrei creare uno specchio e quindi la sagoma dell'eroe riflessa al suo interno.. Su questo ho trovato uno script di nome icicles che però non saprei come importare e far funzionare. Ti posto il file script? Da un errore a LabelDebug.

Inviato da: AprilSkiesil 4 Jan 2015, 10:08

Per risolvere il problema dei pulsanti, lo script che ti avevo postato, sul gioco "default" funziona. L'ho appena provato, quindi nel tuo caso probabilmente succede qualcos'altro. Riusciresti a caricare tutta la cartella su un sito di sharing, tipo drop-box? E' l'unico modo che ho per capire.

NOTA per il futuro: il 9-verbi funziona così, anche nei vecchi giochi Lucas: rimane evidenziata l'azione di default, anche se ne stai compiendo un'altra. perché ti indica cosa avverrebbe se clicchi con il destro. Siccome lo script dei 9 verbi è molto incasinato, consiglio sempre di creare delle interfacce nuove da zero, che "codi" a tuo piacimento. Toccare uno script così complicato è difficile per persone alle prime armi.

Quanto al modulo per il riflesso, stai usando il modulo di Monsieur OUXX?

Inviato da: Squall_Leonheartil 4 Jan 2015, 14:09

Si esattamente blush.gif
Sto cercando di riuscire a gestirlo. Ma mi da un errore a questa riga:

CITAZIONE
LabelDebug.Text = String.Format("transp=%d", c.Transparency);



Vorrei capire come funziona.
Ad occhio è croce ho visto che imposta due region, una per collocare la posizione del riflesso e l'altra dell'eroe davanti allo specchio. Poi ho visto che ha creato dei characters per il riflesso, quindi nello script ha impostato un azione del tipo:

Se eroe è su regione 3, fai apparire il chara nella regione 4.
Così si può ben delineare anche il limite del riflesso... Il problema è che non riesco a farlo funzionare nel mio gioco.
Mi da quell'errore e poi noto, che bisognerebbe apportare una piccola modifica poiché utilizzo il fatto dell'interrutore della luce. Ma quello poi si vede, adesso mi interessa capire il da farsi e lo script.

Inviato da: AprilSkiesil 4 Jan 2015, 18:25

quella riga lì serve per vedere su schermo cosa succede (in particolare dovresti creare una label in cui visualizzi, il valore della transparency). Serve per il settaggio.
infatti si chiama debug.

Nel tuo caso puoi omettere:

metti le solite "//" davanti a quella riga e vai ;-)

Inviato da: Squall_Leonheartil 4 Jan 2015, 22:13

Ok, ora parte il modulo. Solo che non appare il riflesso.
Nella room ho messo questo:

CODICE
bool mirrorsCreated = false;
bool moduleInitialized = false;

function room_Load()
{


  //do this only once in your entire game
  if (!moduleInitialized) {
    
    Mirrors2.AddMirrorChar(cMirror1);
    Mirrors2.AddMirrorChar(cMirror2);
    Mirrors2.AddMirrorChar(cMirror3);

    moduleInitialized = true;
  }
  

  //do this for each room that has mirrors
  if (!mirrorsCreated) {
    

  
    Mirrors2.NewMirror(oMirror1,  oCenter1, region[4], eSymmetryHoriz, 1.0, 30.0, 0, 0);
    Mirrors2.NewMirror(oMirror2,  oCenter2, region[1], eSymmetryVertic, 1.0, 100.0, 0, 0);
    Mirrors2.NewMirror(oMirror3,  oCenter3, region[1], eSymmetryNone, 1.0, 100.0, 0, 40);
    
    Mirrors2.SetSubstituteCharacter(oMirror3, cSubstitute1);
    mirrorsCreated = true;
  }


  //You must enable the mirrors manually after you create them
  Mirrors2.EnableMirror(oMirror1);
  Mirrors2.EnableMirror(oMirror2);
  Mirrors2.EnableMirror(oMirror3);
  //you could also do : Mirrors2.EnableAllMirrorsInRoom();
}


Ora come regione 4 ho disegnato la mattonella davanti allo specchio.. Ma niente..

Inviato da: AprilSkiesil 5 Jan 2015, 09:36

non ho capito, che vuol dire hai disegnato la mattonella davanti allo specchio?

Inviato da: Squall_Leonheartil 5 Jan 2015, 14:18

Perdonami, ho disegnato la region sulla mattonella davanti allo specchio.

Inviato da: AprilSkiesil 5 Jan 2015, 17:09

Quindi quando il personaggio si trova su quella region non accade nulla?

Inviato da: Squall_Leonheartil 5 Jan 2015, 19:44

No niente. Probabilmente sono io che non ho passato tutto per bene..

Inviato da: AprilSkiesil 6 Jan 2015, 09:50

In che senso passato?

come hai importato il modulo?

hai letto le istruzioni di Monsieur OUXX?

Inviato da: Squall_Leonheartil 6 Jan 2015, 14:37

HOW TO USE
- See the demo game and the header script. It's as simple as possible : choose an object as the mirror, another object as its symmetry center, and a region to trigger it on or off when the player walks on it.


Sono queste.
Ho copiato lo script pari passo nel mio progetto utilizzando export and import del programma.. Poi ho creato l'oggetto e la regione ma niente..

Un altra cosa, non capisco dove scegliere la region per il riflesso e per quella che deve attivarlo.

Inviato da: AprilSkiesil 6 Jan 2015, 21:25

Le region per cui si attiva il riflesso sono quelle che scrivi nello script:

se scrivi
Mirrors2.NewMirror(oMirror1, oCenter1, region[1], eSymmetryHoriz, 1.0, 50.0, 0, 10);

Lo specchio mirror 1 si attiva quando il personaggio cammina nella region 1

Fai la region abbastanza ampia, mi raccomando.

Una cosa: hai creato gli oggetti oCenter1 e oMirror1??
Dove li hai posizionati?
Fai uno screenshot.
E fai anche uno screenshot di dove hai posizionato la region.

Poi ripeto, in tali casi, in cui non capisco bene cosa succede, come avviene anche sul forum di AGS, se riesci ad uploadare il progetto, posso guardare bene il tutto e aiutarti a risolvere. Non preoccuparti non lo darò a nessuno il link. Puoi scrivermelo in privato.

Inviato da: Squall_Leonheartil 7 Jan 2015, 16:39

Allora, ora ti posto tutto. Se non capisci ti mando la sorgente in mp.

Dunque, questa è la stanza. In alto c'è Mirror1 e la coppa giù è center1, entrambe visibili come impostazione.
Poi sotto è la region 4. Infine a destra il risultato in game. Mi sono reso conto che negli sprite, lui ha dei file mirror. Devo importare anche quelli? sono tipo scarabocchi.



Questo è lo script della stanza:

CODICE
bool mirrorsCreated = false;
bool moduleInitialized = false;

function room_Load()
{


  //do this only once in your entire game
  if (!moduleInitialized) {
    
    Mirrors2.AddMirrorChar(cMirror1);

    moduleInitialized = true;
  }
  

  //do this for each room that has mirrors
  if (!mirrorsCreated) {
    

  
    Mirrors2.NewMirror(oMirror1,  oCenter1, region[4], eSymmetryHoriz, 1.0, 30.0, 0, 0);
    
    Mirrors2.SetSubstituteCharacter(oMirror1, cSubstitute1);
    mirrorsCreated = true;
  }


  //You must enable the mirrors manually after you create them
  Mirrors2.EnableMirror(oMirror1);
  //you could also do : Mirrors2.EnableAllMirrorsInRoom();
}
function room_FirstLoad()
{    

    hPorta.Enabled = false;
  // Lock door on startup when entering the room  
// set_door_state(20, 2);
//  init_object(20, oDoor.ID);  
}
function room_BeforeFadeIn()
{  
  
  oPorta.Visible = false;
}
function room_AfterFadeIn()
{  
      oPorta.Visible = false;
  region[1].Enabled = false;
  region[2].Enabled = false;
            if (Luce == 1)
          {
           SetBackgroundFrame(1);
           region[1].Enabled = true;
           region[2].Enabled = true;
           if (hPorta.Enabled == true) region[3].Enabled = true;
           else region[3].Enabled = false;
           }
          else
          {
           SetBackgroundFrame(0);
           region[1].Enabled = false;
           region[2].Enabled = false;
           region[3].Enabled = false;
           }
  oPorta.Visible = true;
  gMaingui.Visible = false;
  SfondoGui.Visible = false;
  // Se la porta è stata sbloccata, dì qualcosa al ritorno nella stanza.
//  if (get_door_state(20)<2) {
  //   player.FaceDirection(eDir_Down);
   //  player.Say("Well, that's it. Nothing more to do.");
   //  player.Say("Now get started with your own game.");
   //  cBman.Say("Have fun!");
  //
  }
function oPorta_AnyClick()
{
  if (MovePlayer(38, 150))
{
    // Usa
    if(UsedAction(eGA_Use)) {
      player.Say("Chiusa.");
    }
     // OPEN
  else if(UsedAction(eGA_Open)) {
      oPorta.Graphic = 217;
      oPorta.Move (38, 154, 0, eBlock, eAnywhere);
      hPorta.Enabled = true;  
      if (Luce == 1) region[3].Enabled = true;
      else region[3].Enabled = false;    
  }  
  // CLOSE
  else if(UsedAction(eGA_Close)) {
     oPorta.Graphic = 12;
     oPorta.Move (10, 166, 0, eBlock, eAnywhere);
     hPorta.Enabled = false;
     region[3].Enabled = false;
    }  
    // Guarda
   else if(UsedAction(eGA_LookAt)) {
      player.Say("La porta d'uscita.");
    }
    // Push
    else if(UsedAction(eGA_Push)) {
      player.Say("Si romperebbe.");
    }
    // Pull
    else if(UsedAction(eGA_Pull)) {
      player.Say("No.");
    }  
    // PICKUP
    else if(UsedAction(eGA_PickUp)) {
      player.Say("Non ci va in tasca.");
    }
    //USE INV
    else if(UsedAction(eGA_UseInv)) {
      Unhandled();
    }
    // don't forget this
    else Unhandled();
  }
}

function Bacchetta_AnyClick()
{
  if (MovePlayer(77, 173)) {
    // LOOK AT
    if(UsedAction(eGA_LookAt)) {
      player.Say("Una coppa blu.");
    }
    // USE
    else if(UsedAction(eGA_Use)) {
      player.Say("Senza nulla?.");
    }
    // Push
    else if(UsedAction(eGA_Push)) {
      player.Say("Si romperebbe.");
    }
    // Pull
    else if(UsedAction(eGA_Pull)) {
      Unhandled();
    }  
    // PICKUP
    else if(UsedAction(eGA_PickUp)) {
      player.Say("Si dai.");
     // any_click_walk_look_pick(108, 100, eDir_Down, "1",oCup.ID, iCup);
      cBastian.AddInventory(iBacchetta);
      oBacchetta.Clickable = false;
      oBacchetta.Visible = false;
    }
    //USE INV
    else if(UsedAction(eGA_UseInv)) {
      Unhandled();
    }
    // don't forget this
    else Unhandled();
  }
}

function hPorta_AnyClick()
{
cBastian.ChangeRoom(2, 100, 100);
// if (any_click_on_door_special(20, oDoor.ID, 61, 104, eDir_Left, 2, 180, 88, eDir_Left, null, null, 4, 0)==0) Unhandled();

}

function hArmadio_AnyClick()
{
  MovePlayer(250, 158);
  if(UsedAction(eGA_LookAt)) {
    player.Say("Il mio armadio, pieno di costumi.");
  }
      else if(UsedAction(eGA_Use)) {
      player.Say("Non ho voglia di cambiarmi.");
    }
  else Unhandled();
}

function hLuce_AnyClick()
{
   if(UsedAction(eGA_LookAt)) player.Say("L'interrutore della luce.");
   else if(UsedAction(eGA_Use))
   {
      player.Walk(20, 167, eBlock, eWalkableAreas);
      if (Luce == 1) Luce = 0; else Luce = 1;
          if (Luce == 1)
          {
           SetBackgroundFrame(1);
           region[1].Enabled = true;
           region[2].Enabled = true;
           if (hPorta.Enabled == true) region[3].Enabled = true;
           else region[3].Enabled = false;
           }
          else
          {
           SetBackgroundFrame(0);
           region[1].Enabled = false;
           region[2].Enabled = false;
           region[3].Enabled = false;
           }
   }
   else Unhandled();
}
function Bidone_AnyClick()
{
  MovePlayer(212, 150);
    // LOOK AT
    if(UsedAction(eGA_LookAt)) {
      player.Say("Si tratta di un bidone.");
    }
    // USE
    else if(UsedAction(eGA_Use)) {
      player.Say("Non ho nulla da buttare.");
    }
    // Push
    else if(UsedAction(eGA_Push)) {
      player.Say("No.");
    }
    // Pull
     else if(UsedAction(eGA_Open)) {
      player.Say("Mamm e l'arc no.");
    }  
     else if(UsedAction(eGA_Open)) {
      player.Say("Lo è già.");
    }  
    // PICKUP
    else if(UsedAction(eGA_PickUp)) {
      player.Say("Si dai, portare un bidone dell'immondizia in tasca può comodo... Si, come no.");
    }
    // don't forget this
    else Unhandled();
  }
  function hLatostanza_AnyClick()
{
cBastian.ChangeRoom(2, 0, 195);
}
function room_Leave()
{
hPorta.Enabled = true;
}


Inviato da: AprilSkiesil 8 Jan 2015, 16:10

No non devi importare anche quelli.

EDIT: ho controllato la demo... è strano che non ti vada. Probabilmente hai commesso qualche errore da qualche parte.

Sarebbe opportuno che mi inviassi tutto il progetto. Così non riesco ad esserti d'aiuto.

Inviato da: AprilSkiesil 9 Jan 2015, 12:10

Ok file ricevuto e sistemato. Te l'ho reinoltrato via PM.

L'errore non è nel modulo, che funziona perfettamente, ma è un errore piuttosto grave di programmazione.

Nella tua room1 ci sono molte funzioni definite, ma mai lanciate nel run-time. una di queste è la function roomload, in cui c'è l'inizializzazione del modulo.

nel menù della room devi dirgli di lanciare quella funzione, altrimenti non verrà mai eseguita.
L'ho fatto io per te.

Ma attento a questi errori.

Inviato da: Squall_Leonheartil 10 Jan 2015, 19:43

D'accordo blush.gif

Purtroppo adesso però non riesco ad impostare la maschera, per far riflettere l'immagine solo nella circonferenza dello specchio..

Inviato da: AprilSkiesil 14 Jan 2015, 09:05

Per fare quello, hai bisogno di un oggetto maschera, bucato in corrispondenza dello specchio da posizionare davanti allo sfondo, con baseline maggiore dell'oggetto "oMirror1".
ti ho inviato un PM impostando la cosa nel tuo progetto.

Nella demo del modulo mirror, tale oggetto è osservabile chiaramente nella stanza dei cristalli

Inviato da: Squall_Leonheartil 14 Jan 2015, 20:52

Grazie sempre di tutto April, ma come sempre non finisco mai d'incepparmi xD

Ho notato, che al caricamento della stanza si vedono prima tutti gli oggetti e gli sprite, poi scompaiono. Come posso impedirlo? Purtroppo così un occhio ben attento può capire il da farsi senza sbatterci un pò..
Poi non riesco a capire come fare una transazione da una stanza all'altra, senza far scomparire lo schermo. Stile Monkey Island per intederci.

Inviato da: AprilSkiesil 14 Jan 2015, 21:08

per impedirlo devi semplicmente mettere tutti gli avvenimenti e le cose che fai sugli oggetti in RoomLoad anziché in Room enter after fade in.

per l'altra domanda, cosa intendi transizione da una stanza all'altra senza far scomparire lo schermo?
in che senso ti scompare lo schermo?

Inviato da: Squall_Leonheartil 15 Jan 2015, 17:57

Quando passi da una room all'altra, praticamente esce prima la transizione con la schermata nera.. Invece a me in alcuni casi servirebbe il passaggio istantaneo senza di essa.

Inviato da: AprilSkiesil 15 Jan 2015, 19:35

Usa il comando SetScreenTransition(.....);
vedi il manuale per capire come si usa e quali sono gli argomenti ;-)

Inviato da: Vincentil 7 Feb 2015, 20:02

Ciao Ragazzi blush.gif
Certamente non avrà lo stesso effetto del modulo ma piazzando un personaggio (come specchio)
Nascosto tramite WalkBehind ed una WalkableArea tutta sua credo si possa fare ugualmente..
Assegnando a cSpecchio la stessa view del personaggio ma con i frames rivolti rolleyes.gif

CODICE
// room script file

int mirror_scale = 3,  
mirror_baseline = 332,
lazy_from_mirror,
limit_distance_from_mirror;

function room_RepExec()
{
   cSpecchio.x = player.x;
   lazy_from_mirror = player.y - mirror_baseline;
   limit_distance_from_mirror = lazy_from_mirror / scale;
   cSpecchio.y = mirror_baseline - limit_distance_from_mirror;
   cSpecchio.Loop = player.Loop;
   cSpecchio.Frame = player.Frame;
}

Inviato da: Roccail 14 Aug 2015, 22:46

Ciao ragazzi utilizzare domanda niubba, utilizzare le foto come sfondi la trovate una cosa fattibile?
Ovviamente poi mettergli un filtro di schizzo..

Inviato da: Vincentil 16 Oct 2015, 19:00

CITAZIONE (Rocca @ 14 Aug 2015, 22:46) *
Ciao ragazzi utilizzare domanda niubba, utilizzare le foto come sfondi la trovate una cosa fattibile?
Ovviamente poi mettergli un filtro di schizzo..


Dipende da che tipo di game vuoi creare rolleyes.gif
Se hai in mente di creare un fmv puoi anche farlo con delle foto ed utilizzarle come sfondi tranquillamente rolleyes.gif

Inviato da: LostTrainDudeil 20 Oct 2015, 16:36

CITAZIONE (Rocca @ 14 Aug 2015, 23:46) *
Ciao ragazzi utilizzare domanda niubba, utilizzare le foto come sfondi la trovate una cosa fattibile?
Ovviamente poi mettergli un filtro di schizzo..


Così su due piedi mi viene in mente che ci sono 2 giochi piuttosto recenti, sviluppati con AGS, che usano fotografie come sfondi. Entrambi sono stati sviluppati dal team Cloak and Dagger:


Quindi direi che sia fattibilissimo blush.gif

Inviato da: LostTrainDudeil 20 Oct 2015, 16:36

( lookaround.gif messaggio per sbaglio pubblicato due volte)

Inviato da: Vincentil 18 Apr 2016, 13:25

CITAZIONE (LostTrainDude @ 20 Oct 2015, 17:36) *
( lookaround.gif messaggio per sbaglio pubblicato due volte)


Amo tantissimo quei due giochi love.gif

Fornito da Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)