176 lines
4.4 KiB
C++
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;
|
|
}
|
|
|
|
|