Fix for bugs #790 and #5; this reorgs the talk segue and removes a few hacks and hopefully brings all spliced comm edge cases to norm

git-svn-id: svn://svn.code.sf.net/p/sc2/code/trunk@2087 8092fc87-c524-0410-9efc-e669fe64eaf9
This commit is contained in:
avolkov
2005-12-17 21:30:55 +00:00
parent 0f7b5d4caf
commit f1ab2c5d0c
+88 -107
View File
@@ -1273,18 +1273,78 @@ Rewind:
CommData.AlienFrame = F; CommData.AlienFrame = F;
do_subtitles ((void *)~0); do_subtitles ((void *)~0);
if (wait_track == (COUNT)~0) if (!which_track || wait_track == (COUNT)~0)
{ // reached the end
SetSliderImage (SetAbsFrameIndex (ActivityFrame, 8)); SetSliderImage (SetAbsFrameIndex (ActivityFrame, 8));
return (FALSE);
}
return (passed); return (passed);
} }
static BOOLEAN
DoTalkSegue (COUNT wait_track)
{
BOOLEAN done;
// Transition animation to talking state, if necessary
if (CommData.AlienTalkDesc.NumFrames)
{
if (!(CommData.AlienTransitionDesc.AnimFlags & TALK_INTRO))
{
CommData.AlienTransitionDesc.AnimFlags |= TALK_INTRO;
if (CommData.AlienTransitionDesc.NumFrames)
CommData.AlienTalkDesc.AnimFlags |= TALK_INTRO;
}
CommData.AlienTransitionDesc.AnimFlags &= ~PAUSE_TALKING;
if (CommData.AlienTalkDesc.NumFrames)
CommData.AlienTalkDesc.AnimFlags |= WAIT_TALKING;
while (CommData.AlienTalkDesc.AnimFlags & TALK_INTRO)
{ // wait until the trasition finishes
UnlockMutex (GraphicsLock);
TaskSwitch ();
LockMutex (GraphicsLock);
}
}
done = !SpewPhrases (wait_track);
// transition back to silent, if necessary
if (CommData.AlienTalkDesc.NumFrames)
{
// must set the TALK_DONE flag so that the animation task
// releases WAIT_TALKING from AlienTalkDesc
CommData.AlienTransitionDesc.AnimFlags |= TALK_DONE;
if ((CommData.AlienTalkDesc.AnimFlags & WAIT_TALKING))
CommData.AlienTalkDesc.AnimFlags |= PAUSE_TALKING;
}
return done;
}
static void
FlushTalkSegue (void)
{
FlushInput ();
while (AnyButtonPress (TRUE))
TaskSwitch ();
do
TaskSwitch ();
while (CommData.AlienTalkDesc.AnimFlags & PAUSE_TALKING);
}
void void
AlienTalkSegue (COUNT wait_track) AlienTalkSegue (COUNT wait_track)
{ {
BOOLEAN abort; BOOLEAN done;
// this skips any talk segues that follow an aborted one
if ((GLOBAL (CurrentActivity) & CHECK_ABORT) if ((GLOBAL (CurrentActivity) & CHECK_ABORT)
|| (CommData.AlienTransitionDesc.AnimFlags & TALK_INTRO)) || (CommData.AlienTransitionDesc.AnimFlags & TALK_DONE))
return; return;
LockMutex (GraphicsLock); LockMutex (GraphicsLock);
if (!pCurInputState->Initialized) if (!pCurInputState->Initialized)
@@ -1354,46 +1414,24 @@ AlienTalkSegue (COUNT wait_track)
LastActivity &= ~CHECK_LOAD; LastActivity &= ~CHECK_LOAD;
} }
if (wait_track == (COUNT)~0 || CommData.AlienTalkDesc.NumFrames)
{
if (!(CommData.AlienTransitionDesc.AnimFlags & TALK_INTRO))
{
CommData.AlienTransitionDesc.AnimFlags |= TALK_INTRO;
if (CommData.AlienTransitionDesc.NumFrames)
CommData.AlienTalkDesc.AnimFlags |= TALK_INTRO;
}
CommData.AlienTransitionDesc.AnimFlags &= ~PAUSE_TALKING; done = DoTalkSegue (wait_track);
if (CommData.AlienTalkDesc.NumFrames) if (done || wait_track == (COUNT)~0)
CommData.AlienTalkDesc.AnimFlags |= WAIT_TALKING;
while (CommData.AlienTalkDesc.AnimFlags & TALK_INTRO)
{
UnlockMutex (GraphicsLock);
TaskSwitch ();
LockMutex (GraphicsLock);
}
}
if (!(abort = SpewPhrases (wait_track)) || wait_track == (COUNT)~0)
FadeMusic (FOREGROUND_VOL, ONE_SECOND); FadeMusic (FOREGROUND_VOL, ONE_SECOND);
else
CommData.AlienTransitionDesc.AnimFlags &= ~TALK_INTRO;
if (wait_track == (COUNT)~0 || ! abort || CommData.AlienTalkDesc.NumFrames)
{
CommData.AlienTransitionDesc.AnimFlags |= TALK_DONE;
if ((CommData.AlienTalkDesc.AnimFlags & WAIT_TALKING))
CommData.AlienTalkDesc.AnimFlags |= PAUSE_TALKING;
}
UnlockMutex (GraphicsLock); UnlockMutex (GraphicsLock);
FlushInput (); FlushTalkSegue ();
while (AnyButtonPress (TRUE))
TaskSwitch ();
do if (done || wait_track == (COUNT)~0)
TaskSwitch (); { // all done talking here
while (CommData.AlienTalkDesc.AnimFlags & PAUSE_TALKING); CommData.AlienTransitionDesc.AnimFlags |= TALK_DONE;
}
else
{ // there is more to come
CommData.AlienTransitionDesc.AnimFlags &= ~TALK_DONE;
// allow a transition to talking state again later
CommData.AlienTransitionDesc.AnimFlags &= ~TALK_INTRO;
}
} }
static BOOLEAN static BOOLEAN
@@ -1401,7 +1439,7 @@ DoCommunication (PENCOUNTER_STATE pES)
{ {
SetMenuSounds (MENU_SOUND_UP | MENU_SOUND_DOWN, MENU_SOUND_SELECT); SetMenuSounds (MENU_SOUND_UP | MENU_SOUND_DOWN, MENU_SOUND_SELECT);
if (!(CommData.AlienTransitionDesc.AnimFlags & (TALK_INTRO | TALK_DONE))) if (!(CommData.AlienTransitionDesc.AnimFlags & TALK_DONE))
{ {
AlienTalkSegue ((COUNT)~0); AlienTalkSegue ((COUNT)~0);
} }
@@ -1424,43 +1462,13 @@ DoCommunication (PENCOUNTER_STATE pES)
{ {
FadeMusic (BACKGROUND_VOL, ONE_SECOND); FadeMusic (BACKGROUND_VOL, ONE_SECOND);
LockMutex (GraphicsLock); LockMutex (GraphicsLock);
// reset transition state
CommData.AlienTransitionDesc.AnimFlags &= ~(TALK_INTRO | TALK_DONE); CommData.AlienTransitionDesc.AnimFlags &= ~(TALK_INTRO | TALK_DONE);
if (CommData.AlienTalkDesc.NumFrames) DoTalkSegue (0);
{
if (!(CommData.AlienTransitionDesc.AnimFlags & TALK_INTRO))
{
CommData.AlienTransitionDesc.AnimFlags |= TALK_INTRO;
if (CommData.AlienTransitionDesc.NumFrames)
CommData.AlienTalkDesc.AnimFlags |= TALK_INTRO;
}
CommData.AlienTransitionDesc.AnimFlags &= ~PAUSE_TALKING;
if (CommData.AlienTalkDesc.NumFrames)
CommData.AlienTalkDesc.AnimFlags |= WAIT_TALKING;
while (CommData.AlienTalkDesc.AnimFlags & TALK_INTRO)
{
UnlockMutex (GraphicsLock); UnlockMutex (GraphicsLock);
TaskSwitch (); FlushTalkSegue ();
LockMutex (GraphicsLock); // done one way or the other
}
}
SpewPhrases (0);
CommData.AlienTransitionDesc.AnimFlags |= TALK_DONE; CommData.AlienTransitionDesc.AnimFlags |= TALK_DONE;
if (CommData.AlienTalkDesc.NumFrames)
{
if ((CommData.AlienTalkDesc.AnimFlags & WAIT_TALKING))
CommData.AlienTalkDesc.AnimFlags |= PAUSE_TALKING;
}
UnlockMutex (GraphicsLock);
FlushInput ();
while (AnyButtonPress (TRUE))
TaskSwitch ();
do
TaskSwitch ();
while (CommData.AlienTalkDesc.AnimFlags & PAUSE_TALKING);
if (GLOBAL (CurrentActivity) & CHECK_ABORT) if (GLOBAL (CurrentActivity) & CHECK_ABORT)
break; break;
@@ -1659,48 +1667,21 @@ DoCommunication (PENCOUNTER_STATE pES)
FadeMusic (BACKGROUND_VOL, ONE_SECOND); FadeMusic (BACKGROUND_VOL, ONE_SECOND);
LockMutex (GraphicsLock); LockMutex (GraphicsLock);
FeedbackPlayerPhrase (pES->phrase_buf); FeedbackPlayerPhrase (pES->phrase_buf);
// reset transition state
CommData.AlienTransitionDesc.AnimFlags &= ~(TALK_INTRO | TALK_DONE); CommData.AlienTransitionDesc.AnimFlags &= ~(TALK_INTRO | TALK_DONE);
if (CommData.AlienTalkDesc.NumFrames) DoTalkSegue (0);
{
if (!(CommData.AlienTransitionDesc.AnimFlags & TALK_INTRO))
{
CommData.AlienTransitionDesc.AnimFlags |= TALK_INTRO;
if (CommData.AlienTransitionDesc.NumFrames)
CommData.AlienTalkDesc.AnimFlags |= TALK_INTRO;
}
CommData.AlienTransitionDesc.AnimFlags &= ~PAUSE_TALKING;
if (CommData.AlienTalkDesc.NumFrames)
CommData.AlienTalkDesc.AnimFlags |= WAIT_TALKING;
while (CommData.AlienTalkDesc.AnimFlags & TALK_INTRO)
{
UnlockMutex (GraphicsLock);
TaskSwitch ();
LockMutex (GraphicsLock);
}
}
SpewPhrases (0);
CommData.AlienTransitionDesc.AnimFlags |= TALK_DONE;
if (CommData.AlienTalkDesc.NumFrames)
{
if ((CommData.AlienTalkDesc.AnimFlags & WAIT_TALKING))
CommData.AlienTalkDesc.AnimFlags |= PAUSE_TALKING;
}
if (!(GLOBAL (CurrentActivity) & CHECK_ABORT)) if (!(GLOBAL (CurrentActivity) & CHECK_ABORT))
{ {
RefreshResponses (pES); RefreshResponses (pES);
FadeMusic (FOREGROUND_VOL, ONE_SECOND); FadeMusic (FOREGROUND_VOL, ONE_SECOND);
} }
UnlockMutex (GraphicsLock); UnlockMutex (GraphicsLock);
FlushInput (); FlushTalkSegue ();
while (AnyButtonPress (TRUE)) // done one way or the other
TaskSwitch (); CommData.AlienTransitionDesc.AnimFlags |= TALK_DONE;
do
TaskSwitch ();
while (CommData.AlienTalkDesc.AnimFlags & PAUSE_TALKING);
} }
else if (PulsedInputState.key[KEY_MENU_UP]) else if (PulsedInputState.key[KEY_MENU_UP])
response = (BYTE)((response + (BYTE)(pES->num_responses - 1)) response = (BYTE)((response + (BYTE)(pES->num_responses - 1))