void Menu::options() { const char* names[] = { "CLR", "SDIR", "SPDS", "TRGT", "BACK" }; switch (gUserInterface.getString(names, 5, 4)) { case 0: clear(); break; case 1: startDirection(); break; case 2: speeds(); break; case 3: targetCell(); break; case 4: // back break; default: break; } }
void ScoreRoller::SetScore( int score ) { int dir = ( _score < score ? 1 : ( _score > score ? -1 : 0 )); if ( 0 == dir ) { int numRollers = _rollers.size(); for ( int i=0, base=1; i<numRollers; ++i, base *=10 ) { int value = (score/base)%10; _rollers[i]->SetValue( value, 0); } } else { int numRollers = _rollers.size(); std::vector< int > values( numRollers ); std::vector< float > speeds( numRollers ); int baseZero = 10; for ( int i=0; i<numRollers; ++i ) { baseZero *= 10; } for ( int i=0, base=1; i<numRollers; ++i, base *=10 ) { int oldValue = ((_score+baseZero)/base)%10; int value = ((score+baseZero)/base)%10; if ( oldValue != value ) { int base1 = 10; for ( int j=0; j<i; ++j ) { values[i-j-1] += base1*dir; base1 += 10; } values[i] = _rollers[i]->GetValue() + (value - oldValue); } else { values[i] = _rollers[i]->GetValue(); } speeds[i] = _rollSpeed; } { int oldValue = ((_score+baseZero)/(baseZero/10))%10; int value = ((score+baseZero)/(baseZero/10))%10; if ( oldValue != value ) { int base1 = 10; for ( int j=0; j<numRollers; ++j ) { values[numRollers-j-1] += base1*dir; base1 += 10; } } } if ( dir > 0 ) { for ( int i=1; i<numRollers; ++i ) { float d1 = values[i-1] - _rollers[i-1]->GetValue(); float d2 = values[i] - _rollers[i]->GetValue(); if ( d1 > 0 && d2 > 0 ) { float k = d1 / d2; for ( int j=0; j<i; ++j ) { speeds[j] *= k; } } } } else if ( dir < 0 ) { for ( int i=1; i<numRollers; ++i ) { float d1 = values[i-1] - _rollers[i-1]->GetValue(); float d2 = values[i] - _rollers[i]->GetValue(); if ( d1 < 0 && d2 < 0 ) { float k = d1 / d2; for ( int j=0; j<i; ++j ) { speeds[j] *= k; } } } } for ( int i=0; i<numRollers; ++i ) { _rollers[i]->SetValue( values[i], dir ); _rollers[i]->SetRollSpeed( speeds[i] ); } } _score = score; }