einstein/topscores.cpp

176 lines
4.4 KiB
C++

#include "topscores.h"
#include "storage.h"
#include "utils.h"
#include "font.h"
#include "convert.h"
#include "messages.h"
TopScores::TopScores()
{
Storage *storage = getStorage();
for (int i = 0; i < MAX_SCORES; i++) {
int score = storage->get(L"top_score_" + toString(i), -1);
if (score < 0)
break;
std::wstring name = storage->get(L"top_name_" + toString(i), L"");
add(name, score);
}
modifed = false;
}
TopScores::~TopScores()
{
save();
}
int TopScores::add(const std::wstring &name, int score)
{
if (score >= getMaxScore() || (scores.size() < 1)) {
if (! isFull()) {
Entry e = { name, score };
scores.push_back(e);
modifed = true;
return scores.size() - 1;
}
return -1;
}
int pos = 0;
for (ScoresList::iterator i = scores.begin(); i != scores.end(); i++) {
Entry &e = *i;
if (e.score > score) {
Entry ne = { name, score };
scores.insert(i, ne);
modifed = true;
break;
}
pos++;
}
while (scores.size() > MAX_SCORES) {
modifed = true;
scores.erase(--scores.end());
}
return modifed ? pos : -1;
}
void TopScores::save()
{
if (! modifed)
return;
Storage *storage = getStorage();
int no = 0;
for (ScoresList::iterator i = scores.begin(); i != scores.end(); i++) {
Entry &e = *i;
storage->set(L"top_name_" + toString(no), e.name);
storage->set(L"top_score_" + toString(no), e.score);
no++;
}
storage->flush();
modifed = false;
}
TopScores::ScoresList& TopScores::getScores()
{
return scores;
}
int TopScores::getMaxScore()
{
if (scores.size() < 1)
return -1;
ScoresList::iterator i = scores.end();
i--;
return (*i).score;
}
class ScoresWindow: public Window
{
public:
ScoresWindow(int x, int y, TopScores *scores, int highlight);
};
ScoresWindow::ScoresWindow(int x, int y, TopScores *scores, int highlight):
Window(x, y, 320, 350, L"blue.bmp")
{
Font titleFont(L"nova.ttf", 26);
Font entryFont(L"laudcn2.ttf", 14);
Font timeFont(L"luximb.ttf", 14);
std::wstring txt = msg(L"topScores");
int w = titleFont.getWidth(txt);
titleFont.draw(background, (320 - w) / 2, 15, 255,255,0, true, txt);
TopScores::ScoresList &list = scores->getScores();
int no = 1;
int pos = 70;
for (TopScores::ScoresList::iterator i = list.begin();
i != list.end(); i++)
{
TopScores::Entry &e = *i;
std::wstring s(toString(no) + L".");
int w = entryFont.getWidth(s);
int c = ((no - 1) == highlight) ? 0 : 255;
entryFont.draw(background, 30 - w, pos, 255,255,c, true, s);
SDL_Rect rect = { 40, pos-20, 180, 40 };
SDL_SetClipRect(background, &rect);
entryFont.draw(background, 40, pos, 255,255,c, true, e.name);
SDL_SetClipRect(background, NULL);
s = secToStr(e.score);
w = timeFont.getWidth(s);
timeFont.draw(background, 305-w, pos, 255,255,c, true, s);
pos += 20;
no++;
}
}
void showScoresWindow(Area *parentArea, TopScores *scores, int highlight)
{
Area area;
Font font(L"laudcn2.ttf", 16);
area.add(parentArea);
area.add(new ScoresWindow(240, 125, scores, highlight));
ExitCommand exitCmd(area);
area.add(new Button(348, 430, 90, 25, &font, 255,255,0, L"blue.bmp",
msg(L"ok"), &exitCmd));
area.add(new KeyAccel(SDLK_ESCAPE, &exitCmd));
area.run();
}
std::wstring enterNameDialog(Area *parentArea)
{
Area area;
Font font(L"laudcn2.ttf", 16);
area.add(parentArea);
area.add(new Window(170, 280, 460, 100, L"blue.bmp"));
Storage *storage = getStorage();
std::wstring name = storage->get(L"lastName", msg(L"anonymous"));
area.add(new Label(&font, 180, 300, 255,255,0, msg(L"enterName")));
area.add(new InputField(350, 300, 270, 26, L"blue.bmp", name, 20,
255,255,0, &font));
ExitCommand exitCmd(area);
area.add(new Button(348, 340, 90, 25, &font, 255,255,0, L"blue.bmp",
msg(L"ok"), &exitCmd));
area.add(new KeyAccel(SDLK_ESCAPE, &exitCmd));
area.add(new KeyAccel(SDLK_RETURN, &exitCmd));
area.run();
storage->set(L"lastName", name);
return name;
}