Adventure Game Studio

AGS Support => Beginners' Technical Questions => Topic started by: joelphilippage on Sun 13/01/2008 01:55:20

Title: Making non blocking Talking
Post by: joelphilippage on Sun 13/01/2008 01:55:20
I am trying to make a command to make the character say things non-blocking and animate the talking view when the character is standing still. This is the script I have.
Function:

function Nonblocksay(String message){
  cEgo.SayBackground(message);
  SetGlobalInt(200, 1);
}

here I made a function that will have the character say something non-blocking then set the global int 200 to 1.
Repeatedly Execute:

function repeatedly_execute()
{
  if(GetGlobalInt(200)==1){
      if(cEgo.Moving == false){
      cEgo.LockView(cEgo.SpeechView);
  cEgo.Animate(cEgo.Loop, 4, eRepeat, eNoBlock);
}
else{
  cEgo.UnlockView();
    }
    if(cEgo.Speaking == false){
     cEgo.UnlockView();
      SetGlobalInt(200, 0);
}
}
}

Here I made it so if the global int 200 is set to one, the main character will talk when standing still.
The main character says the message non-blocking, but for some reason he will not talk when standing still.
Does anyone know why?
Title: Re: Making non blocking Talking
Post by: Gilbert on Sun 13/01/2008 04:50:18
From the manual, in the "Character.Speaking" part:
QuoteIt will only return true for the active talking character; that is, it will not return true for any characters talking with the SayBackground command.

So your way to check whether the character is speaking just won't work.

So, instead, use an overlay pointer to check whether the speech text is still on screen. Something like (untested):

Overlay* egospeaking;
function Nonblocksay(String message){
  egospeaking = cEgo.SayBackground(message);
  SetGlobalInt(200, 1);
}


function repeatedly_execute()
{
  if(GetGlobalInt(200)==1){
      if(cEgo.Moving == false){
      cEgo.LockView(cEgo.SpeechView);
  cEgo.Animate(cEgo.Loop, 4, eRepeat, eNoBlock);
}
else{
  cEgo.UnlockView();
    }
    if(egospeaking == Null){
     cEgo.UnlockView();
      SetGlobalInt(200, 0);
}
}
}


Title: Re: Making non blocking Talking
Post by: joelphilippage on Sun 13/01/2008 20:06:37
That seems to work better however, it only shows the first frame of the animation when the character is walking or talking. Is there a way I could fix this?
Title: Re: Making non blocking Talking
Post by: Gilbert on Mon 14/01/2008 00:55:38
Hmmm, try this, as the current code might continuously reset the animation as it'll call LockView() and Animate() once every game loop:


Overlay* egospeaking;
function Nonblocksay(String message) {
  egospeaking = cEgo.SayBackground(message);
  SetGlobalInt(200, 1);
}


function repeatedly_execute() {
  if(GetGlobalInt(200)==1) {
      if (cEgo.Moving == false) {
        if (cEgo.View!=cEgo.SpeechView)){
          cEgo.LockView(cEgo.SpeechView);
          cEgo.Animate(cEgo.Loop, 4, eRepeat, eNoBlock);
        }
      } else cEgo.UnlockView();
  }
  if (egospeaking == Null) {
     cEgo.UnlockView();
    SetGlobalInt(200, 0);
  }
}


This might not fix the walking part yet (I'm not sure).
Title: Re: Making non blocking Talking
Post by: joelphilippage on Mon 14/01/2008 03:12:02
Ok I tried out your code and changed a few things because he still couldn't walk. Now for some reason he won't stop animating the talk animation when standing still after he is done talking.

Overlay* egospeaking;
function Nonblocksay(String message) {
  egospeaking = cEgo.SayBackground(message);
  SetGlobalInt(200, 1);
}


function repeatedly_execute() {
  if(GetGlobalInt(200)==1) {
      if (cEgo.Moving == false) {
        if (cEgo.View!=cEgo.SpeechView){
          cEgo.ChangeView(cEgo.SpeechView);
          cEgo.Animate(cEgo.Loop, 4, eRepeat, eNoBlock);
        }
      }
      else{
        if(cEgo.View!=1){
        cEgo.ChangeView(1);
      }
      }
  if (egospeaking == null) {
     if(cEgo.View!=1){
     cEgo.ChangeView(1);
     SetGlobalInt(200, 0);
     }
}
}
}
Title: Re: Making non blocking Talking
Post by: Gilbert on Mon 14/01/2008 04:01:48
Hmmm, I think I made some small mistake here, turned out when an overlay is once initialised, removing it will not turn it back to null, just that the Valid property is changed to 0.

Try changing the line:
  if (egospeaking == null) {

to:
  if (egospeaking != null) if (egospeaking.Valid==0) {
Title: Re: Making non blocking Talking
Post by: joelphilippage on Mon 14/01/2008 23:04:47
Thanks. It works perfectly now.