get current data for HighScoresDialog

define, load and store "special" value
This commit is contained in:
thrust26 2020-02-14 13:49:48 +01:00
parent 542c22fbfd
commit aa0dc0b9ff
7 changed files with 272 additions and 93 deletions

View File

@ -130,12 +130,14 @@ bool HighScoresManager::get(const Properties& props, uInt32& numPlayersR, uInt32
info.scoreBCD = scoreBCD(props);
info.varsBCD = varBCD(props);
info.varsZeroBased = varZeroBased(props);
info.specialBCD = false; // TODO
info.specialZeroBased = true; // TODO
info.special = specialLabel(props);
info.specialBCD = specialBCD(props);
info.specialZeroBased = specialZeroBased(props);
info.playersAddr = playerAddress(props);
info.varsAddr = varAddress(props);
info.specialAddr = 0; // TODO
info.specialAddr = specialAddress(props);
for (uInt32 p = 0; p < MAX_PLAYERS; ++p)
{
if (p < numPlayersR)
@ -167,12 +169,20 @@ void HighScoresManager::set(Properties& props, uInt32 numPlayers, uInt32 numVari
props.set(PropType::Cart_Variations, to_string(min(numVariations, MAX_VARIATIONS)));
// fill from the back to skip default values
if (info.varsZeroBased != DEFAULT_VARS_ZERO_BASED)
output = info.varsZeroBased ? ",1" : ",0";
if (output.length() || info.specialZeroBased != DEFAULT_SPECIAL_ZERO_BASED)
output = info.specialZeroBased ? ",1" : ",0";
if (output.length() || info.specialBCD != DEFAULT_SPECIAL_BCD)
output.insert(0, info.specialBCD ? ",B" : ",D");
if (output.length() || !info.special.empty())
output.insert(0, "," + info.special);
if (output.length() || info.varsZeroBased != DEFAULT_VARS_ZERO_BASED)
output.insert(0, info.varsZeroBased ? ",1" : ",0");
if (output.length() || info.varsBCD != DEFAULT_VARS_BCD)
output.insert(0, info.varsBCD ? ",B" : ",D");
if (output.length() || info.scoreBCD != DEFAULT_SCORE_BCD)
output.insert(0, info.scoreBCD ? ",B" : ",H");
if (output.length() || info.trailingZeroes != DEFAULT_TRAILING)
output.insert(0, "," + to_string(info.trailingZeroes));
if (output.length() || info.numDigits != DEFAULT_DIGITS)
@ -187,10 +197,12 @@ void HighScoresManager::set(Properties& props, uInt32 numPlayers, uInt32 numVari
}
// add optional addresses
if (numVariations != DEFAULT_VARIATION || numPlayers != DEFAULT_PLAYER)
if (numVariations != DEFAULT_VARIATION || numPlayers != DEFAULT_PLAYER || !info.special.empty())
buf << info.varsAddr << "," ;
if (numPlayers != DEFAULT_PLAYER)
if (numPlayers != DEFAULT_PLAYER || !info.special.empty())
buf << info.playersAddr << "," ;
if (!info.special.empty())
buf << info.specialAddr << "," ;
output = buf.str();
output.pop_back();
@ -202,7 +214,7 @@ uInt32 HighScoresManager::numDigits(const Properties& props) const
{
string digits = getPropIdx(props, PropType::Cart_Formats, 0);
return min(uInt32(stringToInt(digits, DEFAULT_DIGITS)), MAX_DIGITS);
return min(uInt32(stringToInt(digits, DEFAULT_DIGITS)), MAX_SCORE_DIGITS);
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
@ -237,6 +249,36 @@ bool HighScoresManager::varZeroBased(const Properties& props) const
return zeroBased == EmptyString ? DEFAULT_VARS_ZERO_BASED : zeroBased != "0";
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
string HighScoresManager::specialLabel(const Properties& props) const
{
string orgLabel, label;
// some ugly formatting
orgLabel = label = getPropIdx(props, PropType::Cart_Formats, 5);
label = BSPF::toLowerCase(label);
label[0] = orgLabel[0];
return label;
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
bool HighScoresManager::specialBCD(const Properties& props) const
{
string bcd = getPropIdx(props, PropType::Cart_Formats, 6);
return bcd == EmptyString ? DEFAULT_SPECIAL_BCD : bcd == "B";
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
bool HighScoresManager::specialZeroBased(const Properties& props) const
{
string zeroBased = getPropIdx(props, PropType::Cart_Formats, 7);
return zeroBased == EmptyString ? DEFAULT_SPECIAL_ZERO_BASED : zeroBased != "0";
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
bool HighScoresManager::playerZeroBased(const Properties& props) const
{
@ -262,6 +304,16 @@ uInt16 HighScoresManager::varAddress(const Properties& props) const
return stringToIntBase16(addr, DEFAULT_ADDRESS);
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
uInt16 HighScoresManager::specialAddress(const Properties& props) const
{
uInt32 idx = numAddrBytes(props) * numPlayers(props) + 2;
string addr = getPropIdx(props, PropType::Cart_Addresses, idx);
return stringToIntBase16(addr, DEFAULT_ADDRESS);
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
uInt32 HighScoresManager::numAddrBytes(Int32 digits, Int32 trailing) const
{
@ -311,6 +363,14 @@ Int32 HighScoresManager::player() const
return player(addr, numPlayers(props), playerZeroBased(props));
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
string HighScoresManager::specialLabel() const
{
Properties props;
return specialLabel(properties(props));
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Int32 HighScoresManager::variation(uInt16 addr, bool varBCD, bool zeroBased,
uInt32 numVariations) const
@ -398,6 +458,34 @@ Int32 HighScoresManager::score() const
return score(currentPlayer, numBytes, trailingZeroes(props), scoreBCD(props), scoreAddr);
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Int32 HighScoresManager::special() const
{
Properties props;
uInt16 addr = specialAddress(properties(props));
if (addr == DEFAULT_ADDRESS)
return -1;
return special(addr, specialBCD(props), specialZeroBased(props));
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Int32 HighScoresManager::special(uInt16 addr, bool varBCD, bool zeroBased) const
{
if (!myOSystem.hasConsole())
return -1;
Int32 var = peek(addr);
if (varBCD)
var = fromBCD(var);
var += zeroBased ? 1 : 0;
return var;
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Int32 HighScoresManager::fromBCD(uInt8 bcd) const
{

View File

@ -22,8 +22,11 @@ class OSystem;
namespace HSM {
static const uInt32 MAX_PLAYERS = 4;
static const uInt32 MAX_ADDR_CHARS = 4;
static const uInt32 MAX_SCORE_DIGITS = 6;
static const uInt32 MAX_SCORE_ADDR = 3;
static const uInt32 MAX_SPECIAL = 5;
static const uInt32 MAX_SPECIAL_NAME = 5;
static const uInt32 MAX_SPECIAL_DIGITS = 3;
static const uInt32 DEFAULT_PLAYER = 1;
static const uInt32 DEFAULT_VARIATION = 1;
@ -100,16 +103,19 @@ class HighScoresManager
Int32 score(uInt32 player, uInt32 numAddrBytes, uInt32 trailingZeroes, bool isBCD,
const ScoreAddresses& scoreAddr) const;
Int32 special(uInt16 addr, bool varBCD, bool zeroBased) const;
// Retrieve current values (using game's properties)
Int32 numVariations() const;
Int32 player() const;
string specialLabel() const;
Int32 variation() const;
Int32 score() const;
Int32 special() const;
private:
static const uInt32 MAX_VARIATIONS = 256;
static const uInt32 MAX_DIGITS = 6;
static const uInt32 MAX_TRAILING = 3;
static const uInt32 DEFAULT_DIGITS = 4;
static const uInt32 DEFAULT_TRAILING = 0;
@ -117,6 +123,8 @@ class HighScoresManager
static const bool DEFAULT_VARS_BCD = true;
static const bool DEFAULT_VARS_ZERO_BASED = false;
static const bool DEFAULT_PLAYERS_ZERO_BASED = true;
static const bool DEFAULT_SPECIAL_BCD = true;
static const bool DEFAULT_SPECIAL_ZERO_BASED = false;
private:
// Get individual highscore info from properties
@ -124,11 +132,15 @@ class HighScoresManager
uInt32 numPlayers(const Properties& props) const;
uInt16 varAddress(const Properties& props) const;
uInt16 playerAddress(const Properties& props) const;
uInt16 specialAddress(const Properties& props) const;
uInt32 numDigits(const Properties& props) const;
uInt32 trailingZeroes(const Properties& props) const;
bool scoreBCD(const Properties& props) const;
bool varBCD(const Properties& props) const;
bool varZeroBased(const Properties& props) const;
string specialLabel(const Properties& props) const;
bool specialBCD(const Properties& props) const;
bool specialZeroBased(const Properties& props) const;
bool playerZeroBased(const Properties& props) const;
// Calculate the number of bytes for one player's score from property parameters

View File

@ -95,7 +95,7 @@
"Cart.ModelNo" "AZ-036-04"
"Cart.Name" "H.E.R.O. (1984) (Activision)"
"Cart.Variations" "5"
"Cart.Formats" "6,0,B,B,1"
"Cart.Addresses" "B7,B8,B9,B4"
"Cart.Formats" "6,0,B,B,1,LEVEL,B,1"
"Cart.Addresses" "B7,B8,B9,B4,0,F5"
""

View File

@ -372,17 +372,15 @@ GameInfoDialog::GameInfoDialog(
xpos += 20; ypos += lineHeight + VGAP;
items.clear();
VarList::push_back(items, "1", "1");
VarList::push_back(items, "2", "2");
VarList::push_back(items, "3", "3");
VarList::push_back(items, "4", "4");
for (int i = 1; i <= HSM::MAX_PLAYERS; ++i)
VarList::push_back(items, std::to_string(i), std::to_string(i));
pwidth = font.getStringWidth("4");
myPlayersLabel = new StaticTextWidget(myTab, font, xpos, ypos + 1, lwidth, fontHeight, "Players");
myPlayers = new PopUpWidget(myTab, font, xpos + lwidth, ypos, pwidth, lineHeight, items, "", 0, kHiScoresChanged);
wid.push_back(myPlayers);
int awidth = font.getStringWidth("FFFF") + 4;
int awidth = font.getMaxCharWidth() * HSM::MAX_ADDR_CHARS + 4;
int vwidth = font.getStringWidth("123") + 4;
myPlayersAddressLabel = new StaticTextWidget(myTab, font, myPlayers->getRight() + 16, ypos + 1, "Address ");
@ -418,9 +416,9 @@ GameInfoDialog::GameInfoDialog(
ypos += lineHeight + VGAP;
mySpecialLabel = new StaticTextWidget(myTab, font, xpos, ypos + 1, "Special ");
mySpecial = new EditTextWidget(myTab, font, mySpecialLabel->getRight(), ypos - 1, swidth, lineHeight);
mySpecial->setTextFilter(fSpecial);
wid.push_back(mySpecial);
mySpecialName = new EditTextWidget(myTab, font, mySpecialLabel->getRight(), ypos - 1, swidth, lineHeight);
mySpecialName->setTextFilter(fSpecial);
wid.push_back(mySpecialName);
mySpecialAddressLabel = new StaticTextWidget(myTab, font, myPlayersAddressLabel->getLeft(), ypos + 1, "Address ");
mySpecialAddress = new EditTextWidget(myTab, font, mySpecialAddressLabel->getRight(), ypos - 1, awidth, lineHeight);
@ -440,12 +438,8 @@ GameInfoDialog::GameInfoDialog(
vwidth = font.getStringWidth("AB") + 4;
items.clear();
VarList::push_back(items, "1", "1");
VarList::push_back(items, "2", "2");
VarList::push_back(items, "3", "3");
VarList::push_back(items, "4", "4");
VarList::push_back(items, "5", "5");
VarList::push_back(items, "6", "6");
for (int i = 1; i <= HSM::MAX_SCORE_DIGITS; ++i)
VarList::push_back(items, std::to_string(i), std::to_string(i));
myScoreDigitsLabel = new StaticTextWidget(myTab, font, xpos, ypos + 1, "Score digits ");
myScoreDigits = new PopUpWidget(myTab, font, myScoreDigitsLabel->getRight(), ypos, pwidth, lineHeight,
@ -453,10 +447,8 @@ GameInfoDialog::GameInfoDialog(
wid.push_back(myScoreDigits);
items.clear();
VarList::push_back(items, "0", "0");
VarList::push_back(items, "1", "1");
VarList::push_back(items, "2", "2");
VarList::push_back(items, "3", "3");
for (int i = 0; i <= HSM::MAX_SCORE_DIGITS - 3; ++i)
VarList::push_back(items, std::to_string(i), std::to_string(i));
pwidth = font.getStringWidth("0");
myTrailingZeroesLabel = new StaticTextWidget(myTab, font, myScoreDigits->getRight() + 30, ypos + 1, "0-digits ");
@ -699,22 +691,22 @@ void GameInfoDialog::loadHighScoresProperties(const Properties& props)
myScoreBCD->setState(info.scoreBCD);
myVarsBCD->setState(info.varsBCD);
myVarsZeroBased->setState(info.varsZeroBased);
mySpecial->setText(info.special);
mySpecialName->setText(info.special);
mySpecialBCD->setState(info.specialBCD);
mySpecialZeroBased->setState(info.specialZeroBased);
ss.str("");
ss << hex << right << setw(4) << setfill(' ')
ss << hex << right //<< setw(HSM::MAX_ADDR_CHARS) << setfill(' ')
<< uppercase << info.playersAddr;
myPlayersAddress->setText(ss.str());
ss.str("");
ss << hex << right << setw(4) << setfill(' ')
ss << hex << right //<< setw(HSM::MAX_ADDR_CHARS) << setfill(' ')
<< uppercase << info.varsAddr;
myVarAddress->setText(ss.str());
ss.str("");
ss << hex << right << setw(4) << setfill(' ')
ss << hex << right //<< setw(HSM::MAX_ADDR_CHARS) << setfill(' ')
<< uppercase << info.specialAddr;
mySpecialAddress->setText(ss.str());
@ -726,7 +718,7 @@ void GameInfoDialog::loadHighScoresProperties(const Properties& props)
if (p < numPlayers)
{
ss.str("");
ss << hex << right << setw(4) << setfill('0')
ss << hex << right //<< setw(HSM::MAX_ADDR_CHARS) << setfill(' ')
<< uppercase << info.scoresAddr[p][a];
myScoreAddress[p][a]->setText(ss.str());
}
@ -814,11 +806,22 @@ void GameInfoDialog::saveHighScoresProperties()
if (myHighScores->getState())
{
string strText;
// limit variants and special size
strText = myVariations->getText();
strText = strText.substr(0, 3);
myVariations->setText(strText);
strText = mySpecialName->getText();
strText = strText.substr(0, HSM::MAX_SPECIAL_NAME);
mySpecialName->setText(strText);
// fill format
info.varsZeroBased = myVarsZeroBased->getState();
info.varsBCD = myVarsBCD->getState();
info.special = mySpecial->getText();
info.special = mySpecialName->getText();
info.specialZeroBased = mySpecialZeroBased->getState();
info.specialBCD = mySpecialBCD->getState();
@ -1007,19 +1010,9 @@ void GameInfoDialog::updateHighScoresWidgets()
uInt32 players = myPlayers->getSelected() + 1;
bool enablePlayers = enable && players > 1;
bool enableVars = enable && myVariations->getText() > "1";
bool enableSpecial = enable && !mySpecial->getText().empty();
bool enableSpecial = enable && !mySpecialName->getText().empty();
uInt32 numAddr = instance().highScores().numAddrBytes(myScoreDigits->getSelected() + 1,
myTrailingZeroes->getSelected());
string strText;
// limit variants and special size
strText = myVariations->getText();
strText = strText.substr(0, 3);
myVariations->setText(strText);
strText = mySpecial->getText();
strText = strText.substr(0, HSM::MAX_SPECIAL);
mySpecial->setText(strText);
// enable widgets
myPlayersLabel->setEnabled(enable);
@ -1040,8 +1033,8 @@ void GameInfoDialog::updateHighScoresWidgets()
myVarsZeroBased->setEnabled(enableVars);
mySpecialLabel->setEnabled(enable);
mySpecial->setEnabled(enable);
mySpecial->setEditable(enable);
mySpecialName->setEnabled(enable);
mySpecialName->setEditable(enable);
mySpecialAddressLabel->setEnabled(enableSpecial);
mySpecialAddress->setEnabled(enableSpecial);
mySpecialAddress->setEditable(enableSpecial);
@ -1049,7 +1042,6 @@ void GameInfoDialog::updateHighScoresWidgets()
mySpecialBCD->setEnabled(enableSpecial);
mySpecialZeroBased->setEnabled(enableSpecial);
mySpecialLabel->setEnabled(enable);
myScoreDigitsLabel->setEnabled(enable);
myScoreDigits->setEnabled(enable);
myScoreBCD->setEnabled(enable);
@ -1123,8 +1115,7 @@ void GameInfoDialog::setAddressVal(EditTextWidget* addressWidget, EditTextWidget
// limit address size
strAddr = addressWidget->getText();
strAddr = strAddr.substr(0, 4);
addressWidget->setText(strAddr);
strAddr = strAddr.substr(0, HSM::MAX_ADDR_CHARS);
if (instance().hasConsole() && valWidget->isEnabled())
{
@ -1139,7 +1130,7 @@ void GameInfoDialog::setAddressVal(EditTextWidget* addressWidget, EditTextWidget
// format output and display in value widget
if (isBCD)
ss << hex;
ss << right << setw(2) << setfill(' ')
ss << right //<< setw(2) << setfill(' ')
<< uppercase << uInt16(val);
valWidget->setText(ss.str());
}

View File

@ -131,7 +131,7 @@ class GameInfoDialog : public Dialog, public CommandSender
CheckboxWidget* myVarsZeroBased{nullptr};
StaticTextWidget* mySpecialLabel{nullptr};
EditTextWidget* mySpecial{nullptr};
EditTextWidget* mySpecialName{nullptr};
StaticTextWidget* mySpecialAddressLabel{nullptr};
EditTextWidget* mySpecialAddress{nullptr};
EditTextWidget* mySpecialAddressVal{nullptr};
@ -147,8 +147,8 @@ class GameInfoDialog : public Dialog, public CommandSender
StaticTextWidget* myScoreAddressesLabel[HSM::MAX_PLAYERS]{nullptr};
EditTextWidget* myScoreAddress[HSM::MAX_PLAYERS][HSM::MAX_SCORE_ADDR]{nullptr};
EditTextWidget* myScoreAddressVal[HSM::MAX_PLAYERS][HSM::MAX_SCORE_ADDR]{nullptr};
StaticTextWidget* myCurrentScoreLabel;
StaticTextWidget* myCurrentScore[HSM::MAX_PLAYERS];
StaticTextWidget* myCurrentScoreLabel{nullptr};
StaticTextWidget* myCurrentScore[HSM::MAX_PLAYERS]{nullptr};
enum {
kVCenterChanged = 'Vcch',

View File

@ -55,7 +55,7 @@ HighScoresDialog::HighScoresDialog(OSystem& osystem, DialogContainer& parent,
//items.clear();
StaticTextWidget* s = new StaticTextWidget(this, font, xpos, ypos + 1, "Variation ");
myVariation = new PopUpWidget(this, font, s->getRight(), ypos,
myVariationWidget = new PopUpWidget(this, font, s->getRight(), ypos,
font.getStringWidth("256") - 4, lineHeight, items, "", 0, 0);
ypos += lineHeight + VGAP * 4;
@ -69,7 +69,7 @@ HighScoresDialog::HighScoresDialog(OSystem& osystem, DialogContainer& parent,
new StaticTextWidget(this, font, xposRank, ypos + 1, "Rank");
new StaticTextWidget(this, font, xposScore, ypos + 1, "Score");
new StaticTextWidget(this, font, xposSpecial, ypos + 1, "Round");
mySpecialLabelWidget = new StaticTextWidget(this, font, xposSpecial, ypos + 1, "Round");
new StaticTextWidget(this, font, xposName - 2, ypos + 1, "Name");
new StaticTextWidget(this, font, xposDate+16, ypos + 1, "Date Time");
@ -77,25 +77,24 @@ HighScoresDialog::HighScoresDialog(OSystem& osystem, DialogContainer& parent,
for (uInt32 p = 0; p < NUM_POSITIONS; ++p)
{
myPositions[p] = new StaticTextWidget(this, font, xposRank, ypos + 1,
(p < 9 ? " " : "") + std::to_string(p + 1) + ". ");
myScores[p] = new StaticTextWidget(this, font, xposScore, ypos + 1, "123456");
mySpecials[p] = new StaticTextWidget(this, font, xposSpecial + 8, ypos + 1, "123");
myEditNames[p] = new EditTextWidget(this, font, xposName, ypos - 1, nWidth, lineHeight, "JTZ");
//myEditNames[p]->setEditable(false);
myEditNames[p]->setFlags(EditTextWidget::FLAG_INVISIBLE);
wid.push_back(myEditNames[p]);
myNames[p] = new StaticTextWidget(this, font, xposName + 2, ypos + 1, "JTZ");
myPositionsWidget[p] = new StaticTextWidget(this, font, xposRank + 8, ypos + 1,
(p < 9 ? " " : "") + std::to_string(p + 1));
myScoresWidget[p] = new StaticTextWidget(this, font, xposScore, ypos + 1, "123456");
mySpecialsWidget[p] = new StaticTextWidget(this, font, xposSpecial + 8, ypos + 1, "123");
myEditNamesWidget[p] = new EditTextWidget(this, font, xposName, ypos - 1, nWidth, lineHeight, "JTZ");
myEditNamesWidget[p]->setFlags(EditTextWidget::FLAG_INVISIBLE);
wid.push_back(myEditNamesWidget[p]);
myNamesWidget[p] = new StaticTextWidget(this, font, xposName + 2, ypos + 1, "JTZ");
//new StaticTextWidget(this, font, xposDate, ypos + 1, "12.02.20 17:15");
//new StaticTextWidget(this, font, xposDate, ypos + 1, "02/12/20 12:30am");
myDates[p] = new StaticTextWidget(this, font, xposDate, ypos + 1, "12-02-20 17:15");
myDatesWidget[p] = new StaticTextWidget(this, font, xposDate, ypos + 1, "12-02-20 17:15");
ypos += lineHeight + VGAP;
}
ypos += VGAP * 2;
myMD5 = new StaticTextWidget(this, ifont, xpos, ypos + 1, "MD5: 9ad36e699ef6f45d9eb6c4cf90475c9f");
myMD5Widget = new StaticTextWidget(this, ifont, xpos, ypos + 1, "MD5: 12345678901234567890123456789012");
wid.clear();
addOKCancelBGroup(wid, font);
@ -122,20 +121,27 @@ void HighScoresDialog::loadConfig()
items.clear();
myVariation = instance().highScores().variation();
for (Int32 i = 1; i <= instance().highScores().numVariations(); ++i)
{
ostringstream buf;
buf << std::setw(3) << std::setfill(' ') << i;
VarList::push_back(items, buf.str(), i);
}
myVariation->addItems(items);
myVariation->setSelected(instance().highScores().variation());
myVariationWidget->addItems(items);
myScore = instance().highScores().score();
mySpecial = instance().highScores().special();
myVariationWidget->setSelected(myVariation);
/////////////////////////////////////////////////////////////////////////////////////////////////
// mock data
const string SCORES[NUM_POSITIONS] = {"999999", "250000", "100000", " 50000", " 20000",
" 5000", " 2000", " 700", " 200", " -"};
const string SPECIALS[NUM_POSITIONS] = {"200", "150", " 90", " 70", " 45",
" 30", " 25", " 10", " 7", " -"};
const Int32 SCORES[NUM_POSITIONS] = {999999, 250000, 100000, 50000, 20000,
5000, 2000, 200, 20, 0};
const Int32 SPECIALS[NUM_POSITIONS] = {200, 150, 90, 70, 45,
30, 25, 10, 7, 0};
const string NAMES[NUM_POSITIONS] = {"RAM", "CDW", "AD ", "JTZ", "DOA",
"ROM", "VCS", "N.S", "JWC", " -"};
const string DATES[NUM_POSITIONS] = {"19-12-24 21:00", "19-07-18 00:00", "20-01-01 12:00",
@ -145,18 +151,66 @@ void HighScoresDialog::loadConfig()
for (Int32 p = 0; p < NUM_POSITIONS; ++p)
{
myScores[p]->setLabel(SCORES[p]);
mySpecials[p]->setLabel(SPECIALS[p]);
myNames[p]->setLabel(NAMES[p]);
myEditNames[p]->setText(NAMES[p]);
myDates[p]->setLabel(DATES[p]);
myScores[p] = SCORES[p];
mySpecials[p] = SPECIALS[p];
myNames[p] = NAMES[p];
myDates[p] = DATES[p];
}
/////////////////////////////////////////////////////////////////////////////////////////////////
Int32 pos;
mySpecialLabelWidget->setLabel(instance().highScores().specialLabel());
for (Int32 p = 0; p < NUM_POSITIONS; ++p)
myEditNamesWidget[p]->setFlags(EditTextWidget::FLAG_INVISIBLE);
if (myScore > 0)
{
for (pos = 0; pos < NUM_POSITIONS; ++pos)
{
if (myScore > myScores[pos] ||
(myScore == myScores[pos] && mySpecial > mySpecials[pos]))
break;
}
if (pos < NUM_POSITIONS)
{
for (Int32 p = NUM_POSITIONS - 1; p > pos; --p)
{
myScores[p] = myScores[p - 1];
mySpecials[p] = mySpecials[p - 1];
myNames[p] = myNames[p - 1];
myDates[p] = myDates[p - 1];
}
myScores[pos] = myScore;
myNames[pos] = "";
mySpecials[pos] = mySpecial;
myDates[pos] = now();
myEditNamesWidget[pos]->clearFlags(EditTextWidget::FLAG_INVISIBLE);
}
}
//myEditNames[4]->setEditable(true);
for (Int32 p = 0; p < NUM_POSITIONS; ++p)
{
ostringstream buf;
buf << std::setw(HSM::MAX_SCORE_DIGITS) << std::setfill(' ') << myScores[p];
myScoresWidget[p]->setLabel(buf.str());
buf.str("");
buf << std::setw(HSM::MAX_SPECIAL_DIGITS) << std::setfill(' ') << mySpecials[p];
mySpecialsWidget[p]->setLabel(buf.str());
myNamesWidget[p]->setLabel(myNames[p]);
myEditNamesWidget[p]->setText(myNames[p]);
myDatesWidget[p]->setLabel(myDates[p]);
}
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void HighScoresDialog::saveConfig()
{
//myNames[3]->setHeight(1);
//myNames[3]->setWidth(0);
myEditNames[4]->clearFlags(EditTextWidget::FLAG_INVISIBLE);
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
@ -165,12 +219,32 @@ void HighScoresDialog::handleCommand(CommandSender* sender, int cmd, int data, i
switch (cmd)
{
case kOKCmd:
saveConfig();
case kCloseCmd:
instance().eventHandler().leaveMenuMode();
instance().eventHandler().handleEvent(Event::ExitMode);
// instance().eventHandler().handleEvent(Event::ExitMode);
// case GuiObject::kOKCmd:
// close();
break;
default:
Dialog::handleCommand(sender, cmd, data, 0);
}
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
string HighScoresDialog::now() const
{
std::tm now = BSPF::localTime();
ostringstream ss;
ss << std::setfill('0') << std::right
<< std::setw(2) << (now.tm_year - 100) << '-'
<< std::setw(2) << (now.tm_mon + 1) << '-'
<< std::setw(2) << now.tm_mday << " "
<< std::setw(2) << now.tm_hour << ":"
<< std::setw(2) << now.tm_min;
return ss.str();
}

View File

@ -44,17 +44,31 @@ class HighScoresDialog : public Dialog
protected:
void loadConfig() override;
void saveConfig() override;
void handleCommand(CommandSender* sender, int cmd, int data, int id) override;
private:
PopUpWidget* myVariation;
StaticTextWidget* myPositions[NUM_POSITIONS];
StaticTextWidget* myScores[NUM_POSITIONS];
StaticTextWidget* mySpecials[NUM_POSITIONS];
StaticTextWidget* myNames[NUM_POSITIONS];
EditTextWidget* myEditNames[NUM_POSITIONS];
StaticTextWidget* myDates[NUM_POSITIONS];
StaticTextWidget* myMD5;
Int32 myVariation;
Int32 myScore;
Int32 mySpecial;
Int32 myScores[NUM_POSITIONS];
Int32 mySpecials[NUM_POSITIONS];
string myNames[NUM_POSITIONS];
string myDates[NUM_POSITIONS];
string myMD5;
PopUpWidget* myVariationWidget{nullptr};
StaticTextWidget* mySpecialLabelWidget{nullptr};
StaticTextWidget* myPositionsWidget[NUM_POSITIONS]{nullptr};
StaticTextWidget* myScoresWidget[NUM_POSITIONS]{nullptr};
StaticTextWidget* mySpecialsWidget[NUM_POSITIONS]{nullptr};
StaticTextWidget* myNamesWidget[NUM_POSITIONS]{nullptr};
EditTextWidget* myEditNamesWidget[NUM_POSITIONS]{nullptr};
StaticTextWidget* myDatesWidget[NUM_POSITIONS]{nullptr};
StaticTextWidget* myMD5Widget{nullptr};
string now() const;
private:
// Following constructors and assignment operators not supported