SayBackground -- Something clever?

Started by quixotecoyote, Thu 08/11/2007 08:39:38

Previous topic - Next topic

quixotecoyote

This may be old news, but in case it hasn't been said before:

I was trying to get a group of guards to have a looping conversation in the background.  I wanted to be able to interrupt the conversation by speaking and have it resume when I stop.

I ran into the problem of all the characters SayBackground texts displaying at the same time.

I searched the forum, saw a lot of references to a speech queue module, but wondered if I couldn't script it more simply.

So at the top:
Quote
// room script file
Overlay *ovredguard;  //overlay for the red guard
Overlay *ovblackguard; // overlay for the black guard
Overlay *ovgirlguard;  //overlay for the female guard
import bool guardstalking; //importing the varible to see if they are talking or interrupted
bool backstart = true;  // the variable to make the conversation loop

and down in the repeatedly execute section

Quote
function room_c() {
  // script for Room: Repeatedly execute
     if ((guardstalking == true) && (backstart == true)) { //not interupted and starting from the beginning
          ovredguard = cTguardr.SayBackground("Blah");  //Red speaks into his overlay
          backstart = false;  //restart varible is shut off
          SetTimer (1, 120); // timer for the first speech is set
}
   if ((IsTimerExpired(1)) && (guardstalking == true)) {  //after done speaking
     ovredguard.Remove(); //Red's overlay disappears
     ovblackguard = cTguardb.SayBackground ("Oh yeah?"); //Black Speaks
     SetTimer (2, 120); //timer for this speech is set
   }
   
   if ((IsTimerExpired(2)) && (guardstalking == true)){ // same as above
     ovblackguard.Remove();
     ovgirlguard = cTguardg.SayBackground ("Yeah.");
     SetTimer (3, 120);
   }
   if ((IsTimerExpired(3)) && (guardstalking == true)) {// the timer for the last speech is done
     ovgirlguard.Remove();// the last overlay is removed
     backstart = true; // the restart variable begins the loop again
   }
   if (guardstalking == false) {//and if anything interrupts it, the loop is broken
     cTguardb.FaceLocation(0,200,eBlock);// any reaction to the interruption
          cTguardg.FaceLocation(0,200,eBlock);
          cTguardr.FaceLocation(0,200,eBlock);
}
   
}



I'm happy with it because it's simple and can be restarted with a minimum of fuss.

The only downside is you can only have a maximum of 20 lines of repeating conversation because of the timer limits.

Any suggestions on tweaking this?

SSH

Yes, don't reinvent the wheel and use one of the Background Speech queue modules!
12

quixotecoyote

Why bother messing with a whole new module if a short script can do what you want instead?

Rui 'Trovatore' Pires

Use an array timer[100]. Instant 100 timers.
Reach for the moon. Even if you miss, you'll land among the stars.

Kneel. Now.

Never throw chicken at a Leprechaun.

quixotecoyote

I haven't messed with arrays yet. 

Would you have to name your timer array like:

timer bkgtalk[100]

or does

timer[100] automatically increase the timers available.


The only odd artifact I'm finding with this is that it's screwed up where dialog appears for one of the guards.  Red and Girl are fine, but the Black guard's dialog appears in the center of the screen.  Not his SayBackground, just his dialog.




Gilbert

#5
No, there's no pre-defined timer variable type.
Declare them like this:
Code: ags
int timer[100];


Unfortunately, as each array entry is just an ordinary integer variable you can't directly use them (with SetTimer(), IsTimerExpired(), etc.) like the pre-defined timers, you need to manually (with a while loop maybe) cycle through them and decrease the values of the active ones in repeatedly_execute_always().

When you need to "setup" a "timer" in the array, just assign a value to it, like:
Code: ags
timer[12]=400; //400 loops is 10 seconds normally


Then in repeatedly_execute_always():
Code: ags
int ii=0;
while (ii<100){
  if (timer[ii]>0) timer[ii]--;
  ii++;
}


To check whether a "timer" has "expired", just check whether its value is 0.

It's not very complicated, but not as simple as what a very short (depends on how you define "short") script can do, so you may opt to add these codes (not tested, may need ammendments) manually or try out a module.

@Redrum: You might want to help, but like in this case the solution is not that "instant" (at least this cannot be done directly without modifying the original codes), so your comment was more confusing than really helpful, as the solution is not clear (at least not for an average user). Please at least give more explanations.
 

SSH

Quote from: quixotecoyote on Thu 08/11/2007 09:54:07
Why bother messing with a whole new module if a short script can do what you want instead?

Because you just download and import the module and the add commands like this to your script:

Code: ags

qDisplaySpeech(cTguardr, "Blah");
qDisplaySpeech(cTguardg, "Oh yeah?");
qDisplaySpeech(cTguardr, "Yeah!");
12

Rui 'Trovatore' Pires

Gilbot, I know, but I've tried to think of many different examples. I actually wrote 4 or 5 posts, stuttering, writing and deleting.

Eventually I just thought "To heck with it - someone else can explain it better than I can, and maybe he'll just understand at once". Trust me, the examples I kept coming up with were even more confusing.
Reach for the moon. Even if you miss, you'll land among the stars.

Kneel. Now.

Never throw chicken at a Leprechaun.

quixotecoyote

Well thanks to both of you.  If I need a longer conversation, now I know how to do it.

Dualnames

Use SSH modules. Sure can do some good shit.
Worked on Strangeland, Primordia, Hob's Barrow, The Cat Lady, Mage's Initiation, Until I Have You, Downfall, Hunie Pop, and every game in the Wadjet Eye Games catalogue (porting)

SMF spam blocked by CleanTalk