static void GameLoop_PlayAnimation(const HouseAnimation_Animation *animation) { uint8 animationMode = 0; while (animation->duration != 0) { uint16 frameCount; uint16 posX = 0; uint16 posY = 0; uint32 timeout = g_timerGUI + animation->duration * 6; uint32 timeout2 = timeout + 30; /* timeout + 0.5 s */ uint32 timeLeftForFrame; uint32 timeLeft; uint16 mode = animation->flags & 0x3; uint16 addFrameCount; /* additional frame count */ uint16 frame; void *wsa; if ((animation->flags & 0x20) == 0) { posX = 8; posY = 24; } s_var_8068 = 0; if (mode == 0) { wsa = NULL; frame = 0; } else { char filenameBuffer[16]; uint32 wsaSize; bool wsaReservedDisplayFrame; if (mode == 3) { frame = animation->frameCount; wsaReservedDisplayFrame = true; } else { frame = 0; wsaReservedDisplayFrame = ((animation->flags & 0x40) != 0) ? true : false; } if ((animation->flags & 0x480) != 0) { GUI_ClearScreen(SCREEN_1); wsa = GFX_Screen_Get_ByIndex(SCREEN_2); wsaSize = GFX_Screen_GetSize_ByIndex(SCREEN_2) + GFX_Screen_GetSize_ByIndex(SCREEN_3); wsaReservedDisplayFrame = false; } else { wsa = GFX_Screen_Get_ByIndex(SCREEN_1); wsaSize = GFX_Screen_GetSize_ByIndex(SCREEN_1) + GFX_Screen_GetSize_ByIndex(SCREEN_2) + GFX_Screen_GetSize_ByIndex(SCREEN_3); } snprintf(filenameBuffer, sizeof(filenameBuffer), "%s.WSA", animation->string); wsa = WSA_LoadFile(filenameBuffer, wsa, wsaSize, wsaReservedDisplayFrame); } addFrameCount = 0; if ((animation->flags & 0x8) != 0) { timeout -= 45; addFrameCount++; } else if ((animation->flags & 0x10) != 0) { timeout -= 15; addFrameCount++; } if ((animation->flags & 0x4) != 0) { GameLoop_PlaySubtitle(animationMode); WSA_DisplayFrame(wsa, frame++, posX, posY, SCREEN_0); GameLoop_PalettePart_Update(true); memcpy(&g_palette1[215 * 3], s_palettePartCurrent, 18); GUI_SetPaletteAnimated(g_palette1, 45); addFrameCount++; } else { if ((animation->flags & 0x480) != 0) { GameLoop_PlaySubtitle(animationMode); WSA_DisplayFrame(wsa, frame++, posX, posY, SCREEN_1); addFrameCount++; if ((animation->flags & 0x480) == 0x80) { GUI_Screen_FadeIn2(8, 24, 304, 120, SCREEN_1, SCREEN_0, 1, false); } else if ((animation->flags & 0x480) == 0x400) { GUI_Screen_FadeIn(1, 24, 1, 24, 38, 120, SCREEN_1, SCREEN_0); } } } timeLeft = timeout - g_timerGUI; timeLeftForFrame = 0; frameCount = 1; switch (mode) { case 0: frameCount = animation->frameCount - addFrameCount; timeLeftForFrame = timeLeft / frameCount; break; case 1: frameCount = WSA_GetFrameCount(wsa); timeLeftForFrame = timeLeft / animation->frameCount; break; case 2: frameCount = WSA_GetFrameCount(wsa) - addFrameCount; timeLeftForFrame = timeLeft / frameCount; timeout -= timeLeftForFrame; break; case 3: frame = animation->frameCount; frameCount = 1; timeLeftForFrame = timeLeft / 20; break; default: PrepareEnd(); Error("Bad mode in animation #%i.\n", animationMode); exit(0); } while (timeout > g_timerGUI) { g_timerTimeout = timeLeftForFrame; GameLoop_PlaySubtitle(animationMode); WSA_DisplayFrame(wsa, frame++, posX, posY, SCREEN_0); if (mode == 1 && frame == frameCount) { frame = 0; } else { if (mode == 3) frame--; } if (Input_Keyboard_NextKey() != 0 && g_canSkipIntro) { WSA_Unload(wsa); return; } do { GameLoop_PalettePart_Update(false); sleepIdle(); } while (g_timerTimeout != 0 && timeout > g_timerGUI); } if (mode == 2) { bool displayed; do { GameLoop_PlaySubtitle(animationMode); displayed = WSA_DisplayFrame(wsa, frame++, posX, posY, SCREEN_0); } while (displayed); } if ((animation->flags & 0x10) != 0) { memset(&g_palette_998A[3 * 1], 63, 255 * 3); memcpy(&g_palette_998A[215 * 3], s_palettePartCurrent, 18); GUI_SetPaletteAnimated(g_palette_998A, 15); memcpy(g_palette_998A, g_palette1, 256 * 3); } if ((animation->flags & 0x8) != 0) { GameLoop_PalettePart_Update(true); memcpy(&g_palette_998A[215 * 3], s_palettePartCurrent, 18); GUI_SetPaletteAnimated(g_palette_998A, 45); } WSA_Unload(wsa); animationMode++; animation++; while (timeout2 > g_timerGUI) sleepIdle(); } }
static void GameLoop_PlayAnimation(void) { const HouseAnimation_Animation *animation; uint8 animationMode = 0; animation = s_houseAnimation_animation; while (animation->duration != 0) { uint16 loc04; uint16 posX = 0; uint16 posY = 0; uint32 loc10 = g_timerGUI + animation->duration * 6; uint32 loc14 = loc10 + 30; uint32 loc18; uint32 loc1C; uint16 mode = animation->flags & 0x3; bool loc20; uint32 loc24; uint16 locdi; uint16 frame; void *wsa; if ((animation->flags & 0x20) == 0) { posX = 8; posY = 24; } s_var_8068 = 0; if (mode == 0) { wsa = NULL; frame = 0; } else { char filenameBuffer[16]; if (mode == 3) { frame = animation->frameCount; loc20 = true; } else { frame = 0; loc20 = ((animation->flags & 0x40) != 0) ? true : false; } if ((animation->flags & 0x480) != 0) { GUI_ClearScreen(SCREEN_1); wsa = GFX_Screen_Get_ByIndex(SCREEN_2); loc24 = GFX_Screen_GetSize_ByIndex(SCREEN_2) + GFX_Screen_GetSize_ByIndex(SCREEN_3); loc20 = false; } else { wsa = GFX_Screen_Get_ByIndex(SCREEN_1); loc24 = GFX_Screen_GetSize_ByIndex(SCREEN_1) + GFX_Screen_GetSize_ByIndex(SCREEN_2) + GFX_Screen_GetSize_ByIndex(SCREEN_3); } snprintf(filenameBuffer, sizeof(filenameBuffer), "%s.WSA", animation->string); wsa = WSA_LoadFile(filenameBuffer, wsa, loc24, loc20); } locdi = 0; if ((animation->flags & 0x8) != 0) { loc10 -= 45; locdi++; } else { if ((animation->flags & 0x10) != 0) { loc10 -= 15; locdi++; } } if ((animation->flags & 0x4) != 0) { GameLoop_PlaySubtitle(animationMode); WSA_DisplayFrame(wsa, frame++, posX, posY, SCREEN_0); GameLoop_PalettePart_Update(true); memcpy(&g_palette1[215 * 3], s_palettePartCurrent, 18); GUI_SetPaletteAnimated(g_palette1, 45); locdi++; } else { if ((animation->flags & 0x480) != 0) { GameLoop_PlaySubtitle(animationMode); WSA_DisplayFrame(wsa, frame++, posX, posY, SCREEN_1); locdi++; if ((animation->flags & 0x480) == 0x80) { GUI_Screen_FadeIn2(8, 24, 304, 120, SCREEN_1, SCREEN_0, 1, false); } else if ((animation->flags & 0x480) == 0x400) { GUI_Screen_FadeIn(1, 24, 1, 24, 38, 120, SCREEN_1, SCREEN_0); } } } loc1C = loc10 - g_timerGUI; loc18 = 0; loc04 = 1; switch (mode) { case 0: loc04 = animation->frameCount - locdi; loc18 = loc1C / loc04; break; case 1: loc04 = WSA_GetFrameCount(wsa); loc18 = loc1C / animation->frameCount; break; case 2: loc04 = WSA_GetFrameCount(wsa) - locdi; loc18 = loc1C / loc04; loc10 -= loc18; break; case 3: frame = animation->frameCount; loc04 = 1; loc18 = loc1C / 20; break; default: PrepareEnd(); Error("Bad mode in animation #%i.\n", animationMode); exit(0); } while (loc10 > g_timerGUI) { g_timerTimeout = loc18; GameLoop_PlaySubtitle(animationMode); WSA_DisplayFrame(wsa, frame++, posX, posY, SCREEN_0); if (mode == 1 && frame == loc04) { frame = 0; } else { if (mode == 3) frame--; } if (Input_Keyboard_NextKey() != 0 && g_canSkipIntro) { WSA_Unload(wsa); return; } do { GameLoop_PalettePart_Update(false); sleepIdle(); } while (g_timerTimeout != 0 && loc10 > g_timerGUI); } if (mode == 2) { bool displayed; do { GameLoop_PlaySubtitle(animationMode); displayed = WSA_DisplayFrame(wsa, frame++, posX, posY, SCREEN_0); } while (displayed); } if ((animation->flags & 0x10) != 0) { memset(&g_palette_998A[3 * 1], 63, 255 * 3); memcpy(&g_palette_998A[215 * 3], s_palettePartCurrent, 18); GUI_SetPaletteAnimated(g_palette_998A, 15); memcpy(g_palette_998A, g_palette1, 256 * 3); } if ((animation->flags & 0x8) != 0) { GameLoop_PalettePart_Update(true); memcpy(&g_palette_998A[215 * 3], s_palettePartCurrent, 18); GUI_SetPaletteAnimated(g_palette_998A, 45); } WSA_Unload(wsa); animationMode++; animation++; while (loc14 > g_timerGUI) sleepIdle(); } }