mirror of
https://github.com/TerryCavanagh/VVVVVV.git
synced 2024-11-05 18:59:41 +01:00
ea8053303d
This fixes a source of undefined behavior, where the int returned by ss_toi() would be random garbage memory if the string passed into it would be empty. That's because if the string is empty, there are no characters to parse, so nothing simply gets put into x. The easiest way to pass an empty string in to ss_toi() would be to use script commands with empty arguments.
209 lines
3.7 KiB
C++
209 lines
3.7 KiB
C++
#include "UtilityClass.h"
|
|
|
|
#include "SDL.h"
|
|
|
|
#include <sstream>
|
|
|
|
/* Used by UtilityClass::GCString to generate a button list */
|
|
const char *GCChar(SDL_GameControllerButton button)
|
|
{
|
|
if (button == SDL_CONTROLLER_BUTTON_A)
|
|
{
|
|
return "A";
|
|
}
|
|
else if (button == SDL_CONTROLLER_BUTTON_B)
|
|
{
|
|
return "B";
|
|
}
|
|
else if (button == SDL_CONTROLLER_BUTTON_X)
|
|
{
|
|
return "X";
|
|
}
|
|
else if (button == SDL_CONTROLLER_BUTTON_Y)
|
|
{
|
|
return "Y";
|
|
}
|
|
else if (button == SDL_CONTROLLER_BUTTON_BACK)
|
|
{
|
|
return "BACK";
|
|
}
|
|
else if (button == SDL_CONTROLLER_BUTTON_GUIDE)
|
|
{
|
|
return "GUIDE";
|
|
}
|
|
else if (button == SDL_CONTROLLER_BUTTON_START)
|
|
{
|
|
return "START";
|
|
}
|
|
else if (button == SDL_CONTROLLER_BUTTON_LEFTSTICK)
|
|
{
|
|
return "L3";
|
|
}
|
|
else if (button == SDL_CONTROLLER_BUTTON_RIGHTSTICK)
|
|
{
|
|
return "R3";
|
|
}
|
|
else if (button == SDL_CONTROLLER_BUTTON_LEFTSHOULDER)
|
|
{
|
|
return "LB";
|
|
}
|
|
else if (button == SDL_CONTROLLER_BUTTON_RIGHTSHOULDER)
|
|
{
|
|
return "RB";
|
|
}
|
|
SDL_assert(0 && "Unhandled button!");
|
|
return NULL;
|
|
}
|
|
|
|
int ss_toi( std::string _s )
|
|
{
|
|
std::istringstream i(_s);
|
|
int x = 0;
|
|
i >> x;
|
|
return x;
|
|
}
|
|
|
|
std::vector<std::string> split( const std::string &s, char delim, std::vector<std::string> &elems )
|
|
{
|
|
std::stringstream ss(s);
|
|
std::string item;
|
|
while(std::getline(ss, item, delim))
|
|
{
|
|
elems.push_back(item);
|
|
}
|
|
return elems;
|
|
}
|
|
|
|
std::vector<std::string> split( const std::string &s, char delim )
|
|
{
|
|
std::vector<std::string> elems;
|
|
return split(s, delim, elems);
|
|
}
|
|
|
|
UtilityClass::UtilityClass() :
|
|
glow(0),
|
|
glowdir(0)
|
|
{
|
|
for (int i = 0; i < 30; i++)
|
|
{
|
|
splitseconds.push_back(int((i * 100) / 30));
|
|
}
|
|
|
|
slowsine = 0;
|
|
globaltemp = 0;
|
|
temp = 0;
|
|
temp2 = 0;
|
|
}
|
|
|
|
std::string UtilityClass::String( int _v )
|
|
{
|
|
std::ostringstream os;
|
|
os << _v;
|
|
return(os.str());
|
|
}
|
|
|
|
std::string UtilityClass::GCString(std::vector<SDL_GameControllerButton> buttons)
|
|
{
|
|
std::string retval = "";
|
|
for (size_t i = 0; i < buttons.size(); i += 1)
|
|
{
|
|
retval += GCChar(buttons[i]);
|
|
if ((i + 1) < buttons.size())
|
|
{
|
|
retval += ",";
|
|
}
|
|
}
|
|
return retval;
|
|
}
|
|
|
|
std::string UtilityClass::twodigits( int t )
|
|
{
|
|
if (t < 10)
|
|
{
|
|
return "0" + String(t);
|
|
}
|
|
if (t >= 100)
|
|
{
|
|
return "??";
|
|
}
|
|
return String(t);
|
|
}
|
|
|
|
std::string UtilityClass::timestring( int t )
|
|
{
|
|
//given a time t in frames, return a time in seconds
|
|
tempstring = "";
|
|
temp = (t - (t % 30)) / 30;
|
|
if (temp < 60) //less than one minute
|
|
{
|
|
t = t % 30;
|
|
tempstring = String(temp) + ":" + twodigits(splitseconds[t]);
|
|
}
|
|
else
|
|
{
|
|
temp2 = (temp - (temp % 60)) / 60;
|
|
temp = temp % 60;
|
|
t = t % 30;
|
|
tempstring = String(temp2) + ":" + twodigits(temp) + ":" + twodigits(splitseconds[t]);
|
|
}
|
|
return tempstring;
|
|
}
|
|
|
|
std::string UtilityClass::number( int _t )
|
|
{
|
|
const std::string ones_place[] = {"One", "Two", "Three", "Four", "Five", "Six", "Seven", "Eight", "Nine"};
|
|
const std::string tens_place[] = {"Ten", "Twenty", "Thirty", "Forty", "Fifty", "Sixty", "Seventy", "Eighty", "Ninety"};
|
|
const std::string teens[] = {"Eleven", "Twelve", "Thirteen", "Fourteen", "Fifteen", "Sixteen", "Seventeen", "Eighteen", "Nineteen"};
|
|
|
|
if (_t < 0)
|
|
{
|
|
return "???";
|
|
}
|
|
else if (_t > 100)
|
|
{
|
|
return "Lots";
|
|
}
|
|
else if (_t == 0)
|
|
{
|
|
return "Zero";
|
|
}
|
|
else if (_t == 100)
|
|
{
|
|
return "One Hundred";
|
|
}
|
|
else if (_t >= 1 && _t <= 9)
|
|
{
|
|
return ones_place[_t-1];
|
|
}
|
|
else if (_t >= 11 && _t <= 19)
|
|
{
|
|
return teens[_t-11];
|
|
}
|
|
else if (_t % 10 == 0)
|
|
{
|
|
return tens_place[(_t/10)-1];
|
|
}
|
|
else
|
|
{
|
|
return tens_place[(_t/10)-1] + " " + ones_place[(_t%10)-1];
|
|
}
|
|
}
|
|
|
|
bool UtilityClass::intersects( SDL_Rect A, SDL_Rect B )
|
|
{
|
|
return (SDL_HasIntersection(&A, &B) == SDL_TRUE);
|
|
}
|
|
|
|
void UtilityClass::updateglow()
|
|
{
|
|
slowsine++;
|
|
if (slowsine >= 64) slowsine = 0;
|
|
|
|
if (glowdir == 0) {
|
|
glow+=2;
|
|
if (glow >= 62) glowdir = 1;
|
|
}else {
|
|
glow-=2;
|
|
if (glow < 2) glowdir = 0;
|
|
}
|
|
}
|