mirror of
https://github.com/TerryCavanagh/VVVVVV.git
synced 2024-12-23 10:09:43 +01:00
Remove usage of std::string from MenuOption
Instead, the string in MenuOption is just a buffer of 161 chars, which is 40 chars (160 bytes if each were the largest possible UTF-8 character size) plus a null terminator. This is because the maximum length of a menu option that can be fit on the screen without going past is 40 chars.
This commit is contained in:
parent
5fb0b4396a
commit
8366e08fbe
3 changed files with 59 additions and 33 deletions
|
@ -6766,27 +6766,39 @@ void Game::createmenu( enum Menu::MenuName t, bool samemenu/*= false*/ )
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
std::string text;
|
const char* prefix;
|
||||||
if(tvar>=0)
|
if(tvar>=0)
|
||||||
{
|
{
|
||||||
if(customlevelstats[tvar].score==0)
|
switch (customlevelstats[tvar].score)
|
||||||
{
|
{
|
||||||
text = " " + ed.ListOfMetaData[i].title;
|
case 0:
|
||||||
|
{
|
||||||
|
static const char tmp[] = " ";
|
||||||
|
prefix = tmp;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
else if(customlevelstats[tvar].score==1)
|
case 1:
|
||||||
{
|
{
|
||||||
text = " * " + ed.ListOfMetaData[i].title;
|
static const char tmp[] = " * ";
|
||||||
|
prefix = tmp;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
else if(customlevelstats[tvar].score==3)
|
case 3:
|
||||||
{
|
{
|
||||||
text = "** " + ed.ListOfMetaData[i].title;
|
static const char tmp[] = "** ";
|
||||||
|
prefix = tmp;
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
text = " " + ed.ListOfMetaData[i].title;
|
static const char tmp[] = " ";
|
||||||
|
prefix = tmp;
|
||||||
}
|
}
|
||||||
for (size_t ii = 0; ii < text.length(); ii++)
|
char text[menutextbytes];
|
||||||
|
SDL_snprintf(text, sizeof(text), "%s%s", prefix, ed.ListOfMetaData[i].title.c_str());
|
||||||
|
for (size_t ii = 0; ii < SDL_arraysize(text); ii++)
|
||||||
{
|
{
|
||||||
text[ii] = SDL_tolower(text[ii]);
|
text[ii] = SDL_tolower(text[ii]);
|
||||||
}
|
}
|
||||||
|
|
|
@ -10,7 +10,8 @@
|
||||||
|
|
||||||
struct MenuOption
|
struct MenuOption
|
||||||
{
|
{
|
||||||
std::string text;
|
char text[161]; // 40 chars (160 bytes) covers the entire screen, + 1 more for null terminator
|
||||||
|
// WARNING: should match Game::menutextbytes below
|
||||||
bool active;
|
bool active;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -225,12 +226,13 @@ public:
|
||||||
int current_credits_list_index;
|
int current_credits_list_index;
|
||||||
int menuxoff, menuyoff;
|
int menuxoff, menuyoff;
|
||||||
int menuspacing;
|
int menuspacing;
|
||||||
|
static const int menutextbytes = 161; // this is just sizeof(MenuOption::text), but doing that is non-standard
|
||||||
std::vector<MenuStackFrame> menustack;
|
std::vector<MenuStackFrame> menustack;
|
||||||
|
|
||||||
void inline option(std::string text, bool active = true)
|
void inline option(const char* text, bool active = true)
|
||||||
{
|
{
|
||||||
MenuOption menuoption;
|
MenuOption menuoption;
|
||||||
menuoption.text = text;
|
SDL_strlcpy(menuoption.text, text, sizeof(menuoption.text));
|
||||||
menuoption.active = active;
|
menuoption.active = active;
|
||||||
menuoptions.push_back(menuoption);
|
menuoptions.push_back(menuoption);
|
||||||
}
|
}
|
||||||
|
|
|
@ -1302,20 +1302,24 @@ void Graphics::drawmenu( int cr, int cg, int cb )
|
||||||
//Draw it highlighted
|
//Draw it highlighted
|
||||||
if (game.menuoptions[i].active)
|
if (game.menuoptions[i].active)
|
||||||
{
|
{
|
||||||
std::string tempstring = game.menuoptions[i].text;
|
char tempstring[Game::menutextbytes];
|
||||||
for (size_t ii = 0; ii < tempstring.length(); ii++)
|
SDL_strlcpy(tempstring, game.menuoptions[i].text, sizeof(tempstring));
|
||||||
|
for (size_t ii = 0; ii < SDL_arraysize(tempstring); ii++)
|
||||||
{
|
{
|
||||||
tempstring[ii] = SDL_toupper(tempstring[ii]);
|
tempstring[ii] = SDL_toupper(tempstring[ii]);
|
||||||
}
|
}
|
||||||
tempstring = std::string("[ ") + tempstring + std::string(" ]");
|
char buffer[Game::menutextbytes];
|
||||||
Print((i * game.menuspacing) - 16 +game.menuxoff, 140 + (i * 12) +game.menuyoff, tempstring, cr, cg, cb);
|
SDL_snprintf(buffer, sizeof(buffer), "[ %s ]", tempstring);
|
||||||
|
Print((i * game.menuspacing) - 16 +game.menuxoff, 140 + (i * 12) +game.menuyoff, buffer, cr, cg, cb);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
std::string tempstring = game.menuoptions[i].text;
|
char tempstring[Game::menutextbytes];
|
||||||
tempstring = "[ " + tempstring + " ]";
|
SDL_strlcpy(tempstring, game.menuoptions[i].text, sizeof(tempstring));
|
||||||
|
char buffer[Game::menutextbytes];
|
||||||
|
SDL_snprintf(buffer, sizeof(buffer), "[ %s ]", tempstring);
|
||||||
//Draw it in gray
|
//Draw it in gray
|
||||||
Print((i * game.menuspacing) - 16 +game.menuxoff, 140 + (i * 12)+game.menuyoff, tempstring, 128, 128, 128);
|
Print((i * game.menuspacing) - 16 +game.menuxoff, 140 + (i * 12)+game.menuyoff, buffer, 128, 128, 128);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -1344,39 +1348,47 @@ void Graphics::drawlevelmenu( int cr, int cg, int cb )
|
||||||
//Draw it highlighted
|
//Draw it highlighted
|
||||||
if (game.menuoptions[i].active)
|
if (game.menuoptions[i].active)
|
||||||
{
|
{
|
||||||
std::string tempstring = game.menuoptions[i].text;
|
char tempstring[Game::menutextbytes];
|
||||||
for (size_t ii = 0; ii < tempstring.length(); ii++)
|
SDL_strlcpy(tempstring, game.menuoptions[i].text, sizeof(tempstring));
|
||||||
|
for (size_t ii = 0; ii < SDL_arraysize(tempstring); ii++)
|
||||||
{
|
{
|
||||||
tempstring[ii] = SDL_toupper(tempstring[ii]);
|
tempstring[ii] = SDL_toupper(tempstring[ii]);
|
||||||
}
|
}
|
||||||
tempstring = std::string("[ ") + tempstring + std::string(" ]");
|
char buffer[Game::menutextbytes];
|
||||||
Print((i * game.menuspacing) - 16 +game.menuxoff, 140+8 + (i * 12) +game.menuyoff, tempstring, cr, cg, cb);
|
SDL_snprintf(buffer, sizeof(buffer), "[ %s ]", tempstring);
|
||||||
|
Print((i * game.menuspacing) - 16 +game.menuxoff, 140+8 + (i * 12) +game.menuyoff, buffer, cr, cg, cb);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
std::string tempstring = game.menuoptions[i].text;
|
char tempstring[Game::menutextbytes];
|
||||||
tempstring = "[ " + tempstring + " ]";
|
SDL_strlcpy(tempstring, game.menuoptions[i].text, sizeof(tempstring));
|
||||||
|
char buffer[Game::menutextbytes];
|
||||||
|
SDL_snprintf(buffer, sizeof(buffer), "[ %s ]", tempstring);
|
||||||
//Draw it in gray
|
//Draw it in gray
|
||||||
Print((i * game.menuspacing) - 16 +game.menuxoff, 140+8 + (i * 12)+game.menuyoff, tempstring, 128, 128, 128);
|
Print((i * game.menuspacing) - 16 +game.menuxoff, 140+8 + (i * 12)+game.menuyoff, buffer, 128, 128, 128);
|
||||||
}
|
}
|
||||||
}else{
|
}else{
|
||||||
//Draw it highlighted
|
//Draw it highlighted
|
||||||
if (game.menuoptions[i].active)
|
if (game.menuoptions[i].active)
|
||||||
{
|
{
|
||||||
std::string tempstring = game.menuoptions[i].text;
|
char tempstring[Game::menutextbytes];
|
||||||
for (size_t ii = 0; ii < tempstring.length(); ii++)
|
SDL_strlcpy(tempstring, game.menuoptions[i].text, sizeof(tempstring));
|
||||||
|
for (size_t ii = 0; ii < SDL_arraysize(tempstring); ii++)
|
||||||
{
|
{
|
||||||
tempstring[ii] = SDL_toupper(tempstring[ii]);
|
tempstring[ii] = SDL_toupper(tempstring[ii]);
|
||||||
}
|
}
|
||||||
tempstring = std::string("[ ") + tempstring + std::string(" ]");
|
char buffer[Game::menutextbytes];
|
||||||
Print((i * game.menuspacing) - 16 +game.menuxoff, 144 + (i * 12) +game.menuyoff, tempstring, cr, cg, cb);
|
SDL_snprintf(buffer, sizeof(buffer), "[ %s ]", tempstring);
|
||||||
|
Print((i * game.menuspacing) - 16 +game.menuxoff, 144 + (i * 12) +game.menuyoff, buffer, cr, cg, cb);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
std::string tempstring = game.menuoptions[i].text;
|
char tempstring[Game::menutextbytes];
|
||||||
tempstring = "[ " + tempstring + " ]";
|
SDL_strlcpy(tempstring, game.menuoptions[i].text, sizeof(tempstring));
|
||||||
|
char buffer[Game::menutextbytes];
|
||||||
|
SDL_snprintf(buffer, sizeof(buffer), "[ %s ]", tempstring);
|
||||||
//Draw it in gray
|
//Draw it in gray
|
||||||
Print((i * game.menuspacing) - 16 +game.menuxoff, 144 + (i * 12)+game.menuyoff, tempstring, 128, 128, 128);
|
Print((i * game.menuspacing) - 16 +game.menuxoff, 144 + (i * 12)+game.menuyoff, buffer, 128, 128, 128);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue