/** * Display a mentat. * @param houseFilename Filename of the house. * @param houseID ID of the house. */ void GUI_Mentat_Display(const char *wsaFilename, uint8 houseID) { char textBuffer[16]; Screen oldScreenID; int i; snprintf(textBuffer, sizeof(textBuffer), "MENTAT%c.CPS", g_table_houseInfo[houseID].name[0]); Sprites_LoadImage(textBuffer, SCREEN_1, g_palette_998A); oldScreenID = GFX_Screen_SetActive(SCREEN_1); if (houseID == HOUSE_MERCENARY) { File_ReadBlockFile("BENE.PAL", g_palette1, 256 * 3); } memset(s_mentatSprites, 0, sizeof(s_mentatSprites)); s_eyesLeft = s_eyesRight = s_unknownHouseData[houseID][0]; s_eyesTop = s_eyesBottom = s_unknownHouseData[houseID][1]; for (i = 0; i < 5; i++) { s_mentatSprites[0][i] = g_sprites[387 + houseID * 15 + i]; } s_eyesRight += Sprite_GetWidth(s_mentatSprites[0][0]); s_eyesBottom += Sprite_GetHeight(s_mentatSprites[0][0]); s_mouthLeft = s_mouthRight = s_unknownHouseData[houseID][2]; s_mouthTop = s_mouthBottom = s_unknownHouseData[houseID][3]; for (i = 0; i < 5; i++) { s_mentatSprites[1][i] = g_sprites[392 + houseID * 15 + i]; } s_mouthRight += Sprite_GetWidth(s_mentatSprites[1][0]); s_mouthBottom += Sprite_GetHeight(s_mentatSprites[1][0]); s_otherLeft = s_unknownHouseData[houseID][4]; s_otherTop = s_unknownHouseData[houseID][5]; for (i = 0; i < 4; i++) { s_mentatSprites[2][i] = g_sprites[398 + houseID * 15 + i]; } g_shoulderLeft = s_unknownHouseData[houseID][6]; g_shoulderTop = s_unknownHouseData[houseID][7]; Widget_SetAndPaintCurrentWidget(8); if (wsaFilename != NULL) { void *wsa; wsa = WSA_LoadFile(wsaFilename, GFX_Screen_Get_ByIndex(SCREEN_2), GFX_Screen_GetSize_ByIndex(SCREEN_2), false); WSA_DisplayFrame(wsa, 0, g_curWidgetXBase * 8, g_curWidgetYBase, SCREEN_1); WSA_Unload(wsa); } GUI_DrawSprite(SCREEN_1, g_sprites[397 + houseID * 15], g_shoulderLeft, g_shoulderTop, 0, 0); GFX_Screen_SetActive(oldScreenID); }
static void GameCredits_LoadPalette(void) { uint16 i; uint8 *p; s_buffer_182E = GFX_Screen_Get_ByIndex(SCREEN_3); s_buffer_1832 = (uint8 *)s_buffer_182E + SCREEN_WIDTH * g_curWidgetHeight; g_palette1 = malloc(256 * 3 * 10); g_palette2 = calloc(1, 256 * 3); File_ReadBlockFile("IBM.PAL", g_palette1, 256 * 3); /* Create 10 fadein/fadeout palettes */ p = g_palette1; for (i = 0; i < 10; i++) { uint16 j; uint8 *pr = g_palette1; for (j = 0; j < 255 * 3; j++) *p++ = *pr++ * (9 - i) / 9; *p++ = 0x3F; *p++ = 0x3F; *p++ = 0x3F; } }
/** * Loads the game options. * * @return True if loading is successful. */ bool GameOptions_Load(void) { if (!File_Exists("OPTIONS.CFG")) return false; File_ReadBlockFile("OPTIONS.CFG", &g_gameConfig, sizeof(g_gameConfig)); return true; }
void Driver_Voice_LoadFile(const char *filename, void *buffer, uint32 length) { assert(buffer != NULL); if (filename == NULL) return; if (g_driverVoice->index == 0xFFFF) return; if (!File_Exists(filename)) return; File_ReadBlockFile(filename, buffer, length); }
static void GameLoop_PrepareAnimation(const HouseAnimation_Animation *animation, const HouseAnimation_Subtitle *subtitle, uint16 arg_8062, const HouseAnimation_SoundEffect *soundEffect) { uint8 i; uint8 colors[16]; s_houseAnimation_animation = animation; s_houseAnimation_subtitle = subtitle; s_houseAnimation_soundEffect = soundEffect; s_houseAnimation_currentSubtitle = 0; s_houseAnimation_currentSoundEffect = 0; g_fontCharOffset = 0; s_var_8062 = arg_8062; s_var_8068 = 0; s_subtitleWait = 0xFFFF; s_subtitleActive = false; s_palettePartDirection = PPD_STOPPED; s_palettePartCount = 0; s_paletteAnimationTimeout = 0; GFX_ClearScreen(); File_ReadBlockFile("INTRO.PAL", g_palette1, 256 * 3); memcpy(g_palette_998A, g_palette1, 256 * 3); Font_Select(g_fontIntro); GFX_Screen_SetActive(SCREEN_0); memcpy(s_palettePartTarget, &g_palette1[(144 + s_houseAnimation_subtitle->colour * 16) * 3], 6 * 3); memset(&g_palette1[215 * 3], 0, 6 * 3); memcpy(s_palettePartCurrent, s_palettePartTarget, 6 * 3); memset(s_palettePartChange, 0, 6 * 3); colors[0] = 0; for (i = 0; i < 6; i++) colors[i + 1] = 215 + i; GUI_InitColors(colors, 0, 15); }
/** * Main game loop. */ static void GameLoop_Main(void) { static uint32 l_timerNext = 0; static uint32 l_timerUnitStatus = 0; static int16 l_selectionState = -2; uint16 key; String_Init(); Sprites_Init(); Input_Flags_SetBits(INPUT_FLAG_KEY_REPEAT | INPUT_FLAG_UNKNOWN_0010 | INPUT_FLAG_UNKNOWN_0200 | INPUT_FLAG_UNKNOWN_2000); Input_Flags_ClearBits(INPUT_FLAG_KEY_RELEASE | INPUT_FLAG_UNKNOWN_0400 | INPUT_FLAG_UNKNOWN_0100 | INPUT_FLAG_UNKNOWN_0080 | INPUT_FLAG_UNKNOWN_0040 | INPUT_FLAG_UNKNOWN_0020 | INPUT_FLAG_UNKNOWN_0008 | INPUT_FLAG_UNKNOWN_0004 | INPUT_FLAG_NO_TRANSLATE); Timer_SetTimer(TIMER_GAME, true); Timer_SetTimer(TIMER_GUI, true); g_campaignID = 0; g_scenarioID = 1; g_playerHouseID = HOUSE_INVALID; g_debugScenario = false; g_selectionType = SELECTIONTYPE_MENTAT; g_selectionTypeNew = SELECTIONTYPE_MENTAT; g_palette1 = calloc(1, 256 * 3); g_palette2 = calloc(1, 256 * 3); g_readBufferSize = 12000; g_readBuffer = calloc(1, g_readBufferSize); ReadProfileIni("PROFILE.INI"); free(g_readBuffer); g_readBuffer = NULL; File_ReadBlockFile("IBM.PAL", g_palette_998A, 256 * 3); memmove(g_palette1, g_palette_998A, 256 * 3); GUI_ClearScreen(SCREEN_0); Video_SetPalette(g_palette1, 0, 256); GFX_SetPalette(g_palette1); GFX_SetPalette(g_palette2); g_paletteMapping1 = malloc(256); g_paletteMapping2 = malloc(256); GUI_Palette_CreateMapping(g_palette1, g_paletteMapping1, 0xC, 0x55); g_paletteMapping1[0xFF] = 0xFF; g_paletteMapping1[0xDF] = 0xDF; g_paletteMapping1[0xEF] = 0xEF; GUI_Palette_CreateMapping(g_palette1, g_paletteMapping2, 0xF, 0x55); g_paletteMapping2[0xFF] = 0xFF; g_paletteMapping2[0xDF] = 0xDF; g_paletteMapping2[0xEF] = 0xEF; Script_LoadFromFile("TEAM.EMC", g_scriptTeam, g_scriptFunctionsTeam, NULL); Script_LoadFromFile("BUILD.EMC", g_scriptStructure, g_scriptFunctionsStructure, NULL); GUI_Palette_CreateRemap(HOUSE_MERCENARY); g_cursorSpriteID = 0; Sprites_SetMouseSprite(0, 0, g_sprites[0]); while (g_mouseHiddenDepth > 1) { GUI_Mouse_Show_Safe(); } Window_WidgetClick_Create(); GameOptions_Load(); Unit_Init(); Team_Init(); House_Init(); Structure_Init(); GUI_Mouse_Show_Safe(); if (g_debugSkipDialogs) { Music_Play(0); free(g_readBuffer); g_readBufferSize = (g_enableVoices == 0) ? 12000 : 20000; g_readBuffer = calloc(1, g_readBufferSize); g_gameMode = GM_NORMAL; } for (;; sleepIdle()) { if (g_gameMode == GM_MENU) { GameLoop_GameIntroAnimationMenu(); if (!g_running) break; if (g_gameMode == GM_MENU) continue; GUI_Mouse_Hide_Safe(); g_canSkipIntro = false; GUI_DrawFilledRectangle(g_curWidgetXBase << 3, g_curWidgetYBase, (g_curWidgetXBase + g_curWidgetWidth) << 3, g_curWidgetYBase + g_curWidgetHeight, 12); Input_History_Clear(); if (s_enableLog != 0) Mouse_SetMouseMode((uint8)s_enableLog, "DUNE.LOG"); GFX_SetPalette(g_palette1); GUI_Mouse_Show_Safe(); } if (g_gameMode == GM_PICKHOUSE) { Music_Play(28); g_playerHouseID = HOUSE_MERCENARY; g_playerHouseID = GUI_PickHouse(); GUI_Mouse_Hide_Safe(); GFX_ClearBlock(SCREEN_0); Sprites_LoadTiles(); GUI_Palette_CreateRemap(g_playerHouseID); Voice_LoadVoices(g_playerHouseID); GUI_Mouse_Show_Safe(); g_gameMode = GM_RESTART; g_scenarioID = 1; g_campaignID = 0; g_strategicRegionBits = 0; } if (g_selectionTypeNew != g_selectionType) { GUI_ChangeSelectionType(g_selectionTypeNew); } GUI_PaletteAnimate(); if (g_gameMode == GM_RESTART) { GUI_ChangeSelectionType(SELECTIONTYPE_MENTAT); Game_LoadScenario(g_playerHouseID, g_scenarioID); if (!g_debugScenario && !g_debugSkipDialogs) GUI_Mentat_ShowBriefing(); g_gameMode = GM_NORMAL; GUI_ChangeSelectionType(g_debugScenario ? SELECTIONTYPE_DEBUG : SELECTIONTYPE_STRUCTURE); Music_Play(Tools_RandomLCG_Range(0, 8) + 8); l_timerNext = g_timerGUI + 300; } if (l_selectionState != g_selectionState) { Map_SetSelectionObjectPosition(0xFFFF); Map_SetSelectionObjectPosition(g_selectionRectanglePosition); l_selectionState = g_selectionState; } if (!Driver_Voice_IsPlaying() && !Sound_StartSpeech()) { if (g_gameConfig.music == 0) { Music_Play(2); g_musicInBattle = 0; } else if (g_musicInBattle > 0) { Music_Play(Tools_RandomLCG_Range(0, 5) + 17); l_timerNext = g_timerGUI + 300; g_musicInBattle = -1; } else { g_musicInBattle = 0; if (g_enableSoundMusic != 0 && g_timerGUI > l_timerNext) { if (!Driver_Music_IsPlaying()) { Music_Play(Tools_RandomLCG_Range(0, 8) + 8); l_timerNext = g_timerGUI + 300; } } } } GFX_Screen_SetActive(SCREEN_0); key = GUI_Widget_HandleEvents(g_widgetLinkedListHead); if (g_selectionType == SELECTIONTYPE_TARGET || g_selectionType == SELECTIONTYPE_PLACE || g_selectionType == SELECTIONTYPE_UNIT || g_selectionType == SELECTIONTYPE_STRUCTURE) { if (g_unitSelected != NULL) { if (l_timerUnitStatus < g_timerGame) { Unit_DisplayStatusText(g_unitSelected); l_timerUnitStatus = g_timerGame + 300; } if (g_selectionType != SELECTIONTYPE_TARGET) { g_selectionPosition = Tile_PackTile(Tile_Center(g_unitSelected->o.position)); } } GUI_Widget_ActionPanel_Draw(false); InGame_Numpad_Move(key); GUI_DrawCredits(g_playerHouseID, 0); GameLoop_Team(); GameLoop_Unit(); GameLoop_Structure(); GameLoop_House(); GUI_DrawScreen(SCREEN_0); } GUI_DisplayText(NULL, 0); if (g_running && !g_debugScenario) { GameLoop_LevelEnd(); } if (!g_running) break; } GUI_Mouse_Hide_Safe(); if (s_enableLog != 0) Mouse_SetMouseMode(INPUT_MOUSE_MODE_NORMAL, "DUNE.LOG"); GUI_Mouse_Hide_Safe(); Widget_SetCurrentWidget(0); GFX_Screen_SetActive(SCREEN_1); GFX_ClearScreen(); GUI_Screen_FadeIn(g_curWidgetXBase, g_curWidgetYBase, g_curWidgetXBase, g_curWidgetYBase, g_curWidgetWidth, g_curWidgetHeight, SCREEN_1, SCREEN_0); }
/** * Intro menu. */ static void GameLoop_GameIntroAnimationMenu(void) { static const uint16 mainMenuStrings[][6] = { {STR_PLAY_A_GAME, STR_REPLAY_INTRODUCTION, STR_EXIT_GAME, STR_NULL, STR_NULL, STR_NULL}, /* Neither HOF nor save. */ {STR_PLAY_A_GAME, STR_REPLAY_INTRODUCTION, STR_LOAD_GAME, STR_EXIT_GAME, STR_NULL, STR_NULL}, /* Has a save game. */ {STR_PLAY_A_GAME, STR_REPLAY_INTRODUCTION, STR_EXIT_GAME, STR_HALL_OF_FAME, STR_NULL, STR_NULL}, /* Has a HOF. */ {STR_PLAY_A_GAME, STR_REPLAY_INTRODUCTION, STR_LOAD_GAME, STR_EXIT_GAME, STR_HALL_OF_FAME, STR_NULL} /* Has a HOF and a save game. */ }; bool loadGame = false; static bool drawMenu = true; static uint16 stringID = STR_REPLAY_INTRODUCTION; uint16 maxWidth; static bool hasSave = false; static bool hasFame = false; static const char *strings[6]; static uint16 index = 0xFFFF; if (index == 0xFFFF) { hasSave = File_Exists("_save000.dat"); hasFame = File_Exists("SAVEFAME.DAT"); index = (hasFame ? 2 : 0) + (hasSave ? 1 : 0); } if (hasSave || File_Exists("ONETIME.DAT")) g_canSkipIntro = true; switch (stringID) { case STR_REPLAY_INTRODUCTION: Music_Play(0); free(g_readBuffer); g_readBufferSize = (g_enableVoices == 0) ? 12000 : 28000; g_readBuffer = calloc(1, g_readBufferSize); GUI_Mouse_Hide_Safe(); Driver_Music_FadeOut(); GameLoop_GameIntroAnimation(); Sound_Output_Feedback(0xFFFE); File_ReadBlockFile("IBM.PAL", g_palette_998A, 256 * 3); memmove(g_palette1, g_palette_998A, 256 * 3); if (!g_canSkipIntro) { File_Create("ONETIME.DAT"); g_canSkipIntro = true; } Music_Play(0); free(g_readBuffer); g_readBufferSize = (g_enableVoices == 0) ? 12000 : 20000; g_readBuffer = calloc(1, g_readBufferSize); GUI_Mouse_Show_Safe(); Music_Play(28); drawMenu = true; break; case STR_EXIT_GAME: g_running = false; return; case STR_HALL_OF_FAME: GUI_HallOfFame_Show(0xFFFF); GFX_SetPalette(g_palette2); hasFame = File_Exists("SAVEFAME.DAT"); drawMenu = true; break; case STR_LOAD_GAME: GUI_Mouse_Hide_Safe(); GUI_SetPaletteAnimated(g_palette2, 30); GUI_ClearScreen(SCREEN_0); GUI_Mouse_Show_Safe(); GFX_SetPalette(g_palette1); if (GUI_Widget_SaveLoad_Click(false)) { loadGame = true; if (g_gameMode == GM_RESTART) break; g_gameMode = GM_NORMAL; } else { GFX_SetPalette(g_palette2); drawMenu = true; } break; default: break; } if (drawMenu) { uint16 i; g_widgetProperties[21].height = 0; for (i = 0; i < 6; i++) { strings[i] = NULL; if (mainMenuStrings[index][i] == 0) { if (g_widgetProperties[21].height == 0) g_widgetProperties[21].height = i; continue; } strings[i] = String_Get_ByIndex(mainMenuStrings[index][i]); } GUI_DrawText_Wrapper(NULL, 0, 0, 0, 0, 0x22); maxWidth = 0; for (i = 0; i < g_widgetProperties[21].height; i++) { if (Font_GetStringWidth(strings[i]) <= maxWidth) continue; maxWidth = Font_GetStringWidth(strings[i]); } maxWidth += 7; g_widgetProperties[21].width = maxWidth >> 3; g_widgetProperties[13].width = g_widgetProperties[21].width + 2; g_widgetProperties[13].xBase = 19 - (maxWidth >> 4); g_widgetProperties[13].yBase = 160 - ((g_widgetProperties[21].height * g_fontCurrent->height) >> 1); g_widgetProperties[13].height = (g_widgetProperties[21].height * g_fontCurrent->height) + 11; Sprites_LoadImage(String_GenerateFilename("TITLE"), SCREEN_1, NULL); GUI_Mouse_Hide_Safe(); GUI_ClearScreen(SCREEN_0); GUI_Screen_Copy(0, 0, 0, 0, SCREEN_WIDTH / 8, SCREEN_HEIGHT, SCREEN_1, SCREEN_0); GUI_SetPaletteAnimated(g_palette1, 30); GUI_DrawText_Wrapper("V1.07", 319, 192, 133, 0, 0x231, 0x39); GUI_DrawText_Wrapper(NULL, 0, 0, 0, 0, 0x22); Widget_SetCurrentWidget(13); GUI_Widget_DrawBorder(13, 2, 1); GameLoop_DrawMenu(strings); GUI_Mouse_Show_Safe(); drawMenu = false; } if (loadGame) return; stringID = GameLoop_HandleEvents(strings); if (stringID != 0xFFFF) stringID = mainMenuStrings[index][stringID]; GUI_PaletteAnimate(); if (stringID == STR_PLAY_A_GAME) g_gameMode = GM_PICKHOUSE; }
static void ReadProfileIni(const char *filename) { char *source; char *key; char *keys; char buffer[120]; uint16 locsi; if (filename == NULL) return; if (!File_Exists(filename)) return; source = GFX_Screen_Get_ByIndex(SCREEN_1); memset(source, 0, 32000); File_ReadBlockFile(filename, source, GFX_Screen_GetSize_ByIndex(SCREEN_1)); keys = source + strlen(source) + 5000; *keys = '\0'; Ini_GetString("construct", NULL, keys, keys, 2000, source); for (key = keys; *key != '\0'; key += strlen(key) + 1) { ObjectInfo *oi = NULL; uint16 count; uint8 type; uint16 buildCredits; uint16 buildTime; uint16 fogUncoverRadius; uint16 availableCampaign; uint16 sortPriority; uint16 priorityBuild; uint16 priorityTarget; uint16 hitpoints; type = Unit_StringToType(key); if (type != UNIT_INVALID) { oi = &g_table_unitInfo[type].o; } else { type = Structure_StringToType(key); if (type != STRUCTURE_INVALID) oi = &g_table_structureInfo[type].o; } if (oi == NULL) continue; Ini_GetString("construct", key, buffer, buffer, 120, source); count = sscanf(buffer, "%hu,%hu,%hu,%hu,%hu,%hu,%hu,%hu", &buildCredits, &buildTime, &hitpoints, &fogUncoverRadius, &availableCampaign, &priorityBuild, &priorityTarget, &sortPriority); oi->buildCredits = buildCredits; oi->buildTime = buildTime; oi->hitpoints = hitpoints; oi->fogUncoverRadius = fogUncoverRadius; oi->availableCampaign = availableCampaign; oi->priorityBuild = priorityBuild; oi->priorityTarget = priorityTarget; if (count <= 7) continue; oi->sortPriority = (uint8)sortPriority; } if (g_debugGame) { for (locsi = 0; locsi < UNIT_MAX; locsi++) { ObjectInfo *oi = &g_table_unitInfo[locsi].o; sprintf(buffer, "%*s%4d,%4d,%4d,%4d,%4d,%4d,%4d,%4d", 15 - (int)strlen(oi->name), "", oi->buildCredits, oi->buildTime, oi->hitpoints, oi->fogUncoverRadius, oi->availableCampaign, oi->priorityBuild, oi->priorityTarget, oi->sortPriority); Ini_SetString("construct", oi->name, buffer, source); } for (locsi = 0; locsi < STRUCTURE_MAX; locsi++) { ObjectInfo *oi = &g_table_unitInfo[locsi].o; sprintf(buffer, "%*s%4d,%4d,%4d,%4d,%4d,%4d,%4d,%4d", 15 - (int)strlen(oi->name), "", oi->buildCredits, oi->buildTime, oi->hitpoints, oi->fogUncoverRadius, oi->availableCampaign, oi->priorityBuild, oi->priorityTarget, oi->sortPriority); Ini_SetString("construct", oi->name, buffer, source); } } *keys = '\0'; Ini_GetString("combat", NULL, keys, keys, 2000, source); for (key = keys; *key != '\0'; key += strlen(key) + 1) { uint16 damage; uint16 movingSpeedFactor; uint16 fireDelay; uint16 fireDistance; Ini_GetString("combat", key, buffer, buffer, 120, source); String_Trim(buffer); if (sscanf(buffer, "%hu,%hu,%hu,%hu", &fireDistance, &damage, &fireDelay, &movingSpeedFactor) < 4) continue; for (locsi = 0; locsi < UNIT_MAX; locsi++) { UnitInfo *ui = &g_table_unitInfo[locsi]; if (strcasecmp(ui->o.name, key) != 0) continue; ui->damage = damage; ui->movingSpeedFactor = movingSpeedFactor; ui->fireDelay = fireDelay; ui->fireDistance = fireDistance; break; } } if (!g_debugGame) return; for (locsi = 0; locsi < UNIT_MAX; locsi++) { const UnitInfo *ui = &g_table_unitInfo[locsi]; sprintf(buffer, "%*s%4d,%4d,%4d,%4d", 15 - (int)strlen(ui->o.name), "", ui->fireDistance, ui->damage, ui->fireDelay, ui->movingSpeedFactor); Ini_SetString("combat", ui->o.name, buffer, source); } }
/** * Checks if the level comes to an end. If so, it shows all end-level stuff, * and prepares for the next level. */ static void GameLoop_LevelEnd(void) { static uint32 levelEndTimer = 0; if (levelEndTimer >= g_timerGame && !s_debugForceWin) return; if (GameLoop_IsLevelFinished()) { Music_Play(0); g_cursorSpriteID = 0; Sprites_SetMouseSprite(0, 0, g_sprites[0]); Sound_Output_Feedback(0xFFFE); GUI_ChangeSelectionType(SELECTIONTYPE_MENTAT); if (GameLoop_IsLevelWon()) { Sound_Output_Feedback(40); GUI_DisplayModalMessage(String_Get_ByIndex(STR_YOU_HAVE_SUCCESSFULLY_COMPLETED_YOUR_MISSION), 0xFFFF); GUI_Mentat_ShowWin(); Sprites_UnloadTiles(); g_campaignID++; GUI_EndStats_Show(g_scenario.killedAllied, g_scenario.killedEnemy, g_scenario.destroyedAllied, g_scenario.destroyedEnemy, g_scenario.harvestedAllied, g_scenario.harvestedEnemy, g_scenario.score, g_playerHouseID); if (g_campaignID == 9) { GUI_Mouse_Hide_Safe(); GUI_SetPaletteAnimated(g_palette2, 15); GUI_ClearScreen(SCREEN_0); GameLoop_GameEndAnimation(); PrepareEnd(); exit(0); } GUI_Mouse_Hide_Safe(); GameLoop_LevelEndAnimation(); GUI_Mouse_Show_Safe(); File_ReadBlockFile("IBM.PAL", g_palette1, 256 * 3); g_scenarioID = GUI_StrategicMap_Show(g_campaignID, true); GUI_SetPaletteAnimated(g_palette2, 15); if (g_campaignID == 1 || g_campaignID == 7) { if (!GUI_Security_Show()) { PrepareEnd(); exit(0); } } } else { Sound_Output_Feedback(41); GUI_DisplayModalMessage(String_Get_ByIndex(STR_YOU_HAVE_FAILED_YOUR_MISSION), 0xFFFF); GUI_Mentat_ShowLose(); Sprites_UnloadTiles(); g_scenarioID = GUI_StrategicMap_Show(g_campaignID, false); } g_playerHouse->flags.doneFullScaleAttack = false; Sprites_LoadTiles(); g_gameMode = GM_RESTART; s_debugForceWin = false; } levelEndTimer = g_timerGame + 300; }
/** * In case the current house is Mercenary, another palette is loaded. */ void Load_Palette_Mercenaries(void) { if (g_playerHouseID == HOUSE_MERCENARY) { File_ReadBlockFile("IBM.PAL", g_palette1, 256 * 3); } }
/** * Logos at begin of intro. */ static void Gameloop_Logos(void) { Screen oldScreenID; void *wsa; uint16 frame; oldScreenID = GFX_Screen_SetActive(SCREEN_0); GFX_SetPalette(g_palette2); GFX_ClearScreen(); File_ReadBlockFile("WESTWOOD.PAL", g_palette_998A, 256 * 3); frame = 0; wsa = WSA_LoadFile("WESTWOOD.WSA", GFX_Screen_Get_ByIndex(SCREEN_1), GFX_Screen_GetSize_ByIndex(SCREEN_1) + GFX_Screen_GetSize_ByIndex(SCREEN_2) + GFX_Screen_GetSize_ByIndex(SCREEN_3), true); WSA_DisplayFrame(wsa, frame++, 0, 0, SCREEN_0); GUI_SetPaletteAnimated(g_palette_998A, 60); Music_Play(0x24); g_timerTimeout = 360; while (WSA_DisplayFrame(wsa, frame++, 0, 0, SCREEN_0)) Timer_Sleep(6); WSA_Unload(wsa); if (Input_Keyboard_NextKey() != 0 && g_canSkipIntro) goto logos_exit; Voice_LoadVoices(0xFFFF); for (; g_timerTimeout != 0; sleepIdle()) { if (Input_Keyboard_NextKey() != 0 && g_canSkipIntro) goto logos_exit; } GUI_SetPaletteAnimated(g_palette2, 60); while (Driver_Music_IsPlaying()) sleepIdle(); GUI_SetPaletteAnimated(g_palette2, 60); GFX_ClearScreen(); Sprites_LoadImage(String_GenerateFilename("AND"), SCREEN_1, g_palette_998A); GUI_Screen_Copy(0, 0, 0, 0, SCREEN_WIDTH / 8, SCREEN_HEIGHT, SCREEN_1, SCREEN_0); GUI_SetPaletteAnimated(g_palette_998A, 30); for (g_timerTimeout = 60; g_timerTimeout != 0; sleepIdle()) { if (Input_Keyboard_NextKey() != 0 && g_canSkipIntro) goto logos_exit; } GUI_SetPaletteAnimated(g_palette2, 30); GUI_ClearScreen(SCREEN_0); Sprites_LoadImage("VIRGIN.CPS", SCREEN_1, g_palette_998A); GUI_Screen_Copy(0, 0, 0, 0, SCREEN_WIDTH / 8, SCREEN_HEIGHT, SCREEN_1, SCREEN_0); GUI_SetPaletteAnimated(g_palette_998A, 30); for (g_timerTimeout = 180; g_timerTimeout != 0; sleepIdle()) { if (Input_Keyboard_NextKey() != 0 && g_canSkipIntro) goto logos_exit; } logos_exit: GUI_SetPaletteAnimated(g_palette2, 30); GUI_ClearScreen(SCREEN_0); GFX_Screen_SetActive(oldScreenID); }
/** * Shows the game credits. */ static void GameLoop_GameCredits(void) { static const uint8 colours[] = {0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0}; uint16 i; uint8 *memory; GUI_Mouse_Hide_Safe(); Widget_SetCurrentWidget(20); Sprites_LoadImage("BIGPLAN.CPS", SCREEN_1, g_palette_998A); GUI_ClearScreen(SCREEN_0); GUI_Screen_Copy(g_curWidgetXBase, g_curWidgetYBase, g_curWidgetXBase, g_curWidgetYBase, g_curWidgetWidth, g_curWidgetHeight, SCREEN_1, SCREEN_0); GUI_SetPaletteAnimated(g_palette_998A, 60); Music_Play(0); GameLoop_Uninit(); Music_Play(33); memory = GFX_Screen_Get_ByIndex(SCREEN_2); for (i = 0; i < 256; i++) { uint8 loc06; uint8 loc04; memory[i] = i & 0xFF; loc06 = i / 16; loc04 = i % 16; if (loc06 == 9 && loc04 <= 6) { memory[i] = (g_playerHouseID * 16) + loc04 + 144; } } Sprites_LoadImage("MAPPLAN.CPS", SCREEN_1, g_palette_998A); GUI_Palette_RemapScreen(g_curWidgetXBase << 3, g_curWidgetYBase, g_curWidgetWidth << 3, g_curWidgetHeight, SCREEN_1, memory); GUI_Screen_FadeIn2(g_curWidgetXBase << 3, g_curWidgetYBase, g_curWidgetWidth << 3, g_curWidgetHeight, SCREEN_1, SCREEN_0, 1, false); GameCredits_LoadPalette(); GUI_Mouse_Hide_Safe(); GUI_InitColors(colours, 0, lengthof(colours) - 1); g_fontCharOffset = -1; GFX_SetPalette(g_palette1); for (;; sleepIdle()) { File_ReadBlockFile(String_GenerateFilename("CREDITS"), s_buffer_1832, GFX_Screen_GetSize_ByIndex(SCREEN_3)); GameCredits_Play(s_buffer_1832, 20, SCREEN_1, SCREEN_2, 6); if (Input_Keyboard_NextKey() != 0) break; Music_Play(33); } GUI_SetPaletteAnimated(g_palette2, 60); Driver_Music_FadeOut(); GFX_ClearScreen(); }
/** * Intro menu. */ static void GameLoop_GameIntroAnimationMenu() { Timer_SetTimer(TIMER_GUI, true); g_techLevel = 0; g_campaignID = 0; g_scenarioID = 1; g_playerHouseID = HOUSE_INVALID; g_debugScenario = false; g_selectionType = SELECTIONTYPE_MENTAT; g_selectionTypeNew = SELECTIONTYPE_MENTAT; memset(g_palette1, 0, 3 * 256); memset(g_palette2, 0, 3 * 256); g_readBufferSize = 12000; g_readBuffer = NULL; File_ReadBlockFile("IBM.PAL", g_palette_998A, 256 * 3); memmove(g_palette1, g_palette_998A, 256 * 3); GUI_ClearScreen(SCREEN_0); GFX_SetPalette(g_palette1); GFX_SetPalette(g_palette2); GUI_Palette_CreateMapping(g_palette1, g_paletteMapping1, 0xC, 0x55); g_paletteMapping1[0xFF] = 0xFF; g_paletteMapping1[0xDF] = 0xDF; g_paletteMapping1[0xEF] = 0xEF; GUI_Palette_CreateMapping(g_palette1, g_paletteMapping2, 0xF, 0x55); g_paletteMapping2[0xFF] = 0xFF; g_paletteMapping2[0xDF] = 0xDF; g_paletteMapping2[0xEF] = 0xEF; Script_LoadFromFile("TEAM.EMC", g_scriptTeam, g_scriptFunctionsTeam, NULL); Script_LoadFromFile("BUILD.EMC", g_scriptStructure, g_scriptFunctionsStructure, NULL); GUI_Palette_CreateRemap(HOUSE_MERCENARY); Video_SetCursor(SHAPE_CURSOR_NORMAL); Window_WidgetClick_Create(); Unit_Init(); UnitAI_ClearSquads(); Team_Init(); House_Init(); Structure_Init(); { Audio_PlayMusic(MUSIC_STOP); free(g_readBuffer); g_readBufferSize = 0x6D60; g_readBuffer = calloc(1, g_readBufferSize); Menu_GameStarted(); } GFX_SetPalette(g_palette1); }