/** * Draw sprites and handle mouse in a mentat screen. * @param speakingMode If \c 1, the mentat is speaking. */ void GUI_Mentat_Animation(uint16 speakingMode) { static uint32 movingEyesTimer = 0; /* Timer when to change the eyes sprite. */ static uint16 movingEyesSprite = 0; /* Index in _mentatSprites of the displayed moving eyes. */ static uint16 movingEyesNextSprite = 0; /* If not 0, it decides the movingEyesNextSprite */ static uint32 movingMouthTimer = 0; static uint16 movingMouthSprite = 0; static uint32 movingOtherTimer = 0; static int16 otherSprite = 0; bool partNeedsRedraw; uint16 i; if (movingOtherTimer < g_timerGUI && !g_disableOtherMovement) { if (movingOtherTimer != 0) { uint8 *sprite; if (s_mentatSprites[2][1 + abs(otherSprite)] == NULL) { otherSprite = 1 - otherSprite; } else { otherSprite++; } sprite = s_mentatSprites[2][abs(otherSprite)]; GUI_Mouse_Hide_InRegion(s_otherLeft, s_otherTop, s_otherLeft + Sprite_GetWidth(sprite), s_otherTop + Sprite_GetHeight(sprite)); GUI_DrawSprite(SCREEN_0, sprite, s_otherLeft, s_otherTop, 0, 0); GUI_Mouse_Show_InRegion(); } switch (g_playerHouseID) { case HOUSE_HARKONNEN: movingOtherTimer = g_timerGUI + 300 * 60; break; case HOUSE_ATREIDES: movingOtherTimer = g_timerGUI + 60 * Tools_RandomLCG_Range(1,3); break; case HOUSE_ORDOS: if (otherSprite != 0) { movingOtherTimer = g_timerGUI + 6; } else { movingOtherTimer = g_timerGUI + 60 * Tools_RandomLCG_Range(10, 19); } break; default: break; } } if (speakingMode == 1) { if (movingMouthTimer < g_timerGUI) { uint8 *sprite; movingMouthSprite = Tools_RandomLCG_Range(0, 4); sprite = s_mentatSprites[1][movingMouthSprite]; GUI_Mouse_Hide_InRegion(s_mouthLeft, s_mouthTop, s_mouthLeft + Sprite_GetWidth(sprite), s_mouthTop + Sprite_GetHeight(sprite)); GUI_DrawSprite(SCREEN_0, sprite, s_mouthLeft, s_mouthTop, 0, 0); GUI_Mouse_Show_InRegion(); switch (movingMouthSprite) { case 0: movingMouthTimer = g_timerGUI + Tools_RandomLCG_Range(7, 30); break; case 1: case 2: case 3: movingMouthTimer = g_timerGUI + Tools_RandomLCG_Range(6, 10); break; case 4: movingMouthTimer = g_timerGUI + Tools_RandomLCG_Range(5, 6); break; default: break; } } } else { partNeedsRedraw = false; if (Input_Test(0x41) == 0 && Input_Test(0x42) == 0) { if (movingMouthSprite != 0) { movingMouthSprite = 0; movingMouthTimer = 0; partNeedsRedraw = true; } } else if (Mouse_InsideRegion(s_mouthLeft, s_mouthTop, s_mouthRight, s_mouthBottom) != 0) { if (movingMouthTimer != 0xFFFFFFFF) { movingMouthTimer = 0xFFFFFFFF; movingMouthSprite = Tools_RandomLCG_Range(1, 4); partNeedsRedraw = true; } } else { if (movingMouthSprite != 0) { movingMouthSprite = 0; movingMouthTimer = 0; partNeedsRedraw = true; } } if (partNeedsRedraw) { uint8 *sprite; sprite = s_mentatSprites[1][movingMouthSprite]; GUI_Mouse_Hide_InRegion(s_mouthLeft, s_mouthTop, s_mouthLeft + Sprite_GetWidth(sprite), s_mouthTop + Sprite_GetHeight(sprite)); GUI_DrawSprite(SCREEN_0, sprite, s_mouthLeft, s_mouthTop, 0, 0); GUI_Mouse_Show_InRegion(); } } partNeedsRedraw = false; if (Input_Test(0x41) != 0 || Input_Test(0x42) != 0) { if (Mouse_InsideRegion(s_eyesLeft, s_eyesTop, s_eyesRight, s_eyesBottom) != 0) { if (movingEyesSprite != 0x4) { partNeedsRedraw = true; movingEyesSprite = (movingEyesSprite == 3) ? 4 : 3; movingEyesNextSprite = 0; movingEyesTimer = 0; } if (partNeedsRedraw) { uint8 *sprite; sprite = s_mentatSprites[0][movingEyesSprite]; GUI_Mouse_Hide_InRegion(s_eyesLeft, s_eyesTop, s_eyesLeft + Sprite_GetWidth(sprite), s_eyesTop + Sprite_GetHeight(sprite)); GUI_DrawSprite(SCREEN_0, sprite, s_eyesLeft, s_eyesTop, 0, 0); GUI_Mouse_Show_InRegion(); } return; } } if (Mouse_InsideRegion((int16)s_eyesLeft - 16, (int16)s_eyesTop - 8, s_eyesRight + 16, s_eyesBottom + 24) != 0) { if (Mouse_InsideRegion((int16)s_eyesLeft - 8, s_eyesBottom, s_eyesRight + 8, SCREEN_HEIGHT - 1) != 0) { i = 3; } else { if (Mouse_InsideRegion(s_eyesRight, (int16)s_eyesTop - 8, s_eyesRight + 16, s_eyesBottom + 8) != 0) { i = 2; } else { i = (Mouse_InsideRegion((int16)s_eyesLeft - 16, (int16)s_eyesTop - 8, s_eyesLeft, s_eyesBottom + 8) == 0) ? 0 : 1; } } if (i != movingEyesSprite) { partNeedsRedraw = true; movingEyesSprite = i; movingEyesNextSprite = 0; movingEyesTimer = g_timerGUI; } } else { if (movingEyesTimer >= g_timerGUI) return; partNeedsRedraw = true; if (movingEyesNextSprite != 0) { movingEyesSprite = movingEyesNextSprite; movingEyesNextSprite = 0; if (movingEyesSprite != 4) { movingEyesTimer = g_timerGUI + Tools_RandomLCG_Range(20, 180); } else { movingEyesTimer = g_timerGUI + Tools_RandomLCG_Range(12, 30); } } else { i = 0; switch (speakingMode) { case 0: i = Tools_RandomLCG_Range(0, 7); if (i > 5) { i = 1; } else { if (i == 5) { i = 4; } } break; case 1: if (movingEyesSprite != ((!g_interrogation) ? 0 : 3)) { i = 0; } else { i = Tools_RandomLCG_Range(0, 17); if (i > 9) { i = 0; } else { if (i >= 5) { i = 4; } } } break; default: i = Tools_RandomLCG_Range(0, 15); if (i > 10) { i = 2; } else { if (i >= 5) { i = 4; } } break; } if ((i == 2 && movingEyesSprite == 1) || (i == 1 && movingEyesSprite == 2)) { movingEyesNextSprite = i; movingEyesSprite = 0; movingEyesTimer = g_timerGUI + Tools_RandomLCG_Range(1, 5); } else { if (i != movingEyesSprite && (i == 4 || movingEyesSprite == 4)) { movingEyesNextSprite = i; movingEyesSprite = 3; movingEyesTimer = g_timerGUI; } else { movingEyesSprite = i; if (i != 4) { movingEyesTimer = g_timerGUI + Tools_RandomLCG_Range(15, 180); } else { movingEyesTimer = g_timerGUI + Tools_RandomLCG_Range(6, 60); } } } if (g_interrogation && movingEyesSprite == 0) movingEyesSprite = 3; } } if (partNeedsRedraw) { uint8 *sprite; sprite = s_mentatSprites[0][movingEyesSprite]; GUI_Mouse_Hide_InRegion(s_eyesLeft, s_eyesTop, s_eyesLeft + Sprite_GetWidth(sprite), s_eyesTop + Sprite_GetHeight(sprite)); GUI_DrawSprite(SCREEN_0, sprite, s_eyesLeft, s_eyesTop, 0, 0); GUI_Mouse_Show_InRegion(); } }
static void GUI_Purchase_ShowInvoice(void) { Widget *w = g_widgetInvoiceTail; Screen oldScreenID; uint16 y = 48; uint16 total = 0; uint16 x; char textBuffer[12]; oldScreenID = GFX_Screen_SetActive(SCREEN_1); GUI_DrawFilledRectangle(128, 48, 311, 159, 20); GUI_DrawText_Wrapper(String_Get_ByIndex(STR_ITEM_NAME_QTY_TOTAL), 128, y, 12, 0, 0x11); y += 7; GUI_DrawLine(129, y, 310, y, 12); y += 2; if (g_factoryWindowOrdered != 0) { uint16 i; for (i = 0; i < g_factoryWindowTotal; i++) { ObjectInfo *oi; uint16 amount; if (g_factoryWindowItems[i].amount == 0) continue; amount = g_factoryWindowItems[i].amount * g_factoryWindowItems[i].credits; total += amount; snprintf(textBuffer, sizeof(textBuffer), "%02d %5d", g_factoryWindowItems[i].amount, amount); oi = g_factoryWindowItems[i].objectInfo; GUI_DrawText_Wrapper(String_Get_ByIndex(oi->stringID_full), 128, y, 8, 0, 0x11); GUI_DrawText_Monospace(textBuffer, 311 - strlen(textBuffer) * 6, y, 15, 0, 6); y += 8; } } else { GUI_DrawText_Wrapper(String_Get_ByIndex(STR_NO_UNITS_ON_ORDER), 220, 99, 6, 0, 0x112); } GUI_DrawLine(129, 148, 310, 148, 12); GUI_DrawLine(129, 150, 310, 150, 12); snprintf(textBuffer, sizeof(textBuffer), "%d", total); x = 311 - strlen(textBuffer) * 6; /* "Total Cost :" */ GUI_DrawText_Wrapper(GUI_String_Get_ByIndex(STR_TOTAL_COST_), x - 3, 152, 11, 0, 0x211); GUI_DrawText_Monospace(textBuffer, x, 152, 11, 0, 6); GUI_Mouse_Hide_Safe(); GUI_Screen_Copy(16, 48, 16, 48, 23, 112, SCREEN_1, SCREEN_0); GUI_Mouse_Show_Safe(); GFX_Screen_SetActive(SCREEN_0); GUI_FactoryWindow_DrawCaption(String_Get_ByIndex(STR_INVOICE_OF_UNITS_ON_ORDER)); Input_History_Clear(); for (; GUI_Widget_HandleEvents(w) == 0; sleepIdle()) { GUI_DrawCredits(g_playerHouseID, 0); GUI_FactoryWindow_UpdateSelection(false); GUI_PaletteAnimate(); } GFX_Screen_SetActive(oldScreenID); w = GUI_Widget_Get_ByIndex(w, 10); if (w != NULL && Mouse_InsideRegion(w->offsetX, w->offsetY, w->offsetX + w->width, w->offsetY + w->height) != 0) { while (Input_Test(0x41) != 0 || Input_Test(0x42) != 0) sleepIdle(); Input_History_Clear(); } if (g_factoryWindowResult == FACTORY_CONTINUE) GUI_FactoryWindow_DrawDetails(); }