mirror of https://github.com/stella-emu/stella.git
add high score notes
This commit is contained in:
parent
9a40428db3
commit
35bad97485
|
@ -140,6 +140,7 @@ bool HighScoresManager::get(const Properties& props, uInt32& numVariationsR,
|
||||||
info.special = specialLabel(props);
|
info.special = specialLabel(props);
|
||||||
info.specialBCD = specialBCD(props);
|
info.specialBCD = specialBCD(props);
|
||||||
info.specialZeroBased = specialZeroBased(props);
|
info.specialZeroBased = specialZeroBased(props);
|
||||||
|
info.notes = notes(props);
|
||||||
|
|
||||||
info.varsAddr = varAddress(props);
|
info.varsAddr = varAddress(props);
|
||||||
info.specialAddr = specialAddress(props);
|
info.specialAddr = specialAddress(props);
|
||||||
|
@ -164,12 +165,15 @@ void HighScoresManager::set(Properties& props, uInt32 numVariations,
|
||||||
props.set(PropType::Cart_Variations, to_string(min(numVariations, MAX_VARIATIONS)));
|
props.set(PropType::Cart_Variations, to_string(min(numVariations, MAX_VARIATIONS)));
|
||||||
|
|
||||||
// fill from the back to skip default values
|
// fill from the back to skip default values
|
||||||
|
if (output.length() || !info.notes.empty())
|
||||||
|
output.insert(0, "," + toPropString(info.notes));
|
||||||
|
|
||||||
if (output.length() || info.specialZeroBased != DEFAULT_SPECIAL_ZERO_BASED)
|
if (output.length() || info.specialZeroBased != DEFAULT_SPECIAL_ZERO_BASED)
|
||||||
output.insert(0, info.specialZeroBased ? ",1" : ",0");
|
output.insert(0, info.specialZeroBased ? ",1" : ",0");
|
||||||
if (output.length() || info.specialBCD != DEFAULT_SPECIAL_BCD)
|
if (output.length() || info.specialBCD != DEFAULT_SPECIAL_BCD)
|
||||||
output.insert(0, info.specialBCD ? ",B" : ",D");
|
output.insert(0, info.specialBCD ? ",B" : ",D");
|
||||||
if (output.length() || !info.special.empty())
|
if (output.length() || !info.special.empty())
|
||||||
output.insert(0, "," + (info.special.empty() ? "-" : info.special));
|
output.insert(0, "," + toPropString(info.special.empty() ? "_" : info.special));
|
||||||
|
|
||||||
if (output.length() || info.varsZeroBased != DEFAULT_VARS_ZERO_BASED)
|
if (output.length() || info.varsZeroBased != DEFAULT_VARS_ZERO_BASED)
|
||||||
output.insert(0, info.varsZeroBased ? ",1" : ",0");
|
output.insert(0, info.varsZeroBased ? ",1" : ",0");
|
||||||
|
@ -253,14 +257,7 @@ bool HighScoresManager::varZeroBased(const Properties& props) const
|
||||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
string HighScoresManager::specialLabel(const Properties& props) const
|
string HighScoresManager::specialLabel(const Properties& props) const
|
||||||
{
|
{
|
||||||
string orgLabel, label;
|
return fromPropString(getPropIdx(props, PropType::Cart_Formats, IDX_SPECIAL_LABEL));
|
||||||
|
|
||||||
// some ugly formatting
|
|
||||||
orgLabel = label = getPropIdx(props, PropType::Cart_Formats, IDX_SPECIAL_LABEL);
|
|
||||||
label = BSPF::toLowerCase(label);
|
|
||||||
label[0] = orgLabel[0];
|
|
||||||
|
|
||||||
return label;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
@ -279,6 +276,12 @@ bool HighScoresManager::specialZeroBased(const Properties& props) const
|
||||||
return zeroBased.empty() ? DEFAULT_SPECIAL_ZERO_BASED : zeroBased != "0";
|
return zeroBased.empty() ? DEFAULT_SPECIAL_ZERO_BASED : zeroBased != "0";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
string HighScoresManager::notes(const Properties& props) const
|
||||||
|
{
|
||||||
|
return fromPropString(getPropIdx(props, PropType::Cart_Formats, IDX_NOTES));
|
||||||
|
}
|
||||||
|
|
||||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
/*bool HighScoresManager::armRAM(const Properties& props) const
|
/*bool HighScoresManager::armRAM(const Properties& props) const
|
||||||
{
|
{
|
||||||
|
@ -474,6 +477,14 @@ Int32 HighScoresManager::special(uInt16 addr, bool varBCD, bool zeroBased) const
|
||||||
return var;
|
return var;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
string HighScoresManager::notes() const
|
||||||
|
{
|
||||||
|
Properties props;
|
||||||
|
|
||||||
|
return notes(properties(props));
|
||||||
|
}
|
||||||
|
|
||||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
Int32 HighScoresManager::convert(uInt32 val, uInt32 maxVal, bool isBCD, bool zeroBased) const
|
Int32 HighScoresManager::convert(uInt32 val, uInt32 maxVal, bool isBCD, bool zeroBased) const
|
||||||
{
|
{
|
||||||
|
@ -505,3 +516,35 @@ Int32 HighScoresManager::fromBCD(uInt8 bcd) const
|
||||||
|
|
||||||
return (bcd >> 4) * 10 + bcd % 16;
|
return (bcd >> 4) * 10 + bcd % 16;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
string HighScoresManager::toPropString(const string& text) const
|
||||||
|
{
|
||||||
|
string result = text;
|
||||||
|
size_t pos;
|
||||||
|
|
||||||
|
while ((pos = result.find(" ")) != std::string::npos) {
|
||||||
|
result.replace(pos, 1, "_");
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
string HighScoresManager::fromPropString(const string& text) const
|
||||||
|
{
|
||||||
|
string result = text;
|
||||||
|
size_t pos;
|
||||||
|
|
||||||
|
while ((pos = result.find("_")) != std::string::npos) {
|
||||||
|
result.replace(pos, 1, " ");
|
||||||
|
}
|
||||||
|
|
||||||
|
// some ugly formatting
|
||||||
|
char first = result[0];
|
||||||
|
result = BSPF::toLowerCase(result);
|
||||||
|
result[0] = first;
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
|
@ -53,6 +53,7 @@ namespace HSM {
|
||||||
string special;
|
string special;
|
||||||
bool specialBCD;
|
bool specialBCD;
|
||||||
bool specialZeroBased;
|
bool specialZeroBased;
|
||||||
|
string notes;
|
||||||
//bool armRAM;
|
//bool armRAM;
|
||||||
// Addresses
|
// Addresses
|
||||||
ScoreAddresses scoreAddr;
|
ScoreAddresses scoreAddr;
|
||||||
|
@ -121,6 +122,7 @@ class HighScoresManager
|
||||||
string formattedScore(Int32 score, Int32 width = -1) const;
|
string formattedScore(Int32 score, Int32 width = -1) const;
|
||||||
bool scoreInvert() const;
|
bool scoreInvert() const;
|
||||||
Int32 special() const;
|
Int32 special() const;
|
||||||
|
string notes() const;
|
||||||
|
|
||||||
// converts the given value, using only the maximum bits required by maxVal
|
// converts the given value, using only the maximum bits required by maxVal
|
||||||
// and adjusted for BCD and zero based data
|
// and adjusted for BCD and zero based data
|
||||||
|
@ -141,6 +143,7 @@ class HighScoresManager
|
||||||
IDX_SPECIAL_LABEL,
|
IDX_SPECIAL_LABEL,
|
||||||
IDX_SPECIAL_BCD,
|
IDX_SPECIAL_BCD,
|
||||||
IDX_SPECIAL_ZERO_BASED,
|
IDX_SPECIAL_ZERO_BASED,
|
||||||
|
IDX_NOTES,
|
||||||
};
|
};
|
||||||
enum {
|
enum {
|
||||||
IDX_VARS_ADDRESS = 0,
|
IDX_VARS_ADDRESS = 0,
|
||||||
|
@ -174,6 +177,7 @@ class HighScoresManager
|
||||||
string specialLabel(const Properties& props) const;
|
string specialLabel(const Properties& props) const;
|
||||||
bool specialBCD(const Properties& props) const;
|
bool specialBCD(const Properties& props) const;
|
||||||
bool specialZeroBased(const Properties& props) const;
|
bool specialZeroBased(const Properties& props) const;
|
||||||
|
string notes(const Properties& props) const;
|
||||||
//bool armRAM(const Properties& props) const;
|
//bool armRAM(const Properties& props) const;
|
||||||
|
|
||||||
// Calculate the number of bytes for one player's score from property parameters
|
// Calculate the number of bytes for one player's score from property parameters
|
||||||
|
@ -185,6 +189,8 @@ class HighScoresManager
|
||||||
string getPropIdx(const Properties& props, PropType type, uInt32 idx = 0) const;
|
string getPropIdx(const Properties& props, PropType type, uInt32 idx = 0) const;
|
||||||
|
|
||||||
Int32 fromBCD(uInt8 bcd) const;
|
Int32 fromBCD(uInt8 bcd) const;
|
||||||
|
string toPropString(const string& test) const;
|
||||||
|
string fromPropString(const string& test) const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
// Reference to the osystem object
|
// Reference to the osystem object
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
"Cart.Name" "draconian_20171013_RC6"
|
"Cart.Name" "draconian_20171013_RC6"
|
||||||
"Display.Phosphor" "YES"
|
"Display.Phosphor" "YES"
|
||||||
"Cart.Variations" "4"
|
"Cart.Variations" "4"
|
||||||
"Cart.Formats" "8,0,B,0,B,1,SECT.,D,1"
|
"Cart.Formats" "8,0,B,0,B,1,SECT.,D,1,VARIATIONS_ARE_DIFFICULTY_LEVEL"
|
||||||
"Cart.Addresses" "177B,177A,1779,1778,811,1780"
|
"Cart.Addresses" "177B,177A,1779,1778,811,1780"
|
||||||
""
|
""
|
||||||
|
|
||||||
|
@ -47,7 +47,7 @@
|
||||||
"Cart.Manufacturer" "Activision, Steve Cartwright"
|
"Cart.Manufacturer" "Activision, Steve Cartwright"
|
||||||
"Cart.ModelNo" "AX-022"
|
"Cart.ModelNo" "AX-022"
|
||||||
"Cart.Name" "Seaquest (1983) (Activision)"
|
"Cart.Name" "Seaquest (1983) (Activision)"
|
||||||
"Cart.Formats" "6"
|
"Cart.Formats" "6,0,B,0,B,0,_,B,0,HIGH_SCORE_IS_FROM_CURRENT_PLAYER"
|
||||||
"Cart.Addresses" "B8,B9,BA"
|
"Cart.Addresses" "B8,B9,BA"
|
||||||
""
|
""
|
||||||
|
|
||||||
|
@ -61,6 +61,15 @@
|
||||||
"Cart.Addresses" "FD,FE,FF,FC"
|
"Cart.Addresses" "FD,FE,FF,FC"
|
||||||
""
|
""
|
||||||
|
|
||||||
|
"Cart.MD5" "2903896d88a341511586d69fcfc20f7d"
|
||||||
|
"Cart.Manufacturer" "Activision, David Crane"
|
||||||
|
"Cart.ModelNo" "AX-014, AX-014-04"
|
||||||
|
"Cart.Name" "Grand Prix (1982) (Activision)"
|
||||||
|
"Cart.Variations" "4"
|
||||||
|
"Cart.Formats" "5,0,B,1,B,1,_,B,0,TIME/SCORE_SHOWS_EXTRA_DIGIT"
|
||||||
|
"Cart.Addresses" "EB,EC,ED,80"
|
||||||
|
""
|
||||||
|
|
||||||
"Cart.MD5" "2a0ba55e56e7a596146fa729acf0e109"
|
"Cart.MD5" "2a0ba55e56e7a596146fa729acf0e109"
|
||||||
"Cart.Manufacturer" "Activision, Bob Whitehead"
|
"Cart.Manufacturer" "Activision, Bob Whitehead"
|
||||||
"Cart.ModelNo" "AG-019"
|
"Cart.ModelNo" "AG-019"
|
||||||
|
@ -115,6 +124,15 @@
|
||||||
"Cart.Addresses" "D5,D6,D7"
|
"Cart.Addresses" "D5,D6,D7"
|
||||||
""
|
""
|
||||||
|
|
||||||
|
"Cart.MD5" "4ca73eb959299471788f0b685c3ba0b5"
|
||||||
|
"Cart.Manufacturer" "Activision, Steve Cartwright"
|
||||||
|
"Cart.ModelNo" "AX-031"
|
||||||
|
"Cart.Name" "Frostbite (1983) (Activision)"
|
||||||
|
"Cart.Variations" "4"
|
||||||
|
"Cart.Formats" "6,0,B,0,B,1,LEVEL,B,1"
|
||||||
|
"Cart.Addresses" "C8,C9,CA,80,CB"
|
||||||
|
""
|
||||||
|
|
||||||
"Cart.MD5" "515046e3061b7b18aa3a551c3ae12673"
|
"Cart.MD5" "515046e3061b7b18aa3a551c3ae12673"
|
||||||
"Cart.Manufacturer" "Atari - GCC, Mark Ackerman, Noellie Alito"
|
"Cart.Manufacturer" "Atari - GCC, Mark Ackerman, Noellie Alito"
|
||||||
"Cart.ModelNo" "CX2692"
|
"Cart.ModelNo" "CX2692"
|
||||||
|
@ -135,7 +153,9 @@
|
||||||
"Cart.Manufacturer" "Atari - GCC, Douglas B. Macrae"
|
"Cart.Manufacturer" "Atari - GCC, Douglas B. Macrae"
|
||||||
"Cart.ModelNo" "CX2677"
|
"Cart.ModelNo" "CX2677"
|
||||||
"Cart.Name" "Dig Dug (1983) (Atari)"
|
"Cart.Name" "Dig Dug (1983) (Atari)"
|
||||||
"Cart.Addresses" "F0FE,F0FD"
|
"Cart.Variations" "2"
|
||||||
|
"Cart.Formats" "4,0,B,0,B,1,_,B,0,VARIATION_1_IS_EASY;_2_IS_NORMAL"
|
||||||
|
"Cart.Addresses" "F0FE,F0FD,80"
|
||||||
""
|
""
|
||||||
|
|
||||||
"Cart.MD5" "72ffbef6504b75e69ee1045af9075f66"
|
"Cart.MD5" "72ffbef6504b75e69ee1045af9075f66"
|
||||||
|
@ -143,7 +163,7 @@
|
||||||
"Cart.ModelNo" "CX2632 - 49-75153"
|
"Cart.ModelNo" "CX2632 - 49-75153"
|
||||||
"Cart.Name" "Space Invaders (1980) (Atari)"
|
"Cart.Name" "Space Invaders (1980) (Atari)"
|
||||||
"Cart.Variations" "112"
|
"Cart.Variations" "112"
|
||||||
"Cart.Formats" "4,0,B,0,H,1"
|
"Cart.Formats" "4,0,B,0,D,1,_,B,0,ONLY_PLAYER_1_SUPPORTED"
|
||||||
"Cart.Addresses" "E6,E8,DC"
|
"Cart.Addresses" "E6,E8,DC"
|
||||||
""
|
""
|
||||||
|
|
||||||
|
@ -164,11 +184,21 @@
|
||||||
"Cart.Addresses" "C9,C8,C7"
|
"Cart.Addresses" "C9,C8,C7"
|
||||||
""
|
""
|
||||||
|
|
||||||
|
"Cart.MD5" "87e79cd41ce136fd4f72cc6e2c161bee"
|
||||||
|
"Cart.Manufacturer" "Atari - GCC, Mark Ackerman, Glenn Parker"
|
||||||
|
"Cart.ModelNo" "CX2675"
|
||||||
|
"Cart.Name" "Ms. Pac-Man (1983) (Atari)"
|
||||||
|
"Display.Phosphor" "YES"
|
||||||
|
"Cart.Variations" "4"
|
||||||
|
"Cart.Formats" "6,0,B,0,B,1,_,D,1,VARS_VALID_AT_GAME_OVER;_CHERRIES_=_VAR_#4"
|
||||||
|
"Cart.Addresses" "FA,F9,F8,F7,0"
|
||||||
|
""
|
||||||
|
|
||||||
"Cart.MD5" "91c2098e88a6b13f977af8c003e0bca5"
|
"Cart.MD5" "91c2098e88a6b13f977af8c003e0bca5"
|
||||||
"Cart.Manufacturer" "Atari - GCC"
|
"Cart.Manufacturer" "Atari - GCC"
|
||||||
"Cart.ModelNo" "CX2676"
|
"Cart.ModelNo" "CX2676"
|
||||||
"Cart.Name" "Centipede (1983) (Atari)"
|
"Cart.Name" "Centipede (1983) (Atari)"
|
||||||
"Cart.Formats" "6"
|
"Cart.Formats" "6,0,B,0,B,0,_,B,0,VARIATIONS_CANNOT_BE_DEFINED"
|
||||||
"Cart.Addresses" "F4,F5,F6"
|
"Cart.Addresses" "F4,F5,F6"
|
||||||
""
|
""
|
||||||
|
|
||||||
|
@ -180,6 +210,14 @@
|
||||||
"Cart.Addresses" "D4,D3,E5"
|
"Cart.Addresses" "D4,D3,E5"
|
||||||
""
|
""
|
||||||
|
|
||||||
|
"Cart.MD5" "94b92a882f6dbaa6993a46e2dcc58402"
|
||||||
|
"Cart.Manufacturer" "Activision, Larry Miller"
|
||||||
|
"Cart.ModelNo" "AX-026, AX-026-04"
|
||||||
|
"Cart.Name" "Enduro (1983) (Activision)"
|
||||||
|
"Cart.Formats" "6,0,B,0,B,0,DAY"
|
||||||
|
"Cart.Addresses" "AA,A9,A8,0,AD"
|
||||||
|
""
|
||||||
|
|
||||||
"Cart.MD5" "9ad36e699ef6f45d9eb6c4cf90475c9f"
|
"Cart.MD5" "9ad36e699ef6f45d9eb6c4cf90475c9f"
|
||||||
"Cart.Manufacturer" "Imagic, Dennis Koble"
|
"Cart.Manufacturer" "Imagic, Dennis Koble"
|
||||||
"Cart.ModelNo" "720103-1A, 720103-1B, IA3203, IX-010-04"
|
"Cart.ModelNo" "720103-1A, 720103-1B, IA3203, IX-010-04"
|
||||||
|
@ -206,8 +244,8 @@
|
||||||
"Cart.Name" "Decathlon (1983) (Activision)"
|
"Cart.Name" "Decathlon (1983) (Activision)"
|
||||||
"Cart.Rarity" "Rare"
|
"Cart.Rarity" "Rare"
|
||||||
"Cart.Variations" "10"
|
"Cart.Variations" "10"
|
||||||
"Cart.Formats" "4,0,B,0,D,1"
|
"Cart.Formats" "4,0,B,0,D,1,_,B,0,DECATHLON_&_100M_DASH_SHARE_VARIATION_1"
|
||||||
"Cart.Addresses" "95,96,80"
|
"Cart.Addresses" "95,96,80,0"
|
||||||
""
|
""
|
||||||
|
|
||||||
"Cart.MD5" "be929419902e21bd7830a7a7d746195d"
|
"Cart.MD5" "be929419902e21bd7830a7a7d746195d"
|
||||||
|
@ -233,7 +271,7 @@
|
||||||
"Cart.Name" "Yars' Revenge (1982) (Atari)"
|
"Cart.Name" "Yars' Revenge (1982) (Atari)"
|
||||||
"Display.Phosphor" "YES"
|
"Display.Phosphor" "YES"
|
||||||
"Cart.Variations" "8"
|
"Cart.Variations" "8"
|
||||||
"Cart.Formats" "6,0,B,0,B,1"
|
"Cart.Formats" "6,0,B,0,B,1,_,B,0,VARIATIONS_ARE_LARGER_BY_1"
|
||||||
"Cart.Addresses" "E0,E1,E2,80"
|
"Cart.Addresses" "E0,E1,E2,80"
|
||||||
""
|
""
|
||||||
|
|
||||||
|
@ -241,7 +279,7 @@
|
||||||
"Cart.Manufacturer" "Atari - GCC, Dave Payne"
|
"Cart.Manufacturer" "Atari - GCC, Dave Payne"
|
||||||
"Cart.ModelNo" "CX2669"
|
"Cart.ModelNo" "CX2669"
|
||||||
"Cart.Name" "Vanguard (1983) (Atari)"
|
"Cart.Name" "Vanguard (1983) (Atari)"
|
||||||
"Cart.Formats" "6"
|
"Cart.Formats" "6,0,B,0,B,0,_,B,0,SCORE_IS_FOR_CURRENT_PLAYER"
|
||||||
"Cart.Addresses" "99,98,97"
|
"Cart.Addresses" "99,98,97"
|
||||||
""
|
""
|
||||||
|
|
||||||
|
@ -252,8 +290,18 @@
|
||||||
"Cart.Rarity" "Common"
|
"Cart.Rarity" "Common"
|
||||||
"Display.Phosphor" "YES"
|
"Display.Phosphor" "YES"
|
||||||
"Cart.Variations" "66"
|
"Cart.Variations" "66"
|
||||||
"Cart.Formats" "5,1,0,B,D,0"
|
"Cart.Formats" "5,1,H,1,D,0,_,B,0,VARIATIONS_>_32_DIFFER_BY_1"
|
||||||
"Cart.Addresses" "BD,BE,80,C7"
|
"Cart.Addresses" "BD,BE,80"
|
||||||
|
""
|
||||||
|
|
||||||
|
"Cart.MD5" "d69559f9c9dc6ef528d841bf9d91b275"
|
||||||
|
"Cart.Manufacturer" "Activision, Alan Miller"
|
||||||
|
"Cart.ModelNo" "AX-016"
|
||||||
|
"Cart.Name" "StarMaster (1982) (Activision)"
|
||||||
|
"Cart.Note" "Use Color/BW switch to change between galactic chart and front views"
|
||||||
|
"Cart.Variations" "4"
|
||||||
|
"Cart.Formats" "4,0,B,0,B,1,_,B,0,SCORE_ONLY_CALCULATED_WHEN_GAME_IS_OVER"
|
||||||
|
"Cart.Addresses" "C1,C2,80"
|
||||||
""
|
""
|
||||||
|
|
||||||
"Cart.MD5" "dd7884b4f93cab423ac471aa1935e3df"
|
"Cart.MD5" "dd7884b4f93cab423ac471aa1935e3df"
|
||||||
|
@ -261,15 +309,15 @@
|
||||||
"Cart.ModelNo" "CX2649, 49-75163"
|
"Cart.ModelNo" "CX2649, 49-75163"
|
||||||
"Cart.Name" "Asteroids (1981) (Atari)"
|
"Cart.Name" "Asteroids (1981) (Atari)"
|
||||||
"Cart.Variations" "66"
|
"Cart.Variations" "66"
|
||||||
"Cart.Formats" "5,1,0,B,D,0"
|
"Cart.Formats" "5,1,H,1,D,0,_,B,0,VARIATIONS_>_32_DIFFER_BY_1"
|
||||||
"Cart.Addresses" "BD,BE,80,C7"
|
"Cart.Addresses" "BD,BE,80"
|
||||||
""
|
""
|
||||||
|
|
||||||
"Cart.MD5" "dde55d9868911407fe8b3fefef396f00"
|
"Cart.MD5" "dde55d9868911407fe8b3fefef396f00"
|
||||||
"Cart.Name" "Seawolf (2004) (Xype, Manuel Rotschkar)"
|
"Cart.Name" "Seawolf (2004) (Xype, Manuel Rotschkar)"
|
||||||
"Cart.Variations" "4"
|
"Cart.Variations" "4"
|
||||||
"Cart.Formats" "6"
|
"Cart.Formats" "6,0,B,0,B,0,_,B,0,USER_DEFINED_VARIATION_BASED_ON_SWITCHES"
|
||||||
"Cart.Addresses" "90,91,92,0"
|
"Cart.Addresses" "90,91,92,0,0"
|
||||||
""
|
""
|
||||||
|
|
||||||
"Cart.MD5" "f0e0addc07971561ab80d9abe1b8d333"
|
"Cart.MD5" "f0e0addc07971561ab80d9abe1b8d333"
|
||||||
|
@ -301,7 +349,7 @@
|
||||||
"Cart.Name" "Breakout (1978) (Atari)"
|
"Cart.Name" "Breakout (1978) (Atari)"
|
||||||
"Cart.Note" "Uses the Paddle Controllers"
|
"Cart.Note" "Uses the Paddle Controllers"
|
||||||
"Controller.MouseAxis" "01 60"
|
"Controller.MouseAxis" "01 60"
|
||||||
"Cart.Formats" "3"
|
"Cart.Formats" "3,0,B,0,B,0,_,B,0,VARIATIONS_CANNOT_BE_DEFINED"
|
||||||
"Cart.Addresses" "CE,CD"
|
"Cart.Addresses" "CE,CD"
|
||||||
""
|
""
|
||||||
|
|
||||||
|
|
|
@ -444,8 +444,9 @@ void GameInfoDialog::addHighScoresTab()
|
||||||
EditableWidget::TextFilter fVars = [](char c) {
|
EditableWidget::TextFilter fVars = [](char c) {
|
||||||
return (c >= '0' && c <= '9');
|
return (c >= '0' && c <= '9');
|
||||||
};
|
};
|
||||||
EditableWidget::TextFilter fSpecial = [](char c) {
|
|
||||||
return (c >= 'a' && c <= 'z') || (c >= '0' && c <= '9') || c == '.'|| c == '-';
|
EditableWidget::TextFilter fText = [](char c) {
|
||||||
|
return (c >= 'a' && c <= 'z') || (c >= ' ' && c < ',') || (c > ',' && c < '@');
|
||||||
};
|
};
|
||||||
|
|
||||||
xpos = HBORDER; ypos = VBORDER;
|
xpos = HBORDER; ypos = VBORDER;
|
||||||
|
@ -499,7 +500,7 @@ void GameInfoDialog::addHighScoresTab()
|
||||||
|
|
||||||
xpos += 20; ypos += lineHeight + VGAP;
|
xpos += 20; ypos += lineHeight + VGAP;
|
||||||
|
|
||||||
vwidth = _font.getStringWidth("AB") + 4;
|
vwidth = _font.getStringWidth("AB") + 3;
|
||||||
items.clear();
|
items.clear();
|
||||||
for (int i = 1; i <= HSM::MAX_SCORE_DIGITS; ++i)
|
for (int i = 1; i <= HSM::MAX_SCORE_DIGITS; ++i)
|
||||||
VarList::push_back(items, std::to_string(i), std::to_string(i));
|
VarList::push_back(items, std::to_string(i), std::to_string(i));
|
||||||
|
@ -553,13 +554,13 @@ void GameInfoDialog::addHighScoresTab()
|
||||||
myCurrentScore = new StaticTextWidget(myTab, _font, myCurrentScoreLabel->getRight(), ypos + 1,
|
myCurrentScore = new StaticTextWidget(myTab, _font, myCurrentScoreLabel->getRight(), ypos + 1,
|
||||||
"12345678");
|
"12345678");
|
||||||
|
|
||||||
xpos -= 20; ypos += lineHeight + VGAP * 4;
|
xpos -= 20; ypos += lineHeight + VGAP * 3;
|
||||||
|
|
||||||
vwidth = _font.getStringWidth("123") + 4;
|
vwidth = _font.getStringWidth("123") + 4;
|
||||||
mySpecialLabel = new StaticTextWidget(myTab, _font, xpos, ypos + 1, "Special");
|
mySpecialLabel = new StaticTextWidget(myTab, _font, xpos, ypos + 1, "Special");
|
||||||
mySpecialName = new EditTextWidget(myTab, _font, mySpecialLabel->getRight() + 19, ypos - 1,
|
mySpecialName = new EditTextWidget(myTab, _font, mySpecialLabel->getRight() + 19, ypos - 1,
|
||||||
swidth, lineHeight);
|
swidth, lineHeight);
|
||||||
mySpecialName->setTextFilter(fSpecial);
|
mySpecialName->setTextFilter(fText);
|
||||||
wid.push_back(mySpecialName);
|
wid.push_back(mySpecialName);
|
||||||
|
|
||||||
mySpecialAddressLabel = new StaticTextWidget(myTab, _font, myVarAddressLabel->getLeft(),
|
mySpecialAddressLabel = new StaticTextWidget(myTab, _font, myVarAddressLabel->getLeft(),
|
||||||
|
@ -580,6 +581,14 @@ void GameInfoDialog::addHighScoresTab()
|
||||||
"0-based", kHiScoresChanged);
|
"0-based", kHiScoresChanged);
|
||||||
wid.push_back(mySpecialZeroBased);
|
wid.push_back(mySpecialZeroBased);
|
||||||
|
|
||||||
|
ypos += lineHeight + VGAP * 3;
|
||||||
|
|
||||||
|
myHighScoreNotesLabel = new StaticTextWidget(myTab, _font, xpos, ypos + 1, "Notes");
|
||||||
|
myHighScoreNotes = new EditTextWidget(myTab, _font, mySpecialName->getLeft(), ypos - 1,
|
||||||
|
_w - HBORDER - mySpecialName->getLeft() - 2 , lineHeight);
|
||||||
|
myHighScoreNotes->setTextFilter(fText);
|
||||||
|
wid.push_back(myHighScoreNotes);
|
||||||
|
|
||||||
// Add items for tab 4
|
// Add items for tab 4
|
||||||
addToFocusList(wid, myTab, tabID);
|
addToFocusList(wid, myTab, tabID);
|
||||||
}
|
}
|
||||||
|
@ -785,6 +794,8 @@ void GameInfoDialog::loadHighScoresProperties(const Properties& props)
|
||||||
mySpecialBCD->setState(info.specialBCD);
|
mySpecialBCD->setState(info.specialBCD);
|
||||||
mySpecialZeroBased->setState(info.specialZeroBased);
|
mySpecialZeroBased->setState(info.specialZeroBased);
|
||||||
|
|
||||||
|
myHighScoreNotes->setText(info.notes);
|
||||||
|
|
||||||
ss.str("");
|
ss.str("");
|
||||||
ss << hex << right //<< setw(HSM::MAX_ADDR_CHARS) << setfill(' ')
|
ss << hex << right //<< setw(HSM::MAX_ADDR_CHARS) << setfill(' ')
|
||||||
<< uppercase << info.varsAddr;
|
<< uppercase << info.varsAddr;
|
||||||
|
@ -898,15 +909,17 @@ void GameInfoDialog::saveHighScoresProperties()
|
||||||
info.varsZeroBased = myVarsZeroBased->getState();
|
info.varsZeroBased = myVarsZeroBased->getState();
|
||||||
info.varsBCD = myVarsBCD->getState();
|
info.varsBCD = myVarsBCD->getState();
|
||||||
|
|
||||||
info.special = mySpecialName->getText();
|
|
||||||
info.specialZeroBased = mySpecialZeroBased->getState();
|
|
||||||
info.specialBCD = mySpecialBCD->getState();
|
|
||||||
|
|
||||||
info.numDigits = myScoreDigits->getSelected() + 1;
|
info.numDigits = myScoreDigits->getSelected() + 1;
|
||||||
info.trailingZeroes = myTrailingZeroes->getSelected();
|
info.trailingZeroes = myTrailingZeroes->getSelected();
|
||||||
info.scoreBCD = myScoreBCD->getState();
|
info.scoreBCD = myScoreBCD->getState();
|
||||||
info.scoreInvert = myScoreInvert->getState();
|
info.scoreInvert = myScoreInvert->getState();
|
||||||
|
|
||||||
|
info.special = mySpecialName->getText();
|
||||||
|
info.specialZeroBased = mySpecialZeroBased->getState();
|
||||||
|
info.specialBCD = mySpecialBCD->getState();
|
||||||
|
|
||||||
|
info.notes = myHighScoreNotes->getText();
|
||||||
|
|
||||||
// fill addresses
|
// fill addresses
|
||||||
string strAddr;
|
string strAddr;
|
||||||
|
|
||||||
|
@ -1097,16 +1110,6 @@ void GameInfoDialog::updateHighScoresWidgets()
|
||||||
myVarsBCD->setEnabled(enableVars && stringToInt(myVariations->getText(), 1) >= 10);
|
myVarsBCD->setEnabled(enableVars && stringToInt(myVariations->getText(), 1) >= 10);
|
||||||
myVarsZeroBased->setEnabled(enableVars);
|
myVarsZeroBased->setEnabled(enableVars);
|
||||||
|
|
||||||
mySpecialLabel->setEnabled(enable);
|
|
||||||
mySpecialName->setEnabled(enable);
|
|
||||||
mySpecialName->setEditable(enable);
|
|
||||||
mySpecialAddressLabel->setEnabled(enableSpecial);
|
|
||||||
mySpecialAddress->setEnabled(enableSpecial);
|
|
||||||
mySpecialAddress->setEditable(enableSpecial);
|
|
||||||
mySpecialAddressVal->setEnabled(enableSpecial && enableConsole);
|
|
||||||
mySpecialBCD->setEnabled(enableSpecial);
|
|
||||||
mySpecialZeroBased->setEnabled(enableSpecial);
|
|
||||||
|
|
||||||
myScoreLabel->setEnabled(enable);
|
myScoreLabel->setEnabled(enable);
|
||||||
myScoreDigitsLabel->setEnabled(enable);
|
myScoreDigitsLabel->setEnabled(enable);
|
||||||
myScoreDigits->setEnabled(enable);
|
myScoreDigits->setEnabled(enable);
|
||||||
|
@ -1126,6 +1129,19 @@ void GameInfoDialog::updateHighScoresWidgets()
|
||||||
myCurrentScoreLabel->setEnabled(enable && enableConsole);
|
myCurrentScoreLabel->setEnabled(enable && enableConsole);
|
||||||
myCurrentScore->setEnabled(enable && enableConsole);
|
myCurrentScore->setEnabled(enable && enableConsole);
|
||||||
|
|
||||||
|
mySpecialLabel->setEnabled(enable);
|
||||||
|
mySpecialName->setEnabled(enable);
|
||||||
|
mySpecialName->setEditable(enable);
|
||||||
|
mySpecialAddressLabel->setEnabled(enableSpecial);
|
||||||
|
mySpecialAddress->setEnabled(enableSpecial);
|
||||||
|
mySpecialAddress->setEditable(enableSpecial);
|
||||||
|
mySpecialAddressVal->setEnabled(enableSpecial && enableConsole);
|
||||||
|
mySpecialBCD->setEnabled(enableSpecial);
|
||||||
|
mySpecialZeroBased->setEnabled(enableSpecial);
|
||||||
|
|
||||||
|
myHighScoreNotesLabel->setEnabled(enable);
|
||||||
|
myHighScoreNotes->setEnabled(enable);
|
||||||
|
|
||||||
// verify and update widget data
|
// verify and update widget data
|
||||||
|
|
||||||
// update variations RAM value
|
// update variations RAM value
|
||||||
|
|
|
@ -132,14 +132,6 @@ class GameInfoDialog : public Dialog, public CommandSender
|
||||||
CheckboxWidget* myVarsBCD{nullptr};
|
CheckboxWidget* myVarsBCD{nullptr};
|
||||||
CheckboxWidget* myVarsZeroBased{nullptr};
|
CheckboxWidget* myVarsZeroBased{nullptr};
|
||||||
|
|
||||||
StaticTextWidget* mySpecialLabel{nullptr};
|
|
||||||
EditTextWidget* mySpecialName{nullptr};
|
|
||||||
StaticTextWidget* mySpecialAddressLabel{nullptr};
|
|
||||||
EditTextWidget* mySpecialAddress{nullptr};
|
|
||||||
EditTextWidget* mySpecialAddressVal{nullptr};
|
|
||||||
CheckboxWidget* mySpecialBCD{nullptr};
|
|
||||||
CheckboxWidget* mySpecialZeroBased{nullptr};
|
|
||||||
|
|
||||||
StaticTextWidget* myScoreLabel{nullptr};
|
StaticTextWidget* myScoreLabel{nullptr};
|
||||||
StaticTextWidget* myScoreDigitsLabel{nullptr};
|
StaticTextWidget* myScoreDigitsLabel{nullptr};
|
||||||
PopUpWidget* myScoreDigits{nullptr};
|
PopUpWidget* myScoreDigits{nullptr};
|
||||||
|
@ -154,6 +146,17 @@ class GameInfoDialog : public Dialog, public CommandSender
|
||||||
StaticTextWidget* myCurrentScoreLabel{nullptr};
|
StaticTextWidget* myCurrentScoreLabel{nullptr};
|
||||||
StaticTextWidget* myCurrentScore{nullptr};
|
StaticTextWidget* myCurrentScore{nullptr};
|
||||||
|
|
||||||
|
StaticTextWidget* mySpecialLabel{nullptr};
|
||||||
|
EditTextWidget* mySpecialName{nullptr};
|
||||||
|
StaticTextWidget* mySpecialAddressLabel{nullptr};
|
||||||
|
EditTextWidget* mySpecialAddress{nullptr};
|
||||||
|
EditTextWidget* mySpecialAddressVal{nullptr};
|
||||||
|
CheckboxWidget* mySpecialBCD{nullptr};
|
||||||
|
CheckboxWidget* mySpecialZeroBased{nullptr};
|
||||||
|
|
||||||
|
StaticTextWidget* myHighScoreNotesLabel{nullptr};
|
||||||
|
EditTextWidget* myHighScoreNotes{nullptr};
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
kVCenterChanged = 'Vcch',
|
kVCenterChanged = 'Vcch',
|
||||||
kPhosphorChanged = 'PPch',
|
kPhosphorChanged = 'PPch',
|
||||||
|
|
|
@ -72,7 +72,8 @@ HighScoresDialog::HighScoresDialog(OSystem& osystem, DialogContainer& parent,
|
||||||
{
|
{
|
||||||
const GUI::Font& ifont = instance().frameBuffer().infoFont();
|
const GUI::Font& ifont = instance().frameBuffer().infoFont();
|
||||||
const int lineHeight = _font.getLineHeight(),
|
const int lineHeight = _font.getLineHeight(),
|
||||||
fontWidth = _font.getMaxCharWidth();
|
fontWidth = _font.getMaxCharWidth(),
|
||||||
|
infoLineHeight = ifont.getLineHeight();
|
||||||
const int VBORDER = 10;
|
const int VBORDER = 10;
|
||||||
const int HBORDER = 10;
|
const int HBORDER = 10;
|
||||||
const int VGAP = 4;
|
const int VGAP = 4;
|
||||||
|
@ -135,12 +136,17 @@ HighScoresDialog::HighScoresDialog(OSystem& osystem, DialogContainer& parent,
|
||||||
|
|
||||||
ypos += lineHeight + VGAP;
|
ypos += lineHeight + VGAP;
|
||||||
}
|
}
|
||||||
ypos += VGAP * 2;
|
ypos += VGAP;
|
||||||
|
|
||||||
myMD5Widget = new StaticTextWidget(this, ifont, xpos, ypos + 1, "MD5: 12345678901234567890123456789012");
|
_w = myDeleteButtons[0]->getRight() + HBORDER;
|
||||||
|
myNotesWidget = new StaticTextWidget(this, ifont, xpos, ypos + 1, _w - HBORDER * 2,
|
||||||
|
infoLineHeight, "Note: ");
|
||||||
|
|
||||||
|
ypos += infoLineHeight + VGAP;
|
||||||
|
|
||||||
|
myMD5Widget = new StaticTextWidget(this, ifont, xpos, ypos + 1, "MD5: 12345678901234567890123456789012");
|
||||||
|
|
||||||
_h = myMD5Widget->getBottom() + VBORDER + buttonHeight(_font) + VBORDER;
|
_h = myMD5Widget->getBottom() + VBORDER + buttonHeight(_font) + VBORDER;
|
||||||
_w = myDeleteButtons[0]->getRight() + HBORDER;
|
|
||||||
|
|
||||||
myGameNameWidget = new StaticTextWidget(this, _font, HBORDER, VBORDER + _th + 1,
|
myGameNameWidget = new StaticTextWidget(this, _font, HBORDER, VBORDER + _th + 1,
|
||||||
_w - HBORDER * 2, lineHeight);
|
_w - HBORDER * 2, lineHeight);
|
||||||
|
@ -201,12 +207,14 @@ void HighScoresDialog::loadConfig()
|
||||||
label = label.substr(label.length() - 5);
|
label = label.substr(label.length() - 5);
|
||||||
mySpecialLabelWidget->setLabel(label);
|
mySpecialLabelWidget->setLabel(label);
|
||||||
|
|
||||||
|
myNotesWidget->setLabel("Note: " + instance().highScores().notes());
|
||||||
|
|
||||||
if (instance().hasConsole())
|
if (instance().hasConsole())
|
||||||
myMD5 = instance().console().properties().get(PropType::Cart_MD5);
|
myMD5 = instance().console().properties().get(PropType::Cart_MD5);
|
||||||
else
|
else
|
||||||
myMD5 = instance().launcher().selectedRomMD5();
|
myMD5 = instance().launcher().selectedRomMD5();
|
||||||
|
|
||||||
myMD5Widget->setLabel("MD5: " + myMD5);
|
myMD5Widget->setLabel("MD5: " + myMD5);
|
||||||
|
|
||||||
// requires the current MD5
|
// requires the current MD5
|
||||||
myGameNameWidget->setLabel(cartName());
|
myGameNameWidget->setLabel(cartName());
|
||||||
|
|
|
@ -129,6 +129,7 @@ class HighScoresDialog : public Dialog
|
||||||
StaticTextWidget* myDateWidgets[NUM_RANKS]{nullptr};
|
StaticTextWidget* myDateWidgets[NUM_RANKS]{nullptr};
|
||||||
ButtonWidget* myDeleteButtons[NUM_RANKS]{nullptr};
|
ButtonWidget* myDeleteButtons[NUM_RANKS]{nullptr};
|
||||||
|
|
||||||
|
StaticTextWidget* myNotesWidget{nullptr};
|
||||||
StaticTextWidget* myMD5Widget{nullptr};
|
StaticTextWidget* myMD5Widget{nullptr};
|
||||||
|
|
||||||
Menu::AppMode myMode{Menu::AppMode::emulator};
|
Menu::AppMode myMode{Menu::AppMode::emulator};
|
||||||
|
|
Loading…
Reference in New Issue