#include #include #include "text.h" #include "entities.h" #include "config.h" #include "carphysics.h" #include "gameframe.h" #include "gamesystem.h" #include "interfaceutil.h" #include "rendercar.h" #include "renderframe.h" #include "environment.h" #include "textures.h" #include "controls.h" #include "networkphysics.h" #include "screen.h" #include "gametime.h" #include "network.h" #include "tracker.h" #define kOverviewSize 0.22 #define kDotSize 0.01 #define kWhiteDotFile "whitedot.pct" #define kWhiteDiamondFile "whitediamond.pct" #define kCornerSignSize 0.1 #define kCornerSignYPos 0.28 void RenderCornerSign() { gTexturesQualityModifier=-255; float corner=(fabs(gAccelSignDisplayCorner)-3)/5; if(corner<0)corner=0; if(corner>1)corner=1; float r=0.5+0.5*corner; float g=1.0-corner; float b=0; float a=1; if(gAccelSignDisplayIntensity>1.3) a=1-(gAccelSignDisplayIntensity-1.3)/0.2; else if(gAccelSignDisplayIntensity<0.8) a=gAccelSignDisplayIntensity/0.8; if(!gConfig->guideSigns) a=0; TexturesSelectTex(FileGetReference("cornersign.pct")); tCarPhysics *phys=(tCarPhysics*)gViewedEntity->physics; if(phys->wrongDriectionFrames*kFrameTime>2) { a=(phys->wrongDriectionFrames*kFrameTime-2)*0.3>1?1:(phys->wrongDriectionFrames*kFrameTime-2)*0.3; r=1; g=0; TexturesSelectTex(FileGetReference("wrongdirsign.pct")); } if(gFrameCount-phys->crashTime>kFPS*1) if(sqr(gViewedEntity->velo)collision&&sqr(gViewedEntity->velo)crashTime)*kFrameTime-1)*0.5>1?1:((gFrameCount-phys->crashTime)*kFrameTime-1)*0.5; r=1; g=0.5; TexturesSelectTex(FileGetReference("towsign.pct")); } if(a==0) return; glPushMatrix(); glPushAttrib(GL_DEPTH_BUFFER_BIT+GL_LIGHTING_BIT+GL_COLOR_BUFFER_BIT+GL_TEXTURE_BIT+GL_CURRENT_BIT); glDisable(GL_DEPTH_TEST); glDisable(GL_LIGHTING); glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA); glLoadIdentity(); glTranslatef(0.0f,0.0f,-1.0f); glTranslatef(0,kCornerSignYPos,0); glScalef(kCornerSignSize*0.5,kCornerSignSize*0.5,0); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_CLAMP); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_CLAMP); glColor4f(r,g,b,a*(1-gConfig->hudTransparency)); glBegin(GL_TRIANGLE_STRIP); if(gAccelSignDisplayCorner<0) { glTexCoord2d(1,1); glVertex2f(1,-1); glTexCoord2d(1,0); glVertex2f(1,1); glTexCoord2d(0,1); glVertex2f(-1,-1); glTexCoord2d(0,0); glVertex2f(-1,1); } else { glTexCoord2d(0,1); glVertex2f(1,-1); glTexCoord2d(0,0); glVertex2f(1,1); glTexCoord2d(1,1); glVertex2f(-1,-1); glTexCoord2d(1,0); glVertex2f(-1,1); } glEnd(); glPopAttrib(); glPopMatrix(); gTexturesQualityModifier=0; } #include "random.h" void RenderOverview(float opacity,float x,float y) { if(opacity==0) return; if(!gMapInfo->hasOverview) return; glPushMatrix(); gTexturesQualityModifier=-255; glPushAttrib(GL_DEPTH_BUFFER_BIT+GL_LIGHTING_BIT+GL_COLOR_BUFFER_BIT+GL_TEXTURE_BIT+GL_CURRENT_BIT); glDisable(GL_DEPTH_TEST); glDisable(GL_LIGHTING); glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA); float ratio=(gMapInfo->overviewBotRight.y-gMapInfo->overviewTopLeft.y)/(gMapInfo->overviewBotRight.x-gMapInfo->overviewTopLeft.x); glColor4f(gEnvironment->instrumentColor.x,gEnvironment->instrumentColor.y,gEnvironment->instrumentColor.z,(1-gConfig->hudTransparency)*opacity); glLoadIdentity(); glTranslatef(0.0f,0.0f,-1.0f); glTranslatef(x,y,0); glScalef(kOverviewSize*0.5,kOverviewSize*ratio*0.5,0); TexturesSelectTex(gMapInfo->overview); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_CLAMP); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_CLAMP); glBegin(GL_TRIANGLE_STRIP); glTexCoord2d(1,1); glVertex2f(1,-2); glTexCoord2d(1,0); glVertex2f(1,0); glTexCoord2d(0,1); glVertex2f(-1,-2); glTexCoord2d(0,0); glVertex2f(-1,0); glEnd(); TexturesSelectTex(FileGetReference(kWhiteDotFile)); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_CLAMP); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_CLAMP); for(int i=0;inumPlayers;i++) if(gCarEntities[i]!=gCarEntities[gReplayViewedEntityID]) { float posX=(gCarEntities[i]->pos.x-gMapInfo->overviewTopLeft.x)/(gMapInfo->overviewBotRight.x-gMapInfo->overviewTopLeft.x)-0.5; float posY=(gCarEntities[i]->pos.z-gMapInfo->overviewTopLeft.y)/(gMapInfo->overviewBotRight.y-gMapInfo->overviewTopLeft.y); glLoadIdentity(); glTranslatef(0.0f,0.0f,-1.0f); glTranslatef(x+posX*kOverviewSize,y-posY*kOverviewSize*ratio,0); glScalef(kDotSize*0.5,kDotSize*0.5,0); tCarPhysics *phys=(tCarPhysics*)(gCarEntities[i]->physics); tCarDefinition *car=&(phys->car); if(car->numColors) glColor4f(car->colors[phys->color].x,car->colors[phys->color].y,car->colors[phys->color].z,(1-gConfig->hudTransparency)*opacity); else glColor4f(1,1,1,1); glBegin(GL_TRIANGLE_STRIP); glTexCoord2d(1,1); glVertex2f(1,-1); glTexCoord2d(1,0); glVertex2f(1,1); glTexCoord2d(0,1); glVertex2f(-1,-1); glTexCoord2d(0,0); glVertex2f(-1,1); glEnd(); } glColor4f(1,1,1,1); if(gGameInfo->numLaps==-1) { glColor4f(gEnvironment->instrumentColor.x,gEnvironment->instrumentColor.y,gEnvironment->instrumentColor.z,(1-gConfig->hudTransparency)*opacity); float posX=(gGhostEntity->pos.x-gMapInfo->overviewTopLeft.x)/(gMapInfo->overviewBotRight.x-gMapInfo->overviewTopLeft.x)-0.5; float posY=(gGhostEntity->pos.z-gMapInfo->overviewTopLeft.y)/(gMapInfo->overviewBotRight.y-gMapInfo->overviewTopLeft.y); glLoadIdentity(); glTranslatef(0.0f,0.0f,-1.0f); glTranslatef(x+posX*kOverviewSize,y-posY*kOverviewSize*ratio,0); glScalef(kDotSize*0.5,kDotSize*0.5,0); glBegin(GL_TRIANGLE_STRIP); glTexCoord2d(1,1); glVertex2f(1,-1); glTexCoord2d(1,0); glVertex2f(1,1); glTexCoord2d(0,1); glVertex2f(-1,-1); glTexCoord2d(0,0); glVertex2f(-1,1); glEnd(); } TexturesSelectTex(FileGetReference(kWhiteDiamondFile)); // TexturesSelectTex(FileGetReference("dot2.pct")); float posX=(gCarEntities[gReplayViewedEntityID]->pos.x-gMapInfo->overviewTopLeft.x)/(gMapInfo->overviewBotRight.x-gMapInfo->overviewTopLeft.x)-0.5; float posY=(gCarEntities[gReplayViewedEntityID]->pos.z-gMapInfo->overviewTopLeft.y)/(gMapInfo->overviewBotRight.y-gMapInfo->overviewTopLeft.y); glLoadIdentity(); glTranslatef(0.0f,0.0f,-1.0f); glTranslatef(x+posX*kOverviewSize,y-posY*kOverviewSize*ratio,0); glScalef(kDotSize*1*0.5,kDotSize*1*0.5,0); /* glColor4f(RandomFl(0,1),RandomFl(0,1),RandomFl(0,1),1); glBegin(GL_TRIANGLE_STRIP); glTexCoord2d(1,1); glVertex2f(1,-1); glTexCoord2d(1,0); glVertex2f(1,1); glTexCoord2d(0,1); glVertex2f(-1,-1); glTexCoord2d(0,0); glVertex2f(-1,1); glEnd();*/ glLoadIdentity(); glTranslatef(0.0f,0.0f,-1.0f); glTranslatef(x+posX*kOverviewSize,y-posY*kOverviewSize*ratio,0); glScalef(kDotSize*2*0.5,kDotSize*2*0.5,0); tCarPhysics *phys=(tCarPhysics*)(gCarEntities[gReplayViewedEntityID]->physics); tCarDefinition *car=&(phys->car); if(car->numColors) glColor4f(car->colors[phys->color].x,car->colors[phys->color].y,car->colors[phys->color].z,(1-gConfig->hudTransparency)*opacity); else glColor4f(1,1,1,1); glBegin(GL_TRIANGLE_STRIP); glTexCoord2d(1,1); glVertex2f(1,-1); glTexCoord2d(1,0); glVertex2f(1,1); glTexCoord2d(0,1); glVertex2f(-1,-1); glTexCoord2d(0,0); glVertex2f(-1,1); glEnd(); glPopAttrib(); glPopMatrix(); gTexturesQualityModifier=0; } #include "error.h" //display in-game stats void RaceInfoDisplay(float inOpacity) { if(!gGameInfo->demolition) { tCarPhysics *phys=(tCarPhysics*)gViewedEntity->physics; if(inOpacity==0) return; //if someone has finished the game, print a message on screen if(gDisqualified) TextPrintfToBufferFormatedColored(Vector(0,1),0.1,kTextAlignMiddle,1,1,1,inOpacity,"Disqualified!"); //if the race has started, print statistics float opacity=inOpacity*(gFrameCount*kFrameTime-kStartGameDelaySeconds); if(gGameInfo->maxTime!=0)opacity=inOpacity; if(opacity>inOpacity)opacity=inOpacity; if(opacity<0)opacity=0; RenderOverview(opacity,0.42,0.3); RenderCornerSign(); if(gMapInfo->loop&&gGameInfo->maxTime==0) if(gGameInfo->numLaps!=-1) { //print last lap time float lastLapTime=phys->lapCount>1?(phys->lapTimes[phys->lapCount-1]-phys->lapTimes[phys->lapCount-2])*kFrameTime:0; TextPrintfToBufferFormatedColored(Vector(-1,0.92),0.03,kTextAlignLeft,1,1,1,opacity,"Last Lap: %d:%02d'%02d",((int)lastLapTime)/60,((int)lastLapTime)%60,((int)(lastLapTime*100))%100); //print lap counter if(phys->lapCount<=gGameInfo->numLaps) TextPrintfToBufferFormatedColored(Vector(1,1),0.05,kTextAlignRight,1,1,1,opacity,"Lap: %d/%d",phys->lapCount,gGameInfo->numLaps); else TextPrintfToBufferFormatedColored(Vector(1,1),0.05,kTextAlignRight,1,1,1,opacity,"Lap: %d/%d",gGameInfo->numLaps,gGameInfo->numLaps); } else { //print last lap time float lastLapTime=gLastLapTime*kFrameTime; TextPrintfToBufferFormatedColored(Vector(-1,0.92),0.03,kTextAlignLeft,1,1,1,opacity,"Last Lap: %d:%02d'%02d",((int)lastLapTime)/60,((int)lastLapTime)%60,((int)(lastLapTime*100))%100); float bestLapTime=gBestLapTime*kFrameTime; TextPrintfToBufferFormatedColored(Vector(-1,0.84),0.03,kTextAlignLeft,1,1,1,opacity,"Best Lap: %d:%02d'%02d",((int)bestLapTime)/60,((int)bestLapTime)%60,((int)(bestLapTime*100))%100); float offset=gConfig->registerLapTimes?0.32:0.24; if(gConfig->registerLapTimes) if(gWorldRecord!=-1) { float worldRecord=gWorldRecord*kFrameTime; if(worldRecord) { TextPrintfToBufferFormatedColored(Vector(-1,0.76),0.03,kTextAlignLeft,1,1,1,opacity,"World Record: %d:%02d'%02d (set by %s\255#n\255)",((int)worldRecord)/60,((int)worldRecord)%60,((int)(worldRecord*100))%100,gRecordName); // TextPrintfToBufferFormatedColored(Vector(-0.95,0.68),0.03,kTextAlignLeft,1,1,1,opacity,"set by: %s",gRecordName); } else if(gWaitingForRecord) TextPrintfToBufferFormatedColored(Vector(-1,0.76),0.03,kTextAlignLeft,1,1,1,opacity,"World Record: not set"); else TextPrintfToBufferFormatedColored(Vector(-1,0.76),0.03,kTextAlignLeft,1,1,1,opacity,"World Record: unavailable"); } else TextPrintfToBufferFormatedColored(Vector(-1,0.76),0.03,kTextAlignLeft,1,1,1,opacity,"World Record: Fetching..."); float localRecord=gLocalRecord*kFrameTime; if(localRecord==0) TextPrintfToBufferFormatedColored(Vector(-1.0,1.0-offset),0.03,kTextAlignLeft,1,1,1,opacity,"Personal Record: not set"); else TextPrintfToBufferFormatedColored(Vector(-1.0,1.0-offset),0.03,kTextAlignLeft,1,1,1,opacity,"Personal Record: %d:%02d'%02d",((int)localRecord)/60,((int)localRecord)%60,((int)(localRecord*100))%100); //print lap counter TextPrintfToBufferFormatedColored(Vector(1,1),0.05,kTextAlignRight,1,1,1,opacity,"Lap: %d",phys->lapCount); } //print current lap time if(gGameInfo->maxTime==0) { float lapTime=phys->lapCount?(gFrameCount-(gGameInfo->numLaps!=-1?(phys->lapTimes[phys->lapCount-1]):gCurrentLapStart))*kFrameTime:0; TextPrintfToBufferFormatedColored(Vector(-1,1),0.03,kTextAlignLeft,1,1,1,opacity,"This Lap: %d:%02d'%02d",((int)lapTime)/60,((int)lapTime)%60,((int)(lapTime*100))%100); } else { float timeTaken=gFrameCount*kFrameTime-kStartGameDelaySeconds; if(timeTaken<0) timeTaken=0; TextPrintfToBufferFormatedColored(Vector(-1,1),0.03,kTextAlignLeft,1,1,1,opacity,"Time Taken: %d:%02d'%02d",((int)timeTaken)/60,((int)timeTaken)%60,((int)(timeTaken*100))%100); float offset=gConfig->registerLapTimes?0.16:0.08; if(gConfig->registerLapTimes) if(gWorldRecord!=-1) { float worldRecord=gWorldRecord*kFrameTime; if(worldRecord==0) TextPrintfToBufferFormatedColored(Vector(-1,0.92),0.03,kTextAlignLeft,1,1,1,opacity,"World Record: not set"); else if((phys->lapCount<=1?timeTaken:(phys->lapTimes[1]*kFrameTime-kStartGameDelaySeconds))lapCount<=1?timeTaken:(phys->lapTimes[1]*kFrameTime-kStartGameDelaySeconds))lapCount<=1?timeTaken:(phys->lapTimes[1]*kFrameTime-kStartGameDelaySeconds))goldTime) TextPrintfToBufferFormatedColored(Vector(-1.0,0.92-offset),0.03,kTextAlignLeft,1,1,1,opacity,"\255goldmedal.pct\255: %d:%02d'%02d",((int)gGameInfo->goldTime)/60,((int)gGameInfo->goldTime)%60,((int)(gGameInfo->goldTime*100))%100); else TextPrintfToBufferFormatedColored(Vector(-1.0,0.92-offset),0.03,kTextAlignLeft,1,1,1,opacity,"\255goldmedal.pct\255: failed"); if((phys->lapCount<=1?timeTaken:(phys->lapTimes[1]*kFrameTime-kStartGameDelaySeconds))silverTime) TextPrintfToBufferFormatedColored(Vector(-1.0,0.84-offset),0.03,kTextAlignLeft,1,1,1,opacity,"\255silvermedal.pct\255: %d:%02d'%02d",((int)gGameInfo->silverTime)/60,((int)gGameInfo->silverTime)%60,((int)(gGameInfo->silverTime*100))%100); else TextPrintfToBufferFormatedColored(Vector(-1.0,0.84-offset),0.03,kTextAlignLeft,1,1,1,opacity,"\255silvermedal.pct\255: failed"); if((phys->lapCount<=1?timeTaken:(phys->lapTimes[1]*kFrameTime-kStartGameDelaySeconds))maxTime) TextPrintfToBufferFormatedColored(Vector(-1.0,0.76-offset),0.03,kTextAlignLeft,1,1,1,opacity,"\255bronzemedal.pct\255: %d:%02d'%02d",((int)gGameInfo->maxTime)/60,((int)gGameInfo->maxTime)%60,((int)(gGameInfo->maxTime*100))%100); else { TextPrintfToBufferFormatedColored(Vector(-1.0,0.76-offset),0.03,kTextAlignLeft,1,1,1,opacity,"\255bronzemedal.pct\255: failed"); if(!gDisqualified) TextPrintfToBufferFormatedColored(Vector(0,1),0.1,kTextAlignMiddle,1,1,1,opacity,"Time Up!"); } } //print lead/trail if(gGameInfo->maxTime==0) { tVector2 leadPos=Vector(-1,gGameInfo->numLaps!=-1?0.84:(gConfig->registerLapTimes?0.6:0.68)); if(phys->lead>=0) TextPrintfToBufferFormatedColored(leadPos,0.03,kTextAlignLeft,1,1,1,opacity,"Lead: %3.1f",phys->lead); else TextPrintfToBufferFormatedColored(leadPos,0.03,kTextAlignLeft,1,1,1,opacity,"Trail: %3.1f",-phys->lead); if(gGameInfo->numPlayers>1&&gGameInfo->numLaps!=-1) for(int i=0;inumPlayers;i++) { tCarPhysics *phys2=(tCarPhysics*)gCarEntities[i]->physics; if(phys2->lead>=0&&phys->lead<0) { if(gGameInfo->network) TextPrintfToBufferFormatedColored(leadPos-Vector(0,0.08),0.03,kTextAlignLeft,1,1,1,opacity,"Leader: %s",gGameInfo->playerNames[i]); else TextPrintfToBufferFormatedColored(leadPos-Vector(0,0.08),0.03,kTextAlignLeft,1,1,1,opacity,"Leader: %s",phys2->car.carName); break; } else if(phys2->lead==-phys->lead) { if(gGameInfo->network) TextPrintfToBufferFormatedColored(leadPos-Vector(0,0.08),0.03,kTextAlignLeft,1,1,1,opacity,"Follower: %s",gGameInfo->playerNames[i]); else TextPrintfToBufferFormatedColored(leadPos-Vector(0,0.08),0.03,kTextAlignLeft,1,1,1,opacity,"Follower: %s",phys2->car.carName); break; } } if(gGameInfo->numLaps!=-1) { /*if(GetInterfaceKey(kInterfaceKeyEasterEgg)) { for(int i=0;inumPlayers;i++) { if(gCarEntities[i]->id>=0) { tCarPhysics *phys2=(tCarPhysics*)gCarEntities[i]->physics; PrintConsoleString("%s: lap %d,pos %f, lead %f",FileGetName(gGameInfo->playerCars[i]),phys2->lap,phys2->position,phys2->lead); } } }*/ //print position int position=0; for(int i=0;inumPlayers;i++) { if(gCarEntities[i]->id>=0) { tCarPhysics *phys2=(tCarPhysics*)gCarEntities[i]->physics; if(phys2->lap>phys->lap)position++; else if(gGameInfo->reverse) {if(phys2->lap==phys->lap&&phys2->position<=phys->position)position++;} else {if(phys2->lap==phys->lap&&phys2->position>=phys->position)position++;} } } int numPlayers=0; for(int i=0;inumPlayers;i++) if(gCarEntities[i]->id>=0) numPlayers++; TextPrintfToBufferFormatedColored(Vector(1,0.9),0.05,kTextAlignRight,1,1,1,opacity,"Position: %d/%d",position,numPlayers); } } /* if(phys->arcadeDraftBoost>0.2) { float a=phys->arcadeDraftBoost; TextPrintfToBufferFormatedColored(Vector(0,0.7),0.09,kTextAlignMiddle,0,1,0,a,"Drafting"); }*/ if(!gReplay) //if the race has not yet started print countdown if(gFrameCount*kFrameTime=kStartGameDelaySeconds) TextPrintfToBufferFormatedColored(Vector(0,0.15),0.2+0.1*(gFrameCount%(int)kFPS)/kFPS,kTextAlignMiddle,1,1,1,inOpacity*(1-(gFrameCount%(int)kFPS)/kFPS),"GO!"); else if(gFrameCount*kFrameTime>=kStartGameDelaySeconds-3) TextPrintfToBufferFormatedColored(Vector(0,0.15),0.05+0.02*(gFrameCount/kFPS)+0.1*(gFrameCount%(int)kFPS)/kFPS,kTextAlignMiddle,1,1,1,inOpacity*(1-(gFrameCount%(int)kFPS)/kFPS),"%d",(int)kStartGameDelaySeconds-gFrameCount/(int)kFPS); } else { int numDisabled=0; for(int i=0;inumPlayers;i++) { if(gCarEntities[i]->id>=0) { tCarPhysics *phys=(tCarPhysics*)gCarEntities[i]->physics; if(phys->damage>=kFatalDamage) numDisabled++; } } if(numDisabled>0&&numDisabled>=gGameInfo->numPlayers-1) { if(numDisabled==gGameInfo->numPlayers) TextPrintfToBufferFormatedColored(Vector(0,0.2),0.1,kTextAlignMiddle,1,1,1,inOpacity,"Everyone wrecked!"); for(int i=0;inumPlayers;i++) { if(gCarEntities[i]->id>=0) { tCarPhysics *phys=(tCarPhysics*)gCarEntities[i]->physics; if(phys->damageplayerNames[i]); } } } else { tCarPhysics *phys=(tCarPhysics*)gCarEntities[gGameInfo->playerID]->physics; if(phys->damage>=kFatalDamage) TextPrintfToBufferFormatedColored(Vector(0,0.2),0.1,kTextAlignMiddle,1,1,1,inOpacity,"You're wrecked!"); TextPrintfToBufferFormatedColored(Vector(-1,1),0.03,kTextAlignLeft,1,1,1,inOpacity,"Wrecked: %d/%d",numDisabled,gGameInfo->numPlayers); } } } /* void SpeedStatsDisplay(float opacity) { tCarPhysics *phys=(tCarPhysics*)gCarEntities[gGameInfo->playerID]->physics; //Print Top Speed and average speed. if(gConfig->metricUnits){ TextPrintfToBufferFormatedColored(Vector(0,-0.75),0.03,kTextAlignMiddle,1,1,1,opacity,"Top Speed: %3.0f km/h",phys->maxSpeed*3.6); TextPrintfToBufferFormatedColored(Vector(0,-0.65),0.03,kTextAlignMiddle,1,1,1,opacity,"Average Speed: %3.0f km/h",phys->averageSpeed*3.6); } else{ TextPrintfToBufferFormatedColored(Vector(0,-0.75),0.03,kTextAlignMiddle,1,1,1,opacity,"Top Speed: %3.0f M.P.H.",phys->maxSpeed*2.2369); TextPrintfToBufferFormatedColored(Vector(0,-0.65),0.03,kTextAlignMiddle,1,1,1,opacity,"Average Speed: %3.0f M.P.H.",phys->averageSpeed*2.2369); } } void BestLapsDisplay(float opacity) { if(gMapInfo->loop) { tCarPhysics *phys=(tCarPhysics*)gCarEntities[gGameInfo->playerID]->physics; //print 5 best laps of player TextPrintfToBufferFormatedColored(Vector(-0.5,0.5),0.03,kTextAlignLeft,1,1,1,opacity,"Best Laps:"); int bestLaps[5]; for(int i=0;i<5&&inumLaps;i++) { float bestLapTime=INFINITY; bestLaps[i]=0; for(int j=0;jnumLaps;j++) { float lapTime=(phys->lapTimes[j+1]-phys->lapTimes[j]); if(lapTime<=0) lapTime=10000000; if(lapTimelapTimes[bestLaps[i]+1]-phys->lapTimes[bestLaps[i]]>0) { float bestTime=(phys->lapTimes[bestLaps[i]+1]-phys->lapTimes[bestLaps[i]])*kFrameTime; TextPrintfToBufferFormatedColored(Vector(-0.5,0.4-0.05*i),0.025,kTextAlignLeft,1,1,1,opacity,"%s Lap: %d:%02d'%02d",str,((int)bestTime)/60,((int)bestTime)%60,((int)(bestTime*100))%100); } else TextPrintfToBufferFormatedColored(Vector(-0.5,0.4-0.05*i),0.025,kTextAlignLeft,1,1,1,opacity,"%s Lap: Retired",str); } } } void BestDriversDisplay(float opacity) { //print best players TextPrintfToBufferFormatedColored(Vector(-0.5,-0.1),0.03,kTextAlignLeft,1,1,1,opacity,"Best Drivers:"); int bestDrivers[kMaxPlayers]; int numPlayersFinished=0; for(int i=0;inumPlayers;i++) { tCarPhysics *phys=(tCarPhysics*)gCarEntities[i]->physics; if(phys->lapCount>gGameInfo->numLaps) { numPlayersFinished++; if(!phys->finishTime) phys->finishTime=phys->lapTimes[gGameInfo->numLaps]; } } if(gReplay) { float leaderTime=0; float time=0; for(int i=0;inumLaps;j++) if(gCheckPoints[i].passTimes[j].time>time) time=gCheckPoints[i].passTimes[j].time; float raceLength=kNumCheckPoints*gGameInfo->numLaps+1; for(int i=0;inumPlayers;i++) { tCarPhysics *phys=(tCarPhysics*)gCarEntities[i]->physics; if(phys->lead>0) { float racePosition=phys->checkPoint+(phys->lapCount>1?phys->lapCount-1:0)*kNumCheckPoints+1; float completeness=racePosition/raceLength; leaderTime=time*kFPS/completeness; } } for(int i=0;inumPlayers;i++) if(gCarEntities[i]->controlType==kControlTypeAIInput) { tCarPhysics *phys=(tCarPhysics*)gCarEntities[i]->physics; if(phys->lapCount<=gGameInfo->numLaps) { phys->lapCount=gGameInfo->numLaps+1; phys->finishTime=leaderTime-phys->lead*kFPS; numPlayersFinished++; } } } for(int i=0;i<(gReplay?gGameInfo->numPlayers:numPlayersFinished);i++) { int bestTime=0x7fffffff; bestDrivers[i]=0; for(int j=0;jnumPlayers;j++) { tCarPhysics *phys=(tCarPhysics*)gCarEntities[j]->physics; int finishTime=phys->finishTime; if(finishTime<=0) finishTime=0x7ffffffe; if(finishTimephysics; tCarDefinition *car=&(phys->car); char *carName=gGameInfo->network?gGameInfo->playerNames[bestDrivers[i]]:car->carName; if(bestTime!=0x7ffffffe) { float t=bestTime*kFrameTime-kStartGameDelaySeconds; TextPrintfToBufferFormatedColored(Vector(-0.5,-0.2-0.05*i),0.025,kTextAlignLeft,1,1,1,opacity,"%s: %d:%02d'%02d",carName,((int)t)/60,((int)t)%60,((int)(t*100))%100); } else TextPrintfToBufferFormatedColored(Vector(-0.5,-0.2-0.05*i),0.025,kTextAlignLeft,1,1,1,opacity,"%s: Retired",carName); //print players place if(bestDrivers[i]==gGameInfo->playerID) if(bestTime!=0x7ffffffe) { char str[8]; MakeNumString(i+1,str); TextPrintfToBufferFormatedColored(Vector(0.0,0.8),0.07,kTextAlignMiddle,1,1,1,opacity,"%s Place!",str); } else TextPrintfToBufferFormatedColored(Vector(0.0,0.8),0.07,kTextAlignMiddle,1,1,1,opacity,"Retired!"); } } //displays game stats when the player has finished the race void EndTextDisplay(float opacity) { if(opacity==0) return; SpeedStatsDisplay(opacity); RenderOverview(opacity); if(gGameInfo->numLaps!=-1) { if(gGameInfo->maxTime>0) { tCarPhysics *phys=(tCarPhysics*)gViewedEntity->physics; if(phys->lapCount<=1) TextPrintfToBufferFormatedColored(Vector(0,1),0.1,kTextAlignMiddle,1,1,1,opacity,"Time Up!"); else if(phys->lapTimes[1]*kFrameTime-kStartGameDelaySeconds>gGameInfo->maxTime) TextPrintfToBufferFormatedColored(Vector(0,1),0.1,kTextAlignMiddle,1,1,1,opacity,"Time Up!"); else { if(phys->lapTimes[1]*kFrameTime-kStartGameDelaySeconds<=gGameInfo->goldTime) TextPrintfToBufferFormatedColored(Vector(0,1),0.1,kTextAlignMiddle,1,1,1,opacity,"\255goldmedal.pct\255Gold Medal!"); else if(phys->lapTimes[1]*kFrameTime-kStartGameDelaySeconds<=gGameInfo->silverTime) TextPrintfToBufferFormatedColored(Vector(0,1),0.1,kTextAlignMiddle,1,1,1,opacity,"\255silvermedal.pct\255Silver Medal!"); else TextPrintfToBufferFormatedColored(Vector(0,1),0.1,kTextAlignMiddle,1,1,1,opacity,"\255bronzemedal.pct\255Bronze Medal!"); float t=phys->lapTimes[1]*kFrameTime-kStartGameDelaySeconds; TextPrintfToBufferFormatedColored(Vector(0.0,0.6),0.035,kTextAlignMiddle,1,1,1,opacity,"Time taken: %d:%02d'%02d",((int)t)/60,((int)t)%60,((int)(t*100))%100); } } else { BestLapsDisplay(opacity); BestDriversDisplay(opacity); } if(gGameInfo->network&&gGameInfo->playerID!=0) TextPrintfToBufferFormatedColored(Vector(0,-0.86),0.05,kTextAlignMiddle,1,1,1,opacity,"Hit esc to leave game."); else TextPrintfToBufferFormatedColored(Vector(0,-0.86),0.05,kTextAlignMiddle,1,1,1,opacity,"Hit esc to exit."); } } */ void SpeedStatsDisplay(float opacity) { tCarPhysics *phys=(tCarPhysics*)gCarEntities[gGameInfo->playerID]->physics; //Print Top Speed and average speed. if(gConfig->metricUnits){ TextPrintfToBufferFormatedColored(Vector(-0.9,-0.5),0.03,kTextAlignLeft,1,1,1,opacity,"Top Speed: %3.0f km/h",phys->maxSpeed*3.6); TextPrintfToBufferFormatedColored(Vector(-0.9,-0.6),0.03,kTextAlignLeft,1,1,1,opacity,"Average Speed: %3.0f km/h",phys->averageSpeed*3.6); } else{ TextPrintfToBufferFormatedColored(Vector(-0.9,-0.5),0.03,kTextAlignLeft,1,1,1,opacity,"Top Speed: %3.0f M.P.H.",phys->maxSpeed*2.2369); TextPrintfToBufferFormatedColored(Vector(-0.9,-0.6),0.03,kTextAlignLeft,1,1,1,opacity,"Average Speed: %3.0f M.P.H.",phys->averageSpeed*2.2369); } } void BestLapsDisplay(float opacity) { if(gMapInfo->loop) { tCarPhysics *phys=(tCarPhysics*)gCarEntities[gGameInfo->playerID]->physics; //print 5 best laps of player TextPrintfToBufferFormatedColored(Vector(0.9,0.45),0.03,kTextAlignRight,1,1,1,opacity,"Best Laps:"); int bestLaps[5]; for(int i=0;i<5&&inumLaps;i++) { float bestLapTime=INFINITY; bestLaps[i]=0; for(int j=0;jnumLaps;j++) { float lapTime=(phys->lapTimes[j+1]-phys->lapTimes[j]); if(lapTime<=0) lapTime=10000000; if(lapTimelapTimes[bestLaps[i]+1]-phys->lapTimes[bestLaps[i]]>0) { float bestTime=(phys->lapTimes[bestLaps[i]+1]-phys->lapTimes[bestLaps[i]])*kFrameTime; TextPrintfToBufferFormatedColored(Vector(0.9,0.35-0.05*i),0.025,kTextAlignRight,1,1,1,opacity,"%s Lap: %d:%02d'%02d",str,((int)bestTime)/60,((int)bestTime)%60,((int)(bestTime*100))%100); } else TextPrintfToBufferFormatedColored(Vector(0.9,0.35-0.05*i),0.025,kTextAlignRight,1,1,1,opacity,"%s Lap: Retired",str); } } } void BestDriversDisplay(float opacity) { //print best players TextPrintfToBufferFormatedColored(Vector(0.9,-0.05),0.03,kTextAlignRight,1,1,1,opacity,"Best Drivers:"); int bestDrivers[kMaxPlayers]; int numPlayersFinished=0; for(int i=0;inumPlayers;i++) { tCarPhysics *phys=(tCarPhysics*)gCarEntities[i]->physics; if(phys->lapCount>gGameInfo->numLaps) numPlayersFinished++; } if(gReplay) { float leaderTime=0; float time=0; for(int i=0;inumLaps;j++) if(gCheckPoints[i].passTimes[j].time>time) time=gCheckPoints[i].passTimes[j].time; float raceLength=kNumCheckPoints*gGameInfo->numLaps+1; for(int i=0;inumPlayers;i++) { tCarPhysics *phys=(tCarPhysics*)gCarEntities[i]->physics; if(phys->lead>0) { float racePosition=phys->checkPoint+(phys->lapCount>1?phys->lapCount-1:0)*kNumCheckPoints+1; float completeness=racePosition/raceLength; leaderTime=time*kFPS/completeness; } } /* for(int i=0;inumPlayers;i++) if(gCarEntities[i]->controlType==kControlTypeAIInput) { tCarPhysics *phys=(tCarPhysics*)gCarEntities[i]->physics; if(phys->lapCount<=gGameInfo->numLaps) { phys->lapCount=gGameInfo->numLaps+1; phys->finishTime=leaderTime-phys->lead*kFPS; numPlayersFinished++; } }*/ } for(int i=0;i<(gReplay?gGameInfo->numPlayers:numPlayersFinished);i++) { int bestTime=0x7fffffff; bestDrivers[i]=0; for(int j=0;jnumPlayers;j++) { tCarPhysics *phys=(tCarPhysics*)gCarEntities[j]->physics; int finishTime=phys->finishTime; if(finishTime<=0) finishTime=0x7ffffffe; if(finishTimephysics; tCarDefinition *car=&(phys->car); char *carName=gGameInfo->network?gGameInfo->playerNames[bestDrivers[i]]:car->carName; if(bestTime!=0x7ffffffe) { float t=bestTime*kFrameTime-kStartGameDelaySeconds; if(bestDrivers[i]==gGameInfo->playerID) TextPrintfToBufferFormatedColored(Vector(0.9,-0.15-0.05*i),0.025,kTextAlignRight,0,1,0,opacity,"%s: %d:%02d'%02d",carName,((int)t)/60,((int)t)%60,((int)(t*100))%100); else TextPrintfToBufferFormatedColored(Vector(0.9,-0.15-0.05*i),0.025,kTextAlignRight,1,1,1,opacity,"%s: \255#w\255%d:%02d'%02d",carName,((int)t)/60,((int)t)%60,((int)(t*100))%100); } else if(bestDrivers[i]==gGameInfo->playerID) TextPrintfToBufferFormatedColored(Vector(0.9,-0.15-0.05*i),0.025,kTextAlignRight,0,1,0,opacity,"%s: Retired",carName); else TextPrintfToBufferFormatedColored(Vector(0.9,-0.15-0.05*i),0.025,kTextAlignRight,1,1,1,opacity,"%s: \255#w\255Retired",carName); //print players place if(bestDrivers[i]==gGameInfo->playerID) if(bestTime!=0x7ffffffe) { char str[8]; MakeNumString(i+1,str); TextPrintfToBufferFormatedColored(Vector(-0.9,0.95),0.08,kTextAlignLeft,1,1,1,opacity,"%s Place!",str); } else TextPrintfToBufferFormatedColored(Vector(-0.9,0.95),0.08,kTextAlignLeft,1,1,1,opacity,"Retired!"); } } //displays game stats when the player has finished the race void EndTextDisplay(float opacity) { if(opacity==0) return; if(!gReplay) SpeedStatsDisplay(opacity); RenderOverview(opacity,0.42,0.36); if(gGameInfo->numLaps!=-1) { if(gGameInfo->maxTime>0) { tCarPhysics *phys=(tCarPhysics*)gViewedEntity->physics; float t=phys->lapTimes[1]*kFrameTime-kStartGameDelaySeconds; if(gDisqualified) TextPrintfToBufferFormatedColored(Vector(0,1),0.1,kTextAlignMiddle,1,1,1,opacity,"Disqualified!"); else if(phys->lapCount<=1) TextPrintfToBufferFormatedColored(Vector(0,1),0.1,kTextAlignMiddle,1,1,1,opacity,"Time Up!"); else { if(t<=gGameInfo->goldTime) TextPrintfToBufferFormatedColored(Vector(0,1),0.1,kTextAlignMiddle,1,1,1,opacity,"\255goldmedal.pct\255 Gold Medal!"); else if(t<=gGameInfo->silverTime) TextPrintfToBufferFormatedColored(Vector(0,1),0.1,kTextAlignMiddle,1,1,1,opacity,"\255silvermedal.pct\255 Silver Medal!"); else if(t<=gGameInfo->maxTime) TextPrintfToBufferFormatedColored(Vector(0,1),0.1,kTextAlignMiddle,1,1,1,opacity,"\255bronzemedal.pct\255 Bronze Medal!"); else TextPrintfToBufferFormatedColored(Vector(0,1),0.1,kTextAlignMiddle,1,1,1,opacity,"Time Up!"); } if(phys->lapCount>1) { TextPrintfToBufferFormatedColored(Vector(0.0,0.6),0.035,kTextAlignMiddle,1,1,1,opacity,"Time taken: %d:%02d'%02d",((int)t)/60,((int)t)%60,((int)(t*100))%100); if(t>gGameInfo->maxTime&&!gDisqualified) { t=t-gGameInfo->maxTime; TextPrintfToBufferFormatedColored(Vector(0.0,0.52),0.035,kTextAlignMiddle,1,1,1,opacity,"Improve by: %d:%02d'%02d",((int)t)/60,((int)t)%60,((int)(t*100))%100); } } } else { BestLapsDisplay(opacity); BestDriversDisplay(opacity); } if(gGameInfo->network&&gGameInfo->playerID!=0) TextPrintfToBufferFormatedColored(Vector(-0.9,-0.77),0.029,kTextAlignLeft,1,1,1,opacity,"Hit esc to leave game."); else TextPrintfToBufferFormatedColored(Vector(-0.9,-0.77),0.029,kTextAlignLeft,1,1,1,opacity,"Hit esc to exit."); if(gGameInfo->network) TextPrintfToBufferFormatedColored(Vector(0.9,-0.77),0.029,kTextAlignRight,1,1,1,opacity,"Watching %s",gGameInfo->playerNames[gReplayViewedEntityID]); else { tCarDefinition *car=(tCarDefinition*)FileGetParsedDataPtr(gGameInfo->playerCars[gReplayViewedEntityID],kParserTypeCarDesc,sizeof(tCarDefinition)); TextPrintfToBufferFormatedColored(Vector(0.9,-0.77),0.029,kTextAlignRight,1,1,1,opacity,"Watching %s",car->carName); } } } void DimScreen(float opacity) { if(opacity==0) return; glPushAttrib(GL_DEPTH_BUFFER_BIT+GL_LIGHTING_BIT+GL_COLOR_BUFFER_BIT+GL_TEXTURE_BIT+GL_CURRENT_BIT); glColor4f(0,0,0,0.3*opacity*(1-gConfig->hudTransparency)); glLoadIdentity(); glDisable(GL_LIGHTING); glDisable(GL_TEXTURE_2D); glDisable(GL_DEPTH_TEST); glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glBegin(GL_TRIANGLE_STRIP); glVertex3f(-1.0f, 1.0f,-1.00f); glVertex3f(-1.0f,-1.0f,-1.00f); glVertex3f( 1.0f, 1.0f,-1.00f); glVertex3f( 1.0f,-1.0f,-1.00f); glEnd(); glPopAttrib(); } #define kChatScreenTime 9.0 #define kChatFadeTime 6.0 void ChatDisplay() { if(gInputChatMode) { int offset=0; while(TextWidth(gGameChatMessage+offset,0.04)>1.5*kTextXPos) offset++; TextPrintfToBufferFormated(Vector(-0.75,0.5),0.04,kTextAlignLeft,"chat: %s%s",gGameChatMessage+offset,(int)(gFrameCount*kFrameTime*4)%2?"_":""); } float t=TimeGetSeconds(); while((t-gGameChatMessagesRecv[0].timestamp)>kChatScreenTime&&gNumGameChatMessages) GameChatMessagesScroll(); int pos=0; for(int i=0;i1)a=1; if(a<0)a=0; if((t-gGameChatMessagesRecv[i].timestamp)<0.2) a=(t-gGameChatMessagesRecv[i].timestamp)/0.2; char str[256]; int offset=0; do{ strcpy(str,gGameChatMessagesRecv[i].message+offset); int word=true; while(TextWidth(str,0.03)>0.9*kTextXPos) { word=str[strlen(str)-1]==' '; str[strlen(str)-1]='\0'; } if(!word) { int i=strlen(str)-1; while(str[i]!=' '&&i>0) i--; if(i>0) str[i]='\0'; } offset+=strlen(str); if(offset) TextPrintfToBufferFormatedColored(Vector(-0.4,1.0-pos*0.07),0.03,kTextAlignLeft,1,1,1,a,"\255#a\255%s",str); else TextPrintfToBufferFormatedColored(Vector(-0.4,1.0-pos*0.07),0.03,kTextAlignLeft,1,1,1,a,str); pos++; }while(offsetnetwork&&gGameInfo->playerID!=0) TextPrintfToBufferFormatedColored(Vector(-0.8,0.7),0.06,kTextAlignLeft,1,1,1,opacity,"Are you sure you want to leave the game?"); else TextPrintfToBufferFormatedColored(Vector(-0.8,0.7),0.06,kTextAlignLeft,1,1,1,opacity,"Are you sure you want to end the game?"); TextPrintfToBufferFormatedColored(Vector(-0.6,0.35),0.05,kTextAlignLeft,1,1,1,opacity,"Cancel"); if(gInputEscMode==kInputEscModeQuit) TextPrintfToBufferFormatedColored(Vector(-0.6,0.5),0.05,kTextAlignLeft,1,1,1,opacity,"Quit"); else TextPrintfToBufferFormatedColored(Vector(-0.6,0.5),0.05,kTextAlignLeft,1,1,1,opacity,"Exit"); if(!gGameInfo->network) TextPrintfToBufferFormatedColored(Vector(-0.6,0.2),0.05,kTextAlignLeft,1,1,1,opacity,"Retry"); glLoadIdentity(); glTranslatef(0.0f,0.0f,-1.0f); glPushAttrib(GL_DEPTH_BUFFER_BIT+GL_LIGHTING_BIT+GL_COLOR_BUFFER_BIT+GL_CURRENT_BIT); glDisable(GL_DEPTH_TEST); glDisable(GL_LIGHTING); glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA); TexturesSelectTex(FileGetReference(kInterfaceMenuPointerTexture)); glColor4f(1,1,1,opacity); glBegin(GL_TRIANGLE_STRIP); float y=((gInputEscSelection?0.5:0.35)-0.05)*kScreenYPos; if(!gGameInfo->network&&gInputEscSelection==2) y=(0.2-0.05)*kScreenYPos; glTexCoord2d(1,1); glVertex2f((-0.6-0.05)*kScreenXPos+kInterfaceMenuPointerSize,y-kInterfaceMenuPointerSize); glTexCoord2d(1,0); glVertex2f((-0.6-0.05)*kScreenXPos+kInterfaceMenuPointerSize,y+kInterfaceMenuPointerSize); glTexCoord2d(0,1); glVertex2f((-0.6-0.05)*kScreenXPos-kInterfaceMenuPointerSize,y-kInterfaceMenuPointerSize); glTexCoord2d(0,0); glVertex2f((-0.6-0.05)*kScreenXPos-kInterfaceMenuPointerSize,y+kInterfaceMenuPointerSize); glEnd(); glPopAttrib(); } void ReplayDisplay(float opacity) { TextPrintfToBufferFormatedColored(Vector(-0.9,0.95),0.08,kTextAlignLeft,1,1,1,opacity*(sin(TimeGetSeconds()*3)*0.5+0.5),"Replay"); if(gReplayAutoCam) TextPrintfToBufferFormatedColored(Vector(-0.9,0.77),0.029,kTextAlignLeft,1,1,1,opacity,"camera automatic"); { tCarDefinition *car=(tCarDefinition*)FileGetParsedDataPtr(gGameInfo->playerCars[gReplayViewedEntityID],kParserTypeCarDesc,sizeof(tCarDefinition)); tCarPhysics *phys=(tCarPhysics*)gCarEntities[gReplayViewedEntityID]->physics; if(phys->plateName) TextPrintfToBufferFormatedColored(Vector(0.9,-0.77),0.029,kTextAlignRight,1,1,1,opacity,"Watching %s",phys->plateName); else TextPrintfToBufferFormatedColored(Vector(0.9,-0.77),0.029,kTextAlignRight,1,1,1,opacity,"Watching %s",car->carName); } if(gGameInfo->playerID==0) TextPrintfToBufferFormatedColored(Vector(-0.9,-0.77),0.029,kTextAlignLeft,1,1,1,opacity,"Hit esc to exit."); if(gGameInfo->maxTime) { float timeTaken=gFrameCount*kFrameTime-kStartGameDelaySeconds; tCarPhysics *phys=(tCarPhysics*)gViewedEntity->physics; if(phys->lapCount>1) timeTaken=phys->lapTimes[1]*kFrameTime-kStartGameDelaySeconds; if(timeTaken<0) timeTaken=0; TextPrintfToBufferFormatedColored(Vector(0.5,0.9),0.03,kTextAlignLeft,1,1,1,opacity,"Time Taken: %d:%02d'%02d",((int)timeTaken)/60,((int)timeTaken)%60,((int)(timeTaken*100))%100); } if(gGameInfo->numPlayers>1) { TextPrintfToBufferFormatedColored(Vector(0.73,0.4),0.025,kTextAlignRight,1,1,1,opacity,"Player"); TextPrintfToBufferFormatedColored(Vector(0.8,0.4),0.025,kTextAlignRight,1,1,1,opacity,"Lap"); TextPrintfToBufferFormatedColored(Vector(0.9,0.4),0.025,kTextAlignRight,1,1,1,opacity,"Trail"); int playerRanks[kMaxPlayers]; for(int i=0;inumPlayers;i++) playerRanks[i]=i; for(int i=0;inumPlayers-1;i++) for(int j=0;jnumPlayers-1-i;j++) { tCarPhysics *phys2=(tCarPhysics*)gCarEntities[playerRanks[j]]->physics; tCarPhysics *phys1=(tCarPhysics*)gCarEntities[playerRanks[j+1]]->physics; if(phys1->finishTime>0&&phys2->finishTime<=0) { int tmp=playerRanks[j]; playerRanks[j]=playerRanks[j+1]; playerRanks[j+1]=tmp; } else if(phys2->finishTime>0&&phys1->finishTime<=0) ; else if(phys2->finishTime>0&&phys1->finishTime>0) { if(phys2->finishTime>phys1->finishTime) { int tmp=playerRanks[j]; playerRanks[j]=playerRanks[j+1]; playerRanks[j+1]=tmp; } } else if((phys1->lap>phys2->lap)||(gGameInfo->reverse&&(phys2->lap==phys1->lap&&phys1->positionposition))||(!gGameInfo->reverse&&(phys2->lap==phys1->lap&&phys1->position>phys2->position))) { int tmp=playerRanks[j]; playerRanks[j]=playerRanks[j+1]; playerRanks[j+1]=tmp; } } for(int i=0;inumPlayers;i++) { tCarPhysics *phys=(tCarPhysics*)gCarEntities[playerRanks[i]]->physics; tCarDefinition *car=(tCarDefinition*)FileGetParsedDataPtr(gGameInfo->playerCars[playerRanks[i]],kParserTypeCarDesc,sizeof(tCarDefinition)); char name[512]; if(playerRanks[i]==gReplayViewedEntityID) sprintf(name,"*%s",phys->plateName?phys->plateName:car->carName); else sprintf(name,phys->plateName?phys->plateName:car->carName); if(playerRanks[i]==gGameInfo->playerID) { TextPrintfToBufferFormatedColored(Vector(0.73,0.33-0.05*i),0.025,kTextAlignRight,0,1,0,opacity,name); if(phys->lapCount<=gGameInfo->numLaps) TextPrintfToBufferFormatedColored(Vector(0.8,0.33-0.05*i),0.025,kTextAlignRight,0,1,0,opacity,"%d",phys->lapCount); else TextPrintfToBufferFormatedColored(Vector(0.8,0.33-0.05*i),0.025,kTextAlignRight,0,1,0,opacity,"F"); if(phys->lead<0) TextPrintfToBufferFormatedColored(Vector(0.9,0.33-0.05*i),0.025,kTextAlignRight,0,1,0,opacity,"%03.1f",-phys->lead); else TextPrintfToBufferFormatedColored(Vector(0.9,0.33-0.05*i),0.025,kTextAlignRight,0,1,0,opacity,"%03.1f",0); } else { TextPrintfToBufferFormatedColored(Vector(0.73,0.33-0.05*i),0.025,kTextAlignRight,1,1,1,opacity,name); if(phys->lapCount<=gGameInfo->numLaps) TextPrintfToBufferFormatedColored(Vector(0.8,0.33-0.05*i),0.025,kTextAlignRight,1,1,1,opacity,"\255#a\255%d",phys->lapCount); else TextPrintfToBufferFormatedColored(Vector(0.8,0.33-0.05*i),0.025,kTextAlignRight,1,1,1,opacity,"\255#a\255F"); if(phys->lead<0) TextPrintfToBufferFormatedColored(Vector(0.9,0.33-0.05*i),0.025,kTextAlignRight,1,1,1,opacity,"\255#a\255%03.1f",-phys->lead); else TextPrintfToBufferFormatedColored(Vector(0.9,0.33-0.05*i),0.025,kTextAlignRight,1,1,1,opacity,"\255#a\255%03.1f",0); } } } RenderOverview(opacity,0.42,0.36); } float gEscDisplay=0; float gPauseDisplay=0; float gEndDisplay=0; float gInterfaceFadeDisplay=1; float gLastDisplayTime=0; float gReplayDisplay=0; #define kFadeSpeed 1.5 void CalcFades() { float dt=TimeGetSeconds()-gLastDisplayTime; gLastDisplayTime+=dt; if(dt<0)dt=0; if(gInputEscMode) gEscDisplay+=dt*kFadeSpeed; else gEscDisplay-=dt*kFadeSpeed; if(gEscDisplay>1)gEscDisplay=1; else if(gEscDisplay<0)gEscDisplay=0; tCarPhysics *phys=(tCarPhysics*)gViewedEntity->physics; if(phys->lapCount>gGameInfo->numLaps&&gGameInfo->numLaps!=-1&&!gReplay) gEndDisplay+=dt*kFadeSpeed; else gEndDisplay-=dt*kFadeSpeed; if(gEndDisplay>1)gEndDisplay=1; else if(gEndDisplay<0)gEndDisplay=0; if(gPaused&&!gInputEscMode) gPauseDisplay+=dt*kFadeSpeed; else gPauseDisplay-=dt*kFadeSpeed; if(gPauseDisplay>1)gPauseDisplay=1; else if(gPauseDisplay<0)gPauseDisplay=0; if(dt<1) gInterfaceFadeDisplay-=dt*kFadeSpeed; if(gInterfaceFadeDisplay<0)gInterfaceFadeDisplay=0; if(gReplay) gReplayDisplay+=dt*kFadeSpeed; else gReplayDisplay-=dt*kFadeSpeed; if(gReplayDisplay>1)gReplayDisplay=1; else if(gReplayDisplay<0)gReplayDisplay=0; } void InitInfoDisplay() { gEscDisplay=0; gPauseDisplay=0; gEndDisplay=0; gInterfaceFadeDisplay=1; gReplayDisplay=0; gLastDisplayTime=0; } //Show game stats void GameShowInfo() { CalcFades(); //if enabled, print frame rate statistics on screen if(gConfig->performanceStats) { TextPrintfToBufferFormated(Vector(-0.35,-0.95),0.025,kTextAlignLeft,"FPS :%5.1f",gFPS); if(gGameInfo->network) { char netStr[7]; NetworkGetStatusString(netStr); TextPrintfToBufferFormated(Vector(0.15,-0.95),0.025,kTextAlignLeft,netStr); float rcv,snd; NetworkGetBandwidth(&rcv,&snd); TextPrintfToBufferFormated(Vector(-0.1,-0.95),0.025,kTextAlignLeft,"R%3.1f/S%3.1f",rcv,snd); } #ifdef __POLYCOUNT TextPrintfToBufferFormated(Vector(-0.1,-0.95),0.025,kTextAlignLeft,"TPS :%7.0f",gPolyCount*gFPS); TextPrintfToBufferFormated(Vector(0.15,-0.95),0.025,kTextAlignLeft,"Polys:%d",gPolyCount); #endif } //are we still playing, or have we finished the race? ChatDisplay(); EndTextDisplay(gEndDisplay); CarRenderPanels(gViewedEntity,1-gPauseDisplay-gEscDisplay-gEndDisplay-gReplayDisplay); RaceInfoDisplay(1-gPauseDisplay-gEscDisplay-gEndDisplay-gReplayDisplay); TextPrintfToBufferFormatedColored(Vector(0,0.7),0.1,kTextAlignMiddle,1,1,1,gPauseDisplay,"Game Paused"); TextPrintfToBufferFormatedColored(Vector(0,-0.3),0.05,kTextAlignMiddle,1,1,1,gPauseDisplay,"Press \255#r\255%s\255#n\255 to Continue.",gConfig->keys[kInputPause].identifier); ReplayDisplay(gReplayDisplay); float dim=gEscDisplay+gPauseDisplay+gEndDisplay; if(dim>1)dim=1; DimScreen(dim); EscDisplay(gEscDisplay); float a=2-(TimeGetSeconds()-giTunesLastStatusUpdate)*0.4; if(a>0) { TextPrintfToBufferFormatedColored(Vector(0,-0.5),0.25,kTextAlignMiddle,1,1,1,a,"\255stereo.pct\255"); if(giTunesPlaying==kITunesPlaying) { TextPrintfToBufferFormatedColored(Vector(0,-0.65),0.04,kTextAlignMiddle,1,1,1,a,giTunesArtist); TextPrintfToBufferFormatedColored(Vector(0,-0.75),0.04,kTextAlignMiddle,1,1,1,a,giTunesSong); } else if(giTunesPlaying==kITunesPaused) TextPrintfToBufferFormatedColored(Vector(0,-0.65),0.04,kTextAlignMiddle,1,1,1,a,"Paused"); else TextPrintfToBufferFormatedColored(Vector(0,-0.65),0.04,kTextAlignMiddle,1,1,1,a,"Stopped"); } TextPrintBuffer(1-gConfig->hudTransparency,true); TextClearBuffer(); InterfaceDrawBackgroundFade(gInterfaceFadeDisplay,true); }