unit UScreenCredits; interface uses UMenu, SDL, UDisplay, UTexture, OpenGL12, UMusic, UFiles, SysUtils, UThemes, ULCD, ULight, UGraphicClasses; type TCreditsStages=(InitialDelay,Intro,MainPart,Outro); TScreenCredits = class(TMenu) public Credits_X: Real; Credits_Time: Cardinal; Credits_Alpha: Cardinal; CTime: Cardinal; CTime_hold: Cardinal; ESC_Alpha: Integer; credits_entry_tex: TTexture; credits_entry_dx_tex: TTexture; credits_bg_tex: TTexture; credits_bg_ovl: TTexture; // credits_bg_logo: TTexture; credits_bg_scrollbox_left: TTexture; credits_blindguard: TTexture; credits_blindy: TTexture; credits_canni: TTexture; credits_commandio: TTexture; credits_lazyjoker: TTexture; credits_mog: TTexture; credits_mota: TTexture; credits_skillmaster: TTexture; credits_whiteshark: TTexture; intro_layer01: TTexture; intro_layer02: TTexture; intro_layer03: TTexture; intro_layer04: TTexture; intro_layer05: TTexture; intro_layer06: TTexture; intro_layer07: TTexture; intro_layer08: TTexture; intro_layer09: TTexture; outro_bg: TTexture; outro_esc: TTexture; outro_exd: TTexture; deluxe_slidein: cardinal; CurrentScrollText: String; NextScrollUpdate: Real; EndofLastScrollingPart: Cardinal; CurrentScrollStart, CurrentScrollEnd: Integer; CRDTS_Stage: TCreditsStages; Fadeout: boolean; constructor Create; override; function ParseInput(PressedKey: Cardinal; ScanCode: byte; PressedDown: Boolean): Boolean; override; function Draw: boolean; override; procedure onShow; override; procedure onHide; override; procedure DrawCredits; procedure Draw_FunkyText; end; const Funky_Text: AnsiString = 'Grandma Deluxe has arrived! Thanks to Corvus5 for the massive work on UltraStar, Wome for the nice tune you´re hearing, '+ 'all the people who put massive effort and work in new songs (don´t forget UltraStar w/o songs would be nothing), ppl from '+ 'irc helping us - eBandit and Gabari, scene ppl who really helped instead of compiling and running away. Thank for the translations to Jakob0 and Spearedge (Swedish), Pino (Dutch) and Canni (French). Greetings to DennisTheMenace for betatesting, '+ 'Demoscene.tv, KakiArts, Sourceforge,..'; Timings: array[0..21] of Cardinal=( 20, // 0 Delay vor Start 149, // 1 Ende erster Intro Zoom 155, // 2 Start 2. Action im Intro 170, // 3 Ende Separation im Intro 271, // 4 Anfang Zoomout im Intro 0, // 5 unused 261, // 6 Start fade-to-white im Intro 271, // 7 Start Main Part 280, // 8 Start On-Beat-Sternchen Main Part 396, // 9 Start BlindGuard 666, // 10 Start blindy 936, // 11 Start Canni 1206, // 12 Start Commandio 1476, // 13 Start LazyJoker 1746, // 14 Start Mog 2016, // 15 Start Mota 2286, // 16 Start SkillMaster 2556, // 17 Start WhiteShark 2826, // 18 Ende Whiteshark 3096, // 19 Start FadeOut Mainscreen 3366, // 20 Ende Credits Tune 60); // 21 start flare im intro implementation uses Dialogs,Windows, UGraphic, UMain, UIni, USongs, Textgl, opengl, ULanguage, Math; function TScreenCredits.ParseInput(PressedKey: Cardinal; ScanCode: byte; PressedDown: Boolean): Boolean; begin Result := true; If (PressedDown) Then begin // Key Down case PressedKey of SDLK_ESCAPE : begin FadeTo(@ScreenMain); Music.PlayBack; end; { SDLK_SPACE: begin setlength(CTime_hold,length(CTime_hold)+1); CTime_hold[high(CTime_hold)]:=CTime; end; } end;//esac end; //fi end; constructor TScreenCredits.Create; begin inherited Create; credits_bg_tex := Texture.LoadTexture(true, 'CRDTS_BG', 'PNG', 'Plain', 0); credits_bg_ovl := Texture.LoadTexture(true, 'CRDTS_OVL', 'PNG', 'Transparent', 0); credits_blindguard := Texture.LoadTexture(true, 'CRDTS_blindguard', 'PNG', 'Font Black', 0); credits_blindy := Texture.LoadTexture(true, 'CRDTS_blindy', 'PNG', 'Font Black', 0); credits_canni := Texture.LoadTexture(true, 'CRDTS_canni', 'PNG', 'Font Black', 0); credits_commandio := Texture.LoadTexture(true, 'CRDTS_commandio', 'PNG', 'Font Black', 0); credits_lazyjoker := Texture.LoadTexture(true, 'CRDTS_lazyjoker', 'PNG', 'Font Black', 0); credits_mog := Texture.LoadTexture(true, 'CRDTS_mog', 'PNG', 'Font Black', 0); credits_mota := Texture.LoadTexture(true, 'CRDTS_mota', 'PNG', 'Font Black', 0); credits_skillmaster := Texture.LoadTexture(true, 'CRDTS_skillmaster', 'PNG', 'Font Black', 0); credits_whiteshark := Texture.LoadTexture(true, 'CRDTS_whiteshark', 'PNG', 'Font Black', 0); intro_layer01 := Texture.LoadTexture(true, 'INTRO_L01', 'PNG', 'Transparent', 0); intro_layer02 := Texture.LoadTexture(true, 'INTRO_L02', 'PNG', 'Transparent', 0); intro_layer03 := Texture.LoadTexture(true, 'INTRO_L03', 'PNG', 'Transparent', 0); intro_layer04 := Texture.LoadTexture(true, 'INTRO_L04', 'PNG', 'Transparent', 0); intro_layer05 := Texture.LoadTexture(true, 'INTRO_L05', 'PNG', 'Transparent', 0); intro_layer06 := Texture.LoadTexture(true, 'INTRO_L06', 'PNG', 'Transparent', 0); intro_layer07 := Texture.LoadTexture(true, 'INTRO_L07', 'PNG', 'Transparent', 0); intro_layer08 := Texture.LoadTexture(true, 'INTRO_L08', 'PNG', 'Transparent', 0); intro_layer09 := Texture.LoadTexture(true, 'INTRO_L09', 'PNG', 'Transparent', 0); outro_bg := Texture.LoadTexture(true, 'OUTRO_BG', 'PNG', 'Plain', 0); outro_esc := Texture.LoadTexture(true, 'OUTRO_ESC', 'PNG', 'Transparent', 0); outro_exd := Texture.LoadTexture(true, 'OUTRO_EXD', 'PNG', 'Plain', 0); CRDTS_Stage:=InitialDelay; end; function TScreenCredits.Draw: boolean; begin DrawCredits; end; procedure TScreenCredits.onShow; begin CRDTS_Stage:=InitialDelay; Credits_X := 580; deluxe_slidein := 0; Credits_Alpha := 0; Music.Open(soundpath + 'wome-credits-tune.mp3'); //danke kleinster liebster weeeetüüüüü!! CTime:=0; // setlength(CTime_hold,0); end; procedure TScreenCredits.onHide; begin Music.Stop; end; Procedure TScreenCredits.Draw_FunkyText; var S,I, Len: Integer; X,Y,A: Real; visibleText: PChar; begin SetFontSize(10); //Init ScrollingText if (CTime = Timings[7]) then begin //Set Position of Text Credits_X := 600; CurrentScrollStart:=1; CurrentScrollEnd:=1; end; if (CTime > Timings[7]) and (CurrentScrollStart < length(Funky_Text)) then begin X:=0; visibleText:=pchar(Copy(Funky_Text, CurrentScrollStart, CurrentScrollEnd)); for S := 0 to length(visibleText)-1 do begin Y:=abs(sin((Credits_X+X)*0.93{*(((Credits_X+X))/1200)}/100*pi)); SetFontPos(Credits_X+X,538-Y*(Credits_X+X)*(Credits_X+X)*(Credits_X+X)/1000000); if (Credits_X+X < 15) then A:=0; if (Credits_X+X >=15) then A:=Credits_X+X-15; if Credits_X+X > 32 then A:=17; glColor4f( 230/255-40/255+Y*(Credits_X+X)/900, 200/255-30/255+Y*(Credits_X+X)/1000, 155/255-20/255+Y*(Credits_X+X)/1100, A/17); glPrintLetter(visibleText[S]); X := X + Fonts[ActFont].Width[Ord(visibleText[S])] * Fonts[ActFont].Tex.H / 30 * Fonts[ActFont].AspectW; end; if (Credits_X<0) and (CurrentScrollStart < length(Funky_Text)) then begin Credits_X:=Credits_X + Fonts[ActFont].Width[Ord(Funky_Text[CurrentScrollStart])] * Fonts[ActFont].Tex.H / 30 * Fonts[ActFont].AspectW; inc(CurrentScrollStart); end; visibleText:=pchar(Copy(Funky_Text, CurrentScrollStart, CurrentScrollEnd)); if (Credits_X+glTextWidth(visibleText) < 600) and (CurrentScrollEnd < length(Funky_Text)) then begin inc(CurrentScrollEnd); end; end; { // timing hack X:=5; SetFontStyle (2); SetFontItalic(False); SetFontSize(9); glColor4f(1, 1, 1, 1); for S:=0 to high(CTime_hold) do begin visibleText:=pchar(inttostr(CTime_hold[S])); SetFontPos (500, X); glPrint (Addr(visibleText[0])); X:=X+20; end;} end; procedure Start3D; begin glMatrixMode(GL_PROJECTION); glPushMatrix; glLoadIdentity; glFrustum(-0.3*4/3,0.3*4/3,-0.3,0.3,1,1000); glMatrixMode(GL_MODELVIEW); glLoadIdentity; end; procedure End3D; begin glMatrixMode(GL_PROJECTION); glPopMatrix; glMatrixMode(GL_MODELVIEW); end; procedure TScreenCredits.DrawCredits; var T,I: Cardinal; X: Real; Ver: PChar; RuntimeStr: AnsiString; Data: TFFTData; j,k,l:cardinal; f,g,h: Real; STime:cardinal; Delay:cardinal; myPixel: longword; myColor: Cardinal; myScale: Real; myAngle: Real; const myLogoCoords: Array[0..27,0..1] of Cardinal = ((39,32),(84,32),(100,16),(125,24), (154,31),(156,58),(168,32),(203,36), (258,34),(251,50),(274,93),(294,84), (232,54),(278,62),(319,34),(336,92), (347,23),(374,32),(377,58),(361,83), (385,91),(405,91),(429,35),(423,51), (450,32),(485,34),(444,91),(486,93)); begin //dis does teh muiwk y0r Data := Music.GetFFTData; T := GetTickCount div 33; if T <> Credits_Time then begin Credits_Time := T; inc(CTime); inc(CTime_hold); Credits_X := Credits_X-2; if (CRDTS_Stage=InitialDelay) and (CTime=Timings[0]) then begin // CTime:=Timings[20]; // CRDTS_Stage:=Outro; CRDTS_Stage:=Intro; CTime:=0; Music.Play; end; if (CRDTS_Stage=Intro) and (CTime=Timings[7]) then begin CRDTS_Stage:=MainPart; end; if (CRDTS_Stage=MainPart) and (CTime=Timings[20]) then begin CRDTS_Stage:=Outro; end; end; //draw background if CRDTS_Stage=InitialDelay then begin glClearColor(0,0,0,0); glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT); end else if CRDTS_Stage=Intro then begin Start3D; glPushMatrix; glClearColor(0,0,0,0); glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT); glEnable(GL_TEXTURE_2D); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glEnable(GL_BLEND); if CTime < Timings[1] then begin myScale:= 0.5+0.5*(Timings[1]-CTime)/(Timings[1]); // slowly move layers together myAngle:=cos((CTime)*pi/((Timings[1])*2)); // and make logo face towards camera end else begin // this is the part when the logo stands still myScale:=0.5; myAngle:=0; end; if CTime > Timings[2] then begin myScale:= 0.5+0.5*(CTime-Timings[2])/(Timings[3]-Timings[2]); // get some space between layers myAngle:=0; end; // if CTime > Timings[3] then myScale:=1; // keep the space between layers glTranslatef(0,0,-5+0.5*myScale); if CTime > Timings[3] then myScale:=1; // keep the space between layers if CTime > Timings[3] then begin // make logo rotate left and grow // myScale:=(CTime-Timings[4])/(Timings[7]-Timings[4]); glRotatef(20*sqr(CTime-Timings[3])/sqr((Timings[7]-Timings[3])/2),0,0,1); glScalef(1+sqr(CTime-Timings[3])/(32*(Timings[7]-Timings[3])),1+sqr(CTime-Timings[3])/(32*(Timings[7]-Timings[3])),1); end; if CTime < Timings[2] then glRotatef(30*myAngle,0.5*myScale+myScale,1+myScale,0); // glScalef(0.5,0.5,0.5); glScalef(4/3,-1,1); glColor4f(1, 1, 1, 1); glBindTexture(GL_TEXTURE_2D, intro_layer01.TexNum); glbegin(gl_quads); glTexCoord2f(0,0);glVertex3f(-1, -1, -0.4 * myScale); glTexCoord2f(0,1);glVertex3f(-1, 1, -0.4 * myScale); glTexCoord2f(1,1); glVertex3f(1, 1, -0.4 * myScale); glTexCoord2f(1,0);glVertex3f(1, -1, -0.4 * myScale); glEnd; glBindTexture(GL_TEXTURE_2D, intro_layer02.TexNum); glbegin(gl_quads); glTexCoord2f(0,0);glVertex3f(-1, -1, -0.3 * myScale); glTexCoord2f(0,1);glVertex3f(-1, 1, -0.3 * myScale); glTexCoord2f(1,1); glVertex3f(1, 1, -0.3 * myScale); glTexCoord2f(1,0);glVertex3f(1, -1, -0.3 * myScale); glEnd; glBindTexture(GL_TEXTURE_2D, intro_layer03.TexNum); glbegin(gl_quads); glTexCoord2f(0,0);glVertex3f(-1, -1, -0.2 * myScale); glTexCoord2f(0,1);glVertex3f(-1, 1, -0.2 * myScale); glTexCoord2f(1,1); glVertex3f(1, 1, -0.2 * myScale); glTexCoord2f(1,0);glVertex3f(1, -1, -0.2 * myScale); glEnd; glBindTexture(GL_TEXTURE_2D, intro_layer04.TexNum); glbegin(gl_quads); glTexCoord2f(0,0);glVertex3f(-1, -1, -0.1 * myScale); glTexCoord2f(0,1);glVertex3f(-1, 1, -0.1 * myScale); glTexCoord2f(1,1); glVertex3f(1, 1, -0.1 * myScale); glTexCoord2f(1,0);glVertex3f(1, -1, -0.1 * myScale); glEnd; glBindTexture(GL_TEXTURE_2D, intro_layer05.TexNum); glbegin(gl_quads); glTexCoord2f(0,0);glVertex3f(-1, -1, 0 * myScale); glTexCoord2f(0,1);glVertex3f(-1, 1, 0 * myScale); glTexCoord2f(1,1); glVertex3f(1, 1, 0 * myScale); glTexCoord2f(1,0);glVertex3f(1, -1, 0 * myScale); glEnd; glBindTexture(GL_TEXTURE_2D, intro_layer06.TexNum); glbegin(gl_quads); glTexCoord2f(0,0);glVertex3f(-1, -1, 0.1 * myScale); glTexCoord2f(0,1);glVertex3f(-1, 1, 0.1 * myScale); glTexCoord2f(1,1); glVertex3f(1, 1, 0.1 * myScale); glTexCoord2f(1,0);glVertex3f(1, -1, 0.1 * myScale); glEnd; glBindTexture(GL_TEXTURE_2D, intro_layer07.TexNum); glbegin(gl_quads); glTexCoord2f(0,0);glVertex3f(-1, -1, 0.2 * myScale); glTexCoord2f(0,1);glVertex3f(-1, 1, 0.2 * myScale); glTexCoord2f(1,1); glVertex3f(1, 1, 0.2 * myScale); glTexCoord2f(1,0);glVertex3f(1, -1, 0.2 * myScale); glEnd; glBindTexture(GL_TEXTURE_2D, intro_layer08.TexNum); glbegin(gl_quads); glTexCoord2f(0,0);glVertex3f(-1, -1, 0.3 * myScale); glTexCoord2f(0,1);glVertex3f(-1, 1, 0.3 * myScale); glTexCoord2f(1,1); glVertex3f(1, 1, 0.3 * myScale); glTexCoord2f(1,0);glVertex3f(1, -1, 0.3 * myScale); glEnd; glBindTexture(GL_TEXTURE_2D, intro_layer09.TexNum); glbegin(gl_quads); glTexCoord2f(0,0);glVertex3f(-1, -1, 0.22 * myScale); glTexCoord2f(0,1);glVertex3f(-1, 1, 0.22 * myScale); glTexCoord2f(1,1); glVertex3f(1, 1, 0.22 * myScale); glTexCoord2f(1,0);glVertex3f(1, -1, 0.22 * myScale); glEnd; gldisable(gl_texture_2d); glDisable(GL_BLEND); glPopMatrix; End3D; // do some sparkling effects if (CTime < Timings[1]) and (CTime > Timings[21]) then begin for k:=1 to 3 do begin l:=410+floor((CTime-Timings[21])/(Timings[1]-Timings[21])*(536-410))+RandomRange(-5,5); j:=floor((Timings[1]-CTime)/22)+RandomRange(285,301); GoldenRec.Spawn(l, j, 1, 16, 0, -1, Flare, 0); end; end; // fade to white at end if Ctime > Timings[6] then begin glColor4f(1,1,1,sqr(Ctime-Timings[6])*(Ctime-Timings[6])/sqr(Timings[7]-Timings[6])); glEnable(GL_BLEND); glBegin(GL_QUADS); glVertex2f(0,0); glVertex2f(0,600); glVertex2f(800,600); glVertex2f(800,0); glEnd; glDisable(GL_BLEND); end; end; if (CRDTS_Stage=MainPart) then // main credits screen background, scroller, logo and girl begin glEnable(GL_TEXTURE_2D); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glEnable(GL_BLEND); glColor4f(1, 1, 1, 1); glBindTexture(GL_TEXTURE_2D, credits_bg_tex.TexNum); glbegin(gl_quads); glTexCoord2f(0,0);glVertex2f(0, 0); glTexCoord2f(0,600/1024);glVertex2f(0, 600); glTexCoord2f(800/1024,600/1024); glVertex2f(800, 600); glTexCoord2f(800/1024,0);glVertex2f(800, 0); glEnd; glDisable(GL_TEXTURE_2D); glDisable(GL_BLEND); // draw scroller Draw_FunkyText; //######################################################################### // draw credits names // BlindGuard (von links oben reindrehen, nach rechts unten rausdrehen) STime:=Timings[9]-10; Delay:=Timings[10]-Timings[9]; if CTime > STime then begin k:=0; ESC_Alpha:=20; for j:=0 to 40 do if Data[j]>=Data[k] then k:=j; if Data[k]>0.25 then ESC_Alpha:=5 else inc(ESC_Alpha); if ESC_Alpha >20 then ESC_Alpha:=20; if ((CTime-STime)<20) then ESC_Alpha:=20; k:=CTime-STime; if CTime <=STime+10 then j:=CTime-STime else j:=10; if (CTime >=STime+Delay-10) then if (CTime <=STime+Delay) then j:=(STime+Delay)-CTime else j:=0; glColor4f(1, 1, 1, ESC_Alpha/20*j/10); if (CTime >= STime+10) and (CTime<=STime+12) then begin GoldenRec.Spawn(RandomRange(65,390), RandomRange(200,460), 1, 16, 0, -1, PerfectLineTwinkle, 0); GoldenRec.Spawn(RandomRange(65,390), RandomRange(200,460), 1, 16, 0, -1, PerfectLineTwinkle, 1); GoldenRec.Spawn(RandomRange(65,390), RandomRange(200,460), 1, 16, 0, -1, PerfectLineTwinkle, 5); GoldenRec.Spawn(RandomRange(65,390), RandomRange(200,460), 1, 16, 0, -1, PerfectLineTwinkle, 0); GoldenRec.Spawn(RandomRange(65,390), RandomRange(200,460), 1, 16, 0, -1, PerfectLineTwinkle, 1); GoldenRec.Spawn(RandomRange(65,390), RandomRange(200,460), 1, 16, 0, -1, PerfectLineTwinkle, 5); GoldenRec.Spawn(RandomRange(65,390), RandomRange(200,460), 1, 16, 0, -1, PerfectLineTwinkle, 0); GoldenRec.Spawn(RandomRange(65,390), RandomRange(200,460), 1, 16, 0, -1, PerfectLineTwinkle, 1); GoldenRec.Spawn(RandomRange(65,390), RandomRange(200,460), 1, 16, 0, -1, PerfectLineTwinkle, 5); end; glPushMatrix; gltranslatef(0,329,0); if CTime <= STime+10 then begin glrotatef((CTime-STime)*9+270,0,0,1);end; gltranslatef(223,0,0); if CTime >=STime+Delay-10 then if CTime <=STime+Delay then begin gltranslatef(223,0,0); glrotatef((CTime-(STime+Delay-10))*-9,0,0,1); gltranslatef(-223,0,0); end; glBindTexture(GL_TEXTURE_2D, credits_blindguard.TexNum); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glEnable(GL_BLEND); glEnable(GL_TEXTURE_2D); glbegin(gl_quads); glTexCoord2f(0,0);glVertex2f(-163, -129); glTexCoord2f(0,1);glVertex2f(-163, 129); glTexCoord2f(1,1); glVertex2f(163, 129); glTexCoord2f(1,0);glVertex2f(163, -129); glEnd; gldisable(gl_texture_2d); gldisable(GL_BLEND); glPopMatrix; end; // Blindy (zoom von 0 auf volle grösse und drehung, zoom auf doppelte grösse und nach rechts oben schieben) STime:=Timings[10]-10; Delay:=Timings[11]-Timings[10]+5; if CTime > STime then begin k:=0; ESC_Alpha:=20; for j:=0 to 40 do if Data[j]>=Data[k] then k:=j; if Data[k]>0.25 then ESC_Alpha:=5 else inc(ESC_Alpha); if ESC_Alpha >20 then ESC_Alpha:=20; if ((CTime-STime)<20) then ESC_Alpha:=20; k:=CTime-STime; if CTime <=STime+10 then j:=CTime-STime else j:=10; if (CTime >=STime+Delay-10) then if (CTime <=STime+Delay) then j:=(STime+Delay)-CTime else j:=0; glColor4f(1, 1, 1, ESC_Alpha/20*j/10); if (CTime >= STime+20) and (CTime<=STime+22) then begin GoldenRec.Spawn(RandomRange(65,390), RandomRange(200,460), 1, 16, 0, -1, PerfectLineTwinkle, 0); GoldenRec.Spawn(RandomRange(65,390), RandomRange(200,460), 1, 16, 0, -1, PerfectLineTwinkle, 1); GoldenRec.Spawn(RandomRange(65,390), RandomRange(200,460), 1, 16, 0, -1, PerfectLineTwinkle, 5); GoldenRec.Spawn(RandomRange(65,390), RandomRange(200,460), 1, 16, 0, -1, PerfectLineTwinkle, 0); GoldenRec.Spawn(RandomRange(65,390), RandomRange(200,460), 1, 16, 0, -1, PerfectLineTwinkle, 1); GoldenRec.Spawn(RandomRange(65,390), RandomRange(200,460), 1, 16, 0, -1, PerfectLineTwinkle, 5); GoldenRec.Spawn(RandomRange(65,390), RandomRange(200,460), 1, 16, 0, -1, PerfectLineTwinkle, 0); GoldenRec.Spawn(RandomRange(65,390), RandomRange(200,460), 1, 16, 0, -1, PerfectLineTwinkle, 1); GoldenRec.Spawn(RandomRange(65,390), RandomRange(200,460), 1, 16, 0, -1, PerfectLineTwinkle, 5); end; glPushMatrix; gltranslatef(223,329,0); if CTime <= STime+20 then begin j:=CTime-Stime; glscalef(j*j/400,j*j/400,j*j/400); glrotatef(j*18.0,0,0,1); end; if CTime >=STime+Delay-10 then if CTime <=STime+Delay then begin j:=CTime-(STime+Delay-10); f:=j*10.0; gltranslatef(f*3,-f,0); glscalef(1+j/10,1+j/10,1+j/10); glrotatef(j*9.0,0,0,1); end; glBindTexture(GL_TEXTURE_2D, credits_blindy.TexNum); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glEnable(GL_BLEND); glEnable(GL_TEXTURE_2D); glbegin(gl_quads); glTexCoord2f(0,0);glVertex2f(-163, -129); glTexCoord2f(0,1);glVertex2f(-163, 129); glTexCoord2f(1,1); glVertex2f(163, 129); glTexCoord2f(1,0);glVertex2f(163, -129); glEnd; gldisable(gl_texture_2d); gldisable(GL_BLEND); glPopMatrix; end; // Canni (von links reinschieben, nach rechts oben rausschieben) STime:=Timings[11]-10; Delay:=Timings[12]-Timings[11]+5; if CTime > STime then begin k:=0; ESC_Alpha:=20; for j:=0 to 40 do if Data[j]>=Data[k] then k:=j; if Data[k]>0.25 then ESC_Alpha:=5 else inc(ESC_Alpha); if ESC_Alpha >20 then ESC_Alpha:=20; if ((CTime-STime)<20) then ESC_Alpha:=20; k:=CTime-STime; if CTime <=STime+10 then j:=CTime-STime else j:=10; if (CTime >=STime+Delay-10) then if (CTime <=STime+Delay) then j:=(STime+Delay)-CTime else j:=0; glColor4f(1, 1, 1, ESC_Alpha/20*j/10); if (CTime >= STime+10) and (CTime<=STime+12) then begin GoldenRec.Spawn(RandomRange(65,390), RandomRange(200,460), 1, 16, 0, -1, PerfectLineTwinkle, 0); GoldenRec.Spawn(RandomRange(65,390), RandomRange(200,460), 1, 16, 0, -1, PerfectLineTwinkle, 1); GoldenRec.Spawn(RandomRange(65,390), RandomRange(200,460), 1, 16, 0, -1, PerfectLineTwinkle, 5); GoldenRec.Spawn(RandomRange(65,390), RandomRange(200,460), 1, 16, 0, -1, PerfectLineTwinkle, 0); GoldenRec.Spawn(RandomRange(65,390), RandomRange(200,460), 1, 16, 0, -1, PerfectLineTwinkle, 1); GoldenRec.Spawn(RandomRange(65,390), RandomRange(200,460), 1, 16, 0, -1, PerfectLineTwinkle, 5); GoldenRec.Spawn(RandomRange(65,390), RandomRange(200,460), 1, 16, 0, -1, PerfectLineTwinkle, 0); GoldenRec.Spawn(RandomRange(65,390), RandomRange(200,460), 1, 16, 0, -1, PerfectLineTwinkle, 1); GoldenRec.Spawn(RandomRange(65,390), RandomRange(200,460), 1, 16, 0, -1, PerfectLineTwinkle, 5); end; glPushMatrix; gltranslatef(223,329,0); if CTime <= STime+10 then begin gltranslatef(((CTime-STime)*21.0)-210,0,0); end; if CTime >=STime+Delay-10 then if CTime <=STime+Delay then begin j:=(CTime-(STime+Delay-10))*21; gltranslatef(j,-j/2,0); end; glBindTexture(GL_TEXTURE_2D, credits_canni.TexNum); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glEnable(GL_BLEND); glEnable(GL_TEXTURE_2D); glbegin(gl_quads); glTexCoord2f(0,0);glVertex2f(-163, -129); glTexCoord2f(0,1);glVertex2f(-163, 129); glTexCoord2f(1,1); glVertex2f(163, 129); glTexCoord2f(1,0);glVertex2f(163, -129); glEnd; gldisable(gl_texture_2d); gldisable(GL_BLEND); glPopMatrix; end; // Commandio (von unten reinklappen, nach rechts oben rausklappen) STime:=Timings[12]-10; Delay:=Timings[13]-Timings[12]; if CTime > STime then begin k:=0; ESC_Alpha:=20; for j:=0 to 40 do if Data[j]>=Data[k] then k:=j; if Data[k]>0.25 then ESC_Alpha:=5 else inc(ESC_Alpha); if ESC_Alpha >20 then ESC_Alpha:=20; if ((CTime-STime)<20) then ESC_Alpha:=20; k:=CTime-STime; if CTime <=STime+10 then j:=CTime-STime else j:=10; if (CTime >=STime+Delay-10) then if (CTime <=STime+Delay) then j:=(STime+Delay)-CTime else j:=0; glColor4f(1, 1, 1, ESC_Alpha/20*j/10); if (CTime >= STime+10) and (CTime<=STime+12) then begin GoldenRec.Spawn(RandomRange(65,390), RandomRange(200,460), 1, 16, 0, -1, PerfectLineTwinkle, 0); GoldenRec.Spawn(RandomRange(65,390), RandomRange(200,460), 1, 16, 0, -1, PerfectLineTwinkle, 1); GoldenRec.Spawn(RandomRange(65,390), RandomRange(200,460), 1, 16, 0, -1, PerfectLineTwinkle, 5); GoldenRec.Spawn(RandomRange(65,390), RandomRange(200,460), 1, 16, 0, -1, PerfectLineTwinkle, 0); GoldenRec.Spawn(RandomRange(65,390), RandomRange(200,460), 1, 16, 0, -1, PerfectLineTwinkle, 1); GoldenRec.Spawn(RandomRange(65,390), RandomRange(200,460), 1, 16, 0, -1, PerfectLineTwinkle, 5); GoldenRec.Spawn(RandomRange(65,390), RandomRange(200,460), 1, 16, 0, -1, PerfectLineTwinkle, 0); GoldenRec.Spawn(RandomRange(65,390), RandomRange(200,460), 1, 16, 0, -1, PerfectLineTwinkle, 1); GoldenRec.Spawn(RandomRange(65,390), RandomRange(200,460), 1, 16, 0, -1, PerfectLineTwinkle, 5); end; glPushMatrix; gltranslatef(223,329,0); if CTime <= STime+10 then f:=258.0-25.8*(CTime-STime) else f:=0; if CTime >=STime+Delay-10 then if CTime <=STime+Delay then begin j:=CTime-(STime+Delay-10); g:=32.6*j; end else g:=0; glBindTexture(GL_TEXTURE_2D, credits_commandio.TexNum); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glEnable(GL_BLEND); glEnable(GL_TEXTURE_2D); glbegin(gl_quads); glTexCoord2f(0,0);glVertex2f(-163+g-f*1.5, -129+f*1.5-g/2); glTexCoord2f(0,1);glVertex2f(-163+g*1.5, 129-(g*1.5*258/326)); glTexCoord2f(1,1); glVertex2f(163+g, 129+g/4); glTexCoord2f(1,0);glVertex2f(163+f*1.5+g/4, -129+f*1.5-g/4); glEnd; gldisable(gl_texture_2d); gldisable(GL_BLEND); glPopMatrix; end; // lazy joker (just scrolls from left to right, no twinkling stars, no on-beat flashing) STime:=Timings[13]-35; Delay:=Timings[14]-Timings[13]+5; if CTime > STime then begin k:=0; for j:=0 to 40 do if Data[j]>=Data[k] then k:=j; if Data[k]>0.25 then ESC_Alpha:=5 else inc(ESC_Alpha); if ESC_Alpha >20 then ESC_Alpha:=20; if ((CTime-STime)>10) and ((CTime-STime)<20) then ESC_Alpha:=20; ESC_Alpha:=10; f:=CTime-STime; if CTime <=STime+40 then j:=CTime-STime else j:=40; if (CTime >=STime+Delay-40) then if (CTime <=STime+Delay) then j:=(STime+Delay)-CTime else j:=0; glColor4f(1, 1, 1, ESC_Alpha/20*j*j/1600); glPushMatrix; gltranslatef(180+(f-70),329,0); glBindTexture(GL_TEXTURE_2D, credits_lazyjoker.TexNum); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glEnable(GL_BLEND); glEnable(GL_TEXTURE_2D); glbegin(gl_quads); glTexCoord2f(0,0);glVertex2f(-163, -129); glTexCoord2f(0,1);glVertex2f(-163, 129); glTexCoord2f(1,1); glVertex2f(163, 129); glTexCoord2f(1,0);glVertex2f(163, -129); glEnd; gldisable(gl_texture_2d); gldisable(GL_BLEND); glPopMatrix; end; // Mog (von links reinklappen, nach rechts unten rausklappen) STime:=Timings[14]-10; Delay:=Timings[15]-Timings[14]+5; if CTime > STime then begin k:=0; ESC_Alpha:=20; for j:=0 to 40 do if Data[j]>=Data[k] then k:=j; if Data[k]>0.25 then ESC_Alpha:=5 else inc(ESC_Alpha); if ESC_Alpha >20 then ESC_Alpha:=20; if ((CTime-STime)<20) then ESC_Alpha:=20; k:=CTime-STime; if CTime <=STime+10 then j:=CTime-STime else j:=10; if (CTime >=STime+Delay-10) then if (CTime <=STime+Delay) then j:=(STime+Delay)-CTime else j:=0; glColor4f(1, 1, 1, ESC_Alpha/20*j/10); if (CTime >= STime+10) and (CTime<=STime+12) then begin GoldenRec.Spawn(RandomRange(65,390), RandomRange(200,460), 1, 16, 0, -1, PerfectLineTwinkle, 0); GoldenRec.Spawn(RandomRange(65,390), RandomRange(200,460), 1, 16, 0, -1, PerfectLineTwinkle, 1); GoldenRec.Spawn(RandomRange(65,390), RandomRange(200,460), 1, 16, 0, -1, PerfectLineTwinkle, 5); GoldenRec.Spawn(RandomRange(65,390), RandomRange(200,460), 1, 16, 0, -1, PerfectLineTwinkle, 0); GoldenRec.Spawn(RandomRange(65,390), RandomRange(200,460), 1, 16, 0, -1, PerfectLineTwinkle, 1); GoldenRec.Spawn(RandomRange(65,390), RandomRange(200,460), 1, 16, 0, -1, PerfectLineTwinkle, 5); GoldenRec.Spawn(RandomRange(65,390), RandomRange(200,460), 1, 16, 0, -1, PerfectLineTwinkle, 0); GoldenRec.Spawn(RandomRange(65,390), RandomRange(200,460), 1, 16, 0, -1, PerfectLineTwinkle, 1); GoldenRec.Spawn(RandomRange(65,390), RandomRange(200,460), 1, 16, 0, -1, PerfectLineTwinkle, 5); end; glPushMatrix; gltranslatef(223,329,0); if CTime <= STime+10 then f:=326.0-32.6*(CTime-STime) else f:=0; if CTime >=STime+Delay-10 then if CTime <=STime+Delay then begin j:=CTime-(STime+Delay-10); g:=32.6*j; end else g:=0; glBindTexture(GL_TEXTURE_2D, credits_mog.TexNum); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glEnable(GL_BLEND); glEnable(GL_TEXTURE_2D); glbegin(gl_quads); glTexCoord2f(0,0);glVertex2f(-163+g*1.5, -129+g*1.5); glTexCoord2f(0,1);glVertex2f(-163+g*1.2, 129+g); glTexCoord2f(1,1); glVertex2f(163-f+g/2, 129+f*1.5+g/4); glTexCoord2f(1,0);glVertex2f(163-f+g*1.5, -129-f*1.5); glEnd; gldisable(gl_texture_2d); gldisable(GL_BLEND); glPopMatrix; end; // Mota (von rechts oben reindrehen, nach links unten rausschieben und verkleinern und dabei drehen) STime:=Timings[15]-10; Delay:=Timings[16]-Timings[15]+5; if CTime > STime then begin k:=0; ESC_Alpha:=20; for j:=0 to 40 do if Data[j]>=Data[k] then k:=j; if Data[k]>0.25 then ESC_Alpha:=5 else inc(ESC_Alpha); if ESC_Alpha >20 then ESC_Alpha:=20; if ((CTime-STime)<20) then ESC_Alpha:=20; k:=CTime-STime; if CTime <=STime+10 then j:=CTime-STime else j:=10; if (CTime >=STime+Delay-10) then if (CTime <=STime+Delay) then j:=(STime+Delay)-CTime else j:=0; glColor4f(1, 1, 1, ESC_Alpha/20*j/10); if (CTime >= STime+10) and (CTime<=STime+12) then begin GoldenRec.Spawn(RandomRange(65,390), RandomRange(200,460), 1, 16, 0, -1, PerfectLineTwinkle, 0); GoldenRec.Spawn(RandomRange(65,390), RandomRange(200,460), 1, 16, 0, -1, PerfectLineTwinkle, 1); GoldenRec.Spawn(RandomRange(65,390), RandomRange(200,460), 1, 16, 0, -1, PerfectLineTwinkle, 5); GoldenRec.Spawn(RandomRange(65,390), RandomRange(200,460), 1, 16, 0, -1, PerfectLineTwinkle, 0); GoldenRec.Spawn(RandomRange(65,390), RandomRange(200,460), 1, 16, 0, -1, PerfectLineTwinkle, 1); GoldenRec.Spawn(RandomRange(65,390), RandomRange(200,460), 1, 16, 0, -1, PerfectLineTwinkle, 5); GoldenRec.Spawn(RandomRange(65,390), RandomRange(200,460), 1, 16, 0, -1, PerfectLineTwinkle, 0); GoldenRec.Spawn(RandomRange(65,390), RandomRange(200,460), 1, 16, 0, -1, PerfectLineTwinkle, 1); GoldenRec.Spawn(RandomRange(65,390), RandomRange(200,460), 1, 16, 0, -1, PerfectLineTwinkle, 5); end; glPushMatrix; gltranslatef(223,329,0); if CTime <= STime+10 then begin gltranslatef(223,0,0); glrotatef((10-(CTime-STime))*9,0,0,1); gltranslatef(-223,0,0); end; if CTime >=STime+Delay-10 then if CTime <=STime+Delay then begin j:=CTime-(STime+Delay-10); f:=j*10.0; gltranslatef(-f*2,-f,0); glscalef(1-j/10,1-j/10,1-j/10); glrotatef(-j*9.0,0,0,1); end; glBindTexture(GL_TEXTURE_2D, credits_mota.TexNum); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glEnable(GL_BLEND); glEnable(GL_TEXTURE_2D); glbegin(gl_quads); glTexCoord2f(0,0);glVertex2f(-163, -129); glTexCoord2f(0,1);glVertex2f(-163, 129); glTexCoord2f(1,1); glVertex2f(163, 129); glTexCoord2f(1,0);glVertex2f(163, -129); glEnd; gldisable(gl_texture_2d); gldisable(GL_BLEND); glPopMatrix; end; // Skillmaster (von rechts unten reinschieben, nach rechts oben rausdrehen) STime:=Timings[16]-10; Delay:=Timings[17]-Timings[16]+5; if CTime > STime then begin k:=0; ESC_Alpha:=20; for j:=0 to 40 do if Data[j]>=Data[k] then k:=j; if Data[k]>0.25 then ESC_Alpha:=5 else inc(ESC_Alpha); if ESC_Alpha >20 then ESC_Alpha:=20; if ((CTime-STime)<20) then ESC_Alpha:=20; k:=CTime-STime; if CTime <=STime+10 then j:=CTime-STime else j:=10; if (CTime >=STime+Delay-10) then if (CTime <=STime+Delay) then j:=(STime+Delay)-CTime else j:=0; glColor4f(1, 1, 1, ESC_Alpha/20*j/10); if (CTime >= STime+10) and (CTime<=STime+12) then begin GoldenRec.Spawn(RandomRange(65,390), RandomRange(200,460), 1, 16, 0, -1, PerfectLineTwinkle, 0); GoldenRec.Spawn(RandomRange(65,390), RandomRange(200,460), 1, 16, 0, -1, PerfectLineTwinkle, 1); GoldenRec.Spawn(RandomRange(65,390), RandomRange(200,460), 1, 16, 0, -1, PerfectLineTwinkle, 5); GoldenRec.Spawn(RandomRange(65,390), RandomRange(200,460), 1, 16, 0, -1, PerfectLineTwinkle, 0); GoldenRec.Spawn(RandomRange(65,390), RandomRange(200,460), 1, 16, 0, -1, PerfectLineTwinkle, 1); GoldenRec.Spawn(RandomRange(65,390), RandomRange(200,460), 1, 16, 0, -1, PerfectLineTwinkle, 5); GoldenRec.Spawn(RandomRange(65,390), RandomRange(200,460), 1, 16, 0, -1, PerfectLineTwinkle, 0); GoldenRec.Spawn(RandomRange(65,390), RandomRange(200,460), 1, 16, 0, -1, PerfectLineTwinkle, 1); GoldenRec.Spawn(RandomRange(65,390), RandomRange(200,460), 1, 16, 0, -1, PerfectLineTwinkle, 5); end; glPushMatrix; gltranslatef(223,329,0); if CTime <= STime+10 then begin j:=STime+10-CTime; f:=j*10.0; gltranslatef(+f*2,+f/2,0); end; if CTime >=STime+Delay-10 then if CTime <=STime+Delay then begin j:=CTime-(STime+Delay-10); f:=j*10.0; gltranslatef(0,-223,0); glrotatef(j*-9,0,0,1); gltranslatef(0,223,0); glrotatef(j*9,0,0,1); end; glBindTexture(GL_TEXTURE_2D, credits_skillmaster.TexNum); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glEnable(GL_BLEND); glEnable(GL_TEXTURE_2D); glbegin(gl_quads); glTexCoord2f(0,0);glVertex2f(-163, -129); glTexCoord2f(0,1);glVertex2f(-163, 129); glTexCoord2f(1,1); glVertex2f(163, 129); glTexCoord2f(1,0);glVertex2f(163, -129); glEnd; gldisable(gl_texture_2d); gldisable(GL_BLEND); glPopMatrix; end; // WhiteShark (von links unten reinklappen, nach rechts oben rausklappen) STime:=Timings[17]-10; Delay:=Timings[18]-Timings[17]; if CTime > STime then begin k:=0; ESC_Alpha:=20; for j:=0 to 40 do if Data[j]>=Data[k] then k:=j; if Data[k]>0.25 then ESC_Alpha:=5 else inc(ESC_Alpha); if ESC_Alpha >20 then ESC_Alpha:=20; if ((CTime-STime)<20) then ESC_Alpha:=20; k:=CTime-STime; if CTime <=STime+10 then j:=CTime-STime else j:=10; if (CTime >=STime+Delay-10) then if (CTime <=STime+Delay) then j:=(STime+Delay)-CTime else j:=0; glColor4f(1, 1, 1, ESC_Alpha/20*j/10); if (CTime >= STime+10) and (CTime<=STime+12) then begin GoldenRec.Spawn(RandomRange(65,390), RandomRange(200,460), 1, 16, 0, -1, PerfectLineTwinkle, 0); GoldenRec.Spawn(RandomRange(65,390), RandomRange(200,460), 1, 16, 0, -1, PerfectLineTwinkle, 1); GoldenRec.Spawn(RandomRange(65,390), RandomRange(200,460), 1, 16, 0, -1, PerfectLineTwinkle, 5); GoldenRec.Spawn(RandomRange(65,390), RandomRange(200,460), 1, 16, 0, -1, PerfectLineTwinkle, 0); GoldenRec.Spawn(RandomRange(65,390), RandomRange(200,460), 1, 16, 0, -1, PerfectLineTwinkle, 1); GoldenRec.Spawn(RandomRange(65,390), RandomRange(200,460), 1, 16, 0, -1, PerfectLineTwinkle, 5); GoldenRec.Spawn(RandomRange(65,390), RandomRange(200,460), 1, 16, 0, -1, PerfectLineTwinkle, 0); GoldenRec.Spawn(RandomRange(65,390), RandomRange(200,460), 1, 16, 0, -1, PerfectLineTwinkle, 1); GoldenRec.Spawn(RandomRange(65,390), RandomRange(200,460), 1, 16, 0, -1, PerfectLineTwinkle, 5); end; glPushMatrix; gltranslatef(223,329,0); if CTime <= STime+10 then f:=326.0-32.6*(CTime-STime) else f:=0; if CTime >=STime+Delay-10 then if CTime <=STime+Delay then begin j:=CTime-(STime+Delay-10); g:=32.6*j; end else g:=0; glBindTexture(GL_TEXTURE_2D, credits_whiteshark.TexNum); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glEnable(GL_BLEND); glEnable(GL_TEXTURE_2D); glbegin(gl_quads); glTexCoord2f(0,0);glVertex2f(-163-f+g, -129+f/4-g/2); glTexCoord2f(0,1);glVertex2f(-163-f/4+g, 129+g/2+f/4); glTexCoord2f(1,1); glVertex2f(163-f*1.2+g/4, 129+f/2-g/4); glTexCoord2f(1,0);glVertex2f(163-f*1.5+g/4, -129+f*1.5+g/4); glEnd; gldisable(gl_texture_2d); gldisable(GL_BLEND); glPopMatrix; end; // #################################################################### // do some twinkle stuff (kinda on beat) if (CTime>Timings[8]) and (CTime < Timings[19]) then begin k:=0; for j:=0 to 40 do if Data[j]>=Data[k] then k:=j; if Data[k]>0.2 then begin l:=RandomRange(6,16); j:=RandomRange(0,27); GoldenRec.Spawn(myLogoCoords[j,0], myLogoCoords[j,1], 16-l, l, 0, -1, PerfectNote, 0); end; end; //################################################# // draw the rest of the main screen (girl and logo glEnable(GL_TEXTURE_2D); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glEnable(GL_BLEND); glColor4f(1, 1, 1, 1); glBindTexture(GL_TEXTURE_2D, credits_bg_ovl.TexNum); glbegin(gl_quads); glTexCoord2f(0,0);glVertex2f(800-393, 0); glTexCoord2f(0,600/1024);glVertex2f(800-393, 600); glTexCoord2f(393/512,600/1024); glVertex2f(800, 600); glTexCoord2f(393/512,0);glVertex2f(800, 0); glEnd; { glBindTexture(GL_TEXTURE_2D, credits_bg_logo.TexNum); glbegin(gl_quads); glTexCoord2f(0,0);glVertex2f(0, 0); glTexCoord2f(0,112/128);glVertex2f(0, 112); glTexCoord2f(497/512,112/128); glVertex2f(497, 112); glTexCoord2f(497/512,0);glVertex2f(497, 0); glEnd; } gldisable(gl_texture_2d); glDisable(GL_BLEND); // fade out at end of main part if Ctime > Timings[19] then begin glColor4f(0,0,0,(Ctime-Timings[19])/(Timings[20]-Timings[19])); glEnable(GL_BLEND); glBegin(GL_QUADS); glVertex2f(0,0); glVertex2f(0,600); glVertex2f(800,600); glVertex2f(800,0); glEnd; glDisable(GL_BLEND); end; end else if (CRDTS_Stage=Outro) then begin if CTime=Timings[20] then begin CTime_hold:=0; Music.Stop; Music.Open(soundpath + 'credits-outro-tune.mp3'); Music.Play; Music.SetVolume(20); Music.SetLoop(True); end; if CTime_hold > 231 then begin Music.Play; Ctime_hold:=0; end; glClearColor(0,0,0,0); glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT); // do something useful // outro background glEnable(GL_TEXTURE_2D); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glEnable(GL_BLEND); glColor4f(1, 1, 1, 1); glBindTexture(GL_TEXTURE_2D, outro_bg.TexNum); glbegin(gl_quads); glTexCoord2f(0,0);glVertex2f(0, 0); glTexCoord2f(0,600/1024);glVertex2f(0, 600); glTexCoord2f(800/1024,600/1024); glVertex2f(800, 600); glTexCoord2f(800/1024,0);glVertex2f(800, 0); glEnd; //outro overlays glColor4f(1, 1, 1, (1+sin(CTime/15))/3+1/3); glBindTexture(GL_TEXTURE_2D, outro_esc.TexNum); glbegin(gl_quads); glTexCoord2f(0,0);glVertex2f(0, 0); glTexCoord2f(0,223/256);glVertex2f(0, 223); glTexCoord2f(487/512,223/256); glVertex2f(487, 223); glTexCoord2f(487/512,0);glVertex2f(487, 0); glEnd; ESC_Alpha:=20; if (RandomRange(0,20) > 18) and (ESC_Alpha=20) then ESC_Alpha:=0 else inc(ESC_Alpha); if ESC_Alpha > 20 then ESC_Alpha:=20; glColor4f(1, 1, 1, ESC_Alpha/20); glBindTexture(GL_TEXTURE_2D, outro_exd.TexNum); glbegin(gl_quads); glTexCoord2f(0,0);glVertex2f(800-310, 600-247); glTexCoord2f(0,247/256);glVertex2f(800-310, 600); glTexCoord2f(310/512,247/256); glVertex2f(800, 600); glTexCoord2f(310/512,0);glVertex2f(800, 600-247); glEnd; glDisable(GL_TEXTURE_2D); glDisable(GL_BLEND); // outro scrollers? // ... end; { // draw credits runtime counter SetFontStyle (2); SetFontItalic(False); SetFontSize(9); SetFontPos (5, 5); glColor4f(1, 1, 1, 1); // RuntimeStr:='CTime: '+inttostr(floor(CTime/30.320663991914489602156136106092))+'.'+inttostr(floor(CTime/3.0320663991914489602156136106092)-floor(CTime/30.320663991914489602156136106092)*10); RuntimeStr:='CTime: '+inttostr(CTime); glPrint (Addr(RuntimeStr[1])); } // make the stars shine GoldenRec.Draw; //timing hack // Draw_FunkyText; end; end.