You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
knights/knights/chessclock.cpp

196 lines
4.6 KiB

/***************************************************************************
chessclock.cpp - description
-------------------
begin : Mon Jul 2 2001
copyright : (C) 2003 by Troy Corbin Jr.
email : tcorbin@users.sourceforge.net
***************************************************************************/
/***************************************************************************
* *
* This program 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 2 of the License, or *
* (at your option) any later version. *
* *
***************************************************************************/
#include "chessclock.moc"
#include "audio.h"
chessclock::chessclock(TQWidget *parent, const char *name, resource *Rsrc ) : TQWidget(parent,name)
{
Resource = Rsrc;
Silent = TRUE;
WhiteIndex = 0;
BlackIndex = 0;
Flag[WHITE] = FALSE;
Flag[BLACK] = FALSE;
whiteClock = " 0:00:00 ";
blackClock = " 0:00:00 ";
}
chessclock::~chessclock()
{
}
///////////////////////////////////////
//
// chessclock::Set
//
///////////////////////////////////////
void chessclock::Set( const int WhiteSec, const int BlackSec, const bool onMove )
{
/* these times are in centi seconds */
White.Seconds = WhiteSec / 10;
Black.Seconds = BlackSec / 10;
ArmyOnMove = onMove;
}
///////////////////////////////////////
//
// chessclock::Reset
//
///////////////////////////////////////
void chessclock::Reset( void )
{
Pause();
WhiteIndex = 0;
BlackIndex = 0;
White = Resource->TCPWhite[WhiteIndex];
Black = Resource->TCPBlack[BlackIndex];
White.Seconds *= 10;
White.Increment *= 10;
Black.Seconds *= 10;
Black.Increment *= 10;
ArmyOnMove = WHITE;
External = FALSE;
UpdateStrings();
}
///////////////////////////////////////
//
// chessclock::Pause
//
///////////////////////////////////////
void chessclock::Pause( void )
{
Silent = TRUE;
}
///////////////////////////////////////
//
// chessclock::Resume
//
///////////////////////////////////////
void chessclock::Resume( void )
{
Silent = FALSE;
}
///////////////////////////////////////
//
// chessclock::getCentiseconds
//
///////////////////////////////////////
int chessclock::getCentiseconds( const bool Army )
{
if( Army == WHITE )
{
return White.Seconds * 10;
}
return Black.Seconds * 10;
}
///////////////////////////////////////
//
// chessclock::Moved
//
///////////////////////////////////////
void chessclock::Moved( void )
{
Pause();
if( ArmyOnMove == WHITE )
{
ArmyOnMove = BLACK;
White.Moves--;
White.Seconds += White.Increment;
if( White.Moves < 1 )
{
WhiteIndex++;
if( WhiteIndex == (signed)Resource->TCPWhite.count() ) WhiteIndex--;
White = Resource->TCPWhite[WhiteIndex];
White.Seconds *= 10;
White.Increment *= 10;
}
}
else
{
ArmyOnMove = WHITE;
Black.Moves--;
Black.Seconds += Black.Increment;
if( Black.Moves < 1 )
{
BlackIndex++;
if( BlackIndex == (signed)Resource->TCPBlack.count() ) BlackIndex--;
Black = Resource->TCPBlack[BlackIndex];
Black.Seconds *= 10;
Black.Increment *= 10;
}
}
Resume();
}
///////////////////////////////////////
//
// chessclock::Tick
//
///////////////////////////////////////
void chessclock::Tick( void )
{
if( Silent ) return;
if( ArmyOnMove == WHITE )
{
White.Seconds--;
if( ( White.Seconds < 0 ) && ( Flag[WHITE] == FALSE ) )
{
Flag[WHITE] = TRUE;
emit flagFell( WHITE );
Resource->play( SND_FLAG );
}
}
else
{
Black.Seconds--;
if( ( Black.Seconds < 0 ) && ( Flag[BLACK] == FALSE ) )
{
Flag[BLACK] = TRUE;
emit flagFell( BLACK );
Resource->play( SND_FLAG );
}
}
UpdateStrings();
}
///////////////////////////////////////
//
// chessclock::UpdateStrings
//
///////////////////////////////////////
void chessclock::UpdateStrings( void )
{
int tmp;
int h, m, s;
char sign;
sign = ' ';
if( White.Seconds < 0 ) sign = '-';
tmp = abs(White.Seconds / 10);
s = ( tmp % 60 );
m = ( ( tmp / 60 ) % 60 );
h = ( ( tmp / 60 ) / 60 );
whiteClock.sprintf( " %c%.1d:%.2d:%.2d ", sign, h, m, s );
sign = ' ';
if( Black.Seconds < 0 ) sign = '-';
tmp = abs(Black.Seconds / 10);
s = ( tmp % 60 );
m = ( ( tmp / 60 ) % 60 );
h = ( ( tmp / 60 ) / 60 );
blackClock.sprintf( " %c%.1d:%.2d:%.2d ", sign, h, m, s );
}