static BOOLEAN TalkSegue (COUNT wait_track) { TALKING_STATE talkingState; // Transition animation to talking state, if necessary if (wantTalkingAnim () && haveTalkingAnim ()) { if (haveTransitionAnim ()) setRunIntroAnim (); setRunTalkingAnim (); // wait until the transition finishes while (runningIntroAnim ()) runCommAnimFrame (); } memset (&talkingState, 0, sizeof talkingState); if (wait_track == 0) { // Restarting with a rewind wait_track = WAIT_TRACK_ALL; talkingState.rewind = true; } else if (!PlayingTrack ()) { // initial start of player PlayTrack (); assert (PlayingTrack ()); } // Run the talking controls SetMenuSounds (MENU_SOUND_NONE, MENU_SOUND_NONE); talkingState.InputFunc = DoTalkSegue; talkingState.waitTrack = wait_track; DoInput (&talkingState, FALSE); ClearSubtitles (); if (talkingState.ended) { // reached the end; set STOP icon SetSliderImage (SetAbsFrameIndex (ActivityFrame, 8)); } // transition back to silent, if necessary if (runningTalkingAnim ()) setStopTalkingAnim (); // Wait until the animation task stops "talking" while (runningTalkingAnim ()) runCommAnimFrame (); return talkingState.ended; }
void C_Slider::LocalFunction(short ID,long P[],_TCHAR *,C_Handler *) { switch(ID) { case CSLD_SETUP: Setup(P[0],(short)P[1]); break; case CSLD_SETBGIMAGE: SetBgImage(P[0]); break; case CSLD_SETSLIDERIMAGE: SetSliderImage(P[0]); break; case CSLD_SETSTEPS: SetSteps((short)P[0]); break; } }
static BOOLEAN DoTalkSegue (TALKING_STATE *pTS) { bool left = false; bool right = false; COUNT curTrack; if (GLOBAL (CurrentActivity) & CHECK_ABORT) { pTS->ended = true; return FALSE; } if (PulsedInputState.menu[KEY_MENU_CANCEL]) { JumpTrack (); pTS->ended = true; return FALSE; } if (optSmoothScroll == OPT_PC) { left = PulsedInputState.menu[KEY_MENU_LEFT] != 0; right = PulsedInputState.menu[KEY_MENU_RIGHT] != 0; } else if (optSmoothScroll == OPT_3DO) { left = CurrentInputState.menu[KEY_MENU_LEFT] != 0; right = CurrentInputState.menu[KEY_MENU_RIGHT] != 0; } #if DEMO_MODE || CREATE_JOURNAL left = false; right = false; #endif if (right) { SetSliderImage (SetAbsFrameIndex (ActivityFrame, 3)); if (optSmoothScroll == OPT_PC) FastForward_Page (); else if (optSmoothScroll == OPT_3DO) FastForward_Smooth (); pTS->seeking = true; } else if (left || pTS->rewind) { pTS->rewind = false; SetSliderImage (SetAbsFrameIndex (ActivityFrame, 4)); if (optSmoothScroll == OPT_PC) FastReverse_Page (); else if (optSmoothScroll == OPT_3DO) FastReverse_Smooth (); pTS->seeking = true; } else if (pTS->seeking) { // This is only done once the seeking is over (in the smooth // scroll case, once the user releases the seek button) pTS->seeking = false; SetSliderImage (SetAbsFrameIndex (ActivityFrame, 2)); } else { // This used to have a buggy guard condition, which // would cause the animations to remain paused in a couple cases // after seeking back to the beginning. // Broken cases were: Syreen "several hours later" and Starbase // VUX Beast analysis by the scientist. CheckSubtitles (); } // XXX: When seeking, all animations (talking and ambient) stop // progressing. This is an original 3DO behavior, and I see no // reason why the animations cannot continue while seeking. UpdateAnimations (pTS->seeking); UpdateSpeechGraphics (); curTrack = PlayingTrack (); pTS->ended = !pTS->seeking && !curTrack; SleepThreadUntil (pTS->NextTime); // Need a high enough framerate for 3DO smooth seeking pTS->NextTime = GetTimeCounter () + ONE_SECOND / 60; return pTS->seeking || (curTrack && curTrack <= pTS->waitTrack); }