987 lines
31 KiB
C++
987 lines
31 KiB
C++
//
|
|
// Copyright 2020 Electronic Arts Inc.
|
|
//
|
|
// TiberianDawn.DLL and RedAlert.dll and corresponding source code is free
|
|
// software: you can redistribute it and/or modify it under the terms of
|
|
// the GNU General Public License as published by the Free Software Foundation,
|
|
// either version 3 of the License, or (at your option) any later version.
|
|
|
|
// TiberianDawn.DLL and RedAlert.dll and corresponding source code is distributed
|
|
// in the hope that it will be useful, but with permitted additional restrictions
|
|
// under Section 7 of the GPL. See the GNU General Public License in LICENSE.TXT
|
|
// distributed with this program. You should have received a copy of the
|
|
// GNU General Public License along with permitted additional restrictions
|
|
// with this program. If not, see https://github.com/electronicarts/CnC_Remastered_Collection
|
|
|
|
/* $Header: /counterstrike/EGOS.CPP 2 3/10/97 3:19p Steve_tall $ */
|
|
/*************************************************************************************
|
|
** C O N F I D E N T I A L --- W E S T W O O D S T U D I O S **
|
|
*************************************************************************************
|
|
* *
|
|
* Project Name : Command & Conquer - Red Alert *
|
|
* *
|
|
* File Name : EGOS.CPP *
|
|
* *
|
|
* Programmer : Steve Tall *
|
|
* *
|
|
* Start Date : September 4th, 1996 *
|
|
* *
|
|
* Last Update : September 4th, 1996 [ST] *
|
|
* *
|
|
*-----------------------------------------------------------------------------------*
|
|
* Overview: *
|
|
* *
|
|
* Scrolling movie style credits. *
|
|
* *
|
|
*-----------------------------------------------------------------------------------*
|
|
* Functions: *
|
|
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
|
|
#if(0)
|
|
//PG_TO_FIX
|
|
#include "function.h"
|
|
|
|
/*
|
|
** List of Ego Class instances
|
|
** There will be one instance for each line of text.
|
|
*/
|
|
DynamicVectorClass<EgoClass *> EgoList;
|
|
|
|
/*
|
|
** Number of slideshow pictures
|
|
*/
|
|
|
|
#define NUM_SLIDES 17
|
|
|
|
/*
|
|
** Length of time frame is displayed for
|
|
*/
|
|
#define FRAME_DELAY 150
|
|
|
|
/*
|
|
** Number of frames that palete fade occurs over
|
|
*/
|
|
#define FADE_DELAY 37
|
|
|
|
/*
|
|
** Names of slideshow pictures to play behind the text
|
|
*/
|
|
char SlideNames[NUM_SLIDES][13]={
|
|
|
|
"aftr_hi.pcx",
|
|
"aly1.pcx",
|
|
"apc_hi.pcx",
|
|
"aphi0049.pcx",
|
|
"bnhi0020.pcx",
|
|
"dchi0040.pcx",
|
|
"frhi0166.pcx",
|
|
"lab.pcx",
|
|
"landsbrg.pcx",
|
|
"mahi0107.pcx",
|
|
"mig_hi.pcx",
|
|
"mtfacthi.pcx",
|
|
"needle.pcx",
|
|
"sov2.pcx",
|
|
"spy.pcx",
|
|
"stalin.pcx",
|
|
"tent.pcx"
|
|
};
|
|
|
|
/*
|
|
** Names of low res slideshow pictures to play behind the text
|
|
*/
|
|
char LoresSlideNames[NUM_SLIDES][13]={
|
|
"malo0107.cps",
|
|
"mig_lo.cps",
|
|
"mtfactlo.cps",
|
|
"needl-lo.cps",
|
|
"sov2-lo.cps",
|
|
"spy-lo.cps",
|
|
"staln-lo.cps",
|
|
"tent-lo.cps",
|
|
"aftr_lo.cps",
|
|
"aly1-lo.cps",
|
|
"apc_lo.cps",
|
|
"aplo0049.cps",
|
|
"bnlo0020.cps",
|
|
"dclo0040.cps",
|
|
"frlo0166.cps",
|
|
"lab-lo.cps",
|
|
"lands-lo.cps"
|
|
};
|
|
|
|
/*
|
|
** Array of all the palettes required for the slides
|
|
*/
|
|
char SlidePals[NUM_SLIDES][256*3];
|
|
|
|
/*
|
|
** Array of graphic buffers containing the slides
|
|
*/
|
|
GraphicBufferClass *SlideBuffers[NUM_SLIDES];
|
|
|
|
/*
|
|
** Original copy of slide (pref in video mem) that we use to undraw the text
|
|
*/
|
|
GraphicBufferClass *BackgroundPage;
|
|
|
|
/*
|
|
** This palette contains both the font palette entries and the slide
|
|
** palette.
|
|
*/
|
|
PaletteClass ComboPalette;
|
|
|
|
/*
|
|
** Ptr to the combo palette.
|
|
*/
|
|
unsigned char *ComboPalPtr;
|
|
|
|
/*
|
|
** Lookup table. If an entry is non-zero then it should be faded in/out when the slide changes.
|
|
*/
|
|
char PaletteLUT[256];
|
|
|
|
/*
|
|
** Height of the strips that are blitted from the slides to the backgound and hid pages.
|
|
** We blit in several strips over several frames so as not to impact on the frame rate.
|
|
*/
|
|
#define CHUNK_HEIGHT RESFACTOR * 50
|
|
|
|
|
|
|
|
#ifndef WIN32
|
|
extern void Vsync(void);
|
|
#pragma aux Vsync modify [edx ebx eax] = \
|
|
"mov edx,03DAh" \
|
|
"mov ebx,[VertBlank]" \
|
|
"and bl,001h" \
|
|
"shl bl,3" \
|
|
"in_vbi:" \
|
|
"in al,dx" \
|
|
"and al,008h" \
|
|
"xor al,bl" \
|
|
"je in_vbi" \
|
|
"out_vbi:" \
|
|
"in al,dx" \
|
|
"and al,008h" \
|
|
"xor al,bl" \
|
|
"jne out_vbi"
|
|
#endif //WIN32
|
|
|
|
|
|
|
|
/***********************************************************************************************
|
|
* EC::EgoClass -- EgoClass constructor *
|
|
* *
|
|
* *
|
|
* *
|
|
* INPUT: x position of text *
|
|
* y position of text *
|
|
* ptr to text string *
|
|
* flags to print text with *
|
|
* *
|
|
* *
|
|
* OUTPUT: Nothing *
|
|
* *
|
|
* WARNINGS: None *
|
|
* *
|
|
* HISTORY: *
|
|
* 9/9/96 11:53PM ST : Created *
|
|
*=============================================================================================*/
|
|
EgoClass::EgoClass (int x, int y, char *text, TextPrintType flags)
|
|
{
|
|
XPos = x;
|
|
YPos = y;
|
|
Flags= flags;
|
|
Text = new char [strlen (text)+1];
|
|
strcpy (Text, text);
|
|
}
|
|
|
|
|
|
/***********************************************************************************************
|
|
* EC::~EgoClass -- EgoClass destructor *
|
|
* *
|
|
* *
|
|
* *
|
|
* INPUT: Nothing *
|
|
* *
|
|
* OUTPUT: Nothing *
|
|
* *
|
|
* WARNINGS: None *
|
|
* *
|
|
* HISTORY: *
|
|
* 9/9/96 11:54PM ST : Created *
|
|
*=============================================================================================*/
|
|
EgoClass::~EgoClass(void)
|
|
{
|
|
delete [] Text;
|
|
}
|
|
|
|
|
|
/***********************************************************************************************
|
|
* EC::Scroll -- Apply the given distance to the y position of the text. *
|
|
* A positive distance scrolls up. *
|
|
* *
|
|
* *
|
|
* INPUT: distance in pixels to scroll up *
|
|
* *
|
|
* OUTPUT: true if text scrolled beyond the top of the screen *
|
|
* *
|
|
* WARNINGS: None *
|
|
* *
|
|
* HISTORY: *
|
|
* 9/9/96 11:55PM ST : Created *
|
|
*=============================================================================================*/
|
|
bool EgoClass::Scroll(int distance)
|
|
{
|
|
YPos -= distance;
|
|
if (YPos < -20) {
|
|
return (true);
|
|
}else{
|
|
return (false);
|
|
}
|
|
}
|
|
|
|
|
|
/***********************************************************************************************
|
|
* EC::Render -- Draws the text to the logic page *
|
|
* *
|
|
* *
|
|
* *
|
|
* INPUT: Nothing *
|
|
* *
|
|
* OUTPUT: Nothing *
|
|
* *
|
|
* WARNINGS: None *
|
|
* *
|
|
* HISTORY: *
|
|
* 9/9/96 11:57PM ST : Created *
|
|
*=============================================================================================*/
|
|
void EgoClass::Render (void)
|
|
{
|
|
if (YPos < LogicPage->Get_Height() && YPos > -16) {
|
|
Fancy_Text_Print(Text, XPos, YPos, GadgetClass::Get_Color_Scheme(), TBLACK, Flags);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
/***********************************************************************************************
|
|
* EC::Wipe -- Wipes the previously rendered text by blitting a rectangle from the given *
|
|
* background screen. *
|
|
* *
|
|
* *
|
|
* INPUT: ptr to screen containing original background *
|
|
* *
|
|
* OUTPUT: Nothing *
|
|
* *
|
|
* WARNINGS: None *
|
|
* *
|
|
* HISTORY: *
|
|
* 9/9/96 11:58PM ST : Created *
|
|
*=============================================================================================*/
|
|
void EgoClass::Wipe (GraphicBufferClass *background)
|
|
{
|
|
int width = String_Pixel_Width (Text);
|
|
int x = XPos;
|
|
|
|
if (Flags & TPF_RIGHT) {
|
|
x -= width;
|
|
}else{
|
|
if (Flags & TPF_CENTER){
|
|
x -= width/2;
|
|
}
|
|
}
|
|
|
|
background->Blit(*LogicPage, x-1, YPos, x-1, YPos, width+2, 7 * RESFACTOR +1, false);
|
|
}
|
|
|
|
|
|
|
|
/***********************************************************************************************
|
|
* Set_Pal -- Low level palette set *
|
|
* *
|
|
* *
|
|
* *
|
|
* INPUT: ptr to palette *
|
|
* *
|
|
* OUTPUT: Nothing *
|
|
* *
|
|
* WARNINGS: None *
|
|
* *
|
|
* HISTORY: *
|
|
* 9/9/96 11:59PM ST : Created *
|
|
*=============================================================================================*/
|
|
void Set_Pal(char *palette)
|
|
{
|
|
//#ifndef WIN32
|
|
//Vsync();
|
|
//unsigned char *rgbptr = (unsigned char *) palette;
|
|
//outportb(0x03C8, 0); //Start from color 0
|
|
|
|
//for (int index = 0; index < 256; index++) {
|
|
// outrgb(rgbptr[index*3], rgbptr[index*3+1], rgbptr[index*3+2]);
|
|
//}
|
|
//#else //WIN32
|
|
|
|
Set_Palette((void*)palette);
|
|
//#endif
|
|
}
|
|
|
|
|
|
/***********************************************************************************************
|
|
* Slide_Show -- Handles the blitting and fading of the background pictures. *
|
|
* *
|
|
* The picture frame number is used to trigger blitting and fading events *
|
|
* *
|
|
* *
|
|
* INPUT: picture number *
|
|
* frame *
|
|
* *
|
|
* OUTPUT: Nothing *
|
|
* *
|
|
* WARNINGS: None *
|
|
* *
|
|
* HISTORY: *
|
|
* 9/10/96 0:16AM ST : Created *
|
|
*=============================================================================================*/
|
|
void Slide_Show (int slide, int frame)
|
|
{
|
|
|
|
/*
|
|
** Temprary storage to save CCPalette to
|
|
*/
|
|
char save_palette[256*3];
|
|
|
|
|
|
if (frame >= 1 && frame <=4){
|
|
/*
|
|
** Blit in a quarter of the new frame to the background page.
|
|
*/
|
|
SlideBuffers[slide]->Blit (*BackgroundPage, 0, (frame-1) * CHUNK_HEIGHT,
|
|
0, (frame-1) * CHUNK_HEIGHT,
|
|
SeenBuff.Get_Width(), CHUNK_HEIGHT, false);
|
|
return;
|
|
}
|
|
|
|
if (frame >= 5 && frame <=8 ){
|
|
/*
|
|
** Blit in a quarter of the new frame to the hid page.
|
|
*/
|
|
BackgroundPage->Blit (HidPage, 0, (frame-5) * CHUNK_HEIGHT,
|
|
0, (frame-5) * CHUNK_HEIGHT,
|
|
SeenBuff.Get_Width(), CHUNK_HEIGHT, false);
|
|
return;
|
|
}
|
|
|
|
if (frame ==9){
|
|
/*
|
|
** Create the combo palette from the font entries and the picture entries.
|
|
*/
|
|
for (int index = 0 ; index < 256 ; index++ ){
|
|
if (PaletteLUT[index]) {
|
|
ComboPalPtr[index*3] = SlidePals[slide][index*3];
|
|
ComboPalPtr[index*3+1] = SlidePals[slide][index*3+1];
|
|
ComboPalPtr[index*3+2] = SlidePals[slide][index*3+2];
|
|
}
|
|
}
|
|
return;
|
|
}
|
|
|
|
|
|
if (frame >10 && frame < FADE_DELAY+10){
|
|
/*
|
|
** Fade up the picture in the background. The text colors never fade.
|
|
*/
|
|
memcpy (save_palette, CCPalette, sizeof(save_palette));
|
|
//CCPalette.Partial_Adjust (MIN (6*(frame-5), 255), ComboPalette, PaletteLUT);
|
|
CCPalette.Partial_Adjust (MIN ((255/FADE_DELAY)*(frame-10), 255), ComboPalette, PaletteLUT);
|
|
Set_Pal ( (char *) &CCPalette);
|
|
if (frame != 9+FADE_DELAY){
|
|
memcpy (CCPalette, save_palette, sizeof(save_palette));
|
|
}else{
|
|
memcpy (CCPalette, CurrentPalette, sizeof (CCPalette));
|
|
}
|
|
return;
|
|
}
|
|
|
|
|
|
if (frame >FRAME_DELAY && frame < FRAME_DELAY+FADE_DELAY){
|
|
/*
|
|
** Fade down the picture in the background. The text colors never fade.
|
|
*/
|
|
memcpy (save_palette, CCPalette, sizeof(save_palette));
|
|
CCPalette.Partial_Adjust (MIN ((255/FADE_DELAY)*(frame-FRAME_DELAY), 255), PaletteLUT);
|
|
if (frame != FRAME_DELAY+FADE_DELAY-1){
|
|
Set_Pal ( (char *) &CCPalette);
|
|
memcpy (CCPalette, save_palette, sizeof(save_palette));
|
|
}else{
|
|
/*
|
|
** If this is the last fade down frame then zero the picture palette entries.
|
|
*/
|
|
unsigned char *ccpalptr = (unsigned char*)CCPalette;
|
|
for (int index = 0 ; index < 256 ; index++){
|
|
if (PaletteLUT[index]){
|
|
ccpalptr[index*3] = 0;
|
|
ccpalptr[index*3+1] = 0;
|
|
ccpalptr[index*3+2] = 0;
|
|
}
|
|
}
|
|
Set_Pal ( (char *) &CCPalette);
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/***********************************************************************************************
|
|
* Show_Who_Was_Responsible -- Main function to print the credits. *
|
|
* *
|
|
* *
|
|
* *
|
|
* INPUT: Nothing *
|
|
* *
|
|
* OUTPUT: Nothing *
|
|
* *
|
|
* WARNINGS: None *
|
|
* *
|
|
* HISTORY: *
|
|
* 9/10/96 0:20AM ST : Created *
|
|
*=============================================================================================*/
|
|
void Show_Who_Was_Responsible (void)
|
|
{
|
|
|
|
int i;
|
|
int key;
|
|
|
|
/*
|
|
** Deault speed of credits scolling. This is the frame delay between pixel scrolls.
|
|
*/
|
|
static int speed = 3;
|
|
|
|
/*
|
|
** In DOS we need to scroll slower so we have a bool that lets us do it every other time
|
|
*/
|
|
#ifndef WIN32
|
|
bool scroll_now = false;
|
|
#endif //WIN32
|
|
|
|
/*
|
|
** Read in the credits file to be displayed
|
|
**
|
|
** Lines of text in CREDITS.TXT are treated as follows....
|
|
**
|
|
** If the text starts and ends to the left of column 40 then text will be right justified.
|
|
** If the text starts before column 40 and ends after it then it will be centered.
|
|
** If the text starts after column 40 it will be right justified.
|
|
*/
|
|
CCFileClass creditsfile ("credits.txt");
|
|
if ( !creditsfile.Is_Available()) return;
|
|
char *credits = new char [creditsfile.Size()+1];
|
|
creditsfile.Read (credits, creditsfile.Size());
|
|
|
|
/*
|
|
** Initialise the text printing system.
|
|
*/
|
|
GadgetClass::Set_Color_Scheme(&ColorRemaps[PCOLOR_GREEN]);
|
|
Fancy_Text_Print(TXT_NONE, 0, 0, GadgetClass::Get_Color_Scheme(),
|
|
TBLACK, TPF_CENTER|TPF_6PT_GRAD|TPF_USE_GRAD_PAL|TPF_NOSHADOW);
|
|
|
|
|
|
/*
|
|
** Miscellaneous stuff for parsing the credits text file.
|
|
*/
|
|
int length = creditsfile.Size();
|
|
int line = 0;
|
|
int column = 0;
|
|
char *cptr = credits;
|
|
char ch, lastchar, oldchar;
|
|
char *strstart, *strparse;
|
|
bool gotendstr;
|
|
int startcolumn, endcolumn, x;
|
|
int y=SeenBuff.Get_Height()+2;
|
|
EgoClass *ego;
|
|
TextPrintType flags;
|
|
|
|
|
|
/*
|
|
** Search through the text file and extract the strings, using each string to create
|
|
** a new EgoClass
|
|
*/
|
|
do {
|
|
/*
|
|
** Search for text
|
|
*/
|
|
ch = *cptr++;
|
|
length --;
|
|
|
|
/*
|
|
** Look for a non whitespace character.
|
|
*/
|
|
switch ( ch ){
|
|
|
|
case 13:
|
|
/*
|
|
** Char was carriage return. Go on to the next line starting at column 0.
|
|
*/
|
|
line++;
|
|
column = 0;
|
|
break;
|
|
|
|
|
|
case 10:
|
|
/*
|
|
** Ignore line feed. CR does both.
|
|
*/
|
|
break;
|
|
|
|
/*
|
|
** Space character. Just advance the cursor and move on.
|
|
*/
|
|
case 32:
|
|
column++;
|
|
break;
|
|
|
|
/*
|
|
** Tab char. Advance to the next tab column. Tabs are every 8 columns.
|
|
*/
|
|
case 9:
|
|
column += 8;
|
|
column &= 0xfffffff8;
|
|
break;
|
|
|
|
default:
|
|
/*
|
|
** Found new string. Work out where it ends so we know how to treat it.
|
|
*/
|
|
lastchar = ch;
|
|
strstart = cptr-1;
|
|
strparse = cptr-1;
|
|
endcolumn = startcolumn = column;
|
|
gotendstr = false;
|
|
|
|
do {
|
|
ch = *strparse++;
|
|
switch ( ch ){
|
|
case 9:
|
|
case 10:
|
|
case 13:
|
|
gotendstr = true;
|
|
break;
|
|
|
|
case 32:
|
|
if (lastchar == 32) gotendstr = true;
|
|
endcolumn++;
|
|
break;
|
|
|
|
default:
|
|
endcolumn++;
|
|
}
|
|
if (strparse >= cptr+length) gotendstr = true;
|
|
|
|
lastchar = ch;
|
|
}while (!gotendstr);
|
|
|
|
|
|
if (strparse >= cptr+length) break;
|
|
|
|
/*
|
|
** Strip off any trailing space.
|
|
*/
|
|
if (*(strparse-2) == 32){
|
|
strparse--;
|
|
endcolumn -= 2;
|
|
}
|
|
|
|
|
|
/*
|
|
** If string straddles the center column then center it.
|
|
**
|
|
** If string is on the left hand side then right justify it.
|
|
**
|
|
** If string is on the right hand side then left justify it.
|
|
*/
|
|
flags = TPF_6PT_GRAD | TPF_USE_GRAD_PAL | TPF_DROPSHADOW; //TPF_NOSHADOW;
|
|
|
|
if (startcolumn <40 && endcolumn >40){
|
|
flags = flags | TPF_CENTER;
|
|
x = SeenBuff.Get_Width() / 2;
|
|
}else{
|
|
if (startcolumn <40){
|
|
flags = flags | TPF_RIGHT;
|
|
x = endcolumn *SeenBuff.Get_Width() /80;
|
|
}else{
|
|
x = startcolumn * SeenBuff.Get_Width() / 80;
|
|
}
|
|
}
|
|
|
|
/*
|
|
** Temporarily terminate the string.
|
|
*/
|
|
oldchar = *(strparse-1);
|
|
*(strparse-1) = 0;
|
|
|
|
/*
|
|
** Create the new class and add it to our list.
|
|
*/
|
|
ego = new EgoClass (x, y+ line *8 *RESFACTOR, strstart, flags);
|
|
|
|
EgoList.Add (ego);
|
|
|
|
/*
|
|
** Restore the character that was lost when we added the terminator.
|
|
*/
|
|
*(strparse-1) = oldchar;
|
|
|
|
/*
|
|
** Fix up our outer loop parsing variables.
|
|
*/
|
|
cptr = strparse;
|
|
column += strparse - strstart;
|
|
length -= strparse - strstart-1;
|
|
|
|
if (ch == 13) {
|
|
line++;
|
|
column = 0;
|
|
}else{
|
|
if (ch == 9){
|
|
column += 7;
|
|
column &= 0xfffffff8;
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
|
|
} while ( length>0 );
|
|
|
|
|
|
/*
|
|
** Work out which palette entries the font needs so we dont fade those colors.
|
|
*/
|
|
memset (PaletteLUT, 1, sizeof (PaletteLUT));
|
|
int pcolor = PCOLOR_GREEN;
|
|
|
|
for (int index = 0; index < 6; index++) {
|
|
PaletteLUT[ColorRemaps[pcolor].FontRemap[10+index]] =0;
|
|
}
|
|
//PaletteLUT[ColorRemaps[pcolor].BrightColor] = 0;
|
|
PaletteLUT[ColorRemaps[pcolor].Color] = 0;
|
|
PaletteLUT[ColorRemaps[pcolor].Shadow] = 0;
|
|
PaletteLUT[ColorRemaps[pcolor].Background] = 0;
|
|
PaletteLUT[ColorRemaps[pcolor].Corners] = 0;
|
|
PaletteLUT[ColorRemaps[pcolor].Highlight] = 0;
|
|
PaletteLUT[ColorRemaps[pcolor].Bright] = 0;
|
|
PaletteLUT[ColorRemaps[pcolor].Underline] = 0;
|
|
PaletteLUT[ColorRemaps[pcolor].Bar] = 0;
|
|
PaletteLUT[ColorRemaps[pcolor].Box] = 0;
|
|
|
|
|
|
/*
|
|
** Stop the music.
|
|
*/
|
|
Theme.Stop();
|
|
|
|
/*
|
|
** Fade to black.
|
|
*/
|
|
BlackPalette.Set(TIMER_SECOND*2, Call_Back);
|
|
|
|
/*
|
|
** Load the reference palette for the font.
|
|
*/
|
|
//Load_Title_Page(true);
|
|
//#ifdef WIN32
|
|
// Load_Picture("EGOPAL.CPS", SysMemPage, SysMemPage, CCPalette, BM_DEFAULT);
|
|
//#else //WIN32
|
|
// Load_Picture("EGOPAL.CPS", HidPage, HidPage, CCPalette, BM_DEFAULT);
|
|
//#endif //WIN32
|
|
|
|
|
|
CCFileClass("EGOPAL.PAL").Read(&CCPalette, sizeof(CCPalette));
|
|
|
|
/*
|
|
** Copy the font palette entries into the combo palette.
|
|
*/
|
|
PaletteClass credit_palette;
|
|
ComboPalPtr = (unsigned char *) &ComboPalette;
|
|
unsigned char *creditpal_ptr = (unsigned char *) &credit_palette;
|
|
memcpy (ComboPalette, CCPalette, sizeof (ComboPalette));
|
|
|
|
for (index = 0 ; index < 256 ; index++ ){
|
|
if (PaletteLUT[index]) {
|
|
ComboPalPtr[index*3] = 0;
|
|
ComboPalPtr[index*3+1] = 0;
|
|
ComboPalPtr[index*3+2] = 0;
|
|
}
|
|
}
|
|
|
|
/*
|
|
** Clear the Seen Page since we will not be blitting to all of it.
|
|
*/
|
|
SeenBuff.Clear();
|
|
HidPage.Clear();
|
|
|
|
/*
|
|
** Set the font palette.
|
|
*/
|
|
memcpy ( CCPalette, ComboPalette, sizeof (ComboPalette) );
|
|
CCPalette.Set();
|
|
|
|
/*
|
|
** Loop through and load up all the slideshow pictures
|
|
*/
|
|
for (index = 0 ; index < NUM_SLIDES ; index++){
|
|
#ifdef WIN32
|
|
SlideBuffers[index] = new GraphicBufferClass;
|
|
SlideBuffers[index]->Init (SeenBuff.Get_Width(), SeenBuff.Get_Height(), NULL , 0 , (GBC_Enum)0);
|
|
Load_Title_Screen(&SlideNames[index][0], SlideBuffers[index], (unsigned char*) &SlidePals[index][0]);
|
|
#else //WIN32
|
|
SlideBuffers[index] = new GraphicBufferClass (SeenBuff.Get_Width(), SeenBuff.Get_Height(), (void*)NULL);
|
|
Load_Picture(&LoresSlideNames[index][0], *SlideBuffers[index], *SlideBuffers[index], (unsigned char *)&SlidePals[index][0], BM_DEFAULT);
|
|
#endif //WIN32
|
|
}
|
|
|
|
/*
|
|
** Create a new graphic buffer to restore the background from. Initialise it to black so
|
|
** we can start scrolling before the first slideshow picture is blitted.
|
|
*/
|
|
#ifdef WIN32
|
|
BackgroundPage = new GraphicBufferClass;
|
|
BackgroundPage->Init (SeenBuff.Get_Width(), SeenBuff.Get_Height(), NULL , 0 , (GBC_Enum)(GBC_VIDEOMEM));
|
|
#else //WIN32
|
|
BackgroundPage = new GraphicBufferClass (SeenBuff.Get_Width(), SeenBuff.Get_Height(), (void*)NULL );
|
|
#endif //WIN32
|
|
|
|
SeenBuff.Blit(*BackgroundPage);
|
|
|
|
/*
|
|
** Go away nasty keyboard.
|
|
*/
|
|
Keyboard->Clear();
|
|
|
|
Set_Logic_Page(HidPage);
|
|
|
|
/*
|
|
** Start any old song.
|
|
*/
|
|
fixed oldvolume = Options.ScoreVolume;
|
|
if (oldvolume == 0) {
|
|
Options.Set_Score_Volume(fixed(4, 10), false);
|
|
}
|
|
Theme.Queue_Song(THEME_CREDITS);
|
|
|
|
/*
|
|
** Init misc timing variables.
|
|
*/
|
|
int time = TickCount;
|
|
int frame = 0;
|
|
int picture_frame = 0;
|
|
int slide_number = 0;
|
|
|
|
Hide_Mouse();
|
|
|
|
/*
|
|
** Save the priority of this process so we can change it back later
|
|
*/
|
|
//DWORD process_priority = GetPriorityClass(GetCurrentProcess());
|
|
|
|
/*
|
|
** Main scrolling loop.
|
|
** Keeps going until all the EgoClass objects are deleted or esc is pressed.
|
|
*/
|
|
while ( EgoList.Count() ){
|
|
|
|
frame++;
|
|
|
|
/*
|
|
** Once we have been running for a few frames, and Windows has time to do its virtual
|
|
** memory stuff, increase our priority level.
|
|
*/
|
|
//if (frame == 30){
|
|
// SetPriorityClass (GetCurrentProcess() , HIGH_PRIORITY_CLASS);
|
|
//}
|
|
|
|
/*
|
|
** Update the slideshow frame and switch to the next picture if its time.
|
|
*/
|
|
picture_frame++;
|
|
|
|
if (picture_frame > FRAME_DELAY+50){
|
|
if (slide_number <NUM_SLIDES-1){
|
|
slide_number++;
|
|
picture_frame = 0;
|
|
}else{
|
|
slide_number = 0;
|
|
picture_frame = 0;
|
|
}
|
|
}
|
|
|
|
/*
|
|
** Do the slideshow background.
|
|
*/
|
|
Slide_Show (slide_number, picture_frame);
|
|
|
|
|
|
/*
|
|
** Scroll the text. If any text goes off the top then delete that object.
|
|
*/
|
|
#ifndef WIN32
|
|
scroll_now = !scroll_now;
|
|
if (scroll_now){
|
|
#endif //WIN32
|
|
for (i=EgoList.Count()-1 ; i>=0 ; i--){
|
|
EgoList[i]->Wipe(BackgroundPage);
|
|
if ( EgoList[i]->Scroll(1) ){
|
|
EgoList.Delete(i);
|
|
break;
|
|
}
|
|
}
|
|
#ifndef WIN32
|
|
}
|
|
#endif //WIN32
|
|
/*
|
|
** Render all the text strings in their new positions.
|
|
*/
|
|
if (LogicPage->Lock()){
|
|
for (i=EgoList.Count()-1 ; i>=0 ; i--){
|
|
EgoList[i]->Render();
|
|
}
|
|
LogicPage->Unlock();
|
|
}
|
|
|
|
if (frame > 1000 && !Theme.Still_Playing()){
|
|
Theme.Queue_Song(THEME_CREDITS); //NONE);
|
|
}
|
|
|
|
/*
|
|
** Stop calling Theme.AI after a while so a different song doesnt start playing
|
|
*/
|
|
Call_Back();
|
|
// if (frame <1000 ){
|
|
// Theme.AI();
|
|
// }else{
|
|
// Sound_Callback();
|
|
// }
|
|
|
|
/*
|
|
** Kill any spare time before blitting the hid page forward.
|
|
*/
|
|
while (TickCount - time < frame *speed && !Keyboard->Check()) {}
|
|
|
|
/*
|
|
** Blit all but the top and bottom of the hid page. This is beacuse the text print doesn't
|
|
** clip vertically and looks ugly when it suddenly appears and disappears.
|
|
*/
|
|
#ifndef WIN32
|
|
Wait_Vert_Blank(VertBlank);
|
|
//Vsync();
|
|
#endif //WIN32
|
|
HidPage.Blit(SeenBuff, 0, 8*RESFACTOR, 0, 8*RESFACTOR, SeenBuff.Get_Width(), SeenBuff.Get_Height() - 16*RESFACTOR, false);
|
|
|
|
/*
|
|
** Try and prevent Win95 from swapping out pictures we havnt used yet.
|
|
*/
|
|
#ifdef WIN32
|
|
if (frame && 3 == 3){
|
|
for (i=slide_number+1 ; i<NUM_SLIDES ; i++){
|
|
if ( !SlideBuffers[i]->Get_IsDirectDraw() ){
|
|
Force_VM_Page_In ((void*)SlideBuffers[i]->Get_Offset(), SeenBuff.Get_Width() * SeenBuff.Get_Height() );
|
|
}
|
|
}
|
|
}
|
|
#endif //WIN32
|
|
|
|
/*
|
|
** If user hits escape then break.
|
|
*/
|
|
key = KN_NONE;
|
|
if (Keyboard->Check()){
|
|
key = Keyboard->Get();
|
|
if (key == KN_ESC){
|
|
break;
|
|
}
|
|
#if (0)
|
|
if (key == KN_Z){
|
|
speed--;
|
|
if (speed <1 ) speed=1;
|
|
time = TickCount;
|
|
frame = 0;
|
|
}
|
|
if (key == KN_X){
|
|
speed++;
|
|
time = TickCount;
|
|
frame = 0;
|
|
}
|
|
#endif //(0)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (key == KN_ESC){
|
|
Theme.Fade_Out();
|
|
BlackPalette.Set(TIMER_SECOND*2, Call_Back);
|
|
}else{
|
|
/*
|
|
** Wait for the picture to fade down
|
|
*/
|
|
while (picture_frame <= FADE_DELAY+FRAME_DELAY){
|
|
if (picture_frame < FRAME_DELAY && picture_frame > 10+FADE_DELAY){
|
|
picture_frame = FRAME_DELAY;
|
|
}
|
|
frame++;
|
|
picture_frame++;
|
|
|
|
Slide_Show (slide_number, picture_frame);
|
|
|
|
Call_Back();
|
|
// Sound_Callback(); //Theme.AI();
|
|
|
|
/*
|
|
** Kill any spare time
|
|
*/
|
|
while (TickCount - time < frame *speed && !Keyboard->Check()) {}
|
|
|
|
}
|
|
}
|
|
|
|
/*
|
|
** Tidy up.
|
|
*/
|
|
//SetPriorityClass (GetCurrentProcess() , process_priority);
|
|
SeenBuff.Clear();
|
|
|
|
Show_Mouse();
|
|
|
|
GadgetClass::Set_Color_Scheme(&ColorRemaps[PCOLOR_DIALOG_BLUE]);
|
|
|
|
Theme.Stop();
|
|
Options.Set_Score_Volume(oldvolume, false);
|
|
|
|
for (index = 0 ; index < NUM_SLIDES ; index++){
|
|
delete SlideBuffers[index];
|
|
}
|
|
|
|
delete BackgroundPage;
|
|
|
|
delete [] credits;
|
|
|
|
EgoList.Clear();
|
|
}
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|