Added game stats screen

This commit is contained in:
jsalmon3 2002-04-10 22:48:11 +00:00
parent c8d67f3a12
commit 1560ddacc2
8 changed files with 377 additions and 18 deletions

View file

@ -357,6 +357,7 @@ local int ReturnWithWood(Unit* unit)
// Update wood.
//
unit->Player->Resources[WoodCost]+=unit->Player->Incomes[WoodCost];
unit->Player->TotalResources[WoodCost]+=unit->Player->Incomes[WoodCost];
if( unit->Player==ThisPlayer ) {
MustRedraw|=RedrawResources;
}

View file

@ -367,11 +367,15 @@ local int MoveToGoldDeposit(Unit* unit)
// Update gold.
//
if ( OptionUseDepletedMines && unit->Rs == OptionUseDepletedMines ) {
unit->Player->Resources[GoldCost]+=
unit->Player->Resources[GoldCost]+=
(unit->Player->Incomes[GoldCost] * 100)
/ OptionUseDepletedMines;
unit->Player->TotalResources[GoldCost]+=
(unit->Player->Incomes[GoldCost] * 100)
/ OptionUseDepletedMines;
} else {
unit->Player->Resources[GoldCost]+=unit->Player->Incomes[GoldCost];
unit->Player->TotalResources[GoldCost]+=unit->Player->Incomes[GoldCost];
}
if( unit->Player==ThisPlayer ) {
MustRedraw|=RedrawResources;

View file

@ -400,6 +400,8 @@ local int MoveToDepot(Unit* unit,const Resource* resource)
//
unit->Player->Resources[resource->Cost]
+=unit->Player->Incomes[resource->Cost];
unit->Player->TotalResources[resource->Cost]
+=unit->Player->Incomes[resource->Cost];
if( unit->Player==ThisPlayer ) {
MustRedraw|=RedrawResources;
}

View file

@ -41,6 +41,10 @@
#include "sound.h"
#include "settings.h"
#include "ccl.h"
#include "campaign.h"
#include "cursor.h"
#include "menus.h"
#include "interface.h"
/*----------------------------------------------------------------------------
-- Declarations
@ -67,45 +71,89 @@ global Credits GameCredits; /// Game credits
----------------------------------------------------------------------------*/
local int IntroNoEvent; /// Flag got an event.
local int UseContinueButton;
local int ContinueButtonX;
local int ContinueButtonY;
local int ContinueButtonFlags;
/**
** Callback for input.
*/
local void IntroCallbackButton1(unsigned dummy __attribute__((unused)))
local void IntroCallbackButton1(unsigned button)
{
IntroNoEvent=0;
if( UseContinueButton ) {
if( (1<<button)==LeftButton &&
ContinueButtonX<=CursorX && CursorX<=ContinueButtonX+106 &&
ContinueButtonY<=CursorY && CursorY<=ContinueButtonY+27 ) {
ContinueButtonFlags|=MenuButtonClicked;
}
}
else {
IntroNoEvent=0;
}
}
/**
** Callback for input.
*/
local void IntroCallbackButton2(unsigned dummy __attribute__((unused)))
local void IntroCallbackButton2(unsigned button)
{
if( UseContinueButton ) {
if( (1<<button)==LeftButton &&
ContinueButtonX<=CursorX && CursorX<=ContinueButtonX+106 &&
ContinueButtonY<=CursorY && CursorY<=ContinueButtonY+27 &&
(ContinueButtonFlags&MenuButtonClicked) ) {
IntroNoEvent=0;
}
ContinueButtonFlags&=~MenuButtonClicked;
}
}
/**
** Callback for input.
*/
local void IntroCallbackKey1(unsigned dummy1 __attribute__((unused)),
unsigned dummy2 __attribute__((unused)))
local void IntroCallbackKey1(unsigned key, unsigned keychar)
{
IntroNoEvent=0;
if( UseContinueButton ) {
if( keychar=='c' || keychar=='\r' ) {
ContinueButtonFlags|=MenuButtonClicked;
}
}
else {
IntroNoEvent=0;
}
}
/**
** Callback for input.
*/
local void IntroCallbackKey2(unsigned dummy1 __attribute__((unused)),
unsigned dummy2 __attribute__((unused)))
local void IntroCallbackKey2(unsigned key, unsigned keychar)
{
if( UseContinueButton ) {
if( keychar=='c' || keychar=='\r' ) {
IntroNoEvent=0;
ContinueButtonFlags&=~MenuButtonClicked;
}
}
}
/**
** Callback for input.
*/
local void IntroCallbackMouse(int dummy_x __attribute__((unused)),
int dummy_y __attribute__((unused)))
local void IntroCallbackMouse(int x, int y)
{
CursorX=x;
CursorY=y;
if( UseContinueButton ) {
if( ContinueButtonX<=CursorX && CursorX<=ContinueButtonX+106 &&
ContinueButtonY<=CursorY && CursorY<=ContinueButtonY+27 ) {
ContinueButtonFlags|=MenuButtonActive;
}
else {
ContinueButtonFlags&=~MenuButtonActive;
}
}
}
/**
@ -116,6 +164,24 @@ local void IntroCallbackExit(void)
DebugLevel3Fn("Exit\n");
}
/**
** Draws a continue button at x,y
*/
local void DrawContinueButton()
{
DrawMenuButton(MBUTTON_GM_HALF,ContinueButtonFlags,
106,27,
ContinueButtonX,ContinueButtonY,
LargeFont,"~!Continue");
}
local void InitContinueButton(int x,int y)
{
ContinueButtonX=x;
ContinueButtonY=y;
ContinueButtonFlags=MenuButtonSelected;
}
/**
** Splits text up into a linked list of lines less than a given width.
**
@ -259,6 +325,8 @@ global void ShowIntro(const Intro *intro)
TextLines* ObjectivesText[MAX_OBJECTIVES];
int OldVideoSyncSpeed;
UseContinueButton=0;
VideoLockScreen();
VideoClearScreen();
VideoUnlockScreen();
@ -356,8 +424,6 @@ global void ShowIntro(const Intro *intro)
}
}
// FIXME: draw Continue button
VideoUnlockScreen();
// FIXME: update only the changed area!!!!
@ -437,14 +503,19 @@ global void ShowCredits(Credits *credits)
SplitTextIntoLines(credits->Names,320,&ScrollingCredits);
}
UseContinueButton=1;
InitContinueButton(455,480-40);
DestroyCursorBackground();
x=(VideoWidth-640)/2;
y=(VideoHeight-480)/2;
IntroNoEvent=1;
line=0;
scrolling=1;
while( IntroNoEvent ) {
while( 1 ) {
VideoLockScreen();
HideAnyCursor();
//
// Draw background
@ -463,7 +534,8 @@ global void ShowCredits(Credits *credits)
scrolling=ScrollText(x+140,y+80,320,275,line,ScrollingCredits);
}
// FIXME: draw Continue button
DrawContinueButton();
DrawAnyCursor();
VideoUnlockScreen();
@ -472,6 +544,9 @@ global void ShowCredits(Credits *credits)
Invalidate();
RealizeVideoMemory();
if( !IntroNoEvent )
break;
WaitEventsOneFrame(&callbacks);
++line;
@ -532,6 +607,8 @@ global void ShowPicture(const char* act,const char* title,const char* picture)
int maxi;
int i;
UseContinueButton=0;
OldVideoSyncSpeed=VideoSyncSpeed;
VideoSyncSpeed=100;
SetVideoSync();
@ -641,6 +718,237 @@ global void ShowPicture(const char* act,const char* title,const char* picture)
SetVideoSync();
}
enum {
STATS_OUTCOME,
STATS_RANK,
STATS_SCORE,
STATS_UNITS,
STATS_BUILDINGS,
STATS_GOLD,
STATS_WOOD,
STATS_OIL,
STATS_KILLS,
STATS_RAZINGS,
MAX_STATS_TEXT
};
local char* GameStatsText[MAX_STATS_TEXT];
local int OldVideoSyncSpeed;
local int GameStatsFrameCounter;
local void GameStatsInit()
{
Graphic* background;
char buf[20];
OldVideoSyncSpeed=VideoSyncSpeed;
VideoSyncSpeed=100;
SetVideoSync();
GameStatsFrameCounter=0;
background=LoadGraphic(MenuBackground);
VideoCreatePalette(GlobalPalette);
VideoLockScreen();
VideoClearScreen();
VideoDrawSubClip(background,0,0,background->Width,background->Height,
(VideoWidth-background->Width)/2,(VideoHeight-background->Height)/2);
VideoUnlockScreen();
if( GameResult==GameVictory )
GameStatsText[STATS_OUTCOME]="Victory!";
else
GameStatsText[STATS_OUTCOME]="Defeat!";
GameStatsText[STATS_RANK]="Overlord";
sprintf(buf,"%u",ThisPlayer->Score);
GameStatsText[STATS_SCORE]=strdup(buf);
sprintf(buf,"%u",ThisPlayer->TotalUnits);
GameStatsText[STATS_UNITS]=strdup(buf);
sprintf(buf,"%u",ThisPlayer->TotalBuildings);
GameStatsText[STATS_BUILDINGS]=strdup(buf);
sprintf(buf,"%u",ThisPlayer->TotalResources[GoldCost]);
GameStatsText[STATS_GOLD]=strdup(buf);
sprintf(buf,"%u",ThisPlayer->TotalResources[WoodCost]);
GameStatsText[STATS_WOOD]=strdup(buf);
sprintf(buf,"%u",ThisPlayer->TotalResources[OilCost]);
GameStatsText[STATS_OIL]=strdup(buf);
sprintf(buf,"%u",ThisPlayer->TotalKills);
GameStatsText[STATS_KILLS]=strdup(buf);
sprintf(buf,"%u",ThisPlayer->TotalRazings);
GameStatsText[STATS_RAZINGS]=strdup(buf);
}
local int GameStatsDrawFunc()
{
int x;
int y;
int dodraw;
int done;
const int StatsPause=30; // Wait one second between each stat
done=0;
GameStatsFrameCounter++;
if( (GameStatsFrameCounter%StatsPause)!=0 )
return done;
x=(VideoWidth-640)/2;
y=(VideoHeight-480)/2;
dodraw=GameStatsFrameCounter/StatsPause;
if( dodraw==1 ) {
VideoDrawTextCentered(x+106,y+57,LargeFont,"Outcome");
VideoDrawTextCentered(x+106,y+78,LargeTitleFont,
GameStatsText[STATS_OUTCOME]);
}
if( dodraw==2 ) {
VideoDrawTextCentered(x+324,y+57,LargeFont,"Rank");
VideoDrawTextCentered(x+324,y+78,SmallTitleFont,
GameStatsText[STATS_RANK]);
}
if( dodraw==3 ) {
VideoDrawTextCentered(x+540,y+57,LargeFont,"Score");
VideoDrawTextCentered(x+540,y+78,SmallTitleFont,
GameStatsText[STATS_SCORE]);
}
if( dodraw==4 ) {
VideoDrawTextCentered(x+50,y+178,LargeFont,"Units");
VideoDrawRectangleClip(ColorBlack,x+10,y+208,80,24);
VideoDrawRectangleClip(ColorYellow,x+11,y+209,78,22);
VideoFillRectangleClip(ColorBlack,x+12,y+210,76,20);
VideoDrawTextCentered(x+50,y+213,LargeFont,
GameStatsText[STATS_UNITS]);
}
if( dodraw==5 ) {
VideoDrawTextCentered(x+140,y+178,LargeFont,"Buildings");
VideoDrawRectangleClip(ColorBlack,x+100,y+208,80,24);
VideoDrawRectangleClip(ColorYellow,x+101,y+209,78,22);
VideoFillRectangleClip(ColorBlack,x+102,y+210,76,20);
VideoDrawTextCentered(x+140,y+213,LargeFont,
GameStatsText[STATS_BUILDINGS]);
}
if( dodraw==6 ) {
VideoDrawTextCentered(x+230,y+178,LargeFont,"Gold");
VideoDrawRectangleClip(ColorBlack,x+190,y+208,80,24);
VideoDrawRectangleClip(ColorYellow,x+191,y+209,78,22);
VideoFillRectangleClip(ColorBlack,x+192,y+210,76,20);
VideoDrawTextCentered(x+230,y+213,LargeFont,
GameStatsText[STATS_GOLD]);
}
if( dodraw==7 ) {
VideoDrawTextCentered(x+320,y+178,LargeFont,"Lumber");
VideoDrawRectangleClip(ColorBlack,x+280,y+208,80,24);
VideoDrawRectangleClip(ColorYellow,x+281,y+209,78,22);
VideoFillRectangleClip(ColorBlack,x+282,y+210,76,20);
VideoDrawTextCentered(x+320,y+213,LargeFont,
GameStatsText[STATS_WOOD]);
}
if( dodraw==8 ) {
VideoDrawTextCentered(x+410,y+178,LargeFont,"Oil");
VideoDrawRectangleClip(ColorBlack,x+370,y+208,80,24);
VideoDrawRectangleClip(ColorYellow,x+371,y+209,78,22);
VideoFillRectangleClip(ColorBlack,x+372,y+210,76,20);
VideoDrawTextCentered(x+410,y+213,LargeFont,
GameStatsText[STATS_OIL]);
}
if( dodraw==9 ) {
VideoDrawTextCentered(x+500,y+178,LargeFont,"Kills");
VideoDrawRectangleClip(ColorBlack,x+460,y+208,80,24);
VideoDrawRectangleClip(ColorYellow,x+461,y+209,78,22);
VideoFillRectangleClip(ColorBlack,x+462,y+210,76,20);
VideoDrawTextCentered(x+500,y+213,LargeFont,
GameStatsText[STATS_KILLS]);
}
if( dodraw==10 ) {
VideoDrawTextCentered(x+590,y+178,LargeFont,"Razings");
VideoDrawRectangleClip(ColorBlack,x+550,y+208,80,24);
VideoDrawRectangleClip(ColorYellow,x+551,y+209,78,22);
VideoFillRectangleClip(ColorBlack,x+552,y+210,76,20);
VideoDrawTextCentered(x+590,y+213,LargeFont,
GameStatsText[STATS_RAZINGS]);
done=1;
}
return done;
}
local void GameStatsEnd(void)
{
int i;
for( i=0; i<MAX_STATS_TEXT; i++ ) {
free(GameStatsText[i]);
}
VideoSyncSpeed=OldVideoSyncSpeed;
SetVideoSync();
}
global void ShowStats()
{
EventCallback callbacks;
int done;
callbacks.ButtonPressed=IntroCallbackButton1;
callbacks.ButtonReleased=IntroCallbackButton2;
callbacks.MouseMoved=IntroCallbackMouse;
callbacks.MouseExit=IntroCallbackExit;
callbacks.KeyPressed=IntroCallbackKey1;
callbacks.KeyReleased=IntroCallbackKey2;
callbacks.NetworkEvent=NetworkEvent;
callbacks.SoundReady=WriteSound;
GameStatsInit();
UseContinueButton=1;
InitContinueButton(455,480-40);
DestroyCursorBackground();
done=0;
IntroNoEvent=1;
// FIXME: Need continue button at 455,480-40
while( 1 ) {
VideoLockScreen();
HideAnyCursor();
if( !done ) {
done=GameStatsDrawFunc();
}
DrawContinueButton();
DrawAnyCursor();
VideoUnlockScreen();
Invalidate();
RealizeVideoMemory();
if( !IntroNoEvent )
break;
WaitEventsOneFrame(&callbacks);
}
GameStatsEnd();
}
/**
** Parse the credits configuration.

View file

@ -221,7 +221,23 @@
** Total number of points. You can get points for killing units,
** destroying buildings ...
**
** Player::Kills
** Player::TotalUnits
**
** Total number of units made.
**
** Player::TotalBuildings
**
** Total number of buildings made.
**
** Player::TotalResources
**
** Total number of resources collected.
**
** Player::TotalRazings
**
** Total number of buildings destroyed.
**
** Player::TotalKills
**
** Total number of kills.
**
@ -323,7 +339,11 @@ struct _player_ {
unsigned LastRepairResource; /// last resource for repair cycles
unsigned Score; /// Points for killing ...
unsigned Kills; /// How many unit killed
unsigned TotalUnits;
unsigned TotalBuildings;
unsigned TotalResources[MaxCosts];
unsigned TotalRazings;
unsigned TotalKills; /// How many unit killed
// Display video
unsigned Color; /// color of units on minimap

View file

@ -124,6 +124,8 @@ extern void ShowIntro(const Intro* intro);
extern void ShowCredits();
/// Show picture
extern void ShowPicture(const char* act,const char* title,const char* picture);
/// Show stats
extern void ShowStats();
/// Register Ccl
extern void CreditsCclRegister(void);
/// Create a game

View file

@ -634,6 +634,11 @@ global void GameMainLoop(void)
SetStatusLine("You have won!");
ProcessMenu(MENU_VICTORY, 1);
}
if( GameResult==GameVictory || GameResult==GameDefeat ) {
ShowStats();
}
GamePaused=0;
}

View file

@ -265,6 +265,12 @@ global Unit* MakeUnit(UnitType* type,Player* player)
//
if( player ) {
unit->PlayerSlot=player->Units+player->TotalNumUnits++;
if( type->Building ) {
player->TotalBuildings++;
}
else {
player->TotalUnits++;
}
*unit->PlayerSlot=unit;
player->UnitTypesCount[type->Type]++;
@ -1441,6 +1447,12 @@ global void ChangeUnitOwner(Unit* unit,Player* oldplayer,Player* newplayer)
// Insert into new player table.
unit->PlayerSlot=newplayer->Units+newplayer->TotalNumUnits++;
if( unit->Type->Building ) {
newplayer->TotalBuildings++;
}
else {
newplayer->TotalUnits++;
}
*unit->PlayerSlot=unit;
unit->Player=newplayer;
@ -3128,7 +3140,12 @@ global void HitUnit(Unit* attacker,Unit* target,int damage)
if( target->HP<=damage ) { // unit is killed or destroyed
if( attacker ) {
attacker->Player->Score+=target->Type->Points;
attacker->Player->Kills++;
if( type->Building ) {
attacker->Player->TotalRazings++;
}
else {
attacker->Player->TotalKills++;
}
#ifdef USE_HP_FOR_XP
attacker->XP+=target->HP;
#else