/*----------------------------------------------------------------------------- Name : spScenarioBitmap Description : Inputs : Outputs : Return : ----------------------------------------------------------------------------*/ void spScenarioBitmap(featom *atom, regionhandle region) { rectangle textureRect; sdword index, y; fonthandle oldFont; textureRect.x0 = region->rect.x0 + SCP_TEXTURE_INSET; textureRect.y0 = region->rect.y0 + SCP_TEXTURE_INSET; textureRect.x1 = region->rect.x1 - SCP_TEXTURE_INSET; textureRect.y1 = region->rect.y1 - SCP_TEXTURE_INSET; //draw the bitmap... if (scenarioTexture != TR_InvalidInternalHandle) { if (glcActive()) { glcRectSolidTexturedScaled2(&textureRect, spTextureWidth, spTextureHeight, spTextureData, NULL, TRUE); } else { trRGBTextureMakeCurrent(scenarioTexture); rndPerspectiveCorrection(FALSE); primRectSolidTextured2(&textureRect); //draw the bitmap } feStaticRectangleDraw(region); //draw a border } //draw the description text... if (spDescription != NULL) { //if there is description text dbgAssert(spDescriptionFont != FONT_InvalidFontHandle); oldFont = fontMakeCurrent(spDescriptionFont); //set the font if (spDescriptionShadow) { //optionally enable dropshadow fontShadowSet(FS_SE, colBlack); } for (index = 0, y = textureRect.y0; index < spNDescriptionLines; index++) { //draw each line dbgAssert(spDescriptionLines[index] != NULL); if (y + fontHeight(" ") >= textureRect.y1) { //if this line will extend off bottom of region break; } fontPrint(textureRect.x0, y, spDescriptionColor, spDescriptionLines[index]); y += fontHeight(" ") + 1; } fontShadowSet(FS_NONE, colBlack); fontMakeCurrent(oldFont); } }
/*----------------------------------------------------------------------------- Name : tmTechImageDraw Description : Loads in, decompresses and draws the tech picture. Inputs : none Outputs : loads in tmTechImage and creates tmTechTexture Return : void ----------------------------------------------------------------------------*/ void tmTechImageDraw(featom *atom, regionhandle region) { char filename[128]; sdword index, lru = 0; real32 time=(real32)1.0e22; rectangle textureRect; tmTechImageRegion = region; feStaticRectangleDraw(region); //draw standard rectangle if (tmtechinfo != -1) { if (tmtechinfo != tmCurTechTexture) { for (index=0;index<TM_TOTALPICS;index++) // RM_TOTALPICS is the size of the cache { // Find least recently used texture if (pictures[index].timestamp < time) { time = pictures[index].timestamp; lru = index; } // If already cached, use it and exit this routine if ( (pictures[index].tech==tmtechinfo) && (pictures[index].race==universe.curPlayerPtr->race) ) { tmTechTexturePrepare(index); tmCurTechTexture = tmtechinfo; tmCurTechImage = pictures[lru].techImage; tmCurIndex = index; pictures[index].timestamp = universe.totaltimeelapsed; textureRect.x0=region->rect.x0+TM_TEXTURE_INSET; textureRect.y0=region->rect.y0+TM_TEXTURE_INSET; textureRect.x1=region->rect.x1-TM_TEXTURE_INSET; textureRect.y1=region->rect.y1-TM_TEXTURE_INSET; rndPerspectiveCorrection(FALSE); primRectSolidTextured2(&textureRect); //if(tmExtendedInfoActive) //{ // primRectTranslucent2(&textureRect, colRGBA(0, 0, 0, 128)); // tmTechInfoDraw(region); //} return; } } // Build filename for loading texture from file strcpy(filename, TechImagePaths[universe.curPlayerPtr->race]); strcat(filename, TechTypeToString(tmtechinfo)); strcat(filename,".lif"); // Remove oldest (least recently used) texture from memory if (pictures[lru].techImage != NULL) { memFree(pictures[lru].techImage); pictures[lru].techImage = NULL; } if (pictures[lru].techTexture != TR_InvalidInternalHandle) { trRGBTextureDelete(pictures[lru].techTexture); pictures[lru].techTexture = TR_InvalidInternalHandle; } // Load the image into LRU cache pictures[lru].techImage = trLIFFileLoad(filename, NonVolatile); dbgAssertOrIgnore(pictures[lru].techImage->flags & TRF_Paletted); tmTechTexturePrepare(lru); tmCurTechTexture = tmtechinfo; tmCurTechImage = pictures[lru].techImage; pictures[lru].tech = tmtechinfo; pictures[lru].race = universe.curPlayerPtr->race; pictures[lru].timestamp = universe.totaltimeelapsed; } else { trPalettedTextureMakeCurrent(pictures[tmCurIndex].techTexture, pictures[tmCurIndex].techImage->palette); } textureRect.x0=region->rect.x0+TM_TEXTURE_INSET; textureRect.y0=region->rect.y0+TM_TEXTURE_INSET; textureRect.x1=region->rect.x1-TM_TEXTURE_INSET; textureRect.y1=region->rect.y1-TM_TEXTURE_INSET; rndPerspectiveCorrection(FALSE); primRectSolidTextured2(&textureRect); } }
void tutExecute(regionhandle reg) { fonthandle currentfont; sdword texty, bitmap; rectangle rect; // used for translucent boxes behind text rectangle *buttonrect = ®->rect; // used for "next" button bool modeset = FALSE; sdword bitmap_x, bitmap_vel; if(tutorial == 3) return; if(tutRegion->previous) regSiblingMoveToFront(tutRegion); if(tutTransition == 0 && tutLesson != TUT_LESSON_ENTER_BUILD_MANAGER && tutLesson != TUT_LESSON_BUILD_SHIP) // don't draw button on build manager lessons { if(mouseInRect(buttonrect)) { if(mouseLeftButton()) { tutSkip = TRUE; trRGBTextureMakeCurrent(tutButtonTexture[NEXT_ON]); } else trRGBTextureMakeCurrent(tutButtonTexture[NEXT_MOUSE]); } else trRGBTextureMakeCurrent(tutButtonTexture[NEXT_OFF]); rndPerspectiveCorrection(FALSE); // glEnable(GL_BLEND); // needs to be enabled once Keith fixes alpha blending intel compiler optimization bug primRectSolidTextured2(buttonrect); // glDisable(GL_BLEND); // needs to be enabled once Keith fixes alpha blending intel compiler optimization bug } if(tutTransition == 0) { switch(PassedTutorial(tutLesson)) { case 0: // Didn't pass break; case 1: // Perform transition tutTransition = 1; break; case -1: // No Transition tutLesson++; InitTutorial(tutLesson); break; } } else if(tutTransition == 1) { tutTransitionCount++; if(tutTransitionCount == TUT_TransitionFramesOut) { tutTransition = 2; tutTransitionCount = TUT_TransitionFramesIn; tutLesson++; InitTutorial(tutLesson); if((tutLesson >= TUT_ADVANCED_INTRO && tutorial == 1) || (tutLesson >= TUT_TOTAL_LESSONS && tutorial == 2)) { tutorialdone = TRUE; return; } } } else if(tutTransition == 2) { tutTransitionCount--; if(tutTransitionCount == 0) tutTransition = 0; } if(tutBitmapList[tutLesson][2] != -1) { bitmap_x = TUT_BITMAP_X; bitmap_vel = 210; } else if(tutBitmapList[tutLesson][1] != -1) { bitmap_x = TUT_BITMAP_X + (TUT_BITMAP_WIDTH + 8); bitmap_vel = 150; } else { bitmap_x = TUT_BITMAP_X + ((2 * TUT_BITMAP_WIDTH) + 8); bitmap_vel = 90; } if(tutTransition == 0) bitmap_vel = 0; else if(tutTransition == 1) bitmap_vel = (long) (((float)bitmap_vel/(float)TUT_TransitionFramesOut) * (float)tutTransitionCount); else if(tutTransition == 2) bitmap_vel = (long) (((float)bitmap_vel/(float)TUT_TransitionFramesIn) * (float)tutTransitionCount); // glEnable(GL_BLEND); for(bitmap = 0; bitmap < 3; bitmap++) { if(tutBitmapList[tutLesson][bitmap] != -1) { trRGBTextureMakeCurrent(tutButtonTexture[tutBitmapList[tutLesson][bitmap]]); rndPerspectiveCorrection(FALSE); rect.x0 = bitmap_x + ((TUT_BITMAP_WIDTH + 8) * bitmap) + bitmap_vel; rect.y0 = TUT_BITMAP_Y; rect.x1 = bitmap_x + ((TUT_BITMAP_WIDTH + 8) * bitmap) + TUT_BITMAP_WIDTH + bitmap_vel; rect.y1 = TUT_BITMAP_Y + TUT_BITMAP_HEIGHT; primRectSolidTextured2(&rect); } } // glDisable(GL_BLEND); if (!primModeEnabled) // draw translucent polys before text { primModeSet2(); modeset = TRUE; } if(tutLesson != TUT_LESSON_BUILD_SHIP) // default behaviour for lessons { long TitlePos = (long)(TUT_TitleTransMult[tutTransition] * (float)tutTransitionCount); long TextPos = (long)(TUT_TextTransMult[tutTransition] * (float)tutTransitionCount); rect.x0 = 0; rect.y0 = TUT_Title_Y - TitlePos - 7; rect.x1 = 640; rect.y1 = TUT_Title_Y - TitlePos + 22; primRectTranslucent2(&rect, colRGBA(0, 0, 0, 128)); rect.x0 = TUT_Main_X - TextPos - 12; rect.y0 = TUT_Main_Y - 6; rect.x1 = TUT_Main_X - TextPos + TUT_MainTextWidth + 4; rect.y1 = tutLastMainY; primRectTranslucent2(&rect, colRGBA(0, 0, 0, 128)); currentfont = fontMakeCurrent(tutTitleFont); // draw text fontPrintf(TUT_Title_X, TUT_Title_Y - TitlePos, TUT_TitleColor, "%s", strGetString(strTutorial00Title + (tutLesson * 7))); currentfont = fontMakeCurrent(tutMainFont); texty = DrawTextBlock(strGetString(strTutorial00Line01 + (tutLesson * 7)), TUT_Main_X - TextPos, TUT_Main_Y, TUT_MainTextWidth, TUT_MainTextHeight, TUT_MainColor); texty = DrawTextBlock(strGetString(strTutorial00Line02 + (tutLesson * 7)), TUT_Main_X - TextPos, texty, TUT_MainTextWidth, TUT_MainTextHeight, TUT_MainColor); texty = DrawTextBlock(strGetString(strTutorial00Line03 + (tutLesson * 7)), TUT_Main_X - TextPos, texty, TUT_MainTextWidth, TUT_MainTextHeight, TUT_MainColor); texty = DrawTextBlock(strGetString(strTutorial00Line04 + (tutLesson * 7)), TUT_Main_X - TextPos, texty, TUT_MainTextWidth, TUT_MainTextHeight, TUT_MainColor); tutLastMainY = DrawTextBlock(strGetString(strTutorial00Line05 + (tutLesson * 7)), TUT_Main_X - TextPos, texty, TUT_MainTextWidth, TUT_MainTextHeight, TUT_MainColor); fontMakeCurrent(currentfont); } else // special case for build ship lesson { currentfont = fontMakeCurrent(tutMainFont); texty = DrawTextBlock(strGetString(strTutorial17Line01 + tutVar.count), TUT_Build_X, TUT_Build_Y, TUT_BuildTextWidth, TUT_BuildTextHeight, TUT_BuildColor); fontMakeCurrent(currentfont); rect.x0 = TUT_Build_X - 8; // draw outline box around text rect.y0 = TUT_Build_Y - 6; rect.x1 = TUT_Build_X + TUT_BuildTextWidth + 8; rect.y1 = texty; primRectOutline2(&rect, 2, colRGB(tutPulseValue, tutPulseValue, tutPulseValue)); if(tutVar.count == 0) // point to appropriate place on screen tutDrawLinePulse(TUT_Build_X - 8, texty, 160, 100, tutPulseValue, 8); else if(tutVar.count == 1) tutDrawLinePulse(TUT_Build_X - 8, texty, 180, 410, tutPulseValue, 8); else if(tutVar.count == 2) tutDrawLinePulse(TUT_Build_X - 8, texty, 550, 410, tutPulseValue, 8); tutPulseValue -= 8; } if(!FirstWordNULL(strGetString(strTutorial00Tip + (tutLesson * 7)))) { long TipPos = (long)(TUT_TipTransMult[tutTransition] * (float)tutTransitionCount); long TextPos = (long)(TUT_TextTransMult[tutTransition] * (float)tutTransitionCount); if (!primModeEnabled) // draw translucent polys before tip text { primModeSet2(); modeset = TRUE; } rect.x0 = TUT_TipTitle_X - 8; rect.y0 = TUT_TipTitle_Y - TipPos - 6; rect.x1 = TUT_Tip_X - 8; rect.y1 = TUT_TipTitle_Y - TipPos + 18; primRectTranslucent2(&rect, colRGBA(0, 0, 0, 128)); rect.x0 = TUT_Tip_X + TextPos - 8; rect.y0 = TUT_Tip_Y - 6; rect.x1 = TUT_Tip_X + TextPos + TUT_TipTextWidth + 8; rect.y1 = tutLastTipY; primRectTranslucent2(&rect, colRGBA(0, 0, 0, 128)); if(modeset) primModeClear2(); currentfont = fontMakeCurrent(tutTipTitleFont); fontPrintf(TUT_TipTitle_X, TUT_TipTitle_Y - TipPos, TUT_TipTitleColor, "%s", strGetString(strTutorialTip)); currentfont = fontMakeCurrent(tutTipFont); tutLastTipY = DrawTextBlock(strGetString(strTutorial00Tip + (tutLesson * 7)), TUT_Tip_X + TextPos, TUT_Tip_Y, TUT_TipTextWidth, TUT_TipTextHeight, TUT_TipColor); } fontMakeCurrent(currentfont); }