From a9f55d3076334f03f26be0413de3d3871dfc94ae Mon Sep 17 00:00:00 2001 From: "Gergely POLONKAI (W00d5t0ck)" Date: Sat, 21 Sep 2013 23:05:25 +0200 Subject: [PATCH] Initial release --- Makefile | 68 +++ Makefile.macosx | 63 ++ Makefile.win | 49 ++ README | 3 + buffer.cpp | 104 ++++ buffer.h | 79 +++ conf.cpp | 1449 ++++++++++++++++++++++++++++++++++++++++++++++ conf.h | 107 ++++ convert.cpp | 69 +++ convert.h | 53 ++ descr.cpp | 367 ++++++++++++ descr.h | 12 + einstein.res | Bin 0 -> 656076 bytes exceptions.h | 24 + font.cpp | 117 ++++ font.h | 32 + formatter.cpp | 187 ++++++ formatter.h | 63 ++ game.cpp | 569 ++++++++++++++++++ game.h | 58 ++ horhints.cpp | 207 +++++++ horhints.h | 41 ++ i18n.cpp | 430 ++++++++++++++ i18n.h | 58 ++ iconset.cpp | 57 ++ iconset.h | 32 + lexal.cpp | 248 ++++++++ lexal.h | 66 +++ main.cpp | 113 ++++ main.h | 16 + menu.cpp | 201 +++++++ messages.cpp | 135 +++++ messages.h | 67 +++ opensave.cpp | 285 +++++++++ opensave.h | 16 + options.cpp | 88 +++ options.h | 13 + puzgen.cpp | 394 +++++++++++++ puzgen.h | 81 +++ puzzle.cpp | 196 +++++++ puzzle.h | 44 ++ random.cpp | 159 +++++ random.h | 41 ++ regstorage.cpp | 131 +++++ regstorage.h | 32 + resources.cpp | 674 +++++++++++++++++++++ resources.h | 413 +++++++++++++ rules.cpp | 563 ++++++++++++++++++ screen.cpp | 309 ++++++++++ screen.h | 78 +++ sound.cpp | 62 ++ sound.h | 35 ++ storage.cpp | 48 ++ storage.h | 27 + streams.cpp | 57 ++ streams.h | 41 ++ table.cpp | 434 ++++++++++++++ table.h | 84 +++ tablestorage.cpp | 59 ++ tablestorage.h | 32 + tokenizer.cpp | 72 +++ tokenizer.h | 61 ++ topscores.cpp | 175 ++++++ topscores.h | 44 ++ unicode.cpp | 595 +++++++++++++++++++ unicode.h | 44 ++ utils.cpp | 419 ++++++++++++++ utils.h | 44 ++ verthints.cpp | 193 ++++++ verthints.h | 41 ++ visitor.h | 18 + widgets.cpp | 1013 ++++++++++++++++++++++++++++++++ widgets.h | 322 +++++++++++ 73 files changed, 12581 insertions(+) create mode 100644 Makefile create mode 100644 Makefile.macosx create mode 100644 Makefile.win create mode 100644 README create mode 100644 buffer.cpp create mode 100644 buffer.h create mode 100644 conf.cpp create mode 100644 conf.h create mode 100644 convert.cpp create mode 100644 convert.h create mode 100644 descr.cpp create mode 100644 descr.h create mode 100644 einstein.res create mode 100644 exceptions.h create mode 100644 font.cpp create mode 100644 font.h create mode 100644 formatter.cpp create mode 100644 formatter.h create mode 100644 game.cpp create mode 100644 game.h create mode 100644 horhints.cpp create mode 100644 horhints.h create mode 100644 i18n.cpp create mode 100644 i18n.h create mode 100644 iconset.cpp create mode 100644 iconset.h create mode 100644 lexal.cpp create mode 100644 lexal.h create mode 100644 main.cpp create mode 100644 main.h create mode 100644 menu.cpp create mode 100644 messages.cpp create mode 100644 messages.h create mode 100644 opensave.cpp create mode 100644 opensave.h create mode 100644 options.cpp create mode 100644 options.h create mode 100644 puzgen.cpp create mode 100644 puzgen.h create mode 100644 puzzle.cpp create mode 100644 puzzle.h create mode 100644 random.cpp create mode 100644 random.h create mode 100644 regstorage.cpp create mode 100644 regstorage.h create mode 100644 resources.cpp create mode 100644 resources.h create mode 100644 rules.cpp create mode 100644 screen.cpp create mode 100644 screen.h create mode 100644 sound.cpp create mode 100644 sound.h create mode 100644 storage.cpp create mode 100644 storage.h create mode 100644 streams.cpp create mode 100644 streams.h create mode 100644 table.cpp create mode 100644 table.h create mode 100644 tablestorage.cpp create mode 100644 tablestorage.h create mode 100644 tokenizer.cpp create mode 100644 tokenizer.h create mode 100644 topscores.cpp create mode 100644 topscores.h create mode 100644 unicode.cpp create mode 100644 unicode.h create mode 100644 utils.cpp create mode 100644 utils.h create mode 100644 verthints.cpp create mode 100644 verthints.h create mode 100644 visitor.h create mode 100644 widgets.cpp create mode 100644 widgets.h diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..e682bb1 --- /dev/null +++ b/Makefile @@ -0,0 +1,68 @@ +######################################## +# +# build parameters +# +######################################## + +# installation prefix +PREFIX=/usr/local + +######################################## +# +# do not modify rest of this file +# +######################################## + +OPTIMIZE=#-O6 -march=pentium4 -mfpmath=sse -fomit-frame-pointer -funroll-loops +PROFILER=#-pg +DEBUG=#-ggdb +CXXFLAGS=-pipe -Wall $(OPTIMIZE) $(DEBUG) `sdl-config --cflags` -DPREFIX=L\"$(PREFIX)\" $(PROFILER) +LNFLAGS=-pipe -lSDL_ttf -lfreetype `sdl-config --libs` -lz -lSDL_mixer $(PROFILER) +INSTALL=install + +TARGET=einstein + +SOURCES=puzgen.cpp main.cpp screen.cpp resources.cpp utils.cpp game.cpp \ + widgets.cpp iconset.cpp puzzle.cpp rules.cpp \ + verthins.cpp random.cpp horhints.cpp menu.cpp font.cpp \ + conf.cpp storage.cpp tablestorage.cpp regstorage.cpp \ + topscores.cpp opensave.cpp descr.cpp options.cpp messages.cpp \ + formatter.cpp buffer.cpp unicode.cpp convert.cpp table.cpp \ + i18n.cpp lexal.cpp streams.cpp tokenizer.cpp sound.cpp +OBJECTS=puzgen.o main.o screen.o resources.o utils.o game.o \ + widgets.o iconset.o puzzle.o rules.o verthints.o random.o \ + horhints.o menu.o font.o conf.o storage.o options.o \ + tablestorage.o regstorage.o topscores.o opensave.o descr.o \ + messages.o formatter.o buffer.o unicode.o convert.o table.o \ + i18n.o lexal.o streams.o tokenizer.o sound.o +HEADERS=screen.h main.h exceptions.h resources.h utils.h \ + widgets.h iconset.h puzzle.h verthints.h random.h horhints.h \ + font.h conf.h storage.h tablestorage.h regstorage.h \ + topscores.h opensave.h game.h descr.h options.h messages.h \ + foramtter.h buffer.h visitor.h unicode.h convert.h table.h \ + i18n.h lexal.h streams.h tokenizer.h sound.h + +.cpp.o: + $(CXX) $(CXXFLAGS) -c $< + +all: $(TARGET) + + +$(TARGET): $(OBJECTS) + $(CXX) $(LNFLAGS) $(OBJECTS) -o $(TARGET) + +clean: + rm -f $(OBJECTS) core* *core $(TARGET) *~ + +depend: + @makedepend $(SOURCES) 2> /dev/null + +run: $(TARGET) + ./$(TARGET) + +install: $(TARGET) + $(INSTALL) -s -D $(TARGET) $(PREFIX)/bin/$(TARGET) + $(INSTALL) -D einstein.res $(PREFIX)/share/einstein/res/einstein.res + +# DO NOT DELETE THIS LINE -- make depend depends on it. + diff --git a/Makefile.macosx b/Makefile.macosx new file mode 100644 index 0000000..70bcbec --- /dev/null +++ b/Makefile.macosx @@ -0,0 +1,63 @@ +######################################## +# +# build parameters +# +######################################## + +# installation prefix +PREFIX=/usr/local + +######################################## +# +# do not modify rest of this file +# +######################################## + +OPTIMIZE=#-O6 -march=pentium4 -mfpmath=sse -fomit-frame-pointer -funroll-loops +PROFILER=#-pg +DEBUG=-ggdb +CXXFLAGS=-pipe -Wall $(OPTIMIZE) $(DEBUG) -I/Library/Frameworks/SDL.framework/Headers/ -I/Library/Frameworks/SDL_ttf.framework/Headers/ -I/Library/Frameworks/SDL_mixer.framework/Headers/ -DPREFIX=L\"$(PREFIX)\" $(PROFILER) +LNFLAGS=-pipe -framework Cocoa -framework SDL_ttf -framework SDL -framework SDL_mixer -lSDLmain -lz $(PROFILER) + +TARGET=einstein + +SOURCES=puzgen.cpp main.cpp screen.cpp resources.cpp utils.cpp game.cpp \ + widgets.cpp iconset.cpp puzzle.cpp rules.cpp \ + verthins.cpp random.cpp horhints.cpp menu.cpp font.cpp \ + conf.cpp storage.cpp tablestorage.cpp regstorage.cpp \ + topscores.cpp opensave.cpp descr.cpp options.cpp messages.cpp \ + formatter.cpp buffer.cpp unicode.cpp convert.cpp table.cpp \ + i18n.cpp lexal.cpp streams.cpp tokenizer.cpp sound.cpp +OBJECTS=puzgen.o main.o screen.o resources.o utils.o game.o \ + widgets.o iconset.o puzzle.o rules.o verthints.o random.o \ + horhints.o menu.o font.o conf.o storage.o options.o \ + tablestorage.o regstorage.o topscores.o opensave.o descr.o \ + messages.o formatter.o buffer.o unicode.o convert.o table.o \ + i18n.o lexal.o streams.o tokenizer.o sound.o +HEADERS=screen.h main.h exceptions.h resources.h utils.h \ + widgets.h iconset.h puzzle.h verthints.h random.h horhints.h \ + font.h conf.h storage.h tablestorage.h regstorage.h \ + topscores.h opensave.h game.h descr.h options.h messages.h \ + foramtter.h buffer.h visitor.h unicode.h convert.h table.h \ + i18n.h lexal.h streams.h tokenizer.h sound.h + +.cpp.o: + $(CXX) $(CXXFLAGS) -c $< + +all: $(TARGET) + + +$(TARGET): $(OBJECTS) + $(CXX) $(LNFLAGS) $(OBJECTS) -o $(TARGET) + +clean: + rm -f $(OBJECTS) core* *core $(TARGET) *~ + +depend: + @makedepend $(SOURCES) 2> /dev/null + +run: $(TARGET) + ./$(TARGET) + +# DO NOT DELETE + diff --git a/Makefile.win b/Makefile.win new file mode 100644 index 0000000..69fe102 --- /dev/null +++ b/Makefile.win @@ -0,0 +1,49 @@ +OPTIMIZE=-O3 #-march=pentium4 -mfpmath=sse -fomit-frame-pointer -funroll-loops +DEBUG=#-ggdb +CXXFLAGS=-Wall $(OPTIMIZE) $(DEBUG) -Ic:/mingw/include/sdl -mwindows +LNFLAGS=-lmingw32 -lSDLmain -mwindows +LIBS=-lmingw32 -lSDLmain -lSDL_ttf -lSDL -lfreetype -lz -lSDL_mixer + +TARGET=einstein + +SOURCES=puzgen.cpp main.cpp screen.cpp resources.cpp utils.cpp game.cpp \ + widgets.cpp iconset.cpp puzzle.cpp rules.cpp \ + verthins.cpp random.cpp horhints.cpp menu.cpp font.cpp \ + conf.cpp storage.cpp tablestorage.cpp regstorage.cpp \ + topscores.cpp opensave.cpp descr.cpp options.cpp messages.cpp \ + formatter.cpp buffer.cpp unicode.cpp convert.cpp table.cpp \ + i18n.cpp lexal.cpp streams.cpp tokenizer.cpp sound.cpp +OBJECTS=puzgen.o main.o screen.o resources.o utils.o game.o \ + widgets.o iconset.o puzzle.o rules.o verthints.o random.o \ + horhints.o menu.o font.o conf.o storage.o options.o \ + tablestorage.o regstorage.o topscores.o opensave.o descr.o \ + messages.o formatter.o buffer.o unicode.o convert.o table.o \ + i18n.o lexal.o streams.o tokenizer.o sound.o +HEADERS=screen.h main.h exceptions.h resources.h utils.h \ + widgets.h iconset.h puzzle.h verthints.h random.h horhints.h \ + font.h conf.h storage.h tablestorage.h regstorage.h \ + topscores.h opensave.h game.h descr.h options.h messages.h \ + foramtter.h buffer.h visitor.h unicode.h convert.h table.h \ + i18n.h lexal.h streams.h tokenizer.h sound.h + +.cpp.o: + $(CXX) $(CXXFLAGS) -c $< + +all: $(TARGET) + + +$(TARGET): $(OBJECTS) + $(CXX) $(LNFLAGS) $(OBJECTS) $(LIBS) -o $(TARGET) + +clean: + del $(TARGET).exe + del *.o + +depend: + @makedepend $(SOURCES) 2> /dev/null + +run: $(TARGET) + ./$(TARGET) + +# DO NOT DELETE + diff --git a/README b/README new file mode 100644 index 0000000..3543a53 --- /dev/null +++ b/README @@ -0,0 +1,3 @@ + +To build and install einstein edit Makefile and run `make install` as root. + diff --git a/buffer.cpp b/buffer.cpp new file mode 100644 index 0000000..c8c0fef --- /dev/null +++ b/buffer.cpp @@ -0,0 +1,104 @@ +#include "buffer.h" +#include +#include "exceptions.h" +#include "unicode.h" + + +Buffer::Buffer(int sz, int alloc) +{ + allocated = alloc; + size = sz; + if (size > allocated) + allocated = size; + if (allocated < 1024) + allocated = 1024; + data = malloc(allocated); + if (! data) + throw Exception(L"Error allocating memory for Buffer"); +} + +Buffer::~Buffer() +{ + free(data); +} + +void Buffer::setSize(size_t sz) +{ + if (sz > allocated) { + int newAl = allocated + sz + 1024; + void *d = realloc(data, newAl); + if (! d) + throw Exception(L"Error expanding buffer memory"); + data = d; + allocated = newAl; + } + + size = sz; +} + +size_t Buffer::getSize() +{ + return size; +} + +size_t Buffer::getAllocated() +{ + return allocated; +} + +void* Buffer::getData() +{ + return data; +} + + +void Buffer::gotoPos(int offset) +{ + currentPos = offset; +} + + +size_t Buffer::putData(const unsigned char *d, size_t length) +{ + if (size < currentPos + length) + setSize(currentPos + length); + memcpy((unsigned char*)data + currentPos, d, length); + currentPos += length; + return length; +} + + +size_t Buffer::putInteger(int v) +{ + unsigned char b[4]; + int i, ib; + + for (i = 0; i < 4; i++) { + ib = v & 0xFF; + v = v >> 8; + b[i] = ib; + } + + return putData(b, 4); +} + + +size_t Buffer::putUtf8(const std::wstring &string) +{ + std::string s(toUtf8(string)); + putInteger(s.length()); + putData((const unsigned char*)s.c_str(), s.length()); + return 4 + s.length(); +} + + +size_t Buffer::putByte(unsigned char value) +{ + if (size < (size_t)currentPos + 1) + setSize(currentPos + 1); + ((unsigned char*)data)[currentPos] = value; + currentPos++; + return 1; +} + + diff --git a/buffer.h b/buffer.h new file mode 100644 index 0000000..0091e1d --- /dev/null +++ b/buffer.h @@ -0,0 +1,79 @@ +#ifndef __BUFFER_H__ +#define __BUFFER_H__ + + +#include +#include + + +/// Dynamic growing buffer +class Buffer +{ + private: + size_t size; + size_t allocated; + void *data; + int currentPos; + + public: + /// Create buffer + /// \param size initial size of buffer + /// \param allocated bytes to allocate + Buffer(int size=0, int allocated=1024); + + ~Buffer(); + + public: + /// Set buffer size, expands memory if needed + /// \param size new size + void setSize(size_t size); + + /// Get current size of buffer + size_t getSize(); + + /// Get actual bytes used by buffer + size_t getAllocated(); + + /// Get pointer to data + void* getData(); + + public: + /// Move pointer to specified position. + /// \param offset offset from buffer start + void gotoPos(int offset); + + /// Add data to buffer and advance current position by data length. + /// Grow buffer if needed. + /// \param data pointer to data + /// \param length data size. + size_t putData(const unsigned char *data, size_t length); + + /// Add data to buffer and advance current position by data length. + /// Grow buffer if needed. + /// \param data pointer to data + /// \param length data size. + size_t putData(const char *data, size_t length) { + return putData((const unsigned char*)data, length); + }; + + /// Add integer to buffer and advance current position by 4. + /// Grow buffer if needed. + /// \param value value to add. + size_t putInteger(int value); + + /// Add string to buffer encoded in UTF-8 and advance current + /// position by string length. String stored prefixed by + /// string length. + /// Grow buffer if needed. + /// \param string value to add. + size_t putUtf8(const std::wstring &string); + + /// Add byte to buffer and advance current position by 1. + /// Grow buffer if needed. + /// \param value value to add. + size_t putByte(unsigned char value); +}; + + +#endif + diff --git a/conf.cpp b/conf.cpp new file mode 100644 index 0000000..85c32d9 --- /dev/null +++ b/conf.cpp @@ -0,0 +1,1449 @@ +#include +#include +#include +#include +#include "conf.h" + + +typedef struct _SField +{ + char *name; + int type; + union { + char *str_value; + int int_value; + double double_value; + HTable table_value; + } value; + struct _SField *next; +} SField; + + +typedef struct _STable +{ + SField *fields; + char *stat_buf; +} STable; + + +typedef struct _STableIterator +{ + HTable table; + SField *cur_field; + int before_start; + char *stat_buf; +} STableIterator; + + + +HTable table_create() +{ + HTable table; + + table = (STable*)calloc(1, sizeof(STable)); + return table; +} + + +static void free_field(SField *field) +{ + if (! field) + return; + if (field->name) + free(field->name); + switch (field->type) + { + case TYPE_STRING: free(field->value.str_value); break; + case TYPE_TABLE: table_free(field->value.table_value); break; + } + free(field); +} + + +static SField* find_field(HTable table, const char *name) +{ + SField *f; + + if ((! table) || (! name)) + return NULL; + + f = table->fields; + while (f) + { + if (f->name && (! strcmp(f->name, name))) + return f; + f = f->next; + } + + return NULL; +} + + +int table_remove_field(HTable table, char *field) +{ + SField *f, *pf; + + if ((! table) || (! field)) + return -1; + + f = find_field(table, field); + if (f) + { + if (table->fields == f) + table->fields = f->next; + else + { + pf = table->fields; + while (pf && (pf->next != f)) + pf = pf->next; + if (pf) + pf->next = f->next; + } + free_field(f); + } + + return 0; +} + + +static SField* add_empty_field(HTable table, const char *field) +{ + SField *f, *nf; + + if ((! table) || (! field)) + return NULL; + + f = find_field(table, field); + if (f) + table_remove_field(table, f->name); + + nf = (SField*)calloc(1, sizeof(SField)); + if (! nf) return NULL; + nf->name = strdup(field); + + f = table->fields; + if (f) + { + while (f->next) + f = f->next; + f->next = nf; + } + else + table->fields = nf; + + return nf; +} + + +int table_set_str(HTable table, const char *field, const char *value) +{ + SField *f; + + if ((! table) || (! field) || (! value)) + return -1; + + f = add_empty_field(table, field); + if (! f) return -1; + + f->type = TYPE_STRING; + f->value.str_value = strdup(value); + return 0; +} + + +int table_set_int(HTable table, const char *field, int value) +{ + SField *f; + + if ((! table) || (! field)) + return -1; + + f = add_empty_field(table, field); + if (! f) return -1; + + f->type = TYPE_INT; + f->value.int_value = value; + return 0; +} + + +int table_set_double(HTable table, const char *field, double value) +{ + SField *f; + + if ((! table) || (! field)) + return -1; + + f = add_empty_field(table, field); + if (! f) return -1; + + f->type = TYPE_FLOAT; + f->value.double_value = value; + return 0; +} + + +int table_set_table(HTable table, const char *field, HTable value) +{ + SField *f; + + if ((! table) || (! field) || (! value)) + return -1; + + f = add_empty_field(table, field); + if (! f) return -1; + + f->type = TYPE_TABLE; + f->value.table_value = value; + return 0; +} + + +static int skip_spaces(char *buf, long int *pos); + + +static int skip_multy_comment(char *buf, long int *pos) +{ + while (buf[*pos]) + { + if (buf[*pos] == '*') + { + (*pos)++; + if (buf[*pos] == '/') + { + (*pos)++; + return skip_spaces(buf, pos); + } + } + (*pos)++; + } + + return -1; +} + + +static int skip_line_comment(char *buf, long int *pos) +{ + while (buf[*pos] && ((buf[*pos]) != '\n')) + (*pos)++; + return skip_spaces(buf, pos); +} + + +static int is_cspace(char *buf, long int *pos) +{ + if (isspace(buf[*pos])) + return 1; + if (buf[*pos] == '/') + { + if ((buf[(*pos) + 1] == '*') || (buf[(*pos) + 1] == '/')) + return 1; + } + return 0; +} + + +static int skip_spaces(char *buf, long int *pos) +{ + while (buf[*pos] && isspace(buf[*pos])) + (*pos)++; + + if (buf[*pos] == '/') + { + (*pos)++; + if (buf[*pos] == '*') + { + (*pos)++; + return skip_multy_comment(buf, pos); + } + else if (buf[*pos] == '/') + { + (*pos)++; + return skip_line_comment(buf, pos); + } + else + return -1; + } + return 0; +} + + +static int is_symbol(char sym) +{ + static char syms[] = { '=', '{', '}', ';', '\'', '"', ',', '/', '\\' }; + unsigned int i; + + for (i = 0; i < sizeof(syms) / sizeof(char); i++) + { + if (sym == syms[i]) + return 1; + } + + return 0; +} + + +static char* read_string(char* buf, long int *pos) +{ + int allocated=50, len=1; + char *b; + + b = (char*)malloc(allocated); + if (! b) return NULL; + b[0] = buf[*pos]; + (*pos)++; + while (buf[*pos]) + { + if (len + 3 > allocated) + { + char *s = (char*)realloc(b, allocated+=20); + if (! s) + { + free(b); + return NULL; + } + b = s; + } + if ((buf[*pos] == '\\') && (buf[*pos + 1] == b[0])) + { + b[len++] = '\\'; + b[len] = b[0]; + } + else + { + b[len++] = buf[*pos]; + if (buf[*pos] == b[0]) + { + b[len] = 0; + (*pos)++; + return b; + } + } + (*pos)++; + } + free(b); + return NULL; +} + + +static char* read_word(char* buf, long int *pos) +{ + int allocated=50, len=0; + char *b; + + b = (char*)malloc(allocated); + if (! b) return NULL; + while (buf[*pos] && (! is_cspace(buf, pos)) && (! is_symbol(buf[*pos]))) + { + if (len + 3 > allocated) + { + char *s = (char*)realloc(b, allocated+=20); + if (! s) + { + free(b); + return NULL; + } + b = s; + } + b[len++] = buf[*pos]; + (*pos)++; + } + if (! len) + { + free(b); + return NULL; + } + b[len] = 0; + return b; +} + + +static char* read_token(char *buf, long int *pos) +{ + if (skip_spaces(buf, pos) || (! buf[*pos])) + return NULL; + + if ((buf[*pos] == '\'') || (buf[*pos] == '"')) + return read_string(buf, pos); + + if (is_symbol(buf[*pos])) + { + char *b = (char*)malloc(2); + if (! b) return NULL; + b[0] = buf[*pos]; + b[1] = 0; + (*pos)++; + return b; + } + + return read_word(buf, pos); +} + + +static long int get_file_size(FILE *f) +{ + long int len; + + if (fseek(f, 0L, SEEK_END)) + return -1; + + len = ftell(f); + + if (fseek(f, 0L, SEEK_SET)) + return -1; + + return len; +} + + +static char* read_file(const char *filename, long int *length) +{ + FILE *f; + char *buf; + long int len; + + f = fopen(filename, "rb"); + if (! f) return NULL; + + len = get_file_size(f); + if (len <= 0) + { + fclose(f); + return NULL; + } + + buf = (char*)malloc(len + 1); + if (! buf) + { + fclose(f); + return NULL; + } + + if (fread(buf, 1, len, f) != (unsigned)len) + { + free(buf); + fclose(f); + return NULL; + } + + buf[len] = 0; + + fclose(f); + *length = len + 1; + return buf; +} + + +static int get_next_index(HTable table) +{ + SField *f; + int v, max_v=-1; + char *endptr; + + for (f = table->fields; f; f = f->next) + { + v = strtol(f->name, &endptr, 10); + if ((! f->name[0]) || (endptr[0])) + continue; + if (v > max_v) + max_v = v; + } + + return max_v + 1; +} + + +static int is_ident(char *str) +{ + char *p; + + if (! str) + return 0; + if (strlen(str) < 1) + return 0; + if (! isalpha(str[0])) + return 0; + + for (p = str; *p; p++) + if (! (isalnum(*p) || (*p == '_') || (*p == '.'))) + return 0; + + return 1; +} + + +static int is_string_value(char *value) +{ + int len; + + if ((value[0] == '\'') || (value[0] == '"')) + { + if ((len = strlen(value)) >= 2) + { + if (value[len - 1] == value[0]) + return 1; + } + } + + return 0; +} + + +static int is_int_value(char *value) +{ + char *p; + + for (p = value; *p; p++) + { + if (! isdigit(*p)) + { + if (p != value) + return 0; + else + if (! ((*p == '+') || (*p == '-'))) + return 0; + } + } + return 1; +} + + +static int is_float_value(char *value) +{ + char *p; + int pcount = 0; + + for (p = value; *p; p++) + { + if (! isdigit(*p)) + { + if (p != value) + { + if (*p != '.') + return 0; + else + { + pcount++; + if (pcount > 1) + return 0; + } + } + else + { + if (! ((*p == '+') || (*p == '-'))) + return 0; + } + } + } + return 1; +} + + +static int get_value_type(char *value) +{ + if ((! value) || (! value[0])) + return -1; + + if (is_string_value(value)) + return TYPE_STRING; + if (! strcmp(value, "{")) + return TYPE_TABLE; + if (is_int_value(value)) + return TYPE_INT; + if (is_float_value(value)) + return TYPE_FLOAT; + + return -1; +} + + +static char* unescape_string(char *str) +{ + char *buf, quote, *p; + int allocated=50, len=0; + + buf = (char*)malloc(allocated); + + quote = str[0]; + p = str + 1; + while ((*p) && (*p != quote)) + { + if (len + 10 > allocated) + { + char *s = (char*)realloc(buf, allocated+=20); + if (! s) + { + free(buf); + return NULL; + } + buf = s; + } + if (*p == '\\') + { + p++; + switch (*p) + { + case 'n': buf[len++] = '\n'; break; + case 't': buf[len++] = '\t'; break; + case 'r': buf[len++] = '\r'; break; + default: buf[len++] = *p; + } + } + else + buf[len++] = *p; + p++; + } + buf[len] = 0; + + if ((*p == quote) && (*(p + 1))) + { + free(buf); + return NULL; + } + return buf; +} + + +static int parse_table(HTable table, char *buf, long int *pos, int top_level); + + +static int add_field(HTable table, char *name, char *value, char *buf, long int *pos) +{ + int value_type; + char *s; + HTable tbl; + + value_type = get_value_type(value); + switch (value_type) + { + case TYPE_INT: + table_set_int(table, name, atoi(value)); + break; + case TYPE_STRING: + s = unescape_string(value); + if (! s) + return -1; + table_set_str(table, name, s); + free(s); + break; + case TYPE_FLOAT: + table_set_double(table, name, atof(value)); + break; + case TYPE_TABLE: + tbl = table_create(); + if (table_set_table(table, name, tbl)) + { + table_free(tbl); + return -1; + } + if (parse_table(tbl, buf, pos, 0)) + return -1; + break; + default: + return -1; + } + return 0; +} + + +static int add_field_to_array(HTable table, char *token, char *buf, long int *pos) +{ + int idx = get_next_index(table); + char b[100]; + sprintf(b, "%i", idx); + return add_field(table, b, token, buf, pos); +} + + + +/* + * TODO: add field as in array highly unoptimized. it scans for max index + * number on every element addition, converting idexes from strings + * to numbers where it possible. optimizations method: process + * indexes in batch + */ + +static int parse_table(HTable table, char *buf, long int *pos, int top_level) +{ + char *token=NULL; + char *name; + int res; + + while (1) + { + if (! token) + token = read_token(buf, pos); + if (! token) + { + if (top_level) + return 0; + else + return -1; + } + + if (! strcmp(token, "{")) + { + if (add_field_to_array(table, token, buf, pos)) + { + free(token); + return -1; + } + free(token); + token = read_token(buf, pos); + if (! token) + { + if (top_level) + return 0; + else + return -1; + } + if ((! strcmp(token, ";")) || (! strcmp(token, ","))) + { + free(token); + token = NULL; + } + continue; + } + else if (! strcmp(token, "}")) + { + free(token); + if (top_level) + return -1; + else + return 0; + } + + name = token; + + token = read_token(buf, pos); + + if (token && (! strcmp(token, "="))) + { + free(token); + + if (! is_ident(name)) + { + free(name); + return -1; + } + + token = read_token(buf, pos); + if (! token) + { + free(name); + return -1; + } + + res = add_field(table, name, token, buf, pos); + free(name); + free(token); + if (res) + { + return -1; + } + + token = read_token(buf, pos); + if (! token) + { + if (top_level) + return 0; + else + return -1; + } + if ((! strcmp(token, ";")) || (! strcmp(token, ","))) + { + free(token); + token = NULL; + } + else + if (strcmp(token, "}")) + { + free(token); + return -1; + } + } + else + { + if ((! token) && (! top_level)) + { + free(name); + return -1; + } + if (! (token && ((! strcmp(token, ";")) || (! strcmp(token, ",")) + || (! strcmp(token, "}"))))) + { + free(name); + if (token) free(token); + return -1; + } + + res = add_field_to_array(table, name, buf, pos); + free(name); + if (res) + { + free(token); + return -1; + } + + if ((! token) || (! strcmp(token, "}"))) + { + if (token) free(token); + return 0; + } + + if (token && ((! strcmp(token, ",")) || ((! strcmp(token, ";"))))) + { + free(token); + token = NULL; + } + } + } + + return 0; +} + + +HTable table_read(const char *filename) +{ + long int len, pos; + char *buf; + HTable table; + int res; + + buf = read_file(filename, &len); + if (! buf) return NULL; + + pos = 0; + table = table_create(); + res = parse_table(table, buf, &pos, 1); + if (res) + { + table_free(table); + table = NULL; + } + + free(buf); + return table; +} + + +void table_free(HTable table) +{ + SField *f, *nf; + + if (! table) return; + + f = table->fields; + while (f) + { + nf = f->next; + free_field(f); + f = nf; + } + if (table->stat_buf) + free(table->stat_buf); + free(table); +} + + +HTableIterator table_get_iter(HTable table) +{ + HTableIterator it; + + it = (HTableIterator)calloc(sizeof(STableIterator), 1); + if (! it) return NULL; + + it->table = table; + it->before_start = 1; + + return it; +} + + +void table_free_iter(HTableIterator iterator) +{ + if (! iterator) return; + if (iterator->stat_buf) free(iterator->stat_buf); + free(iterator); +} + + +int table_iter_next(HTableIterator iterator) +{ + if (! iterator) + return 0; + + if (iterator->before_start) + { + iterator->before_start = 0; + iterator->cur_field = iterator->table->fields; + } + else + { + if (iterator->cur_field) + iterator->cur_field = iterator->cur_field->next; + } + + if (! iterator->cur_field) + return 0; + + return 1; +} + + +char* table_iter_get_name(HTableIterator iterator) +{ + if ((! iterator) || (! iterator->cur_field)) + return NULL; + + return iterator->cur_field->name; +} + + +int table_iter_get_type(HTableIterator iterator) +{ + if ((! iterator) || (! iterator->cur_field)) + return -1; + + return iterator->cur_field->type; +} + + +static char* encode_string(char *str) +{ + char *buf, *s; + int allocated, len; + + if (! str) + return strdup("''"); + + allocated = 20; + buf = (char*)malloc(allocated); + if (! buf) return NULL; + buf[0] = '\''; + len = 1; + for (s = str; *s; s++) + { + if (len + 2 < allocated - 2) + { + char *m = (char*)realloc(buf, allocated += 20); + if (! m) + { + free(buf); + return NULL; + } + buf = m; + } + switch (*s) + { + case '\n': buf[len++] = '\\'; buf[len++] = 'n'; break; + case '\r': buf[len++] = '\\'; buf[len++] = 'r'; break; + case '\'': buf[len++] = '\\'; buf[len++] = '\''; break; + case '\\': buf[len++] = '\\'; buf[len++] = '\\'; break; + default: + buf[len++] = *s; + } + } + buf[len++] = '\''; + buf[len] = 0; + return buf; +} + + +static char* print_field(SField *field, int butify, int spaces) +{ + char buf[100]; + + if (! field) return NULL; + + switch (field->type) + { + case TYPE_STRING: + return encode_string(field->value.str_value); + case TYPE_INT: + sprintf(buf, "%i", field->value.int_value); + return strdup(buf); + case TYPE_FLOAT: + sprintf(buf, "%g", field->value.double_value); + if (! strchr(buf, '.')) + strcat(buf, ".0"); + return strdup(buf); + case TYPE_TABLE: + return table_to_str(field->value.table_value, 1, butify, spaces); + } + + return NULL; +} + + +static int isSimpleArray(HTable table) +{ + SField *f; + char buf[50]; + int i; + + for (f = table->fields, i = 0; f; f = f->next, i++) + { + sprintf(buf, "%i", i); + if (! (f && f->name && (! strcmp(f->name, buf)))) + return 0; + } + return 1; +} + + +#define APPEND_BUF(buf, s) { int l = strlen(s); \ + if (len + l > allocated - 5) { \ + char *nb; \ + allocated += l + 50; \ + nb = (char*)realloc(buf, allocated); \ + if (! nb) { \ + free(buf); \ + return NULL; \ + } \ + buf = nb; \ + } \ + strcat(buf, s); \ + len += l; \ + } + +#define APPEND_SPACES(buf, n) \ + for (int i = 0; i < n; i++) { APPEND_BUF(buf, " "); } + +char* table_to_str(HTable table, int print_braces, int butify, int spaces) +{ + char *b, *fs; + int len=0, allocated; + SField *f; + + if (! table) return NULL; + + allocated = 100; + b = (char*)malloc(allocated); + if (! b) return NULL; + + if (print_braces) { + if (butify) + strcpy(b, "{\n"); + else + strcpy(b, "{ "); + } else + strcpy(b, ""); + len = strlen(b); + int printNames = ! isSimpleArray(table); + for (f = table->fields; f; f = f->next) { + if (butify) { + APPEND_SPACES(b, spaces); + } else + if (f != table->fields) { + APPEND_BUF(b, " "); + } + if (printNames) { + APPEND_BUF(b, f->name); + APPEND_BUF(b, " = "); + } + fs = print_field(f, butify, spaces + 4); + APPEND_BUF(b, fs); + free(fs); + if (butify) { + APPEND_BUF(b, ";\n"); + } else { + APPEND_BUF(b, ";"); + } + } + if (print_braces) { + if (! butify) { + APPEND_BUF(b, " }"); + } else { + APPEND_SPACES(b, spaces); + APPEND_BUF(b, "}"); + } + } + return b; +} + + +static char* get_field_str(SField *field, int *err) +{ + char buf[100]; + + if (err) *err = 0; + + if (! field) + { + if (err) *err = 1; + return NULL; + } + + switch (field->type) + { + case TYPE_STRING: + return strdup(field->value.str_value); + case TYPE_INT: + sprintf(buf, "%i", field->value.int_value); + return strdup(buf); + case TYPE_FLOAT: + sprintf(buf, "%f", field->value.double_value); + return strdup(buf); + case TYPE_TABLE: + return table_to_str(field->value.table_value, 1, 0, 0);; + } + + if (err) *err = 1; + return NULL; +} + + +char* table_iter_get_str(HTableIterator iterator, int *err) +{ + if ((! iterator) || (! iterator->cur_field)) + { + if (err) *err = 1; + return NULL; + } + + return get_field_str(iterator->cur_field, err); +} + + +char* table_iter_get_strs(HTableIterator iterator, int *err) +{ + if ((! iterator) || (! iterator->cur_field)) + { + if (err) *err = 1; + return NULL; + } + + if (iterator->stat_buf) + free(iterator->stat_buf); + iterator->stat_buf = get_field_str(iterator->cur_field, err); + return iterator->stat_buf; +} + + +static int get_field_int(SField *field, int *err) +{ + char *endptr; + int n; + + if (err) *err = 0; + + if (! field) + { + if (err) *err = 1; + return 0; + } + + switch (field->type) + { + case TYPE_STRING: + n = strtol(field->value.str_value, &endptr, 10); + if ((! field->value.str_value[0]) || (endptr[0])) + { + if (err) *err = 1; + return 0; + } + return n; + case TYPE_INT: + return field->value.int_value; + case TYPE_FLOAT: + return (int)field->value.double_value; + } + + if (err) *err = 1; + return 0; +} + + +int table_iter_get_int(HTableIterator iterator, int *err) +{ + if ((! iterator) || (! iterator->cur_field)) + { + if (err) *err = 1; + return 0; + } + + return get_field_int(iterator->cur_field, err); +} + + +static double get_field_double(SField *field, int *err) +{ + char *endptr; + double n; + + if (err) *err = 0; + + if (! field) + { + if (err) *err = 1; + return 0.0; + } + + switch (field->type) + { + case TYPE_STRING: + n = strtod(field->value.str_value, &endptr); + if ((! field->value.str_value[0]) || (endptr[0])) + { + if (err) *err = 1; + return 0.0; + } + return n; + case TYPE_INT: + return field->value.int_value; + case TYPE_FLOAT: + return field->value.double_value; + } + + if (err) *err = 1; + return 0.0; +} + + +double table_iter_get_double(HTableIterator iterator, int *err) +{ + if ((! iterator) || (! iterator->cur_field)) + { + if (err) *err = 1; + return 0.0; + } + + return get_field_double(iterator->cur_field, err); +} + + +HTable table_iter_get_table(HTableIterator iterator, int *err) +{ + if ((! iterator) || (! iterator->cur_field)) + { + if (err) *err = 1; + return NULL; + } + + if (iterator->cur_field->type != TYPE_TABLE) + { + if (err) *err = 1; + return NULL; + } + + if (err) *err = 0; + return iterator->cur_field->value.table_value; +} + + +int table_is_field_exists(HTable table, char *name) +{ + SField *f; + + f = find_field(table, name); + if (f) + return 1; + else + return 0; +} + + +int table_get_field_type(HTable table, char *field) +{ + SField *f; + + f = find_field(table, field); + if (! f) + return -1; + + return f->type; +} + + +char* table_get_str(HTable table, char *field, char *dflt, int *err) +{ + SField *f; + char *s; + int e; + + f = find_field(table, field); + if (! f) + { + if (err) *err = 1; + if (dflt) + return strdup(dflt); + else + return NULL; + } + + s = get_field_str(f, &e); + if (err) *err = e; + if (e) + { + if (dflt) + return strdup(dflt); + else + return NULL; + } + else + { + if (s) + return strdup(s); + else + return NULL; + } +} + + +char* table_get_strs(HTable table, char *field, char *dflt, int *err) +{ + SField *f; + char *s; + int e; + + if (! table) + { + if (err) *err = 1; + return dflt; + } + + if (table->stat_buf) + { + free(table->stat_buf); + table->stat_buf = NULL; + } + + f = find_field(table, field); + if (! f) + { + if (err) *err = 1; + return dflt; + } + + s = get_field_str(f, &e); + table->stat_buf = s; + if (err) *err = e; + if (e) + s = dflt; + + return s; +} + + +int table_get_int(HTable table, char *field, int dflt, int *err) +{ + SField *f; + int v, e; + + f = find_field(table, field); + if (! f) + { + if (err) *err = 1; + return dflt; + } + + v = get_field_int(f, &e); + if (err) *err = e; + if (e) + v = dflt; + + return v; +} + + +double table_get_double(HTable table, char *field, double dflt, int *err) +{ + SField *f; + double v; + int e; + + f = find_field(table, field); + if (! f) + { + if (err) *err = 1; + return dflt; + } + + v = get_field_double(f, &e); + if (err) *err = e; + if (e) + v = dflt; + + return v; +} + + +HTable table_get_table(HTable table, char *field, HTable dflt, int *err) +{ + SField *f; + HTable v; + + f = find_field(table, field); + if ((! f) || (f->type != TYPE_TABLE)) + { + if (err) *err = 1; + return dflt; + } + + v = f->value.table_value; + if (err) *err = 0; + + return v; +} + + +int table_append_str(HTable table, const char *val) +{ + int idx; + char b[100]; + + if ((! table) || (! val)) + return -1; + + idx = get_next_index(table); + sprintf(b, "%i", idx); + table_set_str(table, b, val); + return 0; +} + + +int table_append_int(HTable table, int val) +{ + int idx; + char b[100]; + + if ((! table) || (! val)) + return -1; + + idx = get_next_index(table); + sprintf(b, "%i", idx); + table_set_int(table, b, val); + return 0; +} + + +int table_append_double(HTable table, double val) +{ + int idx; + char b[100]; + + if ((! table) || (! val)) + return -1; + + idx = get_next_index(table); + sprintf(b, "%i", idx); + table_set_double(table, b, val); + return 0; +} + + +int table_append_table(HTable table, HTable val) +{ + int idx; + char b[100]; + + if ((! table) || (! val)) + return -1; + + idx = get_next_index(table); + sprintf(b, "%i", idx); + table_set_table(table, b, val); + return 0; +} + diff --git a/conf.h b/conf.h new file mode 100644 index 0000000..5925531 --- /dev/null +++ b/conf.h @@ -0,0 +1,107 @@ +/* + * Configuration file parser + * Copyright (c) 2002 Alexander Babichev + */ + +#ifndef __CONF_H__ +#define __CONF_H__ + +struct _STable; +typedef struct _STable* HTable; +struct _STableIterator; +typedef struct _STableIterator* HTableIterator; + +#define TYPE_INT 1 +#define TYPE_STRING 2 +#define TYPE_FLOAT 3 +#define TYPE_TABLE 4 + +/* create empty table */ +HTable table_create(); + +/* read table from file */ +HTable table_read(const char *filename); + +/* free table */ +void table_free(HTable table); + +/* get table iterator positioned before table start */ +HTableIterator table_get_iter(HTable table); + +/* free table iterator */ +void table_free_iter(HTableIterator iterator); + +/* move iterator. return 1 on success */ +int table_iter_next(HTableIterator iterator); + +/* get name of table field */ +char* table_iter_get_name(HTableIterator iterator); + +/* get type of table field */ +int table_iter_get_type(HTableIterator iterator); + +/* get current table field as newly allocated string */ +char* table_iter_get_str(HTableIterator iterator, int *err); + +/* get current table field as static string valid till next iterator operation */ +char* table_iter_get_strs(HTableIterator iterator, int *err); + +/* get current table field as int */ +int table_iter_get_int(HTableIterator iterator, int *err); + +/* get current table field as double */ +double table_iter_get_double(HTableIterator iterator, int *err); + +/* get current table field as table */ +HTable table_iter_get_table(HTableIterator iterator, int *err); + +/* return 0 if field not exists in table */ +int table_is_field_exists(HTable table, char *name); + +/* get type of table field or -1 if field not exists */ +int table_get_field_type(HTable table, char *field); + +/* get table field as newly allocated string */ +char* table_get_str(HTable table, char *field, char *dflt, int *err); + +/* get table field as static string */ +char* table_get_strs(HTable table, char *field, char *dflt, int *err); + +/* get table field as int */ +int table_get_int(HTable table, char *field, int dflt, int *err); + +/* get table field as double */ +double table_get_double(HTable table, char *field, double dflt, int *err); + +/* get table field as table */ +HTable table_get_table(HTable table, char *field, HTable dflt, int *err); + +/* print table to new allocated string */ +char* table_to_str(HTable table, int print_braces, int butify, int spaces); + +/* set table field as string */ +int table_set_str(HTable table, const char *field, const char *val); + +/* set table field as int */ +int table_set_int(HTable table, const char *field, int val); + +/* set table field as double */ +int table_set_double(HTable table, const char *field, double val); + +/* set table field as table */ +int table_set_table(HTable table, const char *field, HTable val); + +/* append string field to table */ +int table_append_str(HTable table, const char *val); + +/* append int field to table */ +int table_append_int(HTable table, int val); + +/* append double field to table */ +int table_append_double(HTable table, double val); + +/* append tablee field to table */ +int table_append_table(HTable table, HTable val); + +#endif + diff --git a/convert.cpp b/convert.cpp new file mode 100644 index 0000000..d4e16c9 --- /dev/null +++ b/convert.cpp @@ -0,0 +1,69 @@ +#include "convert.h" + +std::wstring toLowerCase(const std::wstring &s) +{ + std::wstring res; + + int len = s.length(); + for (int i = 0; i < len; i++) + res += (wchar_t)towlower(s[i]); + + return res; +} + +std::wstring toUpperCase(const std::wstring &s) +{ + std::wstring res; + + int len = s.length(); + for (int i = 0; i < len; i++) + res += (wchar_t)towupper(s[i]); + + return res; +} + +std::wstring numToStr(int num) +{ + wchar_t buf[30]; +#ifdef WIN32 + swprintf(buf, L"%i", num); +#else + swprintf(buf, 29, L"%i", num); +#endif + buf[29] = 0; + return std::wstring(buf); +} + +std::wstring numToStr(unsigned int num) +{ + wchar_t buf[30]; +#ifdef WIN32 + swprintf(buf, L"%u", num); +#else + swprintf(buf, 29, L"%i", num); +#endif + buf[29] = 0; + return std::wstring(buf); +} + +int strToInt(const std::wstring &str) +{ + int n; + wchar_t *endptr; + + n = wcstol(str.c_str(), &endptr, 10); + if ((! str.c_str()[0]) || (endptr[0])) + throw Exception(L"Invalid integer '" + str + L"'"); + return n; +} + +double strToDouble(const std::wstring &str) +{ + double n; + wchar_t *endptr; + + n = wcstod(str.c_str(), &endptr); + if ((! str.c_str()[0]) || (endptr[0])) + throw Exception(L"Invalid double '" + str + L"'"); + return n; +} diff --git a/convert.h b/convert.h new file mode 100644 index 0000000..2dca970 --- /dev/null +++ b/convert.h @@ -0,0 +1,53 @@ +#ifndef __CONVERT_H__ +#define __CONVERT_H__ + + +#include +#include +#include + +#include "exceptions.h" +#include "unicode.h" + + +/// Convert value to string +/// \param x value +template +inline std::wstring toString(const T &x) +{ +#ifndef WIN32 + std::wostringstream o; + if (! (o << x)) + throw Exception(L"Can't convert " + fromMbcs(typeid(x).name()) + + L" to string"); + return o.str(); +#else // Mingw doesn't support std::wostringstream yet :-( + std::ostringstream o; + if (! (o << x)) + throw Exception(L"Can't convert " + fromMbcs(typeid(x).name()) + + L" to string"); + return fromMbcs(o.str()); +#endif +} + + +/// Convert string to lower case. +std::wstring toLowerCase(const std::wstring &s); + +/// Convert string to upper case +std::wstring toUpperCase(const std::wstring &s); + +/// Convert integer to string. +std::wstring numToStr(int num); + +/// Convert unsigned integer to string. +std::wstring numToStr(unsigned int num); + +/// Convert string to integer +int strToInt(const std::wstring &str); + +/// Conver string to double +double strToDouble(const std::wstring &str); + + +#endif diff --git a/descr.cpp b/descr.cpp new file mode 100644 index 0000000..29bdcac --- /dev/null +++ b/descr.cpp @@ -0,0 +1,367 @@ +#include "descr.h" + +#include +#include +#include +#include + +#include "widgets.h" +#include "unicode.h" +#include "messages.h" +#include "convert.h" +#include "utils.h" +#include "tokenizer.h" + + +#define WIDTH 600 +#define HEIGHT 500 +#define CLIENT_WIDTH 570 +#define CLIENT_HEIGHT 390 +#define START_X 115 +#define START_Y 100 + + +class TextPage +{ + private: + std::vector widgets; + + public: + TextPage() { }; + ~TextPage(); + + public: + Widget* getWidget(int no) { return widgets[no]; }; + int getWidgetsCount() const { return widgets.size(); }; + void add(Widget *widget) { widgets.push_back(widget); }; + bool isEmpty() const { return ! widgets.size(); }; +}; + + +class TextParser +{ + private: + Tokenizer tokenizer; + std::vector pages; + Font &font; + int spaceWidth; + int charHeight; + std::map images; + int offsetX; + int offsetY; + int pageWidth; + int pageHeight; + + public: + TextParser(const std::wstring &text, Font &font, + int x, int y, int width, int height); + ~TextParser(); + + public: + TextPage* getPage(unsigned int no); + + private: + void addLine(TextPage *page, std::wstring &line, int &curPosY, + int &lineWidth); + void parseNextPage(); + bool isImage(const std::wstring &name); + std::wstring keywordToImage(const std::wstring &name); + SDL_Surface* getImage(const std::wstring &name); +}; + + +class CursorCommand; + + +// Otobrazhaet pravila igry na ekran +class Description +{ + private: + typedef std::list WidgetsList; + WidgetsList widgets; + + CursorCommand *prevCmd; // Sobytie na nazhatie knopki + CursorCommand *nextCmd; // Sobytie na nazhatie knopki + + Area area; // Mesto gde risovat' + //std::vector pages; // Spisok stranits teksta + unsigned int currentPage; // Tekuschaja stranitsa dlja prosmotra + + Font *titleFont; // Shrift dlja risovanija zagolovka okna + Font *buttonFont; // Shrift dlja risovanija knopok v okne + Font *textFont; // Shrift dlja risovanija teksta + + unsigned int textHeight; // Vysota stroki teksta + TextParser *text; + + public: + Description(Area *parentArea); + ~Description(); + + public: + void run(); + void updateInfo(); // Vyvodit informatsiju na stranitsu + TextPage *getPage(unsigned int no) { return text->getPage(no); }; + + private: + void printPage(); // Vyvodit tekuschuju stranitsu pravil + void deleteWidgets(); // Udaljaet neispol'zuemye metki i kartinki iz oblasti vyvoda informatsii (Area) +}; + + +//Nuzhen pri nazhatii na knopku ili v dialoge spiska pravil +class CursorCommand: public Command +{ + private: + int step; // Cherez skol'ko stranits listat' + Description &description; // Ukazatel' na ob"ekt Description + unsigned int *value; // Ukazatel' na tekuschij nomer stranitsy + + public: + CursorCommand(int step, Description &d, unsigned int *v); + virtual ~CursorCommand() { }; + + public: + virtual void doAction(); // Obrabatyvaet sobytija +}; + + + +void showDescription(Area *parentArea) +{ + Description d(parentArea); + d.run(); +} + + + +Description::Description(Area *parentArea) +{ + currentPage = 0; + //area.add(parentArea, false); + titleFont = new Font(L"nova.ttf", 26); + buttonFont = new Font(L"laudcn2.ttf", 14); + textFont = new Font(L"laudcn2.ttf", 16); + textHeight = (int)(textFont->getHeight(L"A") * 1.0); + text = new TextParser(msg(L"rulesText"), *textFont, START_X, START_Y, + CLIENT_WIDTH, CLIENT_HEIGHT); + prevCmd = new CursorCommand(-1, *this, ¤tPage); + nextCmd = new CursorCommand(1, *this, ¤tPage); +} + +Description::~Description() +{ + deleteWidgets(); + delete text; + delete titleFont; + delete buttonFont; + delete textFont; +} + + +void Description::deleteWidgets() +{ + for (WidgetsList::iterator i = widgets.begin(); + i != widgets.end(); i++) + area.remove(*i); + widgets.clear(); +} + + +void Description::updateInfo() +{ + deleteWidgets(); + printPage(); + area.draw(); +} + +void Description::run() +{ + area.add(new Window(100, 50, WIDTH, HEIGHT, L"blue.bmp")); + area.add(new Label(titleFont, 250, 60, 300, 40, Label::ALIGN_CENTER, Label::ALIGN_MIDDLE, 255, 255, 0, msg(L"rules"))); + area.add(new Button(110, 515, 80, 25, buttonFont, 255, 255, 0, L"blue.bmp", msg(L"prev"), prevCmd)); + area.add(new Button(200, 515, 80, 25, buttonFont, 255, 255, 0, L"blue.bmp", msg(L"next"), nextCmd)); + ExitCommand exitCmd(area); + area.add(new Button(610, 515, 80, 25, buttonFont, 255, 255, 0, L"blue.bmp", msg(L"close"), &exitCmd)); + area.add(new KeyAccel(SDLK_ESCAPE, &exitCmd)); + printPage(); + area.run(); +} + +void Description::printPage() +{ + TextPage *page = text->getPage(currentPage); + if (! page) + return; + int len = page->getWidgetsCount(); + for (int i = 0; i < len; i++) { + Widget *w = page->getWidget(i); + if (w) { + widgets.push_back(w); + area.add(w); + } + } +} + +CursorCommand::CursorCommand(int s, Description &d, unsigned int *v): + description(d) +{ + step = s; + value = v; +} + +void CursorCommand::doAction() +{ + if ((! *value) && (0 > step)) + return; + unsigned int newPageNo = *value + step; + TextPage *page = description.getPage(newPageNo); + if (page) { + *value = newPageNo; + description.updateInfo(); + } +} + + +TextPage::~TextPage() +{ + for (std::vector::iterator i = widgets.begin(); + i != widgets.end(); i++) + delete *i; +} + + +TextParser::TextParser(const std::wstring &text, Font &font, + int x, int y, int width, int height): tokenizer(text), font(font) +{ + spaceWidth = font.getWidth(L' '); + charHeight = font.getWidth(L'A'); + offsetX = x; + offsetY = y; + pageWidth = width; + pageHeight = height; +} + + +TextParser::~TextParser() +{ + for (std::vector::iterator i = pages.begin(); + i != pages.end(); i++) + delete *i; + for (std::map::iterator i = images.begin(); + i != images.end(); i++) + delete (*i).second; +} + + +void TextParser::addLine(TextPage *page, std::wstring &line, int &curPosY, + int &lineWidth) +{ + if (0 < line.length()) { + page->add(new Label(&font, offsetX, offsetY + curPosY, + 255,255,255, line, false)); + line.clear(); + curPosY += 10 + charHeight; + lineWidth = 0; + } +} + +bool TextParser::isImage(const std::wstring &name) +{ + int len = name.length(); + return (3 < len) && (L'$' == name[0]) && (L'$' == name[len - 1]); +} + +std::wstring TextParser::keywordToImage(const std::wstring &name) +{ + return name.substr(1, name.length() - 2); +} + +SDL_Surface* TextParser::getImage(const std::wstring &name) +{ + SDL_Surface *img = images[name]; + if (! img) { + img = loadImage(name); + images[name] = img; + } + return img; +} + +void TextParser::parseNextPage() +{ + if (tokenizer.isFinished()) + return; + + int curPosY = 0; + int lineWidth = 0; + TextPage *page = new TextPage(); + std::wstring line; + + while (true) { + Token t = tokenizer.getNextToken(); + if (Token::Eof == t.getType()) + break; + if (Token::Para == t.getType()) { + if (0 < line.length()) + addLine(page, line, curPosY, lineWidth); + if (! page->isEmpty()) + curPosY += 10; + } else if (Token::Word == t.getType()) { + const std::wstring &word = t.getContent(); + if (isImage(word)) { + addLine(page, line, curPosY, lineWidth); + SDL_Surface *image = getImage(keywordToImage(word)); + if ((image->h + curPosY < pageHeight) || page->isEmpty()) { + int x = offsetX + (pageWidth - image->w) / 2; + page->add(new Picture(x, offsetY + curPosY, image)); + curPosY += image->h; + } else { + tokenizer.unget(t); + break; + } + } else { + int width = font.getWidth(word); + if (lineWidth + width > pageWidth) { + if (! lineWidth) { + line = word; + addLine(page, line, curPosY, lineWidth); + } else { + addLine(page, line, curPosY, lineWidth); + if (curPosY >= pageHeight) { + tokenizer.unget(t); + break; + } + line = word; + lineWidth = width; + } + } else { + lineWidth += width; + if (line.size()) { + line += L' '; + lineWidth += spaceWidth; + } + line += word; + } + } + } + if (curPosY >= pageHeight) + break; + } + addLine(page, line, curPosY, lineWidth); + if (! page->isEmpty()) + pages.push_back(page); + else + delete page; +} + + +TextPage* TextParser::getPage(unsigned int no) +{ + while ((! tokenizer.isFinished()) && (pages.size() <= no)) + parseNextPage(); + if (pages.size() <= no) + return NULL; + else + return pages[no]; +} + diff --git a/descr.h b/descr.h new file mode 100644 index 0000000..4b88752 --- /dev/null +++ b/descr.h @@ -0,0 +1,12 @@ +#ifndef __DESCR_H__ +#define __DESCR_H__ + + +#include "widgets.h" + + +void showDescription(Area *parentArea); + + +#endif + diff --git a/einstein.res b/einstein.res new file mode 100644 index 0000000000000000000000000000000000000000..086cb1b46242f70a369b76025ad25c581d8f2f21 GIT binary patch literal 656076 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 z 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

C%-$hl);}Dr;}=_IV?dlk2S><#LgR2?`^@6%W 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 kZ4g(BD?-{pmLm89)+qzKu! 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

I0T2{oE5I?vM=bi$y`NFP;Gnu>)F;d7+1?Gax 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 Yl?r!XY^ts4XqB%xWk=f|9eEM|KO)+njQ{`u literal 0 HcmV?d00001 diff --git a/exceptions.h b/exceptions.h new file mode 100644 index 0000000..ffaff26 --- /dev/null +++ b/exceptions.h @@ -0,0 +1,24 @@ +#ifndef __EXCEPTIONS_H__ +#define __EXCEPTIONS_H__ + + +#include +#include + + +class Exception +{ + private: + std::wstring message; + + public: + Exception(const std::wstring& msg) { message = msg; /*std::cout << msg << std::endl;*/ }; + virtual ~Exception() { }; + + public: + const std::wstring& getMessage() const { return message; }; +}; + + +#endif + diff --git a/font.cpp b/font.cpp new file mode 100644 index 0000000..d535605 --- /dev/null +++ b/font.cpp @@ -0,0 +1,117 @@ +#include "font.h" +#include "main.h" +#include "utils.h" +#include "unicode.h" + + +static Uint16 *convBuf = NULL; +static size_t bufSize = 0; + + +static Uint16 *strToUint16(const std::wstring &text) +{ + const wchar_t *str = text.c_str(); + if ((! str) || (sizeof(wchar_t) == sizeof(Uint16))) + return (Uint16*)str; + else { + size_t len = wcslen(str); + if (! convBuf) { + size_t sz = len * 2 + 1; + convBuf = (Uint16*)malloc(sizeof(Uint16) * sz); + bufSize = sz; + } else + if (bufSize < len + 1) { + size_t sz = len * 2 + 1; + convBuf = (Uint16*)realloc(convBuf, sizeof(Uint16) * sz); + // I should check if it is NULL, but I'm too lazy today + bufSize = sz; + } + for (unsigned int i = 0; i <= len; i++) + convBuf[i] = (Uint16)str[i]; + return convBuf; + } +} + + + +Font::Font(const std::wstring &name, int ptsize) +{ + int size; + + data = resources->getRef(name, size); + if (! data) + throw Exception(name + L" not found"); + SDL_RWops *op = SDL_RWFromMem(data, size); + font = TTF_OpenFontRW(op, 1, ptsize); + + if (! font) + throw Exception(L"Error loading font " + name); +} + + +Font::~Font() +{ + TTF_CloseFont(font); + resources->delRef(data); +} + + +void Font::draw(SDL_Surface *s, int x, int y, int r, int g, int b, + bool shadow, const std::wstring &text) +{ + if (text.length() < 1) + return; + + Uint16 *str = strToUint16(text); + + if (shadow) { + SDL_Color color = { 1, 1, 1, 1 }; + SDL_Surface *surface = TTF_RenderUNICODE_Blended(font, str, color); + SDL_Rect src = { 0, 0, surface->w, surface->h }; + SDL_Rect dst = { x+1, y+1, surface->w, surface->h }; + SDL_BlitSurface(surface, &src, s, &dst); + SDL_FreeSurface(surface); + } + SDL_Color color = { r, g, b, 0 }; + SDL_Surface *surface = TTF_RenderUNICODE_Blended(font, str, color); + SDL_Rect src = { 0, 0, surface->w, surface->h }; + SDL_Rect dst = { x, y, surface->w, surface->h }; + SDL_BlitSurface(surface, &src, s, &dst); + SDL_FreeSurface(surface); +} + +void Font::draw(int x, int y, int r, int g, int b, bool shadow, + const std::wstring &text) +{ + draw(screen.getSurface(), x, y, r,g,b, shadow, text); +} + +int Font::getWidth(const std::wstring &text) +{ + int w, h; + Uint16 *str = strToUint16(text); + TTF_SizeUNICODE(font, str, &w, &h); + return w; +} + +int Font::getWidth(wchar_t ch) +{ + int minx, maxx, miny, maxy, advance; + TTF_GlyphMetrics(font, (Uint16)ch, &minx, &maxx, &miny, &maxy, &advance); + return advance; +} + +int Font::getHeight(const std::wstring &text) +{ + int w, h; + Uint16 *str = strToUint16(text); + TTF_SizeUNICODE(font, str, &w, &h); + return h; +} + +void Font::getSize(const std::wstring &text, int &width, int &height) +{ + Uint16 *str = strToUint16(text); + TTF_SizeUNICODE(font, str, &width, &height); +} + diff --git a/font.h b/font.h new file mode 100644 index 0000000..2e8e44d --- /dev/null +++ b/font.h @@ -0,0 +1,32 @@ +#ifndef __FONT_H__ +#define __FONT_H__ + + +#include +#include + + +class Font +{ + private: + TTF_Font *font; + void *data; + + public: + Font(const std::wstring &name, int ptsize); + ~Font(); + + public: + void draw(SDL_Surface *s, int x, int y, int r, int g, int b, + bool shadow, const std::wstring &text); + void draw(int x, int y, int r, int g, int b, bool shadow, + const std::wstring &text); + int getWidth(const std::wstring &text); + int getWidth(wchar_t ch); + int getHeight(const std::wstring &text); + void getSize(const std::wstring &text, int &width, int &height); +}; + + +#endif + diff --git a/formatter.cpp b/formatter.cpp new file mode 100644 index 0000000..8d76c12 --- /dev/null +++ b/formatter.cpp @@ -0,0 +1,187 @@ +#include "formatter.h" +#include "utils.h" +#include "convert.h" + + +#define ADD_ARG(t) \ + commands[commandsCnt].type = t; \ + argNo = readInt(data + offset); \ + if (argNo > maxArg) \ + maxArg = argNo; \ + commands[commandsCnt].data = (void*)argNo; \ + commandsCnt++; + +Formatter::Formatter(unsigned char *data, int offset) +{ + int cnt = readInt(data + offset); + if (! cnt) { + commandsCnt = argsCnt = 0; + commands = NULL; + args = NULL; + } + + offset += 4; + commands = new Command[cnt]; + commandsCnt = 0; + + int maxArg = 0, argNo; + + for (int i = 0; i < cnt; i++) { + int type = data[offset]; + offset++; + int size = readInt(data + offset); + offset += 4; + switch (type) { + case 1: + commands[commandsCnt].type = TEXT_COMMAND; + commands[commandsCnt].data = new std::wstring( + fromUtf8((char*)data + offset, size)); + commandsCnt++; + break; + + case 2: ADD_ARG(INT_ARG); break; + case 3: ADD_ARG(STRING_ARG); break; + case 4: ADD_ARG(FLOAT_ARG); break; + case 5: ADD_ARG(DOUBLE_ARG); break; + } + offset += size; + } + + argsCnt = maxArg; + if (! argsCnt) + args = NULL; + else { + args = new CmdType[argsCnt]; + memset(args, 0, sizeof(CmdType) * argsCnt); + for (int i = 0; i < commandsCnt; i++) { + Command &c = commands[i]; + if ((c.type == INT_ARG) || (c.type == STRING_ARG) || + (c.type == FLOAT_ARG) || (c.type == DOUBLE_ARG)) + { + int no = (int)c.data; + args[no - 1] = c.type; + } + } + } +} + +Formatter::~Formatter() +{ + for (int i = 0; i < commandsCnt; i++) + if (TEXT_COMMAND == commands[i].type) + delete (std::wstring*)(commands[i].data); + if (commands) + delete[] commands; + if (args) + delete[] args; +} + +std::wstring Formatter::getMessage() const +{ + std::wstring s; + + for (int i = 0; i < commandsCnt; i++) + if (TEXT_COMMAND == commands[i].type) + s += *(std::wstring*)(commands[i].data); + return s; +} + + +class ArgValue +{ + public: + virtual ~ArgValue() { }; + virtual std::wstring format(Formatter::Command *command) = 0; +}; + +template +class TemplatedArgValue: public ArgValue +{ + private: + T value; + + public: + TemplatedArgValue(const T &v) { value = v; }; + virtual std::wstring format(Formatter::Command *command) { + return toString(value); + }; +}; + +class StrArgValue: public ArgValue +{ + private: + std::wstring value; + + public: + StrArgValue(const std::wstring &v): value(v) { }; + virtual std::wstring format(Formatter::Command *command) { + return value; + }; +}; + + +std::wstring Formatter::format(std::vector &argValues) const +{ + std::wstring s; + int no; + + for (int i = 0; i < commandsCnt; i++) { + Command *cmd = &commands[i]; + + switch (cmd->type) { + case TEXT_COMMAND: + s += *(std::wstring*)(cmd->data); + break; + + case STRING_ARG: + case INT_ARG: + no = (int)cmd->data - 1; + if (no < (int)argValues.size()) + s += argValues[no]->format(cmd); + break; + + default: ; + } + } + + return s; +} + +std::wstring Formatter::format(va_list ap) const +{ + if (! argsCnt) + return getMessage(); + + std::vector argValues; + + for (int i = 0; i < argsCnt; i++) { + switch (args[i]) { + case INT_ARG: + argValues.push_back(new TemplatedArgValue + (va_arg(ap, int))); + break; + case STRING_ARG: + argValues.push_back(new StrArgValue(va_arg(ap, wchar_t*))); + break; + case DOUBLE_ARG: + argValues.push_back(new TemplatedArgValue + (va_arg(ap, double))); + break; + case FLOAT_ARG: + argValues.push_back(new TemplatedArgValue + ((float)va_arg(ap, double))); + break; + default: + i = argsCnt; + } + } + + std::wstring s = format(argValues); + + for (std::vector::iterator i = argValues.begin(); + i != argValues.end(); i++) + delete *i; + + return s; +} + diff --git a/formatter.h b/formatter.h new file mode 100644 index 0000000..9622795 --- /dev/null +++ b/formatter.h @@ -0,0 +1,63 @@ +#ifndef __FORMATTER_H__ +#define __FORMATTER_H__ + + +#include +#include +#include + + +class ArgValue; + + +/// Localized message formatter +class Formatter +{ + public: + typedef enum { + EMPTY_CMD = 0, + TEXT_COMMAND, + INT_ARG, + STRING_ARG, + DOUBLE_ARG, + FLOAT_ARG + } CmdType; + + typedef struct + { + CmdType type; + void *data; + } Command; + + private: + int commandsCnt; + int argsCnt; + + Command *commands; + + CmdType *args; + + public: + /// Create localized message from message buffer. + /// \param data buffer contained message file + /// \param offset offset to message from buffer start + Formatter(unsigned char *data, int offset); + ~Formatter(); + + public: + /// Get message text. + std::wstring getMessage() const; + + /// Fromat message + /// \param ap list of arguments + std::wstring format(va_list ap) const; + + private: + std::wstring format(std::vector &argValues) const; +}; + + + + +#endif + diff --git a/game.cpp b/game.cpp new file mode 100644 index 0000000..de6d443 --- /dev/null +++ b/game.cpp @@ -0,0 +1,569 @@ +#include "main.h" +#include "utils.h" +#include "widgets.h" +#include "puzzle.h" +#include "verthints.h" +#include "horhints.h" +#include "widgets.h" +#include "font.h" +#include "topscores.h" +#include "opensave.h" +#include "options.h" +#include "game.h" +#include "messages.h" +#include "sound.h" +#include "descr.h" + + + +class GameBackground: public Widget +{ + public: + virtual void draw(); +}; + + +void GameBackground::draw() +{ + // draw background + drawWallpaper(L"rain.bmp"); + + // draw title + SDL_Surface *tile = loadImage(L"title.bmp"); + screen.draw(8, 10, tile); + SDL_FreeSurface(tile); + + Font titleFont(L"nova.ttf", 28); + titleFont.draw(screen.getSurface(), 20, 20, 255,255,0, true, + msg(L"einsteinPuzzle")); + + screen.addRegionToUpdate(0, 0, screen.getWidth(), screen.getHeight()); +} + + +class ToggleHintCommand: public Command +{ + private: + VertHints *verHints; + HorHints *horHints; + + public: + ToggleHintCommand(VertHints *v, HorHints *h) { + verHints = v; + horHints = h; + }; + + virtual void doAction() { + verHints->toggleExcluded(); + horHints->toggleExcluded(); + }; +}; + + +class Watch: public TimerHandler, public Widget +{ + private: + Uint32 lastRun; + Uint32 elapsed; + bool stoped; + int lastUpdate; + Font *font; + + public: + Watch(); + Watch(std::istream &stream); + virtual ~Watch(); + + public: + virtual void onTimer(); + void stop(); + void start(); + virtual void draw(); + int getElapsed() { return elapsed; }; + void save(std::ostream &stream); + void reset(); +}; + + +Watch::Watch() +{ + lastRun = elapsed = lastUpdate = 0; + stop(); + font = new Font(L"luximb.ttf", 16); +} + +Watch::Watch(std::istream &stream) +{ + elapsed = readInt(stream); + lastUpdate = 0; + stop(); + font = new Font(L"luximb.ttf", 16); +} + +Watch::~Watch() +{ + delete font; +} + +void Watch::onTimer() +{ + if (stoped) + return; + + Uint32 now = SDL_GetTicks(); + elapsed += now - lastRun; + lastRun = now; + + int seconds = elapsed / 1000; + if (seconds != lastUpdate) + draw(); +} + +void Watch::stop() +{ + stoped = true; +} + +void Watch::start() +{ + stoped = false; + lastRun = SDL_GetTicks(); +} + +void Watch::draw() +{ + int time = elapsed / 1000; + std::wstring s = secToStr(time); + + int x = 700; + int y = 24; + int w, h; + font->getSize(s, w, h); + SDL_Rect rect = { x-2, y-2, w+4, h+4 }; + SDL_FillRect(screen.getSurface(), &rect, + SDL_MapRGB(screen.getSurface()->format, 0, 0, 255)); + font->draw(x, y, 255,255,255, true, s); + screen.addRegionToUpdate(x-2, y-2, w+4, h+4); + + lastUpdate = time; +} + +void Watch::save(std::ostream &stream) +{ + writeInt(stream, elapsed); +} + +void Watch::reset() +{ + elapsed = lastUpdate = 0; + lastRun = SDL_GetTicks(); +} + + +class PauseGameCommand: public Command +{ + private: + Area *gameArea; + Watch *watch; + Widget *background; + + public: + PauseGameCommand(Area *a, Watch *w, Widget *bg) { + gameArea = a; + watch = w; + background = bg; + }; + + virtual void doAction() { + watch->stop(); + Area area; + area.add(background, false); + Font font(L"laudcn2.ttf", 16); + area.add(new Window(280, 275, 240, 50, L"greenpattern.bmp", 6)); + area.add(new Label(&font, 280, 275, 240, 50, Label::ALIGN_CENTER, + Label::ALIGN_MIDDLE, 255,255,0, msg(L"paused"))); + area.add(new AnyKeyAccel()); + area.run(); + sound->play(L"click.wav"); + gameArea->updateMouse(); + gameArea->draw(); + watch->start(); + }; +}; + + +class WinCommand: public Command +{ + private: + Area *gameArea; + Watch *watch; + Game *game; + + public: + WinCommand(Area *a, Watch *w, Game *g) { + gameArea = a; + watch = w; + game = g; + }; + + virtual void doAction() { + sound->play(L"applause.wav"); + watch->stop(); + Font font(L"laudcn2.ttf", 20); + showMessageWindow(gameArea, L"marble1.bmp", + 500, 70, &font, 255,0,0, msg(L"won")); + gameArea->draw(); + TopScores scores; + int score = watch->getElapsed() / 1000; + int pos = -1; + if (! game->isHinted()) { + if ((! scores.isFull()) || (score < scores.getMaxScore())) { + std::wstring name = enterNameDialog(gameArea); + pos = scores.add(name, score); + } + } + showScoresWindow(gameArea, &scores, pos); + gameArea->finishEventLoop(); + }; +}; + +class OkDlgCommand: public Command +{ + private: + bool &res; + Area *area; + + public: + OkDlgCommand(Area *a, bool &r): res(r) { + area = a; + }; + + virtual void doAction() { + res = true; + area->finishEventLoop(); + }; +}; + +class FailCommand: public Command +{ + private: + Area *gameArea; + Game *game; + + public: + FailCommand(Area *a, Game *g) { gameArea = a; game = g; }; + + virtual void doAction() { + sound->play(L"glasbk2.wav"); + bool restart = false; + bool newGame = false; + Font font(L"laudcn2.ttf", 24); + Font btnFont(L"laudcn2.ttf", 14); + Area area; + area.add(gameArea); + area.add(new Window(220, 240, 360, 140, L"redpattern.bmp", 6)); + area.add(new Label(&font, 250, 230, 300, 100, Label::ALIGN_CENTER, + Label::ALIGN_MIDDLE, 255,255,0, msg(L"loose"))); + OkDlgCommand newGameCmd(&area, newGame); + area.add(new Button(250, 340, 90, 25, &btnFont, 255,255,0, + L"redpattern.bmp", msg(L"startNew"), &newGameCmd)); + OkDlgCommand restartCmd(&area, restart); + area.add(new Button(350, 340, 90, 25, &btnFont, 255,255,0, + L"redpattern.bmp", msg(L"tryAgain"), &restartCmd)); + ExitCommand exitCmd(area); + area.add(new Button(450, 340, 90, 25, &btnFont, 255,255,0, + L"redpattern.bmp", msg(L"exit"), &exitCmd)); + area.run(); + if (restart || newGame) { + if (newGame) + game->newGame(); + else + game->restart(); + gameArea->draw(); + gameArea->updateMouse(); + } else + gameArea->finishEventLoop(); + }; +}; + + +class CheatAccel: public Widget +{ + private: + Command *command; + std::wstring typed; + std::wstring cheat; + + public: + CheatAccel(const std::wstring s, Command *cmd): cheat(s) { + command = cmd; + }; + + public: + virtual bool onKeyDown(SDLKey key, unsigned char ch) { + if ((key >= SDLK_a) && (key <= SDLK_z)) { + wchar_t s = L'a' + key - SDLK_a; + typed += s; + if (typed.length() == cheat.length()) { + if (command && (typed == cheat)) + command->doAction(); + } else { + int pos = typed.length() - 1; + if (typed[pos] == cheat[pos]) + return false; + } + } + if (typed.length() > 0) + typed = L""; + return false; + } +}; + + +class CheatCommand: public Command +{ + private: + Area *gameArea; + + public: + CheatCommand(Area *a) { gameArea = a; }; + + virtual void doAction() { + Font font(L"nova.ttf", 30); + showMessageWindow(gameArea, L"darkpattern.bmp", + 500, 100, &font, 255,255,255, + msg(L"iddqd")); + gameArea->draw(); + }; +}; + + +class SaveGameCommand: public Command +{ + private: + Area *gameArea; + Watch *watch; + Widget *background; + Game *game; + + public: + SaveGameCommand(Area *a, Watch *w, Widget *bg, Game *g) { + gameArea = a; + watch = w; + background = bg; + game = g; + }; + + virtual void doAction() { + watch->stop(); + + Area area; + area.add(background, false); + saveGame(&area, game); + + gameArea->updateMouse(); + gameArea->draw(); + watch->start(); + }; +}; + + +class GameOptionsCommand: public Command +{ + private: + Area *gameArea; + + public: + GameOptionsCommand(Area *a) { + gameArea = a; + }; + + virtual void doAction() { + showOptionsWindow(gameArea); + gameArea->updateMouse(); + gameArea->draw(); + }; +}; + + +class HelpCommand: public Command +{ + private: + Area *gameArea; + Watch *watch; + Widget *background; + + public: + HelpCommand(Area *a, Watch *w, Widget *b) { + gameArea = a; + watch = w; + background = b; + }; + + virtual void doAction() { + watch->stop(); + Area area; + area.add(background, false); + area.draw(); + showDescription(&area); + gameArea->updateMouse(); + gameArea->draw(); + watch->start(); + }; +}; + + + +Game::Game() +{ + genPuzzle(); + + possibilities = new Possibilities(); + openInitial(*possibilities, rules); + + puzzle = new Puzzle(iconSet, solvedPuzzle, possibilities); + verHints = new VertHints(iconSet, rules); + horHints = new HorHints(iconSet, rules); + watch = new Watch(); +} + +Game::Game(std::istream &stream) +{ + pleaseWait(); + + loadPuzzle(solvedPuzzle, stream); + loadRules(rules, stream); + memcpy(savedSolvedPuzzle, solvedPuzzle, sizeof(solvedPuzzle)); + savedRules = rules; + possibilities = new Possibilities(stream); + puzzle = new Puzzle(iconSet, solvedPuzzle, possibilities); + verHints = new VertHints(iconSet, rules, stream); + horHints = new HorHints(iconSet, rules, stream); + watch = new Watch(stream); + hinted = true; +} + +Game::~Game() +{ + delete watch; + delete possibilities; + delete verHints; + delete horHints; + delete puzzle; + deleteRules(); +} + +void Game::save(std::ostream &stream) +{ + savePuzzle(solvedPuzzle, stream); + saveRules(rules, stream); + possibilities->save(stream); + verHints->save(stream); + horHints->save(stream); + watch->save(stream); +} + +void Game::deleteRules() +{ + for (Rules::iterator i = rules.begin(); i != rules.end(); i++) + delete *i; + rules.clear(); +} + +void Game::pleaseWait() +{ + drawWallpaper(L"rain.bmp"); + Window window(230, 260, 340, 80, L"greenpattern.bmp", 6); + window.draw(); + Font font(L"laudcn2.ttf", 16); + Label label(&font, 280, 275, 240, 50, Label::ALIGN_CENTER, + Label::ALIGN_MIDDLE, 255,255,0, msg(L"loading")); + label.draw(); + screen.addRegionToUpdate(0, 0, screen.getWidth(), screen.getHeight()); + screen.flush(); +} + +void Game::genPuzzle() +{ + pleaseWait(); + + int horRules, verRules; + do { + if (rules.size() > 0) + deleteRules(); + ::genPuzzle(solvedPuzzle, rules); + getHintsQty(rules, verRules, horRules); + } while ((horRules > 24) || (verRules > 15)); + + memcpy(savedSolvedPuzzle, solvedPuzzle, sizeof(solvedPuzzle)); + savedRules = rules; + + hinted = false; +} + +void Game::resetVisuals() +{ + possibilities->reset(); + openInitial(*possibilities, rules); + puzzle->reset(); + verHints->reset(rules); + horHints->reset(rules); + watch->reset(); +} + +void Game::newGame() +{ + genPuzzle(); + resetVisuals(); +} + +void Game::restart() +{ + memcpy(solvedPuzzle, savedSolvedPuzzle, sizeof(solvedPuzzle)); + rules = savedRules; + + resetVisuals(); + hinted = true; +} + +#define BUTTON(x, y, text, cmd) \ + area.add(new Button(x, y, 94, 30, &btnFont, 255,255,0, \ + L"btn.bmp", msg(text), false, cmd)); + +void Game::run() +{ + Area area; + Font btnFont(L"laudcn2.ttf", 14); + + area.setTimer(300, watch); + + GameBackground *background = new GameBackground(); + area.add(background); + CheatCommand cheatCmd(&area); + area.add(new CheatAccel(L"iddqd", &cheatCmd)); + WinCommand winCmd(&area, watch, this); + FailCommand failCmd(&area, this); + puzzle->setCommands(&winCmd, &failCmd); + area.add(puzzle, false); + area.add(verHints, false); + area.add(horHints, false); + + PauseGameCommand pauseGameCmd(&area, watch, background); + BUTTON(12, 400, L"pause", &pauseGameCmd) + ToggleHintCommand toggleHintsCmd(verHints, horHints); + BUTTON(119, 400, L"switch", &toggleHintsCmd) + SaveGameCommand saveCmd(&area, watch, background, this); + BUTTON(12, 440, L"save", &saveCmd) + GameOptionsCommand optionsCmd(&area); + BUTTON(119, 440, L"options", &optionsCmd) + ExitCommand exitGameCmd(area); + BUTTON(226, 400, L"exit", &exitGameCmd) + area.add(new KeyAccel(SDLK_ESCAPE, &exitGameCmd)); + HelpCommand helpCmd(&area, watch, background); + BUTTON(226, 440, L"help", &helpCmd) + area.add(watch, false); + + watch->start(); + area.run(); +} + diff --git a/game.h b/game.h new file mode 100644 index 0000000..223704d --- /dev/null +++ b/game.h @@ -0,0 +1,58 @@ +#ifndef __GAME_H__ +#define __GAME_H__ + + +#include +#include "puzgen.h" +#include "verthints.h" +#include "horhints.h" +#include "puzzle.h" + + + +class Watch; + + + +class Game +{ + private: + SolvedPuzzle solvedPuzzle; + Rules rules; + Possibilities *possibilities; + VertHints *verHints; + HorHints *horHints; + IconSet iconSet; + Puzzle *puzzle; + Watch *watch; + bool hinted; + SolvedPuzzle savedSolvedPuzzle; + Rules savedRules; + + public: + Game(); + Game(std::istream &stream); + ~Game(); + + public: + SolvedPuzzle& getSolvedPuzzle() { return solvedPuzzle; }; + Rules& getRules() { return rules; }; + Possibilities* getPossibilities() { return possibilities; }; + VertHints* getVerHints() { return verHints; }; + HorHints* getHorHints() { return horHints; }; + void save(std::ostream &stream); + void run(); + bool isHinted() { return hinted; }; + void setHinted() { hinted = true; }; + void restart(); + void newGame(); + + private: + void deleteRules(); + void pleaseWait(); + void genPuzzle(); + void resetVisuals(); +}; + +#endif + diff --git a/horhints.cpp b/horhints.cpp new file mode 100644 index 0000000..4ee4498 --- /dev/null +++ b/horhints.cpp @@ -0,0 +1,207 @@ +#include "horhints.h" +#include "main.h" +#include "utils.h" +#include "sound.h" + + +#define HINTS_COLS 3 +#define HINTS_ROWS 8 +#define TILE_GAP_X 4 +#define TILE_GAP_Y 4 +#define TILE_X 348 +#define TILE_Y 68 +#define TILE_WIDTH 48 +#define TILE_HEIGHT 48 + + +HorHints::HorHints(IconSet &is, Rules &r): iconSet(is) +{ + reset(r); +} + + +HorHints::HorHints(IconSet &is, Rules &rl, std::istream &stream): iconSet(is) +{ + int qty = readInt(stream); + + for (int i = 0; i < qty; i++) { + int no = readInt(stream); + numbersArr.push_back(no); + Rule *r = getRule(rl, no); + int excluded = readInt(stream); + if (excluded) { + excludedRules.push_back(r); + rules.push_back(NULL); + } else { + excludedRules.push_back(NULL); + rules.push_back(r); + } + } + + showExcluded = readInt(stream); + + int x, y; + SDL_GetMouseState(&x, &y); + highlighted = getRuleNo(x, y); +} + + +void HorHints::reset(Rules &r) +{ + rules.clear(); + excludedRules.clear(); + numbersArr.clear(); + + int no = 0; + for (Rules::iterator i = r.begin(); i != r.end(); i++) { + Rule *rule = *i; + if (rule->getShowOpts() == Rule::SHOW_HORIZ) { + rules.push_back(rule); + excludedRules.push_back(NULL); + numbersArr.push_back(no); + } + no++; + } + + showExcluded = false; + + int x, y; + SDL_GetMouseState(&x, &y); + highlighted = getRuleNo(x, y); +} + +void HorHints::draw() +{ + for (int i = 0; i < HINTS_ROWS; i++) + for (int j = 0; j < HINTS_COLS; j++) + drawCell(j, i, true); +} + +void HorHints::drawCell(int col, int row, bool addToUpdate) +{ + int x = TILE_X + col * (TILE_WIDTH*3 + TILE_GAP_X); + int y = TILE_Y + row * (TILE_HEIGHT + TILE_GAP_Y); + + Rule *r = NULL; + int no = row * HINTS_COLS + col; + if (no < (int)rules.size()) + if (showExcluded) + r = excludedRules[no]; + else + r = rules[no]; + if (r) + r->draw(x, y, iconSet, no == highlighted); + else + for (int i = 0; i < 3; i++) + screen.draw(x + TILE_HEIGHT*i, y, iconSet.getEmptyHintIcon()); + + if (addToUpdate) + screen.addRegionToUpdate(x, y, TILE_WIDTH*3, TILE_HEIGHT); +} + + +bool HorHints::onMouseButtonDown(int button, int x, int y) +{ + if (button != 3) + return false; + + int no = getRuleNo(x, y); + if (no < 0) return false; + int row = no / HINTS_COLS; + int col = no - row * HINTS_COLS; + + if (showExcluded) { + Rule *r = excludedRules[no]; + if (r) { + sound->play(L"whizz.wav"); + rules[no] = r; + excludedRules[no] = NULL; + drawCell(col, row); + } + } else { + Rule *r = rules[no]; + if (r) { + sound->play(L"whizz.wav"); + rules[no] = NULL; + excludedRules[no] = r; + drawCell(col, row); + } + } + + return true; +} + + +void HorHints::toggleExcluded() +{ + showExcluded = !showExcluded; + draw(); +} + + +bool HorHints::onMouseMove(int x, int y) +{ + int no = getRuleNo(x, y); + + if (no != highlighted) { + int old = highlighted; + highlighted = no; + if (isActive(old)) { + int row = old / HINTS_COLS; + int col = old - row * HINTS_COLS; + drawCell(col, row); + } + if (isActive(no)) { + int row = no / HINTS_COLS; + int col = no - row * HINTS_COLS; + drawCell(col, row); + } + } + + return false; +} + + +int HorHints::getRuleNo(int x, int y) +{ + if (! isInRect(x, y, TILE_X, TILE_Y, (TILE_WIDTH*3 + TILE_GAP_X) * HINTS_COLS, + (TILE_HEIGHT + TILE_GAP_Y) * HINTS_ROWS)) + return -1; + + x = x - TILE_X; + y = y - TILE_Y; + + int col = x / (TILE_WIDTH*3 + TILE_GAP_X); + if (col * (TILE_WIDTH*3 + TILE_GAP_X) + TILE_WIDTH*3 < x) + return -1; + int row = y / (TILE_HEIGHT + TILE_GAP_Y); + if (row * (TILE_HEIGHT + TILE_GAP_Y) + TILE_HEIGHT < y) + return -1; + + int no = row * HINTS_COLS + col; + if (no >= (int)rules.size()) + return -1; + + return no; +} + +bool HorHints::isActive(int ruleNo) +{ + if ((ruleNo < 0) || (ruleNo >= (int)rules.size())) + return false; + Rule *r = showExcluded ? excludedRules[ruleNo] : rules[ruleNo]; + return r != NULL; +} + + +void HorHints::save(std::ostream &stream) +{ + int cnt = numbersArr.size(); + writeInt(stream, cnt); + for (int i = 0; i < cnt; i++) { + writeInt(stream, numbersArr[i]); + writeInt(stream, rules[i] ? 0 : 1); + } + writeInt(stream, showExcluded ? 1 : 0); +} + diff --git a/horhints.h b/horhints.h new file mode 100644 index 0000000..9f2d80e --- /dev/null +++ b/horhints.h @@ -0,0 +1,41 @@ +#ifndef __HORHINTS_H__ +#define __HORHINTS_H__ + + +#include +#include "iconset.h" +#include "puzgen.h" +#include "widgets.h" + + + +class HorHints: public Widget +{ + private: + IconSet &iconSet; + typedef std::vector RulesArr; + RulesArr rules; + RulesArr excludedRules; + std::vector numbersArr; + bool showExcluded; + int highlighted; + + public: + HorHints(IconSet &is, Rules &rules); + HorHints(IconSet &is, Rules &rules, std::istream &stream); + + public: + virtual void draw(); + void drawCell(int col, int row, bool addToUpdate=true); + virtual bool onMouseButtonDown(int button, int x, int y); + void toggleExcluded(); + int getRuleNo(int x, int y); + virtual bool onMouseMove(int x, int y); + bool isActive(int ruleNo); + void save(std::ostream &stream); + void reset(Rules &rules); +}; + + +#endif + diff --git a/i18n.cpp b/i18n.cpp new file mode 100644 index 0000000..7cb9229 --- /dev/null +++ b/i18n.cpp @@ -0,0 +1,430 @@ +#include "i18n.h" +#include +#include "unicode.h" +#include "convert.h" + +#ifdef WIN32 +#include +//#include +#endif + + +Locale locale; + + +#ifdef WIN32 + +static struct _CountryMap { + wchar_t iso2[3]; + char iso3[4]; +} countries[] = { + { L"AF", "AFG" }, + { L"AL", "ALB" }, + { L"DZ", "DZA" }, + { L"AS", "ASM" }, + { L"AD", "AND" }, + { L"AO", "AGO" }, + { L"AI", "AIA" }, + { L"AQ", "ATA" }, + { L"AG", "ATG" }, + { L"AR", "ARG" }, + { L"AM", "ARM" }, + { L"AW", "ABW" }, + { L"AU", "AUS" }, + { L"AT", "AUT" }, + { L"AZ", "AZE" }, + { L"BS", "BHS" }, + { L"BH", "BHR" }, + { L"BD", "BGD" }, + { L"BB", "BRB" }, + { L"BY", "BLR" }, + { L"BE", "BEL" }, + { L"BZ", "BLZ" }, + { L"BJ", "BEN" }, + { L"BM", "BMU" }, + { L"BT", "BTN" }, + { L"BO", "BOL" }, + { L"BA", "BIH" }, + { L"BW", "BWA" }, + { L"BV", "BVT" }, + { L"BR", "BRA" }, + { L"IO", "IOT" }, + { L"BN", "BRN" }, + { L"BG", "BGR" }, + { L"BF", "BFA" }, + { L"BI", "BDI" }, + { L"KH", "KHM" }, + { L"CM", "CMR" }, + { L"CA", "CAN" }, + { L"CV", "CPV" }, + { L"KY", "CYM" }, + { L"CF", "CAF" }, + { L"TD", "TCD" }, + { L"CL", "CHL" }, + { L"CN", "CHN" }, + { L"CX", "CXR" }, + { L"CC", "CCK" }, + { L"CO", "COL" }, + { L"KM", "COM" }, + { L"CD", "COD" }, + { L"CG", "COG" }, + { L"CK", "COK" }, + { L"CR", "CRI" }, + { L"CI", "CIV" }, + { L"HR", "HRV" }, + { L"CU", "CUB" }, + { L"CY", "CYP" }, + { L"CZ", "CZE" }, + { L"DK", "DNK" }, + { L"DJ", "DJI" }, + { L"DM", "DMA" }, + { L"DO", "DOM" }, + { L"TL", "TLS" }, + { L"EC", "ECU" }, + { L"EG", "EGY" }, + { L"SV", "SLV" }, + { L"GQ", "GNQ" }, + { L"ER", "ERI" }, + { L"EE", "EST" }, + { L"ET", "ETH" }, + { L"FK", "FLK" }, + { L"FO", "FRO" }, + { L"FJ", "FJI" }, + { L"FI", "FIN" }, + { L"FR", "FRA" }, + { L"FX", "FXX" }, + { L"GF", "GUF" }, + { L"PF", "PYF" }, + { L"TF", "ATF" }, + { L"GA", "GAB" }, + { L"GM", "GMB" }, + { L"GE", "GEO" }, + { L"DE", "DEU" }, + { L"GH", "GHA" }, + { L"GI", "GIB" }, + { L"GR", "GRC" }, + { L"GL", "GRL" }, + { L"GD", "GRD" }, + { L"GP", "GLP" }, + { L"GU", "GUM" }, + { L"GT", "GTM" }, + { L"GN", "GIN" }, + { L"GW", "GNB" }, + { L"GY", "GUY" }, + { L"HT", "HTI" }, + { L"HM", "HMD" }, + { L"HN", "HND" }, + { L"HK", "HKG" }, + { L"HU", "HUN" }, + { L"IS", "ISL" }, + { L"IN", "IND" }, + { L"ID", "IDN" }, + { L"IR", "IRN" }, + { L"IQ", "IRQ" }, + { L"IE", "IRL" }, + { L"IL", "ISR" }, + { L"IT", "ITA" }, + { L"JM", "JAM" }, + { L"JP", "JPN" }, + { L"JO", "JOR" }, + { L"KZ", "KAZ" }, + { L"KE", "KEN" }, + { L"KI", "KIR" }, + { L"KP", "PRK" }, + { L"KR", "KOR" }, + { L"KW", "KWT" }, + { L"KG", "KGZ" }, + { L"LA", "LAO" }, + { L"LV", "LVA" }, + { L"LB", "LBN" }, + { L"LS", "LSO" }, + { L"LR", "LBR" }, + { L"LY", "LBY" }, + { L"LI", "LIE" }, + { L"LT", "LTU" }, + { L"LU", "LUX" }, + { L"MO", "MAC" }, + { L"MK", "MKD" }, + { L"MG", "MDG" }, + { L"MW", "MWI" }, + { L"MY", "MYS" }, + { L"MV", "MDV" }, + { L"ML", "MLI" }, + { L"MT", "MLT" }, + { L"MH", "MHL" }, + { L"MQ", "MTQ" }, + { L"MR", "MRT" }, + { L"MU", "MUS" }, + { L"YT", "MYT" }, + { L"MX", "MEX" }, + { L"FM", "FSM" }, + { L"MD", "MDA" }, + { L"MC", "MCO" }, + { L"MN", "MNG" }, + { L"MS", "MSR" }, + { L"MA", "MAR" }, + { L"MZ", "MOZ" }, + { L"MM", "MMR" }, + { L"NA", "NAM" }, + { L"NR", "NRU" }, + { L"NP", "NPL" }, + { L"NL", "NLD" }, + { L"AN", "ANT" }, + { L"NC", "NCL" }, + { L"NZ", "NZL" }, + { L"NI", "NIC" }, + { L"NE", "NER" }, + { L"NG", "NGA" }, + { L"NU", "NIU" }, + { L"NF", "NFK" }, + { L"MP", "MNP" }, + { L"NO", "NOR" }, + { L"OM", "OMN" }, + { L"PK", "PAK" }, + { L"PW", "PLW" }, + { L"PS", "PSE" }, + { L"PA", "PAN" }, + { L"PG", "PNG" }, + { L"PY", "PRY" }, + { L"PE", "PER" }, + { L"PH", "PHL" }, + { L"PN", "PCN" }, + { L"PL", "POL" }, + { L"PT", "PRT" }, + { L"PR", "PRI" }, + { L"QA", "QAT" }, + { L"RE", "REU" }, + { L"RO", "ROU" }, + { L"RU", "RUS" }, + { L"RW", "RWA" }, + { L"KN", "KNA" }, + { L"LC", "LCA" }, + { L"VC", "VCT" }, + { L"WS", "WSM" }, + { L"SM", "SMR" }, + { L"ST", "STP" }, + { L"SA", "SAU" }, + { L"SN", "SEN" }, + { L"SC", "SYC" }, + { L"SL", "SLE" }, + { L"SG", "SGP" }, + { L"SK", "SVK" }, + { L"SI", "SVN" }, + { L"SB", "SLB" }, + { L"SO", "SOM" }, + { L"ZA", "ZAF" }, + { L"GS", "SGS" }, + { L"ES", "ESP" }, + { L"LK", "LKA" }, + { L"SH", "SHN" }, + { L"PM", "SPM" }, + { L"SD", "SDN" }, + { L"SR", "SUR" }, + { L"SJ", "SJM" }, + { L"SZ", "SWZ" }, + { L"SE", "SWE" }, + { L"CH", "CHE" }, + { L"SY", "SYR" }, + { L"TW", "TWN" }, + { L"TJ", "TJK" }, + { L"TZ", "TZA" }, + { L"TH", "THA" }, + { L"TG", "TGO" }, + { L"TK", "TKL" }, + { L"TO", "TON" }, + { L"TT", "TTO" }, + { L"TN", "TUN" }, + { L"TR", "TUR" }, + { L"TM", "TKM" }, + { L"TC", "TCA" }, + { L"TV", "TUV" }, + { L"UG", "UGA" }, + { L"UA", "UKR" }, + { L"AE", "ARE" }, + { L"GB", "GBR" }, + { L"US", "USA" }, + { L"UM", "UMI" }, + { L"UY", "URY" }, + { L"UZ", "UZB" }, + { L"VU", "VUT" }, + { L"VA", "VAT" }, + { L"VE", "VEN" }, + { L"VN", "VNM" }, + { L"VG", "VGB" }, + { L"VI", "VIR" }, + { L"WF", "WLF" }, + { L"EH", "ESH" }, + { L"YE", "YEM" }, + { L"YU", "YUG" }, + { L"ZM", "ZMB" }, + { L"ZW", "ZWE" }, + { L"", "" } + }; + +static wchar_t* mapIso3ContryToIso2(char *iso3) +{ + if (! iso3) + return L""; + + struct _CountryMap *m = countries; + while (m && m->iso3[0]) { + if (! strcmp(iso3, m->iso3)) + return m->iso2; + m++; + } + + return L""; +} + +#endif + + +Locale::Locale() +{ +#ifndef WIN32 + parseLocale(fromMbcs(setlocale(LC_ALL, ""))); +#else + setlocale(LC_ALL, ""); + + char buf[100]; + int len; + len = GetLocaleInfo(LOCALE_USER_DEFAULT, LOCALE_SABBREVCTRYNAME, buf, 99); + if (len > 0) + country = mapIso3ContryToIso2(buf); + + len = GetLocaleInfo(LOCALE_USER_DEFAULT, LOCALE_SABBREVLANGNAME, buf, 99); + if (len > 0) { + /* according to MSDN: + LOCALE_SABBREVLANGNAME Abbreviated name of the language, + created by taking the 2-letter language abbreviation from the + ISO Standard 639 and adding a third letter, as appropriate, + to indicate the sublanguage. + */ + if (len == 4) // exclude subvariant letter + buf[2] = 0; + language = toLowerCase(fromMbcs(buf)); + } + + len = GetLocaleInfo(LOCALE_USER_DEFAULT, LOCALE_IDEFAULTANSICODEPAGE, buf, 99); + if (len > 0) + encoding = L"CP" + std::wstring(fromMbcs(buf)); // FIXME! +#endif + + setlocale(LC_NUMERIC, "C"); // hack because of numbers in Lua +} + + +Locale::Locale(const Locale &locale): language(locale.language), + country(locale.country), encoding(locale.encoding) +{ +} + +void Locale::parseLocale(const std::wstring &name) +{ + int pos = name.find(L'.'); + std::wstring langAndCountry; + if (pos >= 0) { + encoding = name.substr(pos + 1); + langAndCountry = name.substr(0, pos); + } else { + encoding = L""; + langAndCountry = name; + } + pos = langAndCountry.find(L'_'); + if (pos < 0) { + language = langAndCountry; + country = L""; + } else { + language = langAndCountry.substr(0, pos); + country = langAndCountry.substr(pos + 1); + } + language = toLowerCase(language); + country = toUpperCase(country); + encoding = toUpperCase(encoding); +} + + +static bool isLowerCase(const std::wstring &s) +{ + int len = s.length(); + for (int i = 0; i < len; i++) { + char ch = s[i]; + if ((ch < L'a') || (ch > L'z')) + return false; + } + return true; +} + + +static bool isUpperCase(const std::wstring &s) +{ + int len = s.length(); + for (int i = 0; i < len; i++) { + char ch = s[i]; + if ((ch < L'A') || (ch > L'Z')) + return false; + } + return true; +} + + +void splitFileName(const std::wstring &fileName, std::wstring &name, + std::wstring &ext, std::wstring &lang, std::wstring &country) +{ + int pos = fileName.find_last_of(L'.'); + if (pos <= 0) { + ext = L""; + name = fileName; + } else { + name = fileName.substr(0, pos); + ext = fileName.substr(pos + 1); + } + + pos = name.find_last_of('_'); + if ((pos <= 0) || (name.length() - pos != 3)) { + lang = L""; + country = L""; + } else { + std::wstring l = name.substr(pos + 1); + std::wstring s = name.substr(0, pos); + if (isUpperCase(l)) { // country + name = s; + country = l; + pos = name.find_last_of('_'); + if ((pos <= 0) || (name.length() - pos != 3)) + lang = L""; + else { + std::wstring l = name.substr(pos + 1); + std::wstring s = name.substr(0, pos); + if (isLowerCase(l)) { // language + name = s; + lang = l; + } else // invalid + lang = L""; + } + } else if (isLowerCase(l)) { // language + name = s; + lang = l; + country = L""; + } else { // invalid + lang = L""; + country = L""; + } + } +} + +int getScore(const std::wstring &lang, const std::wstring &country, + const Locale &locale) +{ + if ((! country.length()) && (! lang.length())) // locale independent + return 1; + + int score = 0; + if (locale.getCountry().length() && (locale.getCountry() == country)) + score += 2; + if (locale.getLanguage().length() && (locale.getLanguage() == lang)) + score += 4; + + return score; +} + diff --git a/i18n.h b/i18n.h new file mode 100644 index 0000000..636e0ac --- /dev/null +++ b/i18n.h @@ -0,0 +1,58 @@ +#ifndef __I18N_H__ +#define __I18N_H__ + + +/// \file i18n.h +/// Locale related functions + + +#include + + +/// Description of current locale +class Locale +{ + private: + std::wstring language; + std::wstring country; + std::wstring encoding; + + public: + /// Load locale + Locale(); + + /// Copy constructor + Locale(const Locale &locale); + + public: + /// Get current country. + const std::wstring& getCountry() const { return country; }; + + /// Get current language. + const std::wstring& getLanguage() const { return language; }; + + /// Get current encoding. + const std::wstring& getEncoding() const { return encoding; }; + + private: + void parseLocale(const std::wstring &name); +}; + + +// split file name to file name, extension, language name and country +// for exmaple, "story_ru_RU.txt" shoud be splited to +// name="story", extension="txt", language="ru", country="RU" +void splitFileName(const std::wstring &fileName, std::wstring &name, + std::wstring &ext, std::wstring &lang, std::wstring &country); + +// calculate relevance score between language, country and +// current locale +int getScore(const std::wstring &lang, const std::wstring &country, + const Locale &locale); + + +extern Locale locale; + + +#endif + diff --git a/iconset.cpp b/iconset.cpp new file mode 100644 index 0000000..c5626e3 --- /dev/null +++ b/iconset.cpp @@ -0,0 +1,57 @@ +#include +#include "iconset.h" +#include "utils.h" + + +IconSet::IconSet() +{ + std::wstring buf = L"xy.bmp"; + + for (int i = 0; i < 6; i++) + for (int j = 0; j < 6; j++) { + buf[1] = L'1' + j; + buf[0] = L'a' + i; + smallIcons[i][j][0] = loadImage(buf); + smallIcons[i][j][1] = adjustBrightness(smallIcons[i][j][0], 1.5, false); + buf[0] = L'A' + i; + largeIcons[i][j][0] = loadImage(buf); + largeIcons[i][j][1] = adjustBrightness(largeIcons[i][j][0], 1.5, false); + } + emptyFieldIcon = loadImage(L"tile.bmp"); + emptyHintIcon = loadImage(L"hint-tile.bmp"); + nearHintIcon[0] = loadImage(L"hint-near.bmp"); + nearHintIcon[1] = adjustBrightness(nearHintIcon[0], 1.5, false); + sideHintIcon[0] = loadImage(L"hint-side.bmp"); + sideHintIcon[1] = adjustBrightness(sideHintIcon[0], 1.5, false); + betweenArrow[0] = loadImage(L"betwarr.bmp", true); + betweenArrow[1] = adjustBrightness(betweenArrow[0], 1.5, false); +} + +IconSet::~IconSet() +{ + for (int i = 0; i < 6; i++) + for (int j = 0; j < 6; j++) + for (int k = 0; k < 2; k++) { + SDL_FreeSurface(smallIcons[i][j][k]); + SDL_FreeSurface(largeIcons[i][j][k]); + } + SDL_FreeSurface(emptyFieldIcon); + SDL_FreeSurface(emptyHintIcon); + SDL_FreeSurface(nearHintIcon[0]); + SDL_FreeSurface(nearHintIcon[1]); + SDL_FreeSurface(sideHintIcon[0]); + SDL_FreeSurface(sideHintIcon[1]); + SDL_FreeSurface(betweenArrow[0]); + SDL_FreeSurface(betweenArrow[1]); +} + +SDL_Surface* IconSet::getLargeIcon(int row, int num, bool h) +{ + return largeIcons[row][num-1][h ? 1 : 0]; +} + +SDL_Surface* IconSet::getSmallIcon(int row, int num, bool h) +{ + return smallIcons[row][num-1][h ? 1 : 0]; +} + diff --git a/iconset.h b/iconset.h new file mode 100644 index 0000000..0f971ac --- /dev/null +++ b/iconset.h @@ -0,0 +1,32 @@ +#ifndef __ICONSET_H__ +#define __ICONSET_H__ + + +#include + + +class IconSet +{ + private: + SDL_Surface *smallIcons[6][6][2]; + SDL_Surface *largeIcons[6][6][2]; + SDL_Surface *emptyFieldIcon, *emptyHintIcon, *nearHintIcon[2]; + SDL_Surface *sideHintIcon[2], *betweenArrow[2]; + + public: + IconSet(); + virtual ~IconSet(); + + public: + SDL_Surface* getLargeIcon(int row, int num, bool highlighted); + SDL_Surface* getSmallIcon(int row, int num, bool highlighted); + SDL_Surface* getEmptyFieldIcon() { return emptyFieldIcon; }; + SDL_Surface* getEmptyHintIcon() { return emptyHintIcon; }; + SDL_Surface* getNearHintIcon(bool h) { return nearHintIcon[h ? 1 : 0]; }; + SDL_Surface* getSideHintIcon(bool h) { return sideHintIcon[h ? 1 : 0]; }; + SDL_Surface* getBetweenArrow(bool h) { return betweenArrow[h ? 1 : 0]; }; +}; + + +#endif + diff --git a/lexal.cpp b/lexal.cpp new file mode 100644 index 0000000..5a36eff --- /dev/null +++ b/lexal.cpp @@ -0,0 +1,248 @@ +#include "lexal.h" +#include "convert.h" + + +Lexeme::Lexeme(Type t, const std::wstring &cont, int line, int pos) +{ + type = t; + content = cont; + this->line = line; + this->pos = pos; +} + +std::wstring Lexeme::getPosStr() const +{ + return Lexal::posToStr(line, pos); +} + + + +Lexal::Lexal(UtfStreamReader &rdr): reader(rdr) +{ + line = 1; + pos = 0; +} + + +static bool isIdentStart(wchar_t ch) { + return ((L'a' <= ch) && (L'z' >= ch)) || ((L'A' <= ch) && (L'Z' >= ch)) + || (L'_' == ch); +} + +static bool isIdentCont(wchar_t ch) { + return ((L'a' <= ch) && (L'z' >= ch)) || ((L'A' <= ch) && (L'Z' >= ch)) + || (L'_' == ch) || (L'.' == ch) || ((L'0' <= ch) && (L'9' >= ch)); +} + +static bool isWhiteSpace(wchar_t ch) { + return (L' ' == ch) || (L'\t' == ch) || (L'\n' == ch) || (L'\r' == ch); +} + +static bool isDigit(wchar_t ch) { + return (L'0' <= ch) && (L'9' >= ch); +} + +static bool isSymbol(wchar_t ch) { + return (L'{' == ch) || (L'}' == ch) || (L',' == ch) || (L'=' == ch) + || (L';' == ch); +} + +static bool isQuote(wchar_t ch) { + return (L'\'' == ch) || (L'"' == ch); +} + + +std::wstring Lexal::posToStr(int line, int pos) +{ + return L"(" + toString(line) + L":" + toString(pos) + L")"; +} + + +Lexeme Lexal::getNext() +{ + skipSpaces(); + if (reader.isEof()) + return Lexeme(Lexeme::Eof, L"", line, pos); + + int startLine = line; + int startPos = pos; + + wchar_t ch = reader.getNextChar(); + pos++; + + if (isIdentStart(ch)) + return readIdent(startLine, startPos, ch); + else if (isDigit(ch)) + return readNumber(startLine, startPos, ch); + else if (isQuote(ch)) + return readString(startLine, startPos, ch); + else if (isSymbol(ch)) + return Lexeme(Lexeme::Symbol, toString(ch), startLine, startPos); + + throw Exception(L"Invalid character at "+ posToStr(startLine, startPos)); +} + + +Lexeme Lexal::readString(int startLine, int startPos, wchar_t quote) +{ + std::wstring str; + bool closed = false; + + while (! reader.isEof()) { + wchar_t ch = reader.getNextChar(); + pos++; + if ('\n' == ch) { + line++; + pos = 0; + } else if ('\\' == ch) { + if (! reader.isEof()) { + wchar_t nextCh = reader.getNextChar(); + if (isWhiteSpace(nextCh)) + throw Exception(L"Invalid escape sequence at " + + posToStr(line, pos)); + pos++; + switch (nextCh) { + case L'\t': str += L'\t'; break; + case L'\n': str += L'\n'; break; + case L'\r': str += L'\r'; break; + default: + str += nextCh; + } + } + } else if (quote == ch) { + closed = true; + break; + } else + str += ch; + } + + if (! closed) + throw Exception(L"String at " + posToStr(startLine, startPos) + + L" doesn't closed"); + + return Lexeme(Lexeme::String, str, startLine, startPos); +} + +Lexeme Lexal::readNumber(int startLine, int startPos, wchar_t first) +{ + std::wstring number; + number += first; + Lexeme::Type type = Lexeme::Integer; + + while (! reader.isEof()) { + wchar_t ch = reader.getNextChar(); + pos++; + if (isDigit(ch)) + number += ch; + else if (L'.' == ch) { + if (Lexeme::Integer == type) { + type = Lexeme::Float; + number += ch; + } else + throw Exception(L"To many dots in number at " + + posToStr(line, pos)); + } else if ((! isSymbol(ch)) && (! isWhiteSpace(ch))) + throw Exception(L"invalid number at " + posToStr(line, pos)); + else { + pos--; + reader.ungetChar(ch); + break; + } + } + + if (L'.' == number[number.length() - 1]) + throw Exception(L"Missing digit after dot at " + posToStr(line, pos)); + + return Lexeme(type, number, startLine, startPos); +} + +Lexeme Lexal::readIdent(int startLine, int startPos, wchar_t first) +{ + std::wstring ident; + ident += first; + + while (! reader.isEof()) { + wchar_t ch = reader.getNextChar(); + if (! isIdentCont(ch)) { + reader.ungetChar(ch); + break; + } + ident += ch; + pos++; + } + + return Lexeme(Lexeme::Ident, ident, startLine, startPos); +} + + +void Lexal::skipToLineEnd() +{ + while (! reader.isEof()) { + wchar_t ch = reader.getNextChar(); + pos++; + if ('\n' == ch) { + pos = 0; + line++; + return; + } + } +} + + +void Lexal::skipMultilineComment(int startLine, int startPos) +{ + while (! reader.isEof()) { + wchar_t ch = reader.getNextChar(); + pos++; + if ('\n' == ch) { + pos = 0; + line++; + } else if (('*' == ch) && (! reader.isEof())) { + wchar_t nextCh = reader.getNextChar(); + if ('/' != nextCh) + reader.ungetChar(nextCh); + } + } + throw Exception(L"Remark started at " + posToStr(startLine, startPos) + + L" is not closed"); +} + + +void Lexal::skipSpaces() +{ + while (! reader.isEof()) { + wchar_t ch = reader.getNextChar(); + pos++; + if (! isWhiteSpace(ch)) { + if ('#' == ch) + skipToLineEnd(); + else { + bool finish = false; + if (('/' == ch) && (! reader.isEof())) { + wchar_t nextCh = reader.getNextChar(); + pos++; + if ('/' == nextCh) + skipToLineEnd(); + else if ('*' == nextCh) + skipMultilineComment(line, pos); + else { + pos--; + reader.ungetChar(nextCh); + finish = true; + } + } else + finish = true; + if (finish) { + pos--; + reader.ungetChar(ch); + return; + } + } + } else + if ('\n' == ch) { + pos = 0; + line++; + } + } +} + diff --git a/lexal.h b/lexal.h new file mode 100644 index 0000000..f5e2b9a --- /dev/null +++ b/lexal.h @@ -0,0 +1,66 @@ +#ifndef __LEXAL_H__ +#define __LEXAL_H__ + + +#include "streams.h" + + +class Lexeme +{ + public: + typedef enum Type { + String, + Integer, + Float, + Ident, + Symbol, + Eof + }; + + private: + int line; + int pos; + Type type; + std::wstring content; + + public: + Lexeme() { }; + Lexeme(Type type, const std::wstring &content, int line, int pos); + ~Lexeme() { }; + + public: + const Type getType() const { return type; }; + const std::wstring getContent() const { return content; }; + std::wstring getPosStr() const; + int getLine() const { return line; }; + int getPos() const { return pos; }; +}; + + +class Lexal +{ + private: + UtfStreamReader &reader; + int line; + int pos; + + public: + Lexal(UtfStreamReader &reader); + ~Lexal() { }; + + public: + Lexeme getNext(); + static std::wstring posToStr(int line, int pos); + + private: + void skipSpaces(); + void skipToLineEnd(); + void skipMultilineComment(int startLine, int startPos); + Lexeme readIdent(int startLine, int startPos, wchar_t first); + Lexeme readNumber(int startLine, int startPos, wchar_t first); + Lexeme readString(int startLine, int startPos, wchar_t quote); +}; + + +#endif + diff --git a/main.cpp b/main.cpp new file mode 100644 index 0000000..0fcae9a --- /dev/null +++ b/main.cpp @@ -0,0 +1,113 @@ +#include +#include +#include +#include +#include +#include "main.h" +#include "utils.h" +#include "storage.h" +#include "unicode.h" +#include "messages.h" +#include "sound.h" + + +Screen screen; +Random rndGen; + + +static void initScreen() +{ + if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO) < 0) + throw Exception(std::wstring(L"Error initializing SDL: ") + + fromMbcs(SDL_GetError())); + atexit(SDL_Quit); + if (TTF_Init()) + throw Exception(L"Error initializing font engine"); + screen.setMode(VideoMode(800, 600, 24, + getStorage()->get(L"fullscreen", 1) != 0)); + screen.initCursors(); + + SDL_Surface *mouse = loadImage(L"cursor.bmp"); + SDL_SetColorKey(mouse, SDL_SRCCOLORKEY, SDL_MapRGB(mouse->format, 0, 0, 0)); + screen.setMouseImage(mouse); + SDL_FreeSurface(mouse); + SDL_WM_SetCaption("Einstein", NULL); + +#ifdef __APPLE__ + screen.setCursor(false); +#else + screen.setCursor(getStorage()->get(L"niceCursor", 1)); +#endif +} + +static void initAudio() +{ + sound = new Sound(); + sound->setVolume((float)getStorage()->get(L"volume", 20) / 100.0f); +} + + +#ifdef __APPLE__ +static std::wstring getResourcesPath(const std::wstring& path) +{ + int idx = path.find_last_of(L'/'); + return path.substr(0, idx) + L"/../../"; +} +#endif + +static void loadResources(const std::wstring &selfPath) +{ + StringList dirs; +#ifdef WIN32 + dirs.push_back(getStorage()->get(L"path", L"") + L"\\res"); +#else +#ifdef __APPLE__ + dirs.push_back(getResourcesPath(selfPath)); +#else + dirs.push_back(PREFIX L"/share/einstein/res"); + dirs.push_back(fromMbcs(getenv("HOME")) + L"/.einstein/res"); +#endif +#endif + dirs.push_back(L"res"); + dirs.push_back(L"."); + resources = new ResourcesCollection(dirs); + msg.load(); +} + + +/*static void checkBetaExpire() +{ + if (1124832535L + 60L*60L*24L*40L < time(NULL)) { + Font font(L"laudcn2.ttf", 16); + Area area; + showMessageWindow(&area, L"darkpattern.bmp", + 700, 100, &font, 255,255,255, + msg(L"expired")); + } +}*/ + + + +int main(int argc, char *argv[]) +{ +#ifndef WIN32 + ensureDirExists(fromMbcs(getenv("HOME")) + std::wstring(L"/.einstein")); +#endif + + try { + loadResources(fromUtf8(argv[0])); + initScreen(); + initAudio(); +// checkBetaExpire(); + menu(); + getStorage()->flush(); + } catch (Exception &e) { + std::cerr << L"ERROR: " << e.getMessage() << std::endl; + } catch (...) { + std::cerr << L"ERROR: Unknown exception" << std::endl; + } + screen.doneCursors(); + + return 0; +} + diff --git a/main.h b/main.h new file mode 100644 index 0000000..ab66891 --- /dev/null +++ b/main.h @@ -0,0 +1,16 @@ +#ifndef __MAIN_H__ +#define __MAIN_H__ + +#include "exceptions.h" +#include "screen.h" +#include "resources.h" +#include "random.h" + + +extern Screen screen; +extern Random rndGen; + +void menu(); + +#endif + diff --git a/menu.cpp b/menu.cpp new file mode 100644 index 0000000..f15becf --- /dev/null +++ b/menu.cpp @@ -0,0 +1,201 @@ +#include +#include "main.h" +#include "utils.h" +#include "widgets.h" +#include "topscores.h" +#include "opensave.h" +#include "game.h" +#include "descr.h" +#include "options.h" +#include "messages.h" + + + +class MenuBackground: public Widget +{ + public: + virtual void draw(); +}; + + +void MenuBackground::draw() +{ + SDL_Surface *title = loadImage(L"nova.bmp"); + screen.draw(0, 0, title); + SDL_FreeSurface(title); + Font font(L"nova.ttf", 28); + std::wstring s(msg(L"einsteinFlowix")); + int width = font.getWidth(s); + font.draw((screen.getWidth() - width) / 2, 30, 255,255,255, true, s); + Font urlFont(L"luximb.ttf", 16); + s = L"http://games.flowix.com"; + width = urlFont.getWidth(s); + urlFont.draw((screen.getWidth() - width) / 2, 60, 255,255,0, true, s); + screen.addRegionToUpdate(0, 0, screen.getWidth(), screen.getHeight()); +} + + + +class NewGameCommand: public Command +{ + private: + Area *area; + + public: + NewGameCommand(Area *a) { area = a; }; + + virtual void doAction() { + Game game; + game.run(); + area->updateMouse(); + area->draw(); + }; +}; + + +class LoadGameCommand: public Command +{ + private: + Area *area; + + public: + LoadGameCommand(Area *a) { area = a; }; + + virtual void doAction() { + Game *game = loadGame(area); + if (game) { + game->run(); + delete game; + } + area->updateMouse(); + area->draw(); + }; +}; + + + +class TopScoresCommand: public Command +{ + private: + Area *area; + + public: + TopScoresCommand(Area *a) { area = a; }; + + virtual void doAction() { + TopScores scores; + showScoresWindow(area, &scores); + area->updateMouse(); + area->draw(); + }; +}; + + +class RulesCommand: public Command +{ + private: + Area *area; + + public: + RulesCommand(Area *a) { area = a; }; + + virtual void doAction() { + showDescription(area); + area->updateMouse(); + area->draw(); + }; +}; + + +class OptionsCommand: public Command +{ + private: + Area *area; + + public: + OptionsCommand(Area *a) { area = a; }; + + virtual void doAction() { + showOptionsWindow(area); + area->updateMouse(); + area->draw(); + }; +}; + + +class AboutCommand: public Command +{ + private: + Area *parentArea; + + public: + AboutCommand(Area *a) { parentArea = a; }; + + virtual void doAction() { + Area area; + Font titleFont(L"nova.ttf", 26); + Font font(L"laudcn2.ttf", 14); + Font urlFont(L"luximb.ttf", 16); + +#define LABEL(pos, c, f, text) area.add(new Label(&f, 220, pos, 360, 20, \ + Label::ALIGN_CENTER, Label::ALIGN_MIDDLE, 255,255,c, text)); + area.add(parentArea); + area.add(new Window(220, 160, 360, 280, L"blue.bmp")); + area.add(new Label(&titleFont, 250, 165, 300, 40, Label::ALIGN_CENTER, + Label::ALIGN_MIDDLE, 255,255,0, msg(L"about"))); + LABEL(240, 255, font, msg(L"einsteinPuzzle")) + LABEL(260, 255, font, msg(L"version")) + LABEL(280, 255, font, msg(L"copyright")) + LABEL(330, 0, urlFont, L"http://games.flowix.com") +#undef LABEL + ExitCommand exitCmd(area); + area.add(new Button(360, 400, 80, 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(); + + parentArea->updateMouse(); + parentArea->draw(); + }; +}; + + +static Button* menuButton(int y, Font *font, const std::wstring &text, + Command *cmd=NULL) +{ + return new Button(550, y, 220, 30, font, 0,240,240, 30,255,255, text, cmd); +} + + +void menu() +{ + Area area; + Font font(L"laudcn2.ttf", 20); + + area.add(new MenuBackground()); + area.draw(); + + NewGameCommand newGameCmd(&area); + area.add(menuButton(340, &font, msg(L"newGame"), &newGameCmd)); + LoadGameCommand loadGameCmd(&area); + area.add(menuButton(370, &font, msg(L"loadGame"), &loadGameCmd)); + TopScoresCommand topScoresCmd(&area); + area.add(menuButton(400, &font, msg(L"topScores"), &topScoresCmd)); + RulesCommand rulesCmd(&area); + area.add(menuButton(430, &font, msg(L"rules"), &rulesCmd)); + OptionsCommand optionsCmd(&area); + area.add(menuButton(460, &font, msg(L"options"), &optionsCmd)); + AboutCommand aboutCmd(&area); + area.add(menuButton(490, &font, msg(L"about"), &aboutCmd)); + ExitCommand exitMenuCmd(area); + area.add(menuButton(520, &font, msg(L"exit"), &exitMenuCmd)); + area.add(new KeyAccel(SDLK_ESCAPE, &exitMenuCmd)); + + area.draw(); + screen.addRegionToUpdate(0, 0, screen.getWidth(), screen.getHeight()); + screen.flush(); + + area.run(); +} + diff --git a/messages.cpp b/messages.cpp new file mode 100644 index 0000000..2c9980c --- /dev/null +++ b/messages.cpp @@ -0,0 +1,135 @@ +#include + +#include "messages.h" +#include "formatter.h" +#include "resources.h" +#include "exceptions.h" +#include "buffer.h" +#include "utils.h" +#include "unicode.h" + + +Messages msg; + + +Messages::Messages() +{ +} + +Messages::~Messages() +{ +} + +class ResVisitor: public Visitor +{ + private: + Messages &messages; + Buffer *buffer; + + public: + ResVisitor(Messages &m, Buffer *b): messages(m) { buffer = b; }; + + virtual void onVisit(Resource *&r) { + messages.loadFromResource(r, buffer); + } +}; + +void Messages::load() +{ + Buffer buffer; + ResVisitor loader(*this, &buffer); + resources->forEachInGroup(L"messages", loader); +} + +void Messages::loadFromResource(Resource *res, Buffer *buffer) +{ + if (! res) return; + + int cnt = res->getVariantsCount(); + for (int i = 0; i < cnt; i++) { + ResVariant *var = res->getVariant(i); + if (var) { + try { + int score = var->getI18nScore(); + var->getData(*buffer); + loadBundle(score, (unsigned char*)buffer->getData(), + buffer->getSize()); + } catch (Exception &e) { + std::cerr << std::wstring(L"Error loading text bundle " + + res->getName() + L": " + e.getMessage()); + } + } + } +} + +std::wstring Messages::getMessage(const std::wstring &key) const +{ + StrMap::const_iterator i = messages.find(key); + if (i != messages.end()) + return (*i).second.message->getMessage(); + else + return key; +} + +std::wstring Messages::format(const wchar_t *key, va_list ap) const +{ + std::wstring s; + StrMap::const_iterator i = messages.find(key); + if (i != messages.end()) + s = (*i).second.message->format(ap); + else + s = key; + return s; +} + +std::wstring Messages::format(const wchar_t *key, ...) const +{ + va_list ap; + va_start(ap, key); + std::wstring s = format(key, ap); + va_end(ap); + return s; +} + +std::wstring Messages::operator ()(const wchar_t *key, ...) const +{ + va_list ap; + va_start(ap, key); + std::wstring s = format(key, ap); + va_end(ap); + return s; +} + +void Messages::loadBundle(int score, unsigned char *data, size_t size) +{ + if ((data[0] != 'C') || (data[1] != 'M') || (data[2] != 'F')) + throw Exception(L"Invalid format of message file"); + if (readInt(data + 3) != 1) + throw Exception(L"Unknown version of message file"); + + int offset = readInt(data + size - 4); + int cnt = readInt(data + offset); + offset += 4; + + for (int i = 0; i < cnt; i++) { + int sz = readInt(data + offset); + offset += 4; + if (sz > 0) { + std::wstring name(fromUtf8((char*)data + offset, sz)); + int msgOffset = readInt(data + offset + sz); + StrMap::iterator i = messages.find(name); + if (i == messages.end()) { + ScoredStr ss = { score, new Formatter(data, msgOffset) }; + messages[name] = ss; + } else { + ScoredStr &ss = (*i).second; + if (ss.score <= score) { + ss.score = score; + ss.message = new Formatter(data, msgOffset); + } + } + } + offset += sz + 4; + } +} + diff --git a/messages.h b/messages.h new file mode 100644 index 0000000..9e539cc --- /dev/null +++ b/messages.h @@ -0,0 +1,67 @@ +#ifndef __MESSAGES_H__ +#define __MESSAGES_H__ + + +#include +#include +#include + + +class Resource; +class Formatter; +class Buffer; + + +/// Localized messages formatter +class Messages +{ + private: + typedef struct { + int score; + Formatter *message; + } ScoredStr; + typedef std::map StrMap; + StrMap messages; + + public: + /// Create empty messages table. + Messages(); + ~Messages(); + + public: + /// Load message tables from resources. + void load(); + + /// Get simple text string + /// \param key message key + std::wstring getMessage(const std::wstring &key) const; + + /// Shorter alias for getMessage + /// \param key message key + std::wstring operator [](const std::wstring &key) const { + return getMessage(key); + }; + + /// Format message + /// \param key message key + std::wstring format(const wchar_t *key, ...) const; + + /// Shorter alias for format + /// \param key message key + std::wstring operator ()(const wchar_t *key, ...) const; + + /// Load messages from resource + /// \param res resource + void loadFromResource(Resource *res, Buffer *buffer); + + private: + void loadBundle(int score, unsigned char *data, size_t size); + std::wstring format(const wchar_t *key, va_list ap) const; +}; + + +extern Messages msg; + + +#endif + diff --git a/opensave.cpp b/opensave.cpp new file mode 100644 index 0000000..ad6dc36 --- /dev/null +++ b/opensave.cpp @@ -0,0 +1,285 @@ +#include +#include +#include "exceptions.h" +#include "utils.h" +#include "widgets.h" +#include "storage.h" +#include "opensave.h" +#include "unicode.h" +#include "convert.h" +#include "messages.h" + + + +#define MAX_SLOTS 10 + + +class SavedGame +{ + private: + std::wstring fileName; + bool exists; + std::wstring name; + + public: + SavedGame(const std::wstring &fileName); + SavedGame(const SavedGame &s): fileName(s.fileName), name(s.name) { + exists = s.exists; + }; + + public: + const std::wstring& getFileName() { return fileName; }; + std::wstring getName() { return exists ? name : msg(L"empty"); }; + bool isExists() { return exists; }; +}; + + +SavedGame::SavedGame(const std::wstring &s): fileName(s) +{ + exists = false; + + try { + std::ifstream stream(toMbcs(fileName).c_str(), std::ifstream::in | + std::ifstream::binary); + if (stream.fail()) + throw Exception(L"Can't open file"); + name = readString(stream); + stream.close(); + exists = true; + } catch (...) { } +} + + + +class OkCommand: public Command +{ + private: + Area &area; + bool *ok; + + public: + OkCommand(Area &a, bool *o): area(a) { ok = o; }; + + virtual void doAction() { + *ok = true; + area.finishEventLoop(); + }; +}; + + + +class SaveCommand: public Command +{ + private: + SavedGame &savedGame; + Area *parentArea; + bool *saved; + Font *font; + std::wstring defaultName; + Game *game; + + public: + SaveCommand(SavedGame &sg, Font *f, Area *area, bool *s, + const std::wstring &dflt, Game *g): savedGame(sg), defaultName(dflt) + { + parentArea = area; + saved = s; + font = f; + game = g; + }; + + public: + virtual void doAction() { + Area area; + area.add(parentArea, false); + area.add(new Window(170, 280, 460, 100, L"blue.bmp")); + std::wstring name; + if (savedGame.isExists()) + name = savedGame.getName(); + else + name = defaultName; + area.add(new Label(font, 180, 300, 255,255,0, msg(L"enterGame"))); + area.add(new InputField(340, 300, 280, 26, L"blue.bmp", name, 20, + 255,255,0, font)); + ExitCommand exitCmd(area); + OkCommand okCmd(area, saved); + area.add(new Button(310, 340, 80, 25, font, 255,255,0, L"blue.bmp", + msg(L"ok"), &okCmd)); + area.add(new Button(400, 340, 80, 25, font, 255,255,0, L"blue.bmp", + msg(L"cancel"), &exitCmd)); + area.add(new KeyAccel(SDLK_ESCAPE, &exitCmd)); + area.add(new KeyAccel(SDLK_RETURN, &okCmd)); + area.run(); + + if (*saved) { + *saved = false; + try { + std::ofstream stream(toMbcs(savedGame.getFileName()). + c_str(), std::ofstream::out | std::ofstream::binary); + if (stream.fail()) + throw Exception(L"Error creating save file"); + writeString(stream, name); + game->save(stream); + if (stream.fail()) + throw Exception(L"Error saving game"); + stream.close(); + *saved = true; + } catch (...) { + showMessageWindow(&area, L"redpattern.bmp", 300, 80, font, + 255,255,255, msg(L"saveError")); + } + parentArea->finishEventLoop(); + } else { + parentArea->updateMouse(); + parentArea->draw(); + } + }; +}; + + +static std::wstring getSavesPath() +{ +#ifndef WIN32 + std::wstring path(fromMbcs(getenv("HOME")) + + std::wstring(L"/.einstein/save")); +#else + std::wstring path(getStorage()->get(L"path", L"")); + if (path.length() > 0) + path += L"\\"; + path += L"save"; +#endif + ensureDirExists(path); + + return path; +} + + +typedef std::list SavesList; + + +static void showListWindow(SavesList &list, Command **commands, + const std::wstring &title, Area &area, Font *font) +{ + Font titleFont(L"nova.ttf", 26); + + area.add(new Window(250, 90, 300, 420, L"blue.bmp")); + area.add(new Label(&titleFont, 250, 95, 300, 40, Label::ALIGN_CENTER, + Label::ALIGN_MIDDLE, 255,255,0, title)); + ExitCommand exitCmd(area); + area.add(new Button(360, 470, 80, 25, font, 255,255,0, L"blue.bmp", + msg(L"close"), &exitCmd)); + area.add(new KeyAccel(SDLK_ESCAPE, &exitCmd)); + + int pos = 150; + int no = 0; + for (SavesList::iterator i = list.begin(); i != list.end(); i++) { + SavedGame &game = *i; + area.add(new Button(260, pos, 280, 25, font, 255,255,255, L"blue.bmp", + game.getName(), commands[no++])); + pos += 30; + } + + area.run(); +} + + +bool saveGame(Area *parentArea, Game *game) +{ + std::wstring path = getSavesPath(); + + Area area; + area.add(parentArea, false); + Font font(L"laudcn2.ttf", 14); + bool saved = false; + + SavesList list; + Command **commands = new Command*[MAX_SLOTS]; + for (int i = 0; i < MAX_SLOTS; i++) { + SavedGame sg(path + L"/" + toString(i) + L".sav"); + list.push_back(sg); + commands[i] = new SaveCommand(*(--(list.end())), &font, + &area, &saved, L"game " + toString(i+1), game); + } + + showListWindow(list, commands, msg(L"saveGame"), area, &font); + + for (int i = 0; i < MAX_SLOTS; i++) + delete commands[i]; + delete[] commands; + + return saved; +} + + +class LoadCommand: public Command +{ + private: + SavedGame &savedGame; + Area *parentArea; + bool *saved; + Font *font; + std::wstring defaultName; + Game **game; + + public: + LoadCommand(SavedGame &sg, Font *f, Area *area, Game **g): + savedGame(sg) + { + parentArea = area; + font = f; + game = g; + }; + + public: + virtual void doAction() { + try { + std::ifstream stream(toMbcs(savedGame.getFileName()).c_str(), + std::ifstream::in | std::ifstream::binary); + if (stream.fail()) + throw Exception(L"Error opening save file"); + readString(stream); + Game *g = new Game(stream); + if (stream.fail()) + throw Exception(L"Error loading game"); + stream.close(); + *game = g; + } catch (...) { + showMessageWindow(parentArea, L"redpattern.bmp", 300, 80, font, + 255,255,255, L"Error loadng game"); + } + parentArea->finishEventLoop(); + }; +}; + + +Game* loadGame(Area *parentArea) +{ + std::wstring path = getSavesPath(); + + Area area; + area.add(parentArea, false); + Font font(L"laudcn2.ttf", 14); + + Game *newGame = NULL; + + SavesList list; + Command **commands = new Command*[MAX_SLOTS]; + for (int i = 0; i < MAX_SLOTS; i++) { + SavedGame sg(path + L"/" + toString(i) + L".sav"); + list.push_back(sg); + if (sg.isExists()) + commands[i] = new LoadCommand(*(--(list.end())), &font, &area, + &newGame); + else + commands[i] = NULL; + } + + showListWindow(list, commands, msg(L"loadGame"), area, &font); + + for (int i = 0; i < MAX_SLOTS; i++) + delete commands[i]; + delete[] commands; + + return newGame; +} + diff --git a/opensave.h b/opensave.h new file mode 100644 index 0000000..8bcdc33 --- /dev/null +++ b/opensave.h @@ -0,0 +1,16 @@ +#ifndef __OPENSAVE_H__ +#define __OPENSAVE_H__ + + +#include "widgets.h" +#include "game.h" + + + +bool saveGame(Area *parentArea, Game *game); +Game* loadGame(Area *parentArea); + + + +#endif + diff --git a/options.cpp b/options.cpp new file mode 100644 index 0000000..63a7e44 --- /dev/null +++ b/options.cpp @@ -0,0 +1,88 @@ +#include "options.h" +#include "storage.h" +#include "main.h" +#include "messages.h" +#include "sound.h" + + +class OptionsChangedCommand: public Command +{ + private: + bool &fullscreen; + bool &niceCursor; + float &volume; + Area *area; + + public: + OptionsChangedCommand(Area *a, bool &fs, bool &ns, float &v): + fullscreen(fs), niceCursor(ns), volume(v) { + area = a; + }; + + virtual void doAction() { + bool oldFullscreen = (getStorage()->get(L"fullscreen", 1) != 0); + bool oldCursor = (getStorage()->get(L"niceCursor", 1) != 0); + float oldVolume = (float)getStorage()->get(L"volume", 20) / 100.0f; + if (fullscreen != oldFullscreen) { + getStorage()->set(L"fullscreen", fullscreen); + screen.setMode(VideoMode(800, 600, 24, fullscreen)); + } +#ifndef __APPLE__ + if (niceCursor != oldCursor) { + getStorage()->set(L"niceCursor", niceCursor); + screen.setCursor(niceCursor); + } +#endif + if (volume != oldVolume) { + getStorage()->set(L"volume", (int)(volume * 100.0f)); + sound->setVolume(volume); + } + getStorage()->flush(); + area->finishEventLoop(); + }; +}; + + +#define LABEL(y, s) \ + area.add(new Label(&font, 300, y, 300, 20, Label::ALIGN_LEFT, \ + Label::ALIGN_MIDDLE, 255,255,255, msg(s))); +#define CHECKBOX(y, var) \ + area.add(new Checkbox(265, y, 20, 20, &font, 255,255,255, L"blue.bmp", \ + var)); +#define OPTION(y, s, var) LABEL(y, s) CHECKBOX(y, var) + +void showOptionsWindow(Area *parentArea) +{ + Font titleFont(L"nova.ttf", 26); + Font font(L"laudcn2.ttf", 14); + + bool fullscreen = (getStorage()->get(L"fullscreen", 1) != 0); + bool niceCursor = (getStorage()->get(L"niceCursor", 1) != 0); + float volume = ((float)getStorage()->get(L"volume", 20)) / 100.0f; + + Area area; + + area.add(parentArea); + area.add(new Window(250, 170, 300, 260, L"blue.bmp")); + area.add(new Label(&titleFont, 250, 175, 300, 40, Label::ALIGN_CENTER, + Label::ALIGN_MIDDLE, 255,255,0, msg(L"options"))); + OPTION(260, L"fullscreen", fullscreen); +#ifndef __APPLE__ + OPTION(280, L"niceCursor", niceCursor); +#endif + + area.add(new Label(&font, 265, 330, 300, 20, Label::ALIGN_LEFT, + Label::ALIGN_MIDDLE, 255,255,255, msg(L"volume"))); + area.add(new Slider(360, 332, 160, 16, volume)); + + ExitCommand exitCmd(area); + OptionsChangedCommand okCmd(&area, fullscreen, niceCursor, volume); + area.add(new Button(315, 390, 85, 25, &font, 255,255,0, L"blue.bmp", + msg(L"ok"), &okCmd)); + area.add(new Button(405, 390, 85, 25, &font, 255,255,0, L"blue.bmp", + msg(L"cancel"), &exitCmd)); + area.add(new KeyAccel(SDLK_ESCAPE, &exitCmd)); + area.add(new KeyAccel(SDLK_RETURN, &okCmd)); + area.run(); +} + diff --git a/options.h b/options.h new file mode 100644 index 0000000..a616719 --- /dev/null +++ b/options.h @@ -0,0 +1,13 @@ +#ifndef __OPTIONS_H__ +#define __OPTIONS_H__ + + +#include "widgets.h" + + + +void showOptionsWindow(Area *area); + + +#endif + diff --git a/puzgen.cpp b/puzgen.cpp new file mode 100644 index 0000000..6c6c18d --- /dev/null +++ b/puzgen.cpp @@ -0,0 +1,394 @@ +#include +#include +#include +#include +#include +#include "puzgen.h" +#include "exceptions.h" +#include "utils.h" + + + +Possibilities::Possibilities() +{ + reset(); +} + +Possibilities::Possibilities(std::istream &stream) +{ + for (int row = 0; row < PUZZLE_SIZE; row++) + for (int col = 0; col < PUZZLE_SIZE; col++) + for (int element = 0; element < PUZZLE_SIZE; element++) + pos[col][row][element] = readInt(stream); +} + +void Possibilities::reset() +{ + for (int i = 0; i < PUZZLE_SIZE; i++) + for (int j = 0; j < PUZZLE_SIZE; j++) + for (int k = 0; k < PUZZLE_SIZE; k++) + pos[i][j][k] = k + 1; +} + +void Possibilities::checkSingles(int row) +{ + int cellsCnt[PUZZLE_SIZE]; // count of elements in cells + int elsCnt[PUZZLE_SIZE]; // total count of elements in row + int elements[PUZZLE_SIZE]; // one element of each cell + int elCells[PUZZLE_SIZE]; // one cell of each element + + memset(cellsCnt, 0, sizeof(cellsCnt)); + memset(elsCnt, 0, sizeof(elsCnt)); + memset(elements, 0, sizeof(elements)); + memset(elCells, 0, sizeof(elCells)); + + // check if there is only one element left in cell(col, row) + for (int col = 0; col < PUZZLE_SIZE; col++) + for (int i = 0; i < PUZZLE_SIZE; i++) { + if (pos[col][row][i]) { + elsCnt[i]++; + elCells[i] = col; + cellsCnt[col]++; + elements[col] = i + 1; + } + } + + bool changed = false; + + // check for cells with single element + for (int col = 0; col < PUZZLE_SIZE; col++) { + if ((cellsCnt[col] == 1) && (elsCnt[elements[col] - 1] != 1)) { + // there is only one element in cell but it used somewhere else + int e = elements[col] - 1; + for (int i = 0; i < PUZZLE_SIZE; i++) + if (i != col) + pos[i][row][e] = 0; + changed = true; + } + } + + // check for single element without exclusive cell + for (int el = 0; el < PUZZLE_SIZE; el++) + if ((elsCnt[el] == 1) && (cellsCnt[elCells[el]] != 1)) { + int col = elCells[el]; + for (int i = 0; i < PUZZLE_SIZE; i++) + if (i != el) + pos[col][row][i] = 0; + changed = true; + } + + if (changed) + checkSingles(row); +} + +void Possibilities::exclude(int col, int row, int element) +{ + if (! pos[col][row][element - 1]) + return; + + pos[col][row][element - 1] = 0; + + checkSingles(row); +} + +void Possibilities::set(int col, int row, int element) +{ + for (int i = 0; i < PUZZLE_SIZE; i++) + if ((i != element - 1)) + pos[col][row][i] = 0; + else + pos[col][row][i] = element; + + for (int j = 0; j < PUZZLE_SIZE; j++) + if (j != col) + pos[j][row][element - 1] = 0; + + checkSingles(row); +} + +bool Possibilities::isPossible(int col, int row, int element) +{ + return pos[col][row][element - 1] == element; +} + +bool Possibilities::isDefined(int col, int row) +{ + int solvedCnt = 0, unsolvedCnt = 0; + for (int i = 0; i < PUZZLE_SIZE; i++) + if (! pos[col][row][i]) + unsolvedCnt++; + else + solvedCnt++; + return ((unsolvedCnt == PUZZLE_SIZE-1) && (solvedCnt == 1)); +} + + +int Possibilities::getDefined(int col, int row) +{ + for (int i = 0; i < PUZZLE_SIZE; i++) + if (pos[col][row][i]) + return i + 1; + return 0; +} + + +bool Possibilities::isSolved() +{ + for (int i = 0; i < PUZZLE_SIZE; i++) + for (int j = 0; j < PUZZLE_SIZE; j++) + if (! isDefined(i, j)) + return false; + return true; +} + + +bool Possibilities::isValid(SolvedPuzzle &puzzle) +{ + for (int row = 0; row < PUZZLE_SIZE; row++) + for (int col = 0; col < PUZZLE_SIZE; col++) + if (! isPossible(col, row, puzzle[row][col])) + return false; + return true; +} + + +int Possibilities::getPosition(int row, int element) +{ + int cnt = 0; + int lastPos = -1; + + for (int i = 0; i < PUZZLE_SIZE; i++) + if (pos[i][row][element - 1] == element) { + cnt++; + lastPos = i; + } + + return cnt == 1 ? lastPos : -1; +} + +void Possibilities::print() +{ + for (int row = 0; row < PUZZLE_SIZE; row++) { + std::cout << (char)('A' + row) << " "; + for (int col = 0; col < PUZZLE_SIZE; col++) { + for (int i = 0; i < PUZZLE_SIZE; i++) + if (pos[col][row][i]) + std::cout << pos[col][row][i]; + else + std::cout << " "; + std::cout << " "; + } + std::cout << std::endl; + } +} + +void Possibilities::makePossible(int col, int row, int element) +{ + pos[col][row][element-1] = element; +} + +void Possibilities::save(std::ostream &stream) +{ + for (int row = 0; row < PUZZLE_SIZE; row++) + for (int col = 0; col < PUZZLE_SIZE; col++) + for (int element = 0; element < PUZZLE_SIZE; element++) + writeInt(stream, pos[col][row][element]); +} + + +static void shuffle(short arr[PUZZLE_SIZE]) +{ + int a, b, c; + + for (int i = 0; i < 30; i++) { + a = (int)(((double)PUZZLE_SIZE)*rand()/(RAND_MAX+1.0)); + if ((a < 0) || (a >= PUZZLE_SIZE)) { + std::cerr << "Index error" << std::endl; + exit(1); + } + b = (int)(((double)PUZZLE_SIZE)*rand()/(RAND_MAX+1.0)); + if ((b < 0) || (b >= PUZZLE_SIZE)) { + std::cerr << "Index error" << std::endl; + exit(1); + } + c = arr[a]; + arr[a] = arr[b]; + arr[b] = c; + } +} + + +static bool canSolve(SolvedPuzzle &puzzle, Rules &rules) +{ + Possibilities pos; + bool changed = false; + + do { + changed = false; + for (Rules::iterator i = rules.begin(); i != rules.end(); i++) { + Rule *rule = *i; + if (rule->apply(pos)) { + changed = true; + if (! pos.isValid(puzzle)) { +std::cout << "after error:" << std::endl; +pos.print(); + throw Exception(L"Invalid possibilities after rule " + + rule->getAsText()); + } + } + } + } while (changed); + + bool res = pos.isSolved(); + return res; +} + + +static void removeRules(SolvedPuzzle &puzzle, Rules &rules) +{ + bool possible; + + do { + possible = false; + for (Rules::iterator i = rules.begin(); i != rules.end(); i++) { + Rule *rule = *i; + Rules excludedRules = rules; + excludedRules.remove(rule); + if (canSolve(puzzle, excludedRules)) { + possible = true; + rules.remove(rule); + delete rule; + break; + } + } + } while (possible); +} + + +static void genRules(SolvedPuzzle &puzzle, Rules &rules) +{ + bool rulesDone = false; + + do { + Rule *rule = genRule(puzzle); + if (rule) { + std::wstring s = rule->getAsText(); + for (std::list::iterator i = rules.begin(); + i != rules.end(); i++) + if ((*i)->getAsText() == s) { + delete rule; + rule = NULL; + break; + } + if (rule) { +//printf("adding rule %s\n", rule->getAsText().c_str()); + rules.push_back(rule); + rulesDone = canSolve(puzzle, rules); + } + } + } while (! rulesDone); +} + + +/*static void printPuzzle(SolvedPuzzle &puzzle) +{ + for (int i = 0; i < PUZZLE_SIZE; i++) { + char prefix = 'A' + i; + for (int j = 0; j < PUZZLE_SIZE; j++) { + if (j) + std::cout << " "; + std::cout << prefix << puzzle[i][j]; + } + std::cout << std::endl; + } +} + + +static void printRules(Rules &rules) +{ + for (Rules::iterator i = rules.begin(); i != rules.end(); i++) + std::cout << (*i)->getAsText() << std::endl;; +}*/ + + +void genPuzzle(SolvedPuzzle &puzzle, Rules &rules) +{ + for (int i = 0; i < PUZZLE_SIZE; i++) { + for (int j = 0; j < PUZZLE_SIZE; j++) + puzzle[i][j] = j + 1; + shuffle(puzzle[i]); + } + + genRules(puzzle, rules); + removeRules(puzzle, rules); +//printPuzzle(puzzle); +//printRules(rules); +} + + +void openInitial(Possibilities &possib, Rules &rules) +{ + for (Rules::iterator i = rules.begin(); i != rules.end(); i++) { + Rule *r = *i; + if (r->applyOnStart()) + r->apply(possib); + } +} + + +void getHintsQty(Rules &rules, int &vert, int &horiz) +{ + vert = 0; + horiz = 0; + + for (Rules::iterator i = rules.begin(); i != rules.end(); i++) { + Rule::ShowOptions so = (*i)->getShowOpts(); + switch (so) { + case Rule::SHOW_VERT: vert++; break; + case Rule::SHOW_HORIZ: horiz++; break; + default: ; + } + } +} + +void savePuzzle(SolvedPuzzle &puzzle, std::ostream &stream) +{ + for (int row = 0; row < PUZZLE_SIZE; row++) + for (int col = 0; col < PUZZLE_SIZE; col++) + writeInt(stream, puzzle[row][col]); +} + +void loadPuzzle(SolvedPuzzle &puzzle, std::istream &stream) +{ + for (int row = 0; row < PUZZLE_SIZE; row++) + for (int col = 0; col < PUZZLE_SIZE; col++) + puzzle[row][col] = readInt(stream); +} + + +Rule* getRule(Rules &rules, int no) +{ + int j = 0; + for (Rules::iterator i = rules.begin(); i != rules.end(); i++) { + if (j == no) + return *i; + j++; + } + throw Exception(L"Rule is not found"); +} + + +/*int main(int argc, char *argv[]) +{ + srand(time(NULL)); + + Rules rules; + Puzzle puzzle; + + genPuzzle(puzzle, rules); + printPuzzle(puzzle); + printRules(rules); + + return 0; +}*/ + diff --git a/puzgen.h b/puzgen.h new file mode 100644 index 0000000..855dbbd --- /dev/null +++ b/puzgen.h @@ -0,0 +1,81 @@ +#ifndef __PUZGEN_H__ +#define __PUZGEN_H__ + + +#include +#include +#include +#include "iconset.h" + + +#define PUZZLE_SIZE 6 + + +typedef short SolvedPuzzle[PUZZLE_SIZE][PUZZLE_SIZE]; + + +class Possibilities +{ + private: + short pos[PUZZLE_SIZE][PUZZLE_SIZE][PUZZLE_SIZE]; + + public: + Possibilities(); + Possibilities(std::istream &stream); + + public: + void exclude(int col, int row, int element); + void set(int col, int row, int element); + bool isPossible(int col, int row, int element); + bool isDefined(int col, int row); + int getDefined(int col, int row); + int getPosition(int row, int element); + bool isSolved(); + void print(); + bool isValid(SolvedPuzzle &puzzle); + void makePossible(int col, int row, int element); + void save(std::ostream &stream); + void reset(); + void checkSingles(int row); +}; + + +class Rule +{ + public: + typedef enum { + SHOW_VERT, + SHOW_HORIZ, + SHOW_NOTHING + } ShowOptions; + + public: + virtual ~Rule() { }; + + public: + virtual std::wstring getAsText() = 0; + virtual bool apply(Possibilities &pos) = 0; + virtual bool applyOnStart() { return false; }; + virtual ShowOptions getShowOpts() { return SHOW_NOTHING; }; + virtual void draw(int x, int y, IconSet &iconSet, bool highlight) = 0; + virtual void save(std::ostream &stream) = 0; +}; + + +typedef std::list Rules; + + +void genPuzzle(SolvedPuzzle &puzzle, Rules &rules); +void openInitial(Possibilities &possib, Rules &rules); +Rule* genRule(SolvedPuzzle &puzzle); +void getHintsQty(Rules &rules, int &vert, int &horiz); +Rule* getRule(Rules &rules, int no); + +void savePuzzle(SolvedPuzzle &puzzle, std::ostream &stream); +void loadPuzzle(SolvedPuzzle &puzzle, std::istream &stream); +void saveRules(Rules &rules, std::ostream &stream); +void loadRules(Rules &rules, std::istream &stream); + + +#endif + diff --git a/puzzle.cpp b/puzzle.cpp new file mode 100644 index 0000000..c0825cf --- /dev/null +++ b/puzzle.cpp @@ -0,0 +1,196 @@ +#include "puzzle.h" +#include "main.h" +#include "utils.h" +#include "sound.h" + + +#define FIELD_OFFSET_X 12 +#define FIELD_OFFSET_Y 68 +#define FIELD_GAP_X 4 +#define FIELD_GAP_Y 4 +#define FIELD_TILE_WIDTH 48 +#define FIELD_TILE_HEIGHT 48 + + +Puzzle::Puzzle(IconSet &is, SolvedPuzzle &s, Possibilities *p): + iconSet(is), solved(s) +{ + possib = p; + + reset(); +} + + +Puzzle::~Puzzle() +{ +} + +void Puzzle::reset() +{ + valid = true; + win = false; + + int x, y; + SDL_GetMouseState(&x, &y); + getCellNo(x, y, hCol, hRow, subHNo); +} + +void Puzzle::draw() +{ + for (int i = 0; i < PUZZLE_SIZE; i++) + for (int j = 0; j < PUZZLE_SIZE; j++) + drawCell(i, j, true); +} + +void Puzzle::drawCell(int col, int row, bool addToUpdate) +{ + int posX = FIELD_OFFSET_X + col * (FIELD_TILE_WIDTH + FIELD_GAP_X); + int posY = FIELD_OFFSET_Y + row * (FIELD_TILE_HEIGHT + FIELD_GAP_Y); + + if (possib->isDefined(col, row)) { + int element = possib->getDefined(col, row); + if (element > 0) + screen.draw(posX, posY, iconSet.getLargeIcon(row, element, + (hCol == col) && (hRow == row))); + } else { + screen.draw(posX, posY, iconSet.getEmptyFieldIcon()); + int x = posX; + int y = posY + (FIELD_TILE_HEIGHT / 6); + for (int i = 0; i < 6; i++) { + if (possib->isPossible(col, row, i + 1)) + screen.draw(x, y, iconSet.getSmallIcon(row, i + 1, + (hCol == col) && (hRow == row) && (i + 1 == subHNo))); + if (i == 2) { + x = posX; + y += (FIELD_TILE_HEIGHT / 3); + } else + x += (FIELD_TILE_WIDTH / 3); + } + } + if (addToUpdate) + screen.addRegionToUpdate(posX, posY, FIELD_TILE_WIDTH, + FIELD_TILE_HEIGHT); +} + + +void Puzzle::drawRow(int row, bool addToUpdate) +{ + for (int i = 0; i < PUZZLE_SIZE; i++) + drawCell(i, row, addToUpdate); +} + + +bool Puzzle::onMouseButtonDown(int button, int x, int y) +{ + int col, row, element; + + if (! getCellNo(x, y, col, row, element)) + return false; + + if (! possib->isDefined(col, row)) { + /*if (button == 3) { + for (int i = 1; i <= PUZZLE_SIZE; i++) + possib->makePossible(col, row, i); + drawCell(col, row); + } + } else {*/ + if (element == -1) + return false; + if (button == 1) { + if (possib->isPossible(col, row, element)) { + possib->set(col, row, element); + sound->play(L"laser.wav"); + } + } else if (button == 3) { + if (possib->isPossible(col, row, element)) { + possib->exclude(col, row, element); + sound->play(L"whizz.wav"); + } + /*else + possib->makePossible(col, row, element);*/ + } + drawRow(row); + } + + bool valid = possib->isValid(solved); + if (! valid) + onFail(); + else + if (possib->isSolved() && valid) + onVictory(); + + return true; +} + + +void Puzzle::onFail() +{ + if (failCommand) + failCommand->doAction(); +} + + +void Puzzle::onVictory() +{ + if (winCommand) + winCommand->doAction(); +} + +bool Puzzle::getCellNo(int x, int y, int &col, int &row, int &subNo) +{ + col = row = subNo = -1; + + if (! isInRect(x, y, FIELD_OFFSET_X, FIELD_OFFSET_Y, + (FIELD_TILE_WIDTH + FIELD_GAP_X) * PUZZLE_SIZE, + (FIELD_TILE_HEIGHT + FIELD_GAP_Y) * PUZZLE_SIZE)) + return false; + + x = x - FIELD_OFFSET_X; + y = y - FIELD_OFFSET_Y; + + col = x / (FIELD_TILE_WIDTH + FIELD_GAP_X); + if (col * (FIELD_TILE_WIDTH + FIELD_GAP_X) + FIELD_TILE_WIDTH < x) + return false; + row = y / (FIELD_TILE_HEIGHT + FIELD_GAP_Y); + if (row * (FIELD_TILE_HEIGHT + FIELD_GAP_Y) + FIELD_TILE_HEIGHT < y) + return false; + + x = x - col * (FIELD_TILE_WIDTH + FIELD_GAP_X); + y = y - row * (FIELD_TILE_HEIGHT + FIELD_GAP_Y) + - FIELD_TILE_HEIGHT / 6; + if ((y < 0) || (y >= (FIELD_TILE_HEIGHT / 3) * 2)) + return true; + int cCol = x / (FIELD_TILE_WIDTH / 3); + if (cCol >= 3) { + col = row = -1; + return false; + } + int cRow = y / (FIELD_TILE_HEIGHT / 3); + subNo = cRow * 3 + cCol + 1; + + return true; +} + +bool Puzzle::onMouseMove(int x, int y) +{ + int oldCol = hCol; + int oldRow = hRow; + int oldElement = subHNo; + + getCellNo(x, y, hCol, hRow, subHNo); + if ((hCol != oldCol) || (hRow != oldRow) || (subHNo != oldElement)) { + if ((oldCol != -1) && (oldRow != -1)) + drawCell(oldCol, oldRow); + if ((hCol != -1) && (hRow != -1)) + drawCell(hCol, hRow); + } + + return false; +} + +void Puzzle::setCommands(Command *win, Command *fail) +{ + winCommand = win; + failCommand = fail; +} + diff --git a/puzzle.h b/puzzle.h new file mode 100644 index 0000000..53c576e --- /dev/null +++ b/puzzle.h @@ -0,0 +1,44 @@ +#ifndef __PUZZLE_H__ +#define __PUZZLE_H__ + + +#include "iconset.h" +#include "puzgen.h" +#include "widgets.h" + + +class Puzzle: public Widget +{ + private: + Possibilities *possib; + IconSet &iconSet; + bool valid; + bool win; + SolvedPuzzle &solved; + int hCol, hRow; + int subHNo; + Command *winCommand, *failCommand; + + public: + Puzzle(IconSet &is, SolvedPuzzle &solved, Possibilities *possib); + virtual ~Puzzle(); + + public: + virtual void draw(); + void drawRow(int row, bool addToUpdate=true); + void drawCell(int col, int row, bool addToUpdate=true); + Possibilities* getPossibilities() { return possib; }; + virtual bool onMouseButtonDown(int button, int x, int y); + bool isValid() const { return valid; }; + bool victory() const { return win; }; + void onFail(); + void onVictory(); + bool getCellNo(int x, int y, int &col, int &row, int &subNo); + virtual bool onMouseMove(int x, int y); + void setCommands(Command *winCommand, Command *failCommand); + void reset(); +}; + + +#endif + diff --git a/random.cpp b/random.cpp new file mode 100644 index 0000000..3550ee1 --- /dev/null +++ b/random.cpp @@ -0,0 +1,159 @@ +#include "random.h" +#include "utils.h" + +/* Period parameters */ +#define M 397 +#define MATRIX_A 0x9908b0dfUL /* constant vector a */ +#define UPPER_MASK 0x80000000UL /* most significant w-r bits */ +#define LOWER_MASK 0x7fffffffUL /* least significant r bits */ + + +Random::Random() +{ + mti = RAND_N+1; /* mti==RAND_N+1 means mt[RAND_N] is not initialized */ + struct timeval tv; + gettimeofday(&tv); + unsigned long long int s = tv.tv_sec * 1000000 + tv.tv_usec; + initLong(s); +} + +Random::Random(unsigned long int seed) +{ + mti = RAND_N+1; /* mti==RAND_N+1 means mt[RAND_N] is not initialized */ + initLong(seed); +} + + +/* initialize by an array with array-length */ +/* init_key is the array for initializing keys */ +/* key_length is its length */ +Random::Random(int init_key[], int key_length) +{ + mti = RAND_N+1; /* mti==RAND_N+1 means mt[RAND_N] is not initialized */ + + int i, j, k; + initLong(19650218UL); + i=1; j=0; + k = (RAND_N>key_length ? RAND_N : key_length); + for (; k; k--) { + mt[i] = (mt[i] ^ ((mt[i-1] ^ (mt[i-1] >> 30)) * 1664525UL)) + + init_key[j] + j; /* non linear */ + mt[i] &= 0xffffffffUL; /* for WORDSIZE > 32 machines */ + i++; j++; + if (i>=RAND_N) { mt[0] = mt[RAND_N-1]; i=1; } + if (j>=key_length) j=0; + } + for (k=RAND_N-1; k; k--) { + mt[i] = (mt[i] ^ ((mt[i-1] ^ (mt[i-1] >> 30)) * 1566083941UL)) + - i; /* non linear */ + mt[i] &= 0xffffffffUL; /* for WORDSIZE > 32 machines */ + i++; + if (i>=RAND_N) { mt[0] = mt[RAND_N-1]; i=1; } + } + + mt[0] = 0x80000000UL; /* MSB is 1; assuring non-zero initial array */ +} + + + +Random::~Random() +{ +} + +/* initializes mt[RAND_N] with a seed */ +void Random::initLong(unsigned long s) +{ + mt[0]= s & 0xffffffffUL; + for (mti=1; mti> 30)) + mti); + /* See Knuth TAOCP Vol2. 3rd Ed. P.106 for multiplier. */ + /* In the previous versions, MSBs of the seed affect */ + /* only MSBs of the array mt[]. */ + /* 2002/01/09 modified by Makoto Matsumoto */ + mt[mti] &= 0xffffffffUL; + /* for >32 bit machines */ + } +} + + +/* generates a random number on [0,0xffffffff]-interval */ +unsigned long Random::genInt32(void) +{ + unsigned long y; + static unsigned long mag01[2]={0x0UL, MATRIX_A}; + /* mag01[x] = x * MATRIX_A for x=0,1 */ + + if (mti >= RAND_N) { /* generate N words at one time */ + int kk; + + if (mti == RAND_N+1) /* if init_genrand() has not been called, */ + initLong(5489UL); /* a default initial seed is used */ + + for (kk=0;kk> 1) ^ mag01[y & 0x1UL]; + } + for (;kk> 1) ^ mag01[y & 0x1UL]; + } + y = (mt[RAND_N-1]&UPPER_MASK)|(mt[0]&LOWER_MASK); + mt[RAND_N-1] = mt[M-1] ^ (y >> 1) ^ mag01[y & 0x1UL]; + + mti = 0; + } + + y = mt[mti++]; + + /* Tempering */ + y ^= (y >> 11); + y ^= (y << 7) & 0x9d2c5680UL; + y ^= (y << 15) & 0xefc60000UL; + y ^= (y >> 18); + + return y; +} + +/* generates a random number on [0,0x7fffffff]-interval */ +long Random::genInt31() +{ + return (long)(genInt32()>>1); +} + +/* generates a random number on [0,1]-real-interval */ +double Random::genReal1(void) +{ + return genInt32()*(1.0/4294967295.0); + /* divided by 2^32-1 */ +} + +/* generates a random number on [0,1)-real-interval */ +double Random::genReal2() +{ + return genInt32()*(1.0/4294967296.0); + /* divided by 2^32 */ +} + +/* generates a random number on (0,1)-real-interval */ +double Random::genReal3(void) +{ + return (((double)genInt32()) + 0.5)*(1.0/4294967296.0); + /* divided by 2^32 */ +} + +/* generates a random number on [0,1) with 53-bit resolution*/ +double Random::genReal53(void) +{ + unsigned long a=genInt32()>>5, b=genInt32()>>6; + return(a*67108864.0+b)*(1.0/9007199254740992.0); +} + +/* generate integer random number on [0, range) int interval */ +int Random::genInt(int range) +{ + int v = (int)(genReal2() * range); +if (v == range) printf("ooops!\n"); + return v; +} + diff --git a/random.h b/random.h new file mode 100644 index 0000000..9bb00a6 --- /dev/null +++ b/random.h @@ -0,0 +1,41 @@ +#ifndef __RANDOM_H__ +#define __RANDOM_H__ + + + +class Random +{ + private: +#define RAND_N 624 + unsigned long mt[RAND_N]; /* the array for the state vector */ + int mti; /* mti==RAND_N+1 means mt[RAND_N] is not initialized */ + + public: + Random(); + Random(unsigned long int seed); + Random(int keys[], int length); + ~Random(); + + public: + /* generates a random number on [0,0xffffffff]-interval */ + unsigned long int genInt32(); + /* generates a random number on [0,0x7fffffff]-interval */ + long int genInt31(); + /* generates a random number on [0,1]-real-interval */ + double genReal1(); + /* generates a random number on [0,1)-real-interval */ + double genReal2(); + /* generates a random number on (0,1)-real-interval */ + double genReal3(); + /* generates a random number on [0,1) with 53-bit resolution*/ + double genReal53(); + /* generate integer random number on [0, range) int interval */ + int genInt(int range); + + private: + void initLong(unsigned long int s); +}; + + +#endif + diff --git a/regstorage.cpp b/regstorage.cpp new file mode 100644 index 0000000..a02be8b --- /dev/null +++ b/regstorage.cpp @@ -0,0 +1,131 @@ +#ifdef WIN32 // Win32 only +#include "regstorage.h" +#include "unicode.h" + + +RegistryStorage::RegistryStorage() +{ + if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, + "SOFTWARE\\Flowix Games\\Einstein\\2.0", + 0, KEY_READ, &globalKey)) + globalKey = NULL; + if (RegOpenKeyEx(HKEY_CURRENT_USER, + "SOFTWARE\\Flowix Games\\Einstein\\2.0", + 0, KEY_READ | KEY_WRITE, &userKey)) + { + if (RegCreateKeyEx(HKEY_CURRENT_USER, + "SOFTWARE\\Flowix Games\\Einstein\\2.0", 0, NULL, + REG_OPTION_NON_VOLATILE, KEY_READ | KEY_WRITE, + NULL, &userKey, NULL)) + userKey = NULL; + } +} + +RegistryStorage::~RegistryStorage() +{ + if (globalKey) + RegCloseKey(globalKey); + if (userKey) + RegCloseKey(userKey); +} + +int RegistryStorage::get(const std::wstring &name, int dflt) +{ + std::string uname(toUtf8(name)); + + if (globalKey) { + DWORD data; + DWORD size = sizeof(data); + DWORD type; + if (! RegQueryValueEx(globalKey, uname.c_str(), NULL, &type, + (BYTE*)&data, &size)) + if (type == REG_DWORD) + return data; + } + + if (userKey) { + DWORD data; + DWORD size = sizeof(data); + DWORD type; + if (! RegQueryValueEx(userKey, uname.c_str(), NULL, &type, + (BYTE*)&data, &size)) + if (type == REG_DWORD) + return data; + } + + return dflt; +} + +std::wstring RegistryStorage::get(const std::wstring &name, const std::wstring &dflt) +{ + std::string uname(toUtf8(name)); + + if (globalKey) { + DWORD size = 0; + DWORD type; + if (! RegQueryValueEx(globalKey, uname.c_str(), NULL, &type, + NULL, &size)) + { + if ((type == REG_SZ) && (size > 0)) { + char *data = new char[size + 1]; + if (! RegQueryValueEx(globalKey, uname.c_str(), NULL, &type, + (BYTE*)data, &size)) + { + std::wstring s(fromUtf8(data)); + delete[] data; + return s; + } + delete[] data; + } else + return L""; + } + } + + if (userKey) { + DWORD size = 0; + DWORD type; + if (! RegQueryValueEx(userKey, uname.c_str(), NULL, &type, + NULL, &size)) + { + if ((type == REG_SZ) && (size > 0)) { + char *data = new char[size]; + if (! RegQueryValueEx(userKey, uname.c_str(), NULL, &type, + (BYTE*)data, &size)) + { + std::wstring s(fromUtf8(data)); + delete[] data; + return s; + } + delete[] data; + } else + return L""; + } + } + + return dflt; +} + +void RegistryStorage::set(const std::wstring &name, int value) +{ + std::string uname(toUtf8(name)); + + if (userKey) { + DWORD data = value; + RegSetValueEx(userKey, uname.c_str(), 0, REG_DWORD, + (BYTE*)&data, sizeof(data)); + } +} + +void RegistryStorage::set(const std::wstring &name, const std::wstring &value) +{ + std::string uname(toUtf8(name)); + std::string uval(toUtf8(value)); + + if (userKey) + RegSetValueEx(userKey, uname.c_str(), 0, REG_SZ, + (BYTE*)uval.c_str(), (uval.length() + 1) * sizeof(char)); +} + + +#endif + diff --git a/regstorage.h b/regstorage.h new file mode 100644 index 0000000..a53a96c --- /dev/null +++ b/regstorage.h @@ -0,0 +1,32 @@ +#ifndef __REGSTORAGE_H__ +#define __REGSTORAGE_H__ +#ifdef WIN32 // Win32 only + + +#include +#include "storage.h" + + +class RegistryStorage: public Storage +{ + private: + HKEY globalKey; + HKEY userKey; + + public: + RegistryStorage(); + virtual ~RegistryStorage(); + + public: + virtual int get(const std::wstring &name, int dflt) ; + virtual std::wstring get(const std::wstring &name, + const std::wstring &dflt); + virtual void set(const std::wstring &name, int value); + virtual void set(const std::wstring &name, const std::wstring &value); + virtual void flush() { }; +}; + + +#endif +#endif + diff --git a/resources.cpp b/resources.cpp new file mode 100644 index 0000000..5d18fbc --- /dev/null +++ b/resources.cpp @@ -0,0 +1,674 @@ +#include +#include +#include +#include + +#include "resources.h" +#include "exceptions.h" +#include "unicode.h" +#include "convert.h" +#include "i18n.h" +#include "utils.h" + + +ResourcesCollection *resources = NULL; + + +/////////////////////////////////////////////////////////////////// +// +// UnpackedResourceStream +// +/////////////////////////////////////////////////////////////////// + + +class UnpackedResourceStream: public ResourceStream +{ + private: + std::ifstream &stream; + size_t size; + long offset; + long pos; + + public: + UnpackedResourceStream(std::ifstream &stream, long offset, + size_t size); + + public: + virtual size_t getSize() { return size; }; + virtual void seek(long offset); + virtual void read(char *buffer, size_t size); + virtual long getPos() { return pos; }; +}; + +UnpackedResourceStream::UnpackedResourceStream(std::ifstream &s, + long off, size_t sz): stream(s) +{ + offset = off; + size = sz; + pos = 0; +} + +void UnpackedResourceStream::seek(long off) +{ + if ((off < 0) || ((size_t)off > size)) + throw Exception(L"Invalid seek in ResourceStream"); + pos = off; +} + +void UnpackedResourceStream::read(char *buffer, size_t sz) +{ + if (! buffer) + throw Exception(L"Invalid buffer in ResourceStream"); + if (sz + pos > size) + throw Exception(L"Attempt of reading after resource end"); + stream.seekg(offset + pos, std::ios::beg); + stream.read(buffer, sz); + pos += sz; +} + + +/////////////////////////////////////////////////////////////////// +// +// MemoryResourceStream +// +/////////////////////////////////////////////////////////////////// + + +class MemoryResourceStream: public ResourceStream +{ + private: + char *data; + size_t size; + ResVariant *resource; + long pos; + + public: + MemoryResourceStream(ResVariant *resource); + virtual ~MemoryResourceStream(); + + public: + virtual size_t getSize() { return size; }; + virtual void seek(long offset); + virtual void read(char *buffer, size_t size); + virtual long getPos() { return pos; }; +}; + +MemoryResourceStream::MemoryResourceStream(ResVariant *res) +{ + resource = res; + data = (char*)res->getRef(size); + pos = 0; +} + +MemoryResourceStream::~MemoryResourceStream() +{ + resource->delRef(data); +} + +void MemoryResourceStream::seek(long off) +{ + if ((off < 0) || ((size_t)off > size)) + throw Exception(L"Invalid seek in ResourceStream"); + pos = off; +} + +void MemoryResourceStream::read(char *buffer, size_t sz) +{ + if (! buffer) + throw Exception(L"Invalid buffer in ResourceStream"); + if (sz + pos > size) + throw Exception(L"Attempt of reading after resource end"); + memcpy(buffer, data, sz); + pos += sz; +} + + +/////////////////////////////////////////////////////////////////// +// +// ResourceFile +// +/////////////////////////////////////////////////////////////////// + + +ResourceFile::ResourceFile(const std::wstring &fileName, Buffer *buf): + name(fileName) +{ + if (buf) { + buffer = buf; + ownBuffer = false; + } else { + buffer = new Buffer(); + ownBuffer = true; + } + + stream.open(toMbcs(fileName).c_str(), std::ios::in | std::ios::binary); + if (stream.fail()) + throw Exception(L"Error loading resource file '" + name + L"'"); + + char sign[4]; + stream.read(sign, 4); + int readed = stream.gcount(); + if (stream.fail() || (readed != 4) || (sign[0] != 'C') || + (sign[1] != 'R') || (sign[2] != 'F') || sign[3]) + throw Exception(L"Invalid resource file '" + name + L"'"); + + int major = readInt(stream); + readed = stream.gcount(); + int minor = readInt(stream); + readed += stream.gcount(); + priority = readInt(stream); + readed += stream.gcount(); + if (stream.fail() || (readed != 12) || (major != 2) || (minor < 0)) + throw Exception(L"Incompatible version of resource file '" + + name + L"'"); +} + + +ResourceFile::~ResourceFile() +{ + stream.close(); + if (ownBuffer) + delete buffer; +} + + +void ResourceFile::getDirectory(Directory &directory) +{ + stream.seekg(-8, std::ios::end); + if (stream.fail()) + throw Exception(L"Error reading " + name + L" directory"); + int start = readInt(stream); + int count = readInt(stream); + stream.seekg(start, std::ios::beg); + if (stream.fail()) + throw Exception(L"Error reading " + name + L" directory"); + + for (int i = 0; i < count; i++) { + DirectoryEntry entry; + entry.name = readString(stream); + entry.unpackedSize = readInt(stream); + entry.offset = readInt(stream); + entry.packedSize = readInt(stream); + entry.level = readInt(stream); + entry.group = readString(stream); + directory.push_back(entry); + } + + if (stream.fail()) + throw Exception(L"Error reading " + name + L" directory"); +} + + +void ResourceFile::unpack(char *in, int inSize, char *out, int outSize) +{ + z_stream zs; + + memset(&zs, 0, sizeof(z_stream)); + zs.next_in = (Bytef*)in; + zs.avail_in = inSize; + zs.next_out = (Bytef*)out; + zs.avail_out = outSize; + + if (inflateInit(&zs) != Z_OK) + throw Exception(name + L": Error initializing inflate stream."); + + if (inflate(&zs, Z_FINISH) != Z_STREAM_END) + throw Exception(name + L": Error decompresing element."); + + if (inflateEnd(&zs) != Z_OK) + throw Exception(name + L": Error finishing decompresing."); +} + + +void ResourceFile::load(char *buf, long offset, long packedSize, + long unpackedSize, int level) +{ + char *inBuf=NULL; + + try { + if (! level) { + stream.seekg(offset, std::ios::beg); + stream.read(buf, unpackedSize); + return; + } + + buffer->setSize(packedSize); + stream.seekg(offset, std::ios::beg); + stream.read((char*)buffer->getData(), packedSize); + unpack((char*)buffer->getData(), packedSize, buf, unpackedSize); + } catch (Exception &e) { + if (inBuf) free(inBuf); + throw e; + } catch (...) { + if (inBuf) free(inBuf); + throw Exception(name + L": Error loading resource"); + } +} + + +void* ResourceFile::load(long offset, long packedSize, long unpackedSize, + int level) +{ + char *outBuf=NULL; + + try { + outBuf = (char*)malloc(unpackedSize); + if (! outBuf) + throw Exception(name + L": Error allocating memory"); + load(outBuf, offset, packedSize, unpackedSize, level); + } catch (Exception &e) { + if (outBuf) free(outBuf); + throw e; + } catch (...) { + if (outBuf) free(outBuf); + throw Exception(name + L": Error loading resource"); + } + + return outBuf; +} + + +/////////////////////////////////////////////////////////////////// +// +// SimpleResourceFile +// +/////////////////////////////////////////////////////////////////// + + +SimpleResourceFile::SimpleResourceFile(const std::wstring &fileName, + Buffer *buf): ResourceFile(fileName, buf) +{ + Directory entries; + getDirectory(entries); + for (Directory::iterator i = entries.begin(); i != entries.end(); i++) { + DirectoryEntry &e = *i; + directory[e.name] = e; + } +} + +void* SimpleResourceFile::load(const std::wstring &name, int &size) +{ + DirectoryMap::iterator i = directory.find(name); + if (i != directory.end()) { + DirectoryEntry &e = (*i).second; + size = e.unpackedSize; + return ResourceFile::load(e.offset, e.packedSize, e.unpackedSize, + e.level); + } else + throw Exception(L"Resource '" + name + L"' not found"); +} + +void SimpleResourceFile::load(const std::wstring &name, Buffer &outBuf) +{ + DirectoryMap::iterator i = directory.find(name); + if (i != directory.end()) { + DirectoryEntry &e = (*i).second; + outBuf.setSize(e.unpackedSize); + ResourceFile::load((char*)outBuf.getData(), e.offset, + e.packedSize, e.unpackedSize, e.level); + } else + throw Exception(L"Resource '" + name + L"' not found"); +} + +/////////////////////////////////////////////////////////////////// +// +// ResVariant +// +/////////////////////////////////////////////////////////////////// + + +ResVariant::ResVariant(ResourceFile *f, int score, + const ResourceFile::DirectoryEntry &e) +{ + file = f; + i18nScore = score; + offset = e.offset; + unpackedSize = e.unpackedSize; + packedSize = e.packedSize; + level = e.level; + refCnt = 0; + data = NULL; +} + + +ResVariant::~ResVariant() +{ + if (data) + free((char*)data - sizeof(ResVariant*)); +} + +void* ResVariant::getRef() +{ + if (! refCnt) { + char* d = (char*)malloc(unpackedSize + sizeof(void*)); + if (! d) + throw Exception(L"ResVariant::getRef memory allocation error"); + ResVariant *self = this; + file->load(d + sizeof(self), offset, packedSize, unpackedSize, + level); + memcpy(d, &self, sizeof(self)); + data = d + sizeof(self); + } + + refCnt++; + return data; +} + +void* ResVariant::getRef(size_t &sz) +{ + sz = unpackedSize; + return getRef(); +} + +void ResVariant::delRef(void *dta) +{ + if ((! refCnt) || (dta != data)) + throw Exception(L"Invalid ResVariant::delRef call"); + + refCnt--; + if (! refCnt) { + free((char*)data - sizeof(ResVariant*)); + data = NULL; + } +} + +void* ResVariant::getDynData() +{ + if (! refCnt) + return file->load(offset, packedSize, unpackedSize, level); + else { + char* d = (char*)malloc(unpackedSize); + if (! d) + throw Exception(L"ResVariant::getDynData memory allocation error"); + memcpy(d, data, unpackedSize); + return data; + } +} + +void ResVariant::getData(Buffer &buffer) +{ + buffer.setSize(unpackedSize); + if (! refCnt) + file->load((char*)buffer.getData(), offset, packedSize, + unpackedSize, level); + else + memcpy((char*)buffer.getData(), data, unpackedSize); +} + +ResourceStream* ResVariant::createStream() +{ + if (refCnt || level) + return new MemoryResourceStream(this); + else + return new UnpackedResourceStream(file->getStream(), offset, + packedSize); +} + + +/////////////////////////////////////////////////////////////////// +// +// Resource +// +/////////////////////////////////////////////////////////////////// + + +Resource::Resource(ResourceFile *file, int i18nScore, + const ResourceFile::DirectoryEntry &entry, const std::wstring &n): + name(n) +{ + addVariant(file, i18nScore, entry); +} + +Resource::~Resource() +{ + for (Variants::iterator i = variants.begin(); i != variants.end(); i++) + delete *i; +} + +class ScorePredicate +{ + public: + int score; + + ScorePredicate(int sc) { score = sc; } + + bool operator() (const ResVariant *r) const { + return r->getI18nScore() == score; + }; +}; + +class ResVariantMoreThen +{ + public: + bool operator() (const ResVariant *v1, const ResVariant *v2) const { + return v1->getI18nScore() > v2->getI18nScore(); + }; +}; + +void Resource::addVariant(ResourceFile *file, int i18nScore, + const ResourceFile::DirectoryEntry &entry) +{ + if (! variants.size()) { + variants.push_back(new ResVariant(file, i18nScore, entry)); + return; + } + + ScorePredicate p(i18nScore); + Variants::iterator i = std::find_if(variants.begin(), variants.end(), p); + if (i != variants.end()) { + delete *i; + *i = new ResVariant(file, i18nScore, entry); + } else { + variants.push_back(new ResVariant(file, i18nScore, entry)); + ResVariantMoreThen comparator; + std::sort(variants.begin(), variants.end(), comparator); + } +} + + +void* Resource::getRef(int variant) +{ + return variants[variant]->getRef(); +} + + +void* Resource::getRef(int *size, int variant) +{ + if (size) + *size = variants[variant]->getSize(); + return variants[variant]->getRef(); +} + + +void Resource::delRef(void *data) +{ + ResVariant *v = *(ResVariant**)((char*)data - sizeof(ResVariant*)); + v->delRef(data); +} + + +void Resource::getData(Buffer &buffer, int variant) +{ + variants[variant]->getData(buffer); +} + +ResourceStream* Resource::createStream(int variant) +{ + return variants[variant]->createStream(); +} + + +/////////////////////////////////////////////////////////////////// +// +// ResourcesCollection +// +/////////////////////////////////////////////////////////////////// + + +class ResFileMoreThen +{ + public: + bool operator() (const ResourceFile *f1, const ResourceFile *f2) const { + return f1->getPriority() > f2->getPriority(); + }; +}; + +ResourcesCollection::ResourcesCollection(StringList &directories) +{ + loadResourceFiles(directories); + ResFileMoreThen comparator; + std::sort(files.begin(), files.end(), comparator); + processFiles(); +} + + +ResourcesCollection::~ResourcesCollection() +{ + for (ResourcesMap::iterator i = resources.begin(); i != resources.end(); i++) + delete (*i).second; + for (ResourceFiles::iterator i = files.begin(); i != files.end(); i++) + delete *i; +} + + +void ResourcesCollection::loadResourceFiles(StringList &directories) +{ + for (StringList::iterator i = directories.begin(); + i != directories.end(); i++) + { + const std::wstring &d = *i; + DIR *dir = opendir(toMbcs(d).c_str()); + if (dir) { + struct dirent *de; + while ((de = readdir(dir))) + if (de->d_name[0] != '.') { + std::wstring s(fromMbcs(de->d_name)); + if ((s.length() > 4) && + (toLowerCase(s.substr(s.length() - 4)) == L".res")) + files.push_back(new ResourceFile(d + L"/" + s, &buffer)); + } + closedir(dir); + } + } +} + + +void ResourcesCollection::processFiles() +{ + ResourceFile::Directory dir; + for (std::vector::iterator i = files.begin(); + i != files.end(); i++) + { + ResourceFile *file = *i; + file->getDirectory(dir); + for (ResourceFile::Directory::iterator j = dir.begin(); + j != dir.end(); j++) + { + ResourceFile::DirectoryEntry &de = *j; + std::wstring name, ext, language, country; + splitFileName(de.name, name, ext, language, country); + int score = getScore(language, country, locale); + if (score > 0) { + std::wstring resName = name + L"." + ext; + Resource *res = resources[resName]; + if (! res) { + res = new Resource(file, score, de, resName); + resources[resName] = res; + if (de.group.length()) + groups[de.group].push_back(res); + } else + res->addVariant(file, score, de); + } + } + dir.clear(); + } +} + + +Resource* ResourcesCollection::getResource(const std::wstring &name) +{ + Resource *r = resources[name]; + if (! r) + throw Exception(L"Resource '" + name + L"' not found"); + return r; +} + + +void* ResourcesCollection::getRef(const std::wstring &name, int &size) +{ + Resource *r = getResource(name); + ResVariant *v = r->getVariant(0); + size = v->getSize(); + return v->getRef(); +} + + +void* ResourcesCollection::getRef(const std::wstring &name) +{ + Resource *r = getResource(name); + ResVariant *v = r->getVariant(0); + return v->getRef(); +} + +ResourceStream* ResourcesCollection::createStream(const std::wstring &name) +{ + Resource *r = getResource(name); + return r->createStream(); +} + +void ResourcesCollection::delRef(void *data) +{ + ResVariant *v = *(ResVariant**)((char*)data - sizeof(ResVariant*)); + v->delRef(data); +} + +void ResourcesCollection::forEachInGroup(const std::wstring &name, + Visitor &visitor) +{ + if (groups.count(name) > 0) { + ResourcesList &l = groups[name]; + for (ResourcesList::iterator i = l.begin(); i != l.end(); i++) { + Resource *r = *i; + visitor.onVisit(r); + } + } +} + +void ResourcesCollection::loadData(const std::wstring &name, Buffer &buffer) +{ + Resource *r = getResource(name); + r->getData(buffer); +} + + +/////////////////////////////////////////////////////////////////// +// +// ResDataHolder +// +/////////////////////////////////////////////////////////////////// + + +ResDataHolder::ResDataHolder() +{ + data = NULL; + size = 0; +} + +ResDataHolder::ResDataHolder(const std::wstring &name) +{ + load(name); +} + +ResDataHolder::~ResDataHolder() +{ + if (data) + resources->delRef(data); +} + +void ResDataHolder::load(const std::wstring &name) +{ + int s; + data = resources->getRef(name, s); + size = (size_t)s; +} + diff --git a/resources.h b/resources.h new file mode 100644 index 0000000..721f9c3 --- /dev/null +++ b/resources.h @@ -0,0 +1,413 @@ +#ifndef __RESOURCES_H__ +#define __RESOURCES_H__ + +/** \file resources.h + * Classes for resources loading and unloading. + */ + +#include +#include +#include +#include +#include + +#include "visitor.h" +#include "buffer.h" + +typedef std::list StringList; + + +class ResourceFile; + + +/// Abstract interface for streamed resource access +class ResourceStream +{ + public: + virtual ~ResourceStream() { }; + + /// Get size of resource + virtual size_t getSize() = 0; + + /// Seek into resource. + /// \param offset offset from resource start + virtual void seek(long offset) = 0; + + /// Read data from resource into buffer. + /// \param buffer buffer of size bytes. + /// \param size number of bytes to read. + virtual void read(char *buffer, size_t size) = 0; + + /// Get current position + virtual long getPos() = 0; + + /// Return true if end of resource reached + virtual bool isEof() { return (size_t)getPos() >= getSize(); }; + + /// Get count of bytes left + virtual long getAvailable() { return (long)getSize() - getPos(); }; +}; + + +/*** + * Low level resource file interface. + * Never use it, use ResourcesCollection instead. + ***/ +class ResourceFile +{ + private: + std::ifstream stream; /// resource file input stream + int priority; /// priority of resource file + std::wstring name; /// resource file name + Buffer *buffer; + bool ownBuffer; + + public: + /// Resource file directory entry + typedef struct { + std::wstring name; /// resource name + long offset; /// offset from start of resource file + long packedSize; /// compressed size + long unpackedSize; /// uncompressed size + std::wstring group; /// group name + int level; /// pack level + } DirectoryEntry; + /// List of directory entries. + typedef std::list Directory; + + public: + /// Create resource file. Throws exception if file can't be opened. + /// \param fileName the name of resource file. + /// \param buffer buffer for temporary data. + /// Can be shared with other resource files. + ResourceFile(const std::wstring &fileName, Buffer *buffer=NULL); + virtual ~ResourceFile(); + + public: + /// Load directory listing. + /// \param directory list where resource entries will be placed. + void getDirectory(Directory &directory); + + /// Load data in preallocated buffer buf of size unpackedSize. + /// \param buf buffer of unpackedSize bytes where unpacked data will + /// be placed + /// \param offset offset from start of resource file to packed data + /// \param packedSize size of packed resource + /// \param unpackedSize size of unpacked resource + void load(char *buf, long offset, long packedSize, + long unpackedSize, int level); + + /// Allocate buffer and load data. Memory returned by this + /// method must be freed by free() function call. + /// \param offset offset from start of resource file to packed data + /// \param packedSize size of packed resource + /// \param unpackedSize size of unpacked resource + void* load(long offset, long packedSize, long unpackedSize, + int level); + + /// Get priority of this resource file. + int getPriority() const { return priority; }; + + /// Get the name of resource file. + const std::wstring& getFileName() const { return name; }; + + /// Get file stream. + std::ifstream& getStream() { return stream; }; + + private: + /// Unpack memory buffer + /// \param in buffer of inSize bytes filled with packed data + /// \param inSize size of packed data + /// \param out buffer of outSize bytes where unpacked data will + /// be placed + /// \param outSize size of unpacked data + void unpack(char *in, int inSize, char *out, int outSize); +}; + + +/// Simple resource file wrapper. +/// Used at boot time when ResourcesCollection +/// is not available yet. +class SimpleResourceFile: public ResourceFile +{ + private: + typedef std::map DirectoryMap; + DirectoryMap directory; /// Directory map. + + public: + /// Open resource file. Throws exception if file can't be opened. + /// \param fileName the name of resource file. + /// \param buffer buffer for temporary data. + /// Can be shared with other resource files. + SimpleResourceFile(const std::wstring &fileName, Buffer *buffer=NULL); + + public: + /// Load data. Memory returned by this method should be freed + /// by free() function call. + /// \param name name of resource + /// \param size returns size of resource + virtual void* load(const std::wstring &name, int &size); + + /// Load data into the buffer. + /// \param name name of resource + /// \param buffer buffer for resource data + virtual void load(const std::wstring &name, Buffer &buffer); +}; + + +/// Internationalized resource entity. +class ResVariant +{ + private: + int i18nScore; + ResourceFile *file; + long offset; + long unpackedSize; + long packedSize; + int refCnt; + void *data; + int level; + + public: + /// Create resource variation. + /// \param file reesource file + /// \param score locale compability score + /// \param entry entry in global resources directory + ResVariant(ResourceFile *file, int score, + const ResourceFile::DirectoryEntry &entry); + + ~ResVariant(); + + public: + /// Return locale compability score. + int getI18nScore() const { return i18nScore; }; + + /// Get pointer to unpacked resource data. + /// Must be freed after use this delRef() + void* getRef(); + + /// Get pointer to unpacked resource data and return resource size. + /// Must be freed after use this delRef(). + /// \param size returned size of resource data. + void* getRef(size_t &size); + + /// Delete referene to data. + /// \param data pointer to unpacked data. + void delRef(void *data); + + /// Return reference counter. + int getRefCount() const { return refCnt; }; + + /// Is data managed by this object + /// \param data pointer to dataa + bool isDataOwned(void *data) const { return refCnt && data == this->data; }; + + /// return data. + /// destroy it after use with free() + void* getDynData(); + + /// returns size of data + long getSize() const { return unpackedSize; }; + + /// Return data in buffer + /// \param buffer buffer to store data. + void getData(Buffer &buffer); + + /// Create ResourceStream for resource. + /// This may be usefull for large streams unpacked data, + /// for example video and sound. + /// Delete stream after use. + ResourceStream* createStream(); +}; + + +/// Internationalized resources. +/// Collection of localized data (ResVariant) with single name. +class Resource +{ + private: + typedef std::vector Variants; + Variants variants; + std::wstring name; + + public: + /// Create resource and add first entry + /// \param file resource file + /// \param i18nScore locale compability score + /// \param entry resource entry in global directory + /// \param name name of resource + Resource(ResourceFile *file, int i18nScore, + const ResourceFile::DirectoryEntry &entry, + const std::wstring &name); + + ~Resource(); + + public: + /// Add resource variant. + /// \param file resource file + /// \param i18nScore locale compability score + /// \param entry resource entry in global directory + void addVariant(ResourceFile *file, int i18nScore, + const ResourceFile::DirectoryEntry &entry); + + /// Get number of variants. + int getVariantsCount() const { return variants.size(); }; + + /// Geturns variant object. + /// \param variant variant number. + ResVariant* getVariant(int variant=0) { return variants[variant]; }; + + /// Load data from variant. + /// Data must be freed with delRef(). + /// \param variant variant number. + void* getRef(int variant=0); + + /// Load data from variant. + /// data must be freed with delRef() + /// \param size size of data. + /// \param variant variant number. + void* getRef(int *size, int variant=0); + + /// Unload data + /// param data pointer to data. + void delRef(void *data); + + /// Get size of data. + /// \param variant variant number. + long getSize(int variant=0) { return variants[variant]->getSize(); }; + + /// Get name of this resource. + const std::wstring& getName() const { return name; }; + + /// Load data into buffer. + /// \param buffer buffer for data. + /// \param variant variant number. + void getData(Buffer &buffer, int variant=0); + + /// Create ResourceStream for resource. + /// This may be usefull for large streams unpacked data, + /// for example video and sound. + /// Delete stream after use. + /// \param variant variant number. + ResourceStream* createStream(int variant=0); +}; + + +/// Internationalized resource files collection. +/// When ResourceCollection created all resources checked against +/// current locale. Resources not belonged to current locale are +/// ignored, resources that can be used in current locale sorted +/// by locale relevance score. +/// All resources names interpeted as name[_language][_COUNTRY].extension +/// where name is name of resource, language is optional two letters +/// ISO language code, country is two letters ISO country code +/// and extension is file extension. +/// After processing resource name will be truncated to name.extension. +/// By default resource with highest locale relevance score will +/// be loaded. Howether, it is possible to enumerate all variants +/// by using Resource class interface. +/// Resource files loaded in order specified by their priority. +/// Resources from file loaded later can replace resources +/// loaded before it. +class ResourcesCollection +{ + private: + /// Map resource names to resources. + typedef std::map ResourcesMap; + + /// List of resources. + typedef std::list ResourcesList; + + /// Map group names to resources list. + typedef std::map ResourcesListMap; + + /// List of resource files. + typedef std::vector ResourceFiles; + + ResourcesMap resources; /// Map of all available resources. + ResourcesListMap groups; /// Map of all available groups. + ResourceFiles files; /// List of resource files. + Buffer buffer; /// Temporary buffer for resource files. + + public: + /// Load resource files, make grouping and i18n optimizations. + ResourcesCollection(StringList &directories); + ~ResourcesCollection(); + + public: + /// Returns resource entry. + /// If resource not found Exception will be thrown. + Resource* getResource(const std::wstring &name); + + /// Load resource. + /// Loaded data must be freed with delRef method. + void* getRef(const std::wstring &name, int &size); + + /// Load resource. + /// Loaded data must be freed with delRef method. + void* getRef(const std::wstring &name); + + /// Delete reference to resource. + void delRef(void *data); + + /// Visit all group members. + void forEachInGroup(const std::wstring &groupName, + Visitor &visitor); + + /// Create ResourceStream for resource. + /// This may be usefull for large streams unpacked data, + /// for example video and sound. + /// Delete stream after use. + /// \param name name of resource. + ResourceStream* createStream(const std::wstring &name); + + /// Load data into buffer. + /// Usually you don't need this, use getRef instead. + /// \param name name of resource. + /// \param buffer buffer for data. + void loadData(const std::wstring &name, Buffer &buffer); + + private: + /// Open resource files. + void loadResourceFiles(StringList &directories); + + /// Make grouping and locale processing. + void processFiles(); +}; + + +/// Helper class for simple resource loading and unloading +class ResDataHolder +{ + private: + void *data; + size_t size; + + public: + /// Create holder without data + ResDataHolder(); + + /// Create holder and load data + ResDataHolder(const std::wstring &name); + + ~ResDataHolder(); + + public: + /// Load resource data + void load(const std::wstring &name); + + /// Returns pointer to resource data + void* getData() const { return data; }; + + /// Returns size of data + size_t getSize() const { return size; }; +}; + + +/// Global collection of resources. +/// Careated at first step at boot time stage2 +extern ResourcesCollection *resources; + + +#endif + diff --git a/rules.cpp b/rules.cpp new file mode 100644 index 0000000..153a78b --- /dev/null +++ b/rules.cpp @@ -0,0 +1,563 @@ +#include "puzgen.h" +#include "utils.h" +#include "main.h" +#include "convert.h" +#include "unicode.h" + + +static std::wstring getThingName(int row, int thing) +{ + std::wstring s; + s += (wchar_t)(L'A' + row); + s += toString(thing); + return s; +} + + + +class NearRule: public Rule +{ + private: + int thing1[2]; + int thing2[2]; + + public: + NearRule(SolvedPuzzle puzzle); + NearRule(std::istream &stream); + virtual bool apply(Possibilities &pos); + virtual std::wstring getAsText(); + + private: + bool applyToCol(Possibilities &pos, int col, int nearRow, int nearNum, + int thisRow, int thisNum); + virtual void draw(int x, int y, IconSet &iconSet, bool highlighted); + virtual ShowOptions getShowOpts() { return SHOW_HORIZ; }; + virtual void save(std::ostream &stream); +}; + + +NearRule::NearRule(SolvedPuzzle puzzle) +{ + int col1 = rndGen.genInt(PUZZLE_SIZE); + thing1[0] = rndGen.genInt(PUZZLE_SIZE); + thing1[1] = puzzle[thing1[0]][col1]; + + int col2; + if (col1 == 0) + col2 = 1; + else + if (col1 == PUZZLE_SIZE-1) + col2 = PUZZLE_SIZE-2; + else + if (rndGen.genInt(2)) + col2 = col1 + 1; + else + col2 = col1 - 1; + + thing2[0] = rndGen.genInt(PUZZLE_SIZE); + thing2[1] = puzzle[thing2[0]][col2]; +} + + +NearRule::NearRule(std::istream &stream) +{ + thing1[0] = readInt(stream); + thing1[1] = readInt(stream); + thing2[0] = readInt(stream); + thing2[1] = readInt(stream); +} + + +bool NearRule::applyToCol(Possibilities &pos, int col, int nearRow, int nearNum, + int thisRow, int thisNum) +{ + bool hasLeft, hasRight; + + if (col == 0) + hasLeft = false; + else + hasLeft = pos.isPossible(col - 1, nearRow, nearNum); + if (col == PUZZLE_SIZE-1) + hasRight = false; + else + hasRight = pos.isPossible(col + 1, nearRow, nearNum); + + if ((! hasRight) && (! hasLeft) && pos.isPossible(col, thisRow, thisNum)) { + pos.exclude(col, thisRow, thisNum); + return true; + } else + return false; +} + + +bool NearRule::apply(Possibilities &pos) +{ + bool changed = false; + + for (int i = 0; i < PUZZLE_SIZE; i++) { + if (applyToCol(pos, i, thing1[0], thing1[1], thing2[0], thing2[1])) + changed = true; + if (applyToCol(pos, i, thing2[0], thing2[1], thing1[0], thing1[1])) + changed = true; + } + + if (changed) + apply(pos); + + return changed; +} + +std::wstring NearRule::getAsText() +{ + return getThingName(thing1[0], thing1[1]) + + L" is near to " + getThingName(thing2[0], thing2[1]); +} + +void NearRule::draw(int x, int y, IconSet &iconSet, bool h) +{ + SDL_Surface *icon = iconSet.getLargeIcon(thing1[0], thing1[1], h); + screen.draw(x, y, icon); + screen.draw(x + icon->h, y, iconSet.getNearHintIcon(h)); + screen.draw(x + icon->h*2, y, iconSet.getLargeIcon(thing2[0], thing2[1], h)); +} + +void NearRule::save(std::ostream &stream) +{ + writeString(stream, L"near"); + writeInt(stream, thing1[0]); + writeInt(stream, thing1[1]); + writeInt(stream, thing2[0]); + writeInt(stream, thing2[1]); +} + + +class DirectionRule: public Rule +{ + private: + int row1, thing1; + int row2, thing2; + + public: + DirectionRule(SolvedPuzzle puzzle); + DirectionRule(std::istream &stream); + virtual bool apply(Possibilities &pos); + virtual std::wstring getAsText(); + + private: + virtual void draw(int x, int y, IconSet &iconSet, bool highlighted); + virtual ShowOptions getShowOpts() { return SHOW_HORIZ; }; + virtual void save(std::ostream &stream); +}; + + +DirectionRule::DirectionRule(SolvedPuzzle puzzle) +{ + row1 = rndGen.genInt(PUZZLE_SIZE); + row2 = rndGen.genInt(PUZZLE_SIZE); + int col1 = rndGen.genInt(PUZZLE_SIZE - 1); + int col2 = rndGen.genInt(PUZZLE_SIZE - col1 - 1) + col1 + 1; + thing1 = puzzle[row1][col1]; + thing2 = puzzle[row2][col2]; +} + +DirectionRule::DirectionRule(std::istream &stream) +{ + row1 = readInt(stream); + thing1 = readInt(stream); + row2 = readInt(stream); + thing2 = readInt(stream); +} + +bool DirectionRule::apply(Possibilities &pos) +{ + bool changed = false; + + for (int i = 0; i < PUZZLE_SIZE; i++) { + if (pos.isPossible(i, row2, thing2)) { + pos.exclude(i, row2, thing2); + changed = true; + } + if (pos.isPossible(i, row1, thing1)) + break; + } + + for (int i = PUZZLE_SIZE-1; i >= 0; i--) { + if (pos.isPossible(i, row1, thing1)) { + pos.exclude(i, row1, thing1); + changed = true; + } + if (pos.isPossible(i, row2, thing2)) + break; + } + + return changed; +} + +std::wstring DirectionRule::getAsText() +{ + return getThingName(row1, thing1) + + L" is from the left of " + getThingName(row2, thing2); +} + +void DirectionRule::draw(int x, int y, IconSet &iconSet, bool h) +{ + SDL_Surface *icon = iconSet.getLargeIcon(row1, thing1, h); + screen.draw(x, y, icon); + screen.draw(x + icon->h, y, iconSet.getSideHintIcon(h)); + screen.draw(x + icon->h*2, y, iconSet.getLargeIcon(row2, thing2, h)); +} + +void DirectionRule::save(std::ostream &stream) +{ + writeString(stream, L"direction"); + writeInt(stream, row1); + writeInt(stream, thing1); + writeInt(stream, row2); + writeInt(stream, thing2); +} + + +class OpenRule: public Rule +{ + private: + int col, row, thing; + + public: + OpenRule(SolvedPuzzle puzzle); + OpenRule(std::istream &stream); + virtual bool apply(Possibilities &pos); + virtual std::wstring getAsText(); + virtual bool applyOnStart() { return true; }; + virtual void draw(int x, int y, IconSet &iconSet, bool highlighted) { }; + virtual ShowOptions getShowOpts() { return SHOW_NOTHING; }; + virtual void save(std::ostream &stream); +}; + + +OpenRule::OpenRule(SolvedPuzzle puzzle) +{ + col = rndGen.genInt(PUZZLE_SIZE); + row = rndGen.genInt(PUZZLE_SIZE); + thing = puzzle[row][col]; +} + +OpenRule::OpenRule(std::istream &stream) +{ + col = readInt(stream); + row = readInt(stream); + thing = readInt(stream); +} + +bool OpenRule::apply(Possibilities &pos) +{ + if (! pos.isDefined(col, row)) { + pos.set(col, row, thing); + return true; + } else + return false; +} + +std::wstring OpenRule::getAsText() +{ + return getThingName(row, thing) + L" is at column " + toString(col+1); +} + +void OpenRule::save(std::ostream &stream) +{ + writeString(stream, L"open"); + writeInt(stream, col); + writeInt(stream, row); + writeInt(stream, thing); +} + + +class UnderRule: public Rule +{ + private: + int row1, thing1, row2, thing2; + + public: + UnderRule(SolvedPuzzle puzzle); + UnderRule(std::istream &stream); + virtual bool apply(Possibilities &pos); + virtual std::wstring getAsText(); + virtual void draw(int x, int y, IconSet &iconSet, bool highlighted); + virtual ShowOptions getShowOpts() { return SHOW_VERT; }; + virtual void save(std::ostream &stream); +}; + + +UnderRule::UnderRule(SolvedPuzzle puzzle) +{ + int col = rndGen.genInt(PUZZLE_SIZE); + row1 = rndGen.genInt(PUZZLE_SIZE); + thing1 = puzzle[row1][col]; + do { + row2 = rndGen.genInt(PUZZLE_SIZE); + } while (row2 == row1) ; + thing2 = puzzle[row2][col]; +} + +UnderRule::UnderRule(std::istream &stream) +{ + row1 = readInt(stream); + thing1 = readInt(stream); + row2 = readInt(stream); + thing2 = readInt(stream); +} + +bool UnderRule::apply(Possibilities &pos) +{ + bool changed = false; + + for (int i = 0; i < PUZZLE_SIZE; i++) { + if ((! pos.isPossible(i, row1, thing1)) && + pos.isPossible(i, row2, thing2)) + { + pos.exclude(i, row2, thing2); + changed = true; + } + if ((! pos.isPossible(i, row2, thing2)) && + pos.isPossible(i, row1, thing1)) + { + pos.exclude(i, row1, thing1); + changed = true; + } + } + + return changed; +} + + +std::wstring UnderRule::getAsText() +{ + return getThingName(row1, thing1) + L" is the same column as " + + getThingName(row2, thing2); +} + +void UnderRule::draw(int x, int y, IconSet &iconSet, bool h) +{ + SDL_Surface *icon = iconSet.getLargeIcon(row1, thing1, h); + screen.draw(x, y, icon); + screen.draw(x, y + icon->h, iconSet.getLargeIcon(row2, thing2, h)); +} + +void UnderRule::save(std::ostream &stream) +{ + writeString(stream, L"under"); + writeInt(stream, row1); + writeInt(stream, thing1); + writeInt(stream, row2); + writeInt(stream, thing2); +} + + + +class BetweenRule: public Rule +{ + private: + int row1, thing1; + int row2, thing2; + int centerRow, centerThing; + + public: + BetweenRule(SolvedPuzzle puzzle); + BetweenRule(std::istream &stream); + virtual bool apply(Possibilities &pos); + virtual std::wstring getAsText(); + + private: + virtual void draw(int x, int y, IconSet &iconSet, bool highlighted); + virtual ShowOptions getShowOpts() { return SHOW_HORIZ; }; + virtual void save(std::ostream &stream); +}; + + +BetweenRule::BetweenRule(SolvedPuzzle puzzle) +{ + centerRow = rndGen.genInt(PUZZLE_SIZE); + row1 = rndGen.genInt(PUZZLE_SIZE); + row2 = rndGen.genInt(PUZZLE_SIZE); + + int centerCol = rndGen.genInt(PUZZLE_SIZE - 2) + 1; + centerThing = puzzle[centerRow][centerCol]; + if (rndGen.genInt(2)) { + thing1 = puzzle[row1][centerCol - 1]; + thing2 = puzzle[row2][centerCol + 1]; + } else { + thing1 = puzzle[row1][centerCol + 1]; + thing2 = puzzle[row2][centerCol - 1]; + } +} + +BetweenRule::BetweenRule(std::istream &stream) +{ + row1 = readInt(stream); + thing1 = readInt(stream); + row2 = readInt(stream); + thing2 = readInt(stream); + centerRow = readInt(stream); + centerThing = readInt(stream); +} + +bool BetweenRule::apply(Possibilities &pos) +{ + bool changed = false; + + if (pos.isPossible(0, centerRow, centerThing)) { + changed = true; + pos.exclude(0, centerRow, centerThing); + } + + if (pos.isPossible(PUZZLE_SIZE-1, centerRow, centerThing)) { + changed = true; + pos.exclude(PUZZLE_SIZE-1, centerRow, centerThing); + } + + bool goodLoop; + do { + goodLoop = false; + + for (int i = 1; i < PUZZLE_SIZE-1; i++) { + if (pos.isPossible(i, centerRow, centerThing)) { + if (! ((pos.isPossible(i-1, row1, thing1) && + pos.isPossible(i+1, row2, thing2)) || + (pos.isPossible(i-1, row2, thing2) && + pos.isPossible(i+1, row1, thing1)))) + { + pos.exclude(i, centerRow, centerThing); + goodLoop = true; + } + } + } + + for (int i = 0; i < PUZZLE_SIZE; i++) { + bool leftPossible, rightPossible; + + if (pos.isPossible(i, row2, thing2)) { + if (i < 2) + leftPossible = false; + else + leftPossible = (pos.isPossible(i-1, centerRow, centerThing) + && pos.isPossible(i-2, row1, thing1)); + if (i >= PUZZLE_SIZE - 2) + rightPossible = false; + else + rightPossible = (pos.isPossible(i+1, centerRow, centerThing) + && pos.isPossible(i+2, row1, thing1)); + if ((! leftPossible) && (! rightPossible)) { + pos.exclude(i, row2, thing2); + goodLoop = true; + } + } + + if (pos.isPossible(i, row1, thing1)) { + if (i < 2) + leftPossible = false; + else + leftPossible = (pos.isPossible(i-1, centerRow, centerThing) + && pos.isPossible(i-2, row2, thing2)); + if (i >= PUZZLE_SIZE - 2) + rightPossible = false; + else + rightPossible = (pos.isPossible(i+1, centerRow, centerThing) + && pos.isPossible(i+2, row2, thing2)); + if ((! leftPossible) && (! rightPossible)) { + pos.exclude(i, row1, thing1); + goodLoop = true; + } + } + } + + if (goodLoop) + changed = true; + } while (goodLoop); + + return changed; +} + +std::wstring BetweenRule::getAsText() +{ + return getThingName(centerRow, centerThing) + + L" is between " + getThingName(row1, thing1) + L" and " + + getThingName(row2, thing2); +} + +void BetweenRule::draw(int x, int y, IconSet &iconSet, bool h) +{ + SDL_Surface *icon = iconSet.getLargeIcon(row1, thing1, h); + screen.draw(x, y, icon); + screen.draw(x + icon->w, y, iconSet.getLargeIcon(centerRow, centerThing, h)); + screen.draw(x + icon->w*2, y, iconSet.getLargeIcon(row2, thing2, h)); + SDL_Surface *arrow = iconSet.getBetweenArrow(h); + screen.draw(x + icon->w - (arrow->w - icon->w) / 2, y + 0, arrow); +} + +void BetweenRule::save(std::ostream &stream) +{ + writeString(stream, L"between"); + writeInt(stream, row1); + writeInt(stream, thing1); + writeInt(stream, row2); + writeInt(stream, thing2); + writeInt(stream, centerRow); + writeInt(stream, centerThing); +} + + + +Rule* genRule(SolvedPuzzle &puzzle) +{ + int a = rndGen.genInt(14); + switch (a) { + case 0: + case 1: + case 2: + case 3: return new NearRule(puzzle); + case 4: return new OpenRule(puzzle); + case 5: + case 6: return new UnderRule(puzzle); + case 7: + case 8: + case 9: + case 10: return new DirectionRule(puzzle); + case 11: + case 12: + case 13: return new BetweenRule(puzzle); + default: return genRule(puzzle); + } +} + + +void saveRules(Rules &rules, std::ostream &stream) +{ + writeInt(stream, rules.size()); + for (Rules::iterator i = rules.begin(); i != rules.end(); i++) + (*i)->save(stream); +} + + +void loadRules(Rules &rules, std::istream &stream) +{ + int no = readInt(stream); + + for (int i = 0; i < no; i++) { + std::wstring ruleType = readString(stream); + Rule *r; + if (ruleType == L"near") + r = new NearRule(stream); + else if (ruleType == L"open") + r = new OpenRule(stream); + else if (ruleType == L"under") + r = new UnderRule(stream); + else if (ruleType == L"direction") + r = new DirectionRule(stream); + else if (ruleType == L"between") + r = new BetweenRule(stream); + else + throw Exception(L"invalid rule type " + ruleType); + rules.push_back(r); + } +} + + diff --git a/screen.cpp b/screen.cpp new file mode 100644 index 0000000..7e48934 --- /dev/null +++ b/screen.cpp @@ -0,0 +1,309 @@ +#include +#include "screen.h" +#include "exceptions.h" +#include "unicode.h" + + +Screen::Screen() +{ + screen = NULL; + mouseImage = NULL; + mouseSave = NULL; + mouseVisible = false; + regionsList = NULL; + maxRegionsList = 0; +} + +Screen::~Screen() +{ + SDL_SetCursor(cursor); + if (mouseImage) SDL_FreeSurface(mouseImage); + if (mouseSave) SDL_FreeSurface(mouseSave); + if (regionsList) free(regionsList); +} + + +const VideoMode Screen::getVideoMode() const +{ + return VideoMode(screen->w, screen->h, screen->format->BitsPerPixel, fullScreen); +} + + +void Screen::setMode(const VideoMode& mode) +{ + fullScreen = mode.isFullScreen(); + + int flags = SDL_SWSURFACE /*| SDL_OPENGL*/; + if (fullScreen) + flags = flags | SDL_FULLSCREEN; + screen = SDL_SetVideoMode(mode.getWidth(), mode.getHeight(), mode.getBpp(), flags); + if (! screen) + throw Exception(L"Couldn't set video mode: " + + fromMbcs((SDL_GetError()))); +} + + +std::vector Screen::getFullScreenModes() const +{ + std::vector modes; + return modes; +} + + +int Screen::getWidth() const +{ + if (screen) + return screen->w; + else + throw Exception(L"No video mode selected"); +} + + +int Screen::getHeight() const +{ + if (screen) + return screen->h; + else + throw Exception(L"No video mode selected"); +} + +void Screen::centerMouse() +{ + if (screen) + SDL_WarpMouse(screen->w / 2, screen->h / 2); + else + throw Exception(L"No video mode selected"); +} + +void Screen::setMouseImage(SDL_Surface *image) +{ + if (mouseImage) { + SDL_FreeSurface(mouseImage); + mouseImage = NULL; + } + if (mouseSave) { + SDL_FreeSurface(mouseSave); + mouseSave = NULL; + } + + if (! image) return; + + mouseImage = SDL_DisplayFormat(image); + if (! mouseImage) + throw Exception(L"Error creating surface"); + //mouseSave = SDL_DisplayFormat(image); + mouseSave = SDL_CreateRGBSurface(SDL_HWSURFACE | SDL_SRCCOLORKEY, + image->w, image->h, screen->format->BitsPerPixel, + screen->format->Rmask, screen->format->Gmask, + screen->format->Bmask, screen->format->Amask); + if (! mouseSave) { + SDL_FreeSurface(mouseImage); + throw Exception(L"Error creating buffer surface"); + } + SDL_SetColorKey(mouseImage, SDL_SRCCOLORKEY, + SDL_MapRGB(mouseImage->format, 0, 0, 0)); +} + + +void Screen::hideMouse() +{ + if (! mouseVisible) + return; + + if (! niceCursor) { + mouseVisible = false; + return; + } + + if (mouseSave) { + SDL_Rect src = { 0, 0, mouseSave->w, mouseSave->h }; + SDL_Rect dst = { saveX, saveY, mouseSave->w, mouseSave->h }; + if (src.w > 0) { + SDL_BlitSurface(mouseSave, &src, screen, &dst); + addRegionToUpdate(dst.x, dst.y, dst.w, dst.h); + } + } + mouseVisible = false; +} + +void Screen::showMouse() +{ + if (mouseVisible) + return; + + if (! niceCursor) { + mouseVisible = true; + return; + } + + if (mouseImage && mouseSave) { + int x, y; + SDL_GetMouseState(&x, &y); + saveX = x; + saveY = y; + SDL_Rect src = { 0, 0, mouseSave->w, mouseSave->h }; + SDL_Rect dst = { x, y, mouseImage->w, mouseImage->h }; + if (src.w > 0) { + SDL_BlitSurface(screen, &dst, mouseSave, &src); + SDL_BlitSurface(mouseImage, &src, screen, &dst); + addRegionToUpdate(dst.x, dst.y, dst.w, dst.h); + } + } + mouseVisible = true; +} + +void Screen::updateMouse() +{ + hideMouse(); + showMouse(); +} + +void Screen::flush() +{ + if (! regions.size()) return; + + if (! regionsList) { + regionsList = (SDL_Rect*)malloc(sizeof(SDL_Rect) * regions.size()); + if (! regionsList) { + regions.clear(); + throw Exception(L"Error allocating regions buffer"); + } + maxRegionsList = regions.size(); + } else { + if (maxRegionsList < (int)regions.size()) { + SDL_Rect *r = (SDL_Rect*)realloc(regionsList, + sizeof(SDL_Rect) * regions.size()); + if (! r) { + regions.clear(); + free(regionsList); + throw Exception(L"Error incrementing regions buffer"); + } + regionsList = r; + maxRegionsList = regions.size(); + } + } + + int j = 0; + for (std::list::iterator i = regions.begin(); + i != regions.end(); i++, j++) + regionsList[j] = *i; + + SDL_UpdateRects(screen, regions.size(), regionsList); + regions.clear(); +} + + +void Screen::addRegionToUpdate(int x, int y, int w, int h) +{ + if (((x >= getWidth()) || (y >= getHeight())) || (0 >= w) || (0 >= h)) + return; + if ((x + w < 0) || (y + h < 0)) + return; + if (x + w > getWidth()) + w = getWidth() - x; + if (y + h > getHeight()) + h = getHeight() - y; + if (0 > x) { + w = w + x; + x = 0; + } + if (0 > y) { + h = h + y; + y = 0; + } + SDL_Rect r = { x, y, w, h }; + regions.push_back(r); +} + + +void Screen::setPixel(int x, int y, int r, int g, int b) +{ + SDL_LockSurface(screen); + int bpp = screen->format->BytesPerPixel; + Uint32 pixel = SDL_MapRGB(screen->format, r, g, b); + /* Here p is the address to the pixel we want to set */ + Uint8 *p = (Uint8*)screen->pixels + y * screen->pitch + x * bpp; + + switch(bpp) { + case 1: + *p = pixel; + break; + + case 2: + *(Uint16 *)p = pixel; + break; + + case 3: + if(SDL_BYTEORDER == SDL_BIG_ENDIAN) { + p[0] = (pixel >> 16) & 0xff; + p[1] = (pixel >> 8) & 0xff; + p[2] = pixel & 0xff; + } else { + p[0] = pixel & 0xff; + p[1] = (pixel >> 8) & 0xff; + p[2] = (pixel >> 16) & 0xff; + } + break; + + case 4: + *(Uint32 *)p = pixel; + break; + } + SDL_UnlockSurface(screen); +} + + +void Screen::draw(int x, int y, SDL_Surface *tile) +{ + SDL_Rect src = { 0, 0, tile->w, tile->h }; + SDL_Rect dst = { x, y, tile->w, tile->h }; + SDL_BlitSurface(tile, &src, screen, &dst); +} + +void Screen::setCursor(bool nice) +{ + if (nice == niceCursor) + return; + + bool oldVisible = mouseVisible; + if (mouseVisible) + hideMouse(); + niceCursor = nice; + + if (niceCursor) + SDL_SetCursor(emptyCursor); + else + SDL_SetCursor(cursor); + + if (oldVisible) + showMouse(); +} + +void Screen::initCursors() +{ + cursor = SDL_GetCursor(); + Uint8 t = 0; + emptyCursor = SDL_CreateCursor(&t, &t, 8, 1, 0, 0); +} + +void Screen::doneCursors() +{ + if (niceCursor) + SDL_SetCursor(cursor); + SDL_FreeCursor(emptyCursor); +} + +SDL_Surface* Screen::createSubimage(int x, int y, int width, int height) +{ + SDL_Surface *s = SDL_CreateRGBSurface(SDL_HWSURFACE | SDL_SRCCOLORKEY, + width, height, screen->format->BitsPerPixel, + screen->format->Rmask, screen->format->Gmask, + screen->format->Bmask, screen->format->Amask); + if (! s) + throw Exception(L"Error creating buffer surface"); + SDL_Rect src = { x, y, width, height }; + SDL_Rect dst = { 0, 0, width, height }; + SDL_BlitSurface(screen, &src, s, &dst); + return s; +} + diff --git a/screen.h b/screen.h new file mode 100644 index 0000000..2b5253d --- /dev/null +++ b/screen.h @@ -0,0 +1,78 @@ +#ifndef __SCREEN_H__ +#define __SCREEN_H__ + + +#include "SDL.h" +#include +#include + + +class VideoMode +{ + private: + int width; + int height; + int bpp; + bool fullScreen; + + public: + VideoMode(int w, int h, int bpp, bool fullscreen) + { + width = w; + height = h; + this->bpp = bpp; + this->fullScreen = fullscreen; + } + + public: + int getWidth() const { return width; }; + int getHeight() const { return height; }; + int getBpp() const { return bpp; }; + bool isFullScreen() const { return fullScreen; }; +}; + + +class Screen +{ + private: + SDL_Surface *screen; + bool fullScreen; + SDL_Surface *mouseImage; + SDL_Surface *mouseSave; + std::list regions; + bool mouseVisible; + SDL_Rect *regionsList; + int maxRegionsList; + int saveX, saveY; + bool niceCursor; + SDL_Cursor *cursor, *emptyCursor; + + public: + Screen(); + ~Screen(); + + public: + const VideoMode getVideoMode() const; + int getWidth() const; + int getHeight() const; + void setMode(const VideoMode& mode); + std::vector getFullScreenModes() const; + void centerMouse(); + void setMouseImage(SDL_Surface *image); + void hideMouse(); + void showMouse(); + void updateMouse(); + void flush(); + void addRegionToUpdate(int x, int y, int w, int h); + void setPixel(int x, int y, int r, int g, int b); + SDL_Surface* getSurface() { return screen; }; + void draw(int x, int y, SDL_Surface *surface); + void setCursor(bool nice); + void initCursors(); + void doneCursors(); + SDL_Surface* createSubimage(int x, int y, int width, int height); +}; + + +#endif + diff --git a/sound.cpp b/sound.cpp new file mode 100644 index 0000000..998245f --- /dev/null +++ b/sound.cpp @@ -0,0 +1,62 @@ +#include "sound.h" + +#include +#include +#include "resources.h" + + +Sound *sound; + + +Sound::Sound() +{ + int audio_rate = 22050; + Uint16 audio_format = AUDIO_S16; /* 16-bit stereo */ + int audio_channels = 2; + int audio_buffers = 1024; + disabled = Mix_OpenAudio(audio_rate, audio_format, audio_channels, + audio_buffers); + if (disabled) + std::cout << "Audio is disabled" << std::endl; +} + +Sound::~Sound() +{ + if (! disabled) + Mix_CloseAudio(); + for (ChunkMap::iterator i = chunkCache.begin(); i != chunkCache.end(); i++) + Mix_FreeChunk((*i).second); + Mix_CloseAudio(); +} + + +void Sound::play(const std::wstring &name) +{ + if (disabled || (! enableFx)) + return; + + Mix_Chunk *chunk = NULL; + + ChunkMap::iterator i = chunkCache.find(name); + if (i != chunkCache.end()) + chunk = (*i).second; + else { + ResDataHolder data(name); + chunk = Mix_LoadWAV_RW(SDL_RWFromMem(data.getData(), data.getSize()), + 0); + chunkCache[name] = chunk; + } + + if (chunk) { + Mix_VolumeChunk(chunk, (int)(volume * 128.0f)); + Mix_PlayChannel(-1, chunk, 0); + } + SDL_PumpEvents(); +} + +void Sound::setVolume(float v) +{ + volume = v; + enableFx = 0.01 < volume; +} + diff --git a/sound.h b/sound.h new file mode 100644 index 0000000..dc2a449 --- /dev/null +++ b/sound.h @@ -0,0 +1,35 @@ +#ifndef __SOUND_H__ +#define __SOUND_H__ + + +#include +#include +#include + + +class Sound +{ + private: + bool disabled; + + typedef std::map ChunkMap; + ChunkMap chunkCache; + + bool enableFx; + float volume; + + public: + Sound(); + ~Sound(); + + public: + void play(const std::wstring &name); + void setVolume(float volume); +}; + + +extern Sound *sound; + + +#endif + diff --git a/storage.cpp b/storage.cpp new file mode 100644 index 0000000..ff2b6b3 --- /dev/null +++ b/storage.cpp @@ -0,0 +1,48 @@ +#include "storage.h" + +#ifndef WIN32 +#include "tablestorage.h" +#else +#include "regstorage.h" +#endif + + +class StorageHolder +{ + private: + Storage *storage; + + public: + StorageHolder(); + ~StorageHolder(); + + public: + Storage* getStorage() { return storage; }; +}; + + +StorageHolder::StorageHolder() +{ +#ifndef WIN32 + storage = new TableStorage(); +#else + storage = new RegistryStorage(); +#endif +} + + +StorageHolder::~StorageHolder() +{ + if (storage) + delete storage; +} + + +static StorageHolder storageHolder; + + +Storage* getStorage() +{ + return storageHolder.getStorage(); +} + diff --git a/storage.h b/storage.h new file mode 100644 index 0000000..5b68d9f --- /dev/null +++ b/storage.h @@ -0,0 +1,27 @@ +#ifndef __STORAGE_H__ +#define __STORAGE_H__ + + +#include + + +class Storage +{ + public: + virtual ~Storage() { }; + + public: + virtual int get(const std::wstring &name, int dflt) = 0; + virtual std::wstring get(const std::wstring &name, + const std::wstring &dflt) = 0; + virtual void set(const std::wstring &name, int value) = 0; + virtual void set(const std::wstring &name, const std::wstring &value) = 0; + virtual void flush() = 0; +}; + + +Storage* getStorage(); + + +#endif + diff --git a/streams.cpp b/streams.cpp new file mode 100644 index 0000000..3644d3b --- /dev/null +++ b/streams.cpp @@ -0,0 +1,57 @@ +#include "streams.h" +#include "exceptions.h" +#include "unicode.h" + + +UtfStreamReader::UtfStreamReader(std::ifstream *s) +{ + stream = s; +} + +UtfStreamReader::~UtfStreamReader() +{ +} + +// This function is very slow because of poor fromUtf8 function design +wchar_t UtfStreamReader::getNextChar() +{ + unsigned char buf[10]; + + if (0 < backBuf.size()) { + wchar_t wc = backBuf.front(); + backBuf.pop_front(); + return wc; + } + + if (! stream->good()) + throw Exception(L"Error reading from stream 1"); + + int sz = stream->readsome((char*)buf, 1); + if (1 != sz) + throw Exception(L"Error reading from stream 2"); + int size = getUtf8Length(buf[0]); + if (size > 1) { + sz = stream->readsome((char*)buf + 1, size - 1); + if (size - 1 != sz) + throw Exception(L"Error reading from stream 3"); + } + buf[size] = 0; + std::string s((char*)buf); + std::wstring ws(fromUtf8(s)); + if (1 != ws.length()) + throw Exception(L"Error converting UTF-8 character to wide character"); + return ws[0]; +} + +void UtfStreamReader::ungetChar(wchar_t ch) +{ + backBuf.push_back(ch); +} + +bool UtfStreamReader::isEof() +{ + if (stream->eof()) + return true; // FIXME: it doesn't work. why? + return EOF == stream->peek(); +} + diff --git a/streams.h b/streams.h new file mode 100644 index 0000000..deb75ce --- /dev/null +++ b/streams.h @@ -0,0 +1,41 @@ +#ifndef __STREAMS_H__ +#define __STREAMS_H__ + + +#include +#include + + +/// Read utf-8 file and convert it to wide characters +class UtfStreamReader +{ + private: + /// Pointer to file stream + std::ifstream *stream; + + /// Push back buffet + std::list backBuf; + + public: + /// Create utf-8 stream reader. + /// \param stream pointer to file stream. + UtfStreamReader(std::ifstream *stream); + + /// Destructor + ~UtfStreamReader(); + + public: + /// Read next unicode character. + wchar_t getNextChar(); + + /// Push back character. + /// \param ch character to push back + void ungetChar(wchar_t ch); + + /// Check if end of file reached. + bool isEof(); +}; + + +#endif + diff --git a/table.cpp b/table.cpp new file mode 100644 index 0000000..58de711 --- /dev/null +++ b/table.cpp @@ -0,0 +1,434 @@ +#include "table.h" + +#include +#include "convert.h" +#include "unicode.h" +#include "streams.h" +#include "lexal.h" +#include "exceptions.h" + + +class IntValue: public Value +{ + private: + int value; + + public: + IntValue(int val) { value = val; }; + virtual ~IntValue() { }; + + public: + virtual Type getType() const { return Value::Integer; }; + virtual int asInt() const { return value; }; + virtual double asDouble() const { return value; }; + virtual std::wstring asString() const { return toString(value); }; + virtual ::Table* asTable() const { + throw Exception(L"Can't convert integer to table"); + }; + virtual Value* clone() const { return new IntValue(value); }; +}; + + +class DoubleValue: public Value +{ + private: + double value; + + public: + DoubleValue(double val) { value = val; }; + virtual ~DoubleValue() { }; + + public: + virtual Type getType() const { return Value::Double; }; + virtual int asInt() const { return (int)value; }; + virtual double asDouble() const { return value; }; + virtual std::wstring asString() const { return toString(value); }; + virtual ::Table* asTable() const { + throw Exception(L"Can't convert double to table"); + }; + virtual Value* clone() const { return new DoubleValue(value); }; +}; + + +class StringValue: public Value +{ + private: + std::wstring value; + + public: + StringValue(const std::wstring& val): value(val) { }; + virtual ~StringValue() { }; + + public: + virtual Type getType() const { return Value::String; }; + virtual int asInt() const { return strToInt(value); }; + virtual double asDouble() const { return strToDouble(value); }; + virtual std::wstring asString() const { return value; }; + virtual ::Table* asTable() const { + throw Exception(L"Can't convert string to table"); + }; + virtual Value* clone() const { return new StringValue(value); }; +}; + + +class TableValue: public Value +{ + private: + ::Table *value; + + public: + TableValue(::Table *val) { value = val; }; + virtual ~TableValue() { delete value; }; + + public: + virtual Type getType() const { return Value::Table; }; + virtual int asInt() const { + throw Exception(L"Can't convert table to int"); + }; + virtual double asDouble() const { + throw Exception(L"Can't convert table to double"); + }; + virtual std::wstring asString() const { + throw Exception(L"Can't convert table to string"); + }; + virtual ::Table* asTable() const { return value; }; + virtual Value* clone() const { + return new TableValue(new ::Table(*value)); + }; +}; + + +Table::Table(const Table &table) +{ + *this = table; +} + +Table::Table(const std::string &fileName) +{ + lastArrayIndex = 0; + std::ifstream stream(fileName.c_str(), + std::ios::binary | std::ios::in); + if (! stream.good()) + throw Exception(L"Error opening file '" + fromMbcs(fileName) + L""); + UtfStreamReader reader(&stream); + Lexal lexal = Lexal(reader); + parse(lexal, false, 0, 0); +} + +Table::Table(Lexal &lexal, int line, int pos) +{ + lastArrayIndex = 0; + parse(lexal, true, line, pos); +} + +Table::Table() +{ + lastArrayIndex = 0; +} + + +Table::~Table() +{ + for (ValuesMap::iterator i = fields.begin(); i != fields.end(); i++) + delete (*i).second; +} + + +Table& Table::operator = (const Table &table) +{ + if (this == &table) + return *this; + + fields.clear(); + lastArrayIndex = table.lastArrayIndex; + for (ValuesMap::const_iterator i = table.fields.begin(); + i != table.fields.end(); i++) + fields[(*i).first] = (*i).second->clone(); + + return *this; +} + + +static Value* lexToValue(Lexal &lexal, const Lexeme &lexeme) +{ + switch (lexeme.getType()) + { + case Lexeme::Ident: + case Lexeme::String: + return new StringValue(lexeme.getContent()); + case Lexeme::Integer: + return new IntValue(strToInt(lexeme.getContent())); + case Lexeme::Float: + return new DoubleValue(strToDouble(lexeme.getContent())); + case Lexeme::Symbol: + if (L"{" == lexeme.getContent()) + return new TableValue(new Table(lexal, lexeme.getLine(), + lexeme.getPos())); + default: + throw Exception(L"Invalid lexeme type at " + lexeme.getPosStr()); + } +} + + +void Table::addValuePair(Lexal &lexal, const std::wstring &name) +{ + Lexeme lex = lexal.getNext(); + if (Lexeme::Eof == lex.getType()) + throw Exception(L"Unexpected end of file"); + fields[name] = lexToValue(lexal, lex); +} + +void Table::addArrayElement(Lexal &lexal, const Lexeme &lexeme) +{ + fields[numToStr(lastArrayIndex)] = lexToValue(lexal, lexeme); + lastArrayIndex++; +} + +void Table::parse(Lexal &lexal, bool needBracket, int startLine, int startPos) +{ + Lexeme lex; + bool read = true; + + while (true) { + if (read) { + lex = lexal.getNext(); + read = true; + } + Lexeme::Type type = lex.getType(); + if (Lexeme::Eof == type) { + if (! needBracket) + return; + else + throw Exception(L"Table started at " + Lexal::posToStr( + startLine, startPos) + L" is never finished"); + } else if ((Lexeme::Symbol == type) && (L"}" == lex.getContent()) + && needBracket) + return; + else if ((Lexeme::Symbol == type) && ((L"," == lex.getContent()) || + (L";" == lex.getContent()))) { + // ignore separator + } else if (Lexeme::Ident == type) { + Lexeme nextLex = lexal.getNext(); + if (Lexeme::Symbol == nextLex.getType()) { + if (L"=" == nextLex.getContent()) + addValuePair(lexal, lex.getContent()); + else { + addArrayElement(lexal, lex); + lex = nextLex; + read = false; + } + } else + throw Exception(L"Unexpected token at " + Lexal::posToStr( + startLine, startPos)); + } else + addArrayElement(lexal, lex); + } +} + + +bool Table::hasKey(const std::wstring &key) const +{ + return (fields.end() != fields.find(key)); +} + + +static std::wstring encodeString(const std::wstring &str) +{ + std::wstring res; + int len = str.length(); + + res += L"\""; + for (int i = 0; i < len; i++) { + wchar_t ch = str[i]; + switch (ch) { + case '\n': res += L"\\n"; break; + case '\r': res += L"\\r"; break; + case '\'': res += L"\\'"; break; + case '\"': res += L"\\\""; break; + case '\\': res += L"\\\\"; break; + default: + res += ch; + } + } + res += L"\""; + + return res; +} + +static std::wstring printValue(Value *value, bool butify, int spaces) +{ + if (! value) + return L""; + + switch (value->getType()) { + case Value::Integer: + return toString(value->asInt()); + + case Value::Double: + { + std::wstring s = toString(value->asDouble()); + if (s.find(L'.') >= s.length()) + s.append(L".0"); + return s; + } + + case Value::String: + return encodeString(value->asString()); + + case Value::Table: + return value->asTable()->toString(true, butify, spaces); + } + + return L""; +} + + +bool Table::isArray() const +{ + int size = fields.size(); + + for (int i = 0; i < size; i++) { + if (! hasKey(::toString(i))) + return false; + } + + return true; +} + + +std::wstring Table::toString() const +{ + return toString(false, true, 0); +} + + +static bool isInteger(const std::wstring &str) +{ + int sz = str.length(); + for (int i = 0; i < sz; i++) { + wchar_t ch = str[i]; + if ((ch < L'0') || (ch > L'9')) + return false; + } + return true; +} + + +std::wstring Table::toString(bool printBraces, bool butify, int spaces) const +{ + std::wstring res; + + if (printBraces) + res += butify ? L"{\n" : L"{"; + bool printNames = ! isArray(); + + for (ValuesMap::const_iterator i = fields.begin(); i != fields.end(); + i++) + { + const std::wstring &name = (*i).first; + Value *value = (*i).second; + if (butify) + for (int j = 0; j < spaces; j++) + res += L" "; + else + res += L" "; + if (printNames && (! isInteger(name))) + res += name + L" = "; + res += printValue(value, butify, spaces + 4); + if (printNames) + res += butify ? L";\n" : L";"; + else + res += butify ? L",\n" : L","; + } + + if (printBraces) { + if (! butify) + res += L" }"; + else { + int ident = (spaces >= 4) ? spaces - 4 : 0; + for (int j = 0; j < ident; j++) + res += L" "; + res += L"}"; + } + } + + return res; +} + + +Value::Type Table::getType(const std::wstring &key) const +{ + ValuesMap::const_iterator i = fields.find(key); + if (i == fields.end()) + throw Exception(L"Field '" + key + L"' doesn't exists in the table"); + return (*i).second->getType(); +} + + +std::wstring Table::getString(const std::wstring &key, + const std::wstring &dflt) const +{ + ValuesMap::const_iterator i = fields.find(key); + return (i != fields.end()) ? (*i).second->asString() : dflt; +} + +int Table::getInt(const std::wstring &key, int dflt) const +{ + ValuesMap::const_iterator i = fields.find(key); + return (i != fields.end()) ? ((*i).second ? (*i).second->asInt() : dflt) : dflt; +} + +double Table::getDouble(const std::wstring &key, double dflt) const +{ + ValuesMap::const_iterator i = fields.find(key); + return (i != fields.end()) ? (*i).second->asDouble() : dflt; +} + +Table* Table::getTable(const std::wstring &key, Table *dflt) const +{ + ValuesMap::const_iterator i = fields.find(key); + return (i != fields.end()) ? (*i).second->asTable() : dflt; +} + +void Table::setValue(const std::wstring &key, Value *value) +{ + ValuesMap::const_iterator i = fields.find(key); + if (i != fields.end()) + delete (*i).second; + fields[key] = value; +} + +void Table::setString(const std::wstring &key, const std::wstring &value) +{ + setValue(key, new StringValue(value)); +} + +void Table::setInt(const std::wstring &key, int value) +{ + setValue(key, new IntValue(value)); +} + +void Table::setDouble(const std::wstring &key, double value) +{ + setValue(key, new DoubleValue(value)); +} + +void Table::setTable(const std::wstring &key, Table *value) +{ + setValue(key, new TableValue(value)); +} + + +void Table::save(const std::wstring &fileName) const +{ + std::ofstream stream(toMbcs(fileName).c_str(), std::ios::out + | std::ios::binary); + if (! stream.good()) + throw Exception(L"Can't open '" + fileName + L"' for writing"); + std::string utfStr(toUtf8(toString())); + stream.write(utfStr.c_str(), utfStr.length()); + if (! stream.good()) + throw Exception(L"Can't write table to file '" + fileName + L"'"); + stream.close(); +} + diff --git a/table.h b/table.h new file mode 100644 index 0000000..de2188e --- /dev/null +++ b/table.h @@ -0,0 +1,84 @@ +#ifndef __TABLE_H__ +#define __TABLE_H__ + + +#include +#include +#include "lexal.h" + + +class Table; + + +class Value +{ + public: + typedef enum Type { + Integer, + Double, + String, + Table + }; + + public: + virtual ~Value() { }; + + public: + virtual ::Table* asTable() const = 0; + virtual Type getType() const = 0; + virtual int asInt() const = 0; + virtual double asDouble() const = 0; + virtual std::wstring asString() const = 0; + virtual Value* clone() const = 0; +}; + + +class Table +{ + public: + typedef std::map ValuesMap; + typedef ValuesMap::const_iterator Iterator; + + private: + ValuesMap fields; + int lastArrayIndex; + + public: + Table(); + Table(const Table &table); + Table(const std::string &fileName); + Table(Lexal &lexal, int startLine, int startPos); + ~Table(); + + public: + Table& operator = (const Table &table); + std::wstring toString() const; + std::wstring toString(bool printBraces, bool butify, int ident) const; + bool isArray() const; + void save(const std::wstring &fileName) const; + + public: + Iterator begin() const { return fields.begin(); }; + Iterator end() const { return fields.end(); }; + bool hasKey(const std::wstring &key) const; + Value::Type getType(const std::wstring &key) const; + std::wstring getString(const std::wstring &key, const std::wstring &dflt = L"") const; + int getInt(const std::wstring &key, int dflt=0) const; + double getDouble(const std::wstring &key, double dflt=0) const; + Table* getTable(const std::wstring &key, Table *dflt=NULL) const; + void setString(const std::wstring &key, const std::wstring &value); + void setInt(const std::wstring &key, int value); + void setDouble(const std::wstring &key, double value); + void setTable(const std::wstring &key, Table *value); + + private: + void parse(Lexal &lexal, bool needBracket, int startLine, int startPos); + void addArrayElement(Lexal &lexal, const Lexeme &lexeme); + void addValuePair(Lexal &lexal, const std::wstring &name); + void setValue(const std::wstring &key, Value *value); +}; + + + +#endif + diff --git a/tablestorage.cpp b/tablestorage.cpp new file mode 100644 index 0000000..2c25808 --- /dev/null +++ b/tablestorage.cpp @@ -0,0 +1,59 @@ +#include +#include +#include +#include "tablestorage.h" +#include "unicode.h" +#include "exceptions.h" + + +TableStorage::TableStorage() +{ + try { + table = Table(toMbcs(getFileName())); + } catch (Exception &e) { + std::cerr << e.getMessage() << std::endl; + } catch (...) { + std::cerr << "Unknown config file error" << std::endl; + } +} + +TableStorage::~TableStorage() +{ + flush(); +} + +std::wstring TableStorage::getFileName() +{ +#ifndef WIN32 + return std::wstring(fromMbcs(getenv("HOME"))) + L"/.einstein/einsteinrc"; +#else + return L"einstein.cfg"; +#endif +} + +int TableStorage::get(const std::wstring &name, int dflt) +{ + return table.getInt(name, dflt); +} + +std::wstring TableStorage::get(const std::wstring &name, + const std::wstring &dflt) +{ + return table.getString(name, dflt); +} + +void TableStorage::set(const std::wstring &name, int value) +{ + table.setInt(name, value); +} + +void TableStorage::set(const std::wstring &name, const std::wstring &value) +{ + table.setString(name, value); +} + +void TableStorage::flush() +{ + table.save(getFileName()); +} + diff --git a/tablestorage.h b/tablestorage.h new file mode 100644 index 0000000..77c82a4 --- /dev/null +++ b/tablestorage.h @@ -0,0 +1,32 @@ +#ifndef __TABLESTORAGE_H__ +#define __TABLESTORAGE_H__ + + +#include "storage.h" +#include "table.h" + + +class TableStorage: public Storage +{ + private: + Table table; + + public: + TableStorage(); + virtual ~TableStorage(); + + public: + virtual int get(const std::wstring &name, int dflt); + virtual std::wstring get(const std::wstring &name, + const std::wstring &dflt); + virtual void set(const std::wstring &name, int value); + virtual void set(const std::wstring &name, const std::wstring &value); + virtual void flush(); + + private: + std::wstring getFileName(); +}; + + +#endif + diff --git a/tokenizer.cpp b/tokenizer.cpp new file mode 100644 index 0000000..a540a46 --- /dev/null +++ b/tokenizer.cpp @@ -0,0 +1,72 @@ +#include "tokenizer.h" + +#include + + +std::wstring Token::toString() const +{ + if (Word == type) + return L"Word: '" + content + L"'"; + else if (Para == type) + return L"Para"; + else if (Eof == type) + return L"Eof"; + else + return L"Unknown"; +} + + +static bool wisspace(wchar_t ch) +{ +//std::cout << "'" << ch << "' " << ((int)ch) << " " << L'\n' << std::endl; + return (L' ' == ch) || (L'\n' == ch) || (L'\r' == ch) + || (L'\t' == ch) || (L'\f' == ch) || (L'\v' == ch); +} + + +bool Tokenizer::skipSpaces(bool notSearch) +{ + int len = text.length(); + bool foundDoubleReturn = false; + while ((len > currentPos) && wisspace(text[currentPos])) { + currentPos++; + if ((! notSearch) && (L'\n' == text[currentPos - 1]) + && (currentPos < len) && (L'\n' == text[currentPos])) + notSearch = foundDoubleReturn = true; + } + return foundDoubleReturn; +} + + +Token Tokenizer::getNextToken() +{ + if (0 < stack.size()) { + Token t(*stack.begin()); + stack.pop_front(); + return t; + } + int len = text.length(); + if (skipSpaces(! currentPos) && (currentPos < len)) + return Token(Token::Para); + if (currentPos >= len) + return Token(Token::Eof); + int wordStart = currentPos; + while ((len > currentPos) && (! wisspace(text[currentPos]))) + currentPos++; + return Token(Token::Word, text.substr(wordStart, currentPos - wordStart)); +} + + +void Tokenizer::unget(const Token &token) +{ + stack.push_back(token); +} + + +bool Tokenizer::isFinished() +{ + if (0 < stack.size()) + return false; + return currentPos >= (int)text.length(); +} + diff --git a/tokenizer.h b/tokenizer.h new file mode 100644 index 0000000..21c2249 --- /dev/null +++ b/tokenizer.h @@ -0,0 +1,61 @@ +#ifndef __TOKENIZER_H__ +#define __TOKENIZER_H__ + + +#include +#include + + +class Tokenizer; + + +class Token +{ + friend class Tokenizer; + + public: + enum Type { + Word, + Para, + Eof + }; + + private: + Type type; + std::wstring content; + + private: + Token(Type type) { this->type = type; }; + Token(Type type, const std::wstring &content): content(content) { + this->type = type; + } + + public: + Type getType() const { return type; }; + const std::wstring& getContent() const { return content; }; + std::wstring toString() const; +}; + + +class Tokenizer +{ + private: + std::wstring text; + int currentPos; + std::list stack; + + public: + Tokenizer(const std::wstring &s): text(s) { currentPos = 0; }; + + public: + Token getNextToken(); + void unget(const Token &token); + bool isFinished(); + + private: + bool skipSpaces(bool notSearch); +}; + + +#endif + diff --git a/topscores.cpp b/topscores.cpp new file mode 100644 index 0000000..07f9149 --- /dev/null +++ b/topscores.cpp @@ -0,0 +1,175 @@ +#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; +} + + diff --git a/topscores.h b/topscores.h new file mode 100644 index 0000000..23b4f81 --- /dev/null +++ b/topscores.h @@ -0,0 +1,44 @@ +#ifndef __TOPSCORES_H__ +#define __TOPSCORES_H__ + + +#include +#include +#include "widgets.h" + + +#define MAX_SCORES 10 + + +class TopScores +{ + public: + typedef struct { + std::wstring name; + int score; + } Entry; + typedef std::list ScoresList; + + private: + ScoresList scores; + bool modifed; + + public: + TopScores(); + ~TopScores(); + + public: + int add(const std::wstring &name, int scores); + void save(); + ScoresList& getScores(); + int getMaxScore(); + bool isFull() { return scores.size() >= MAX_SCORES; }; +}; + + +void showScoresWindow(Area *area, TopScores *scores, int highlightPos=-1); +std::wstring enterNameDialog(Area *area); + + +#endif + diff --git a/unicode.cpp b/unicode.cpp new file mode 100644 index 0000000..5a12260 --- /dev/null +++ b/unicode.cpp @@ -0,0 +1,595 @@ +#include +#include +#ifdef WIN32 +#include +#endif +#include "unicode.h" +#include "exceptions.h" + + +/// Returns length of wide character in utf-8 +#define UTF8_LENGTH(Char) \ + ((Char) < 0x80 ? 1 : \ + ((Char) < 0x800 ? 2 : \ + ((Char) < 0x10000 ? 3 : \ + ((Char) < 0x200000 ? 4 : \ + ((Char) < 0x4000000 ? 5 : 6))))) + +#define UTF8_COMPUTE(Char, Mask, Len) \ + if (Char < 128) \ + { \ + Len = 1; \ + Mask = 0x7f; \ + } \ + else if ((Char & 0xe0) == 0xc0) \ + { \ + Len = 2; \ + Mask = 0x1f; \ + } \ + else if ((Char & 0xf0) == 0xe0) \ + { \ + Len = 3; \ + Mask = 0x0f; \ + } \ + else if ((Char & 0xf8) == 0xf0) \ + { \ + Len = 4; \ + Mask = 0x07; \ + } \ + else if ((Char & 0xfc) == 0xf8) \ + { \ + Len = 5; \ + Mask = 0x03; \ + } \ + else if ((Char & 0xfe) == 0xfc) \ + { \ + Len = 6; \ + Mask = 0x01; \ + } \ + else \ + Len = -1; + + + +#ifndef WIN32 + +static const char utf8_skip_data[256] = { + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,4,4,4,4,4,4,4,4,5,5,5,5,6,6,1,1 +}; + +const char * const g_utf8_skip = utf8_skip_data; + +#define g_utf8_next_char(p) (char *)((p) + g_utf8_skip[*(unsigned char *)(p)]) + +#define UTF8_GET(Result, Chars, Count, Mask, Len) \ + (Result) = (Chars)[0] & (Mask); \ + for ((Count) = 1; (Count) < (Len); ++(Count)) \ + { \ + if (((Chars)[(Count)] & 0xc0) != 0x80) \ + { \ + (Result) = -1; \ + break; \ + } \ + (Result) <<= 6; \ + (Result) |= ((Chars)[(Count)] & 0x3f); \ + } + +/* Like g_utf8_get_char, but take a maximum length + * and return (wchar_t)-2 on incomplete trailing character + */ +static inline wchar_t +g_utf8_get_char_extended (const char *p, + size_t max_len) +{ + unsigned int i, len; + wchar_t wc = (unsigned char) *p; + + if (wc < 0x80) + { + return wc; + } + else if (wc < 0xc0) + { + return (wchar_t)-1; + } + else if (wc < 0xe0) + { + len = 2; + wc &= 0x1f; + } + else if (wc < 0xf0) + { + len = 3; + wc &= 0x0f; + } + else if (wc < 0xf8) + { + len = 4; + wc &= 0x07; + } + else if (wc < 0xfc) + { + len = 5; + wc &= 0x03; + } + else if (wc < 0xfe) + { + len = 6; + wc &= 0x01; + } + else + { + return (wchar_t)-1; + } + + if (max_len >= 0 && len > max_len) + { + for (i = 1; i < max_len; i++) + { + if ((((unsigned char *)p)[i] & 0xc0) != 0x80) + return (wchar_t)-1; + } + return (wchar_t)-2; + } + + for (i = 1; i < len; ++i) + { + wchar_t ch = ((unsigned char *)p)[i]; + + if ((ch & 0xc0) != 0x80) + { + if (ch) + return (wchar_t)-1; + else + return (wchar_t)-2; + } + + wc <<= 6; + wc |= (ch & 0x3f); + } + + if (UTF8_LENGTH(wc) != len) + return (wchar_t)-1; + + return wc; +} + +/** + * g_utf8_get_char: + * @p: a pointer to Unicode character encoded as UTF-8 + * + * Converts a sequence of bytes encoded as UTF-8 to a Unicode character. + * If @p does not point to a valid UTF-8 encoded character, results are + * undefined. If you are not sure that the bytes are complete + * valid Unicode characters, you should use g_utf8_get_char_validated() + * instead. + * + * Return value: the resulting character + **/ +wchar_t +g_utf8_get_char (const char *p) +{ + int i, mask = 0, len; + wchar_t result; + unsigned char c = (unsigned char) *p; + + UTF8_COMPUTE (c, mask, len); + if (len == -1) + return (wchar_t)-1; + UTF8_GET (result, p, i, mask, len); + + return result; +} + + +/** + * g_utf8_to_ucs4: + * @str: a UTF-8 encoded string + * @len: the maximum length of @str to use. If @len < 0, then + * the string is nul-terminated. + * @items_read: location to store number of bytes read, or %NULL. + * If %NULL, then %G_CONVERT_ERROR_PARTIAL_INPUT will be + * returned in case @str contains a trailing partial + * character. If an error occurs then the index of the + * invalid input is stored here. + * @items_written: location to store number of characters written or %NULL. + * The value here stored does not include the trailing 0 + * character. + * @error: location to store the error occuring, or %NULL to ignore + * errors. Any of the errors in #GConvertError other than + * %G_CONVERT_ERROR_NO_CONVERSION may occur. + * + * Convert a string from UTF-8 to a 32-bit fixed width + * representation as UCS-4. A trailing 0 will be added to the + * string after the converted text. + * + * Return value: a pointer to a newly allocated UCS-4 string. + * This value must be freed with g_free(). If an + * error occurs, %NULL will be returned and + * @error set. + **/ +wchar_t * +g_utf8_to_ucs4 (const char *str, + long len, + long *items_read, + long *items_written, + wchar_t **error) +{ + wchar_t *result = NULL; + int n_chars, i; + const char *in; + + in = str; + n_chars = 0; + while ((len < 0 || str + len - in > 0) && *in) + { + wchar_t wc = g_utf8_get_char_extended (in, str + len - in); + if (wc & 0x80000000) + { + if (wc == (wchar_t)-2) + { + if (items_read) + break; + else + if (error) + *error = L"Partial character sequence at end of input"; + } + else + if (error) + *error = L"Invalid byte sequence in conversion input"; + + goto err_out; + } + + n_chars++; + + in = g_utf8_next_char (in); + } + + result = (wchar_t*)malloc((n_chars + 1) * sizeof(wchar_t)); + + in = str; + for (i=0; i < n_chars; i++) + { + result[i] = g_utf8_get_char (in); + in = g_utf8_next_char (in); + } + result[i] = 0; + + if (items_written) + *items_written = n_chars; + + err_out: + if (items_read) + *items_read = in - str; + + return result; +} + +/** + * g_unichar_to_utf8: + * @c: a ISO10646 character code + * @outbuf: output buffer, must have at least 6 bytes of space. + * If %NULL, the length will be computed and returned + * and nothing will be written to @outbuf. + * + * Converts a single character to UTF-8. + * + * Return value: number of bytes written + **/ +int +g_unichar_to_utf8 (wchar_t c, + char *outbuf) +{ + unsigned int len = 0; + int first; + int i; + + if (c < 0x80) + { + first = 0; + len = 1; + } + else if (c < 0x800) + { + first = 0xc0; + len = 2; + } + else if (c < 0x10000) + { + first = 0xe0; + len = 3; + } + else if (c < 0x200000) + { + first = 0xf0; + len = 4; + } + else if (c < 0x4000000) + { + first = 0xf8; + len = 5; + } + else + { + first = 0xfc; + len = 6; + } + + if (outbuf) + { + for (i = len - 1; i > 0; --i) + { + outbuf[i] = (c & 0x3f) | 0x80; + c >>= 6; + } + outbuf[0] = c | first; + } + + return len; +} + +/** + * g_ucs4_to_utf8: + * @str: a UCS-4 encoded string + * @len: the maximum length of @str to use. If @len < 0, then + * the string is terminated with a 0 character. + * @items_read: location to store number of characters read read, or %NULL. + * @items_written: location to store number of bytes written or %NULL. + * The value here stored does not include the trailing 0 + * byte. + * @error: location to store the error occuring, or %NULL to ignore + * errors. Any of the errors in #GConvertError other than + * %G_CONVERT_ERROR_NO_CONVERSION may occur. + * + * Convert a string from a 32-bit fixed width representation as UCS-4. + * to UTF-8. The result will be terminated with a 0 byte. + * + * Return value: a pointer to a newly allocated UTF-8 string. + * This value must be freed with g_free(). If an + * error occurs, %NULL will be returned and + * @error set. + **/ +char * +g_ucs4_to_utf8 (const wchar_t *str, + long len, + long *items_read, + long *items_written, + wchar_t **error) +{ + int result_length; + char *result = NULL; + char *p; + int i; + + result_length = 0; + for (i = 0; len < 0 || i < len ; i++) + { + if (!str[i]) + break; + + if ((unsigned)str[i] >= 0x80000000) + { + if (items_read) + *items_read = i; + if (error) + *error = L"Character out of range for UTF-8"; + goto err_out; + } + + result_length += UTF8_LENGTH (str[i]); + } + + result = (char*)malloc (result_length + 1); + p = result; + + i = 0; + while (p < result + result_length) + p += g_unichar_to_utf8 (str[i++], p); + + *p = '\0'; + + if (items_written) + *items_written = p - result; + + err_out: + if (items_read) + *items_read = i; + + return result; +} + +std::string toUtf8(const std::wstring &str) +{ + long readed, writed; + wchar_t *errMsg = NULL; + + char *res = g_ucs4_to_utf8(str.c_str(), str.length(), &readed, + &writed, &errMsg); + if (! res) { + if (errMsg) + throw Exception(errMsg); + else + throw Exception(L"Error converting text to UTF-8"); + } + + std::string s(res); + free(res); + + return s; +} + +std::wstring fromUtf8(const std::string &str) +{ + long readed, writed; + wchar_t *errMsg = NULL; + + wchar_t *res = g_utf8_to_ucs4(str.c_str(), str.length(), &readed, + &writed, &errMsg); + if (! res) { + if (errMsg) + throw Exception(errMsg); + else + throw Exception(L"Error converting text from UTF-8"); + } + + std::wstring s(res); + free(res); + + return s; +} + + +#else + + + +std::string toUtf8(const std::wstring &str) +{ + if (! str.length()) + return ""; + + int len = str.length(); + int bufSize = (len + 1) * 6 + 1; + char buf[bufSize]; + int res = WideCharToMultiByte(CP_UTF8, 0, str.c_str(), len + 1, + buf, bufSize, NULL, NULL); + + if (! res) + throw Exception(L"Error converting UCS-2 to UTF-8"); + return buf; +} + +std::wstring fromUtf8(const std::string &str) +{ + if (! str.length()) + return L""; + + int len = str.length(); + wchar_t buf[len + 1]; + + int res = MultiByteToWideChar(CP_UTF8, 0, str.c_str(), len + 1, + buf, len + 1); + if (! res) + throw Exception(L"Error converting UTF-8 to UCS-2"); + return buf; +} + + +std::string toOem(const std::wstring &str) +{ + if (! str.length()) + return ""; + + int len = str.length(); + int bufSize = (len + 1) * 6 + 1; + char buf[bufSize]; + int res = WideCharToMultiByte(CP_OEMCP, 0, str.c_str(), len + 1, + buf, bufSize, NULL, NULL); + + if (! res) + throw Exception(L"Error converting UCS-2 to OEM"); + return buf; +} + +std::wstring fromOem(const std::string &str) +{ + if (! str.length()) + return L""; + + int len = str.length(); + wchar_t buf[len + 1]; + + int res = MultiByteToWideChar(CP_OEMCP, 0, str.c_str(), len + 1, + buf, len + 1); + if (! res) + throw Exception(L"Error converting OEM to UCS-2"); + return buf; +} + +#endif + + +std::wstring fromUtf8(const char *str, int len) +{ + char *buf = (char*)malloc(len + 1); + if (! buf) + throw Exception(L"Error allocating memory"); + memcpy(buf, str, len); + buf[len] = 0; + std::string s(buf); + free(buf); + return fromUtf8(s); +} + + +std::string toMbcs(const std::wstring &str) +{ + int len = str.length(); + if (! len) + return ""; + else { + int maxSize = MB_CUR_MAX * len; + char buf[maxSize + 1]; + size_t l = wcstombs(buf, str.c_str(), maxSize); + if ((size_t)-1 == -l) { // convert what we can + std::string res; + for (int i = 0; i < len; i++) { + int b = wctomb(buf, str[i]); + if (0 < b) { + buf[b] = 0; + res += buf; + } + } + return res; + } else { + buf[l] = 0; + return buf; + } + } +} + + +std::wstring fromMbcs(const std::string &str) +{ + int maxLen = str.length(); + wchar_t ws[maxLen + 1]; + size_t cnt = mbstowcs(ws, str.c_str(), maxLen); + if (cnt == (size_t)-1) { + return L""; + } + ws[cnt] = 0; + return ws; +} + + +std::ostream& operator << (std::ostream &stream, const std::wstring &str) +{ +#ifdef WIN32 + if ((stream == std::cout) || (stream == std::cerr) || + (stream == std::clog)) + stream << toOem(str); + else +#endif + stream << toMbcs(str); + return stream; +} + + +int getUtf8Length(unsigned char c) +{ + int mask, len; + UTF8_COMPUTE(c, mask, len); + if (-1 == len) + throw Exception(L"Invalid utf-8 character"); + else + return len; +} + diff --git a/unicode.h b/unicode.h new file mode 100644 index 0000000..93fd0b9 --- /dev/null +++ b/unicode.h @@ -0,0 +1,44 @@ +#ifndef __UNICODE_H__ +#define __UNICODE_H__ + + +/// \file unicode.h +/// Definition of UNICODE handling rotinues. + + +#include +#include + + +/// Convert unicode string to multibyte string in UTF-8 encoding +/// \param str string in unicode +std::string toUtf8(const std::wstring &str); + +/// Convert multibyte string in UTF-8 encoding to unicode string +/// \param str string in UTF-8 encoding +std::wstring fromUtf8(const std::string &str); + +/// Convert multibyte string in UTF-8 encoding to unicode string +/// \param str string in UTF-8 encoding +/// \param len string length in bytes +std::wstring fromUtf8(const char *str, int len); + +/// Convert unicode string to multibyte string in system default encoding +/// \param str string in unicode +std::string toMbcs(const std::wstring &str); + +/// Convert unicode string to multibyte string in system default encoding +/// \param str string in unicode +std::wstring fromMbcs(const std::string &str); + +/// Convert unicode string to default multibyte encoding +/// and write it to stream. +/// \param stream stream +/// \param str string to output +std::ostream& operator << (std::ostream &stream, const std::wstring &str); + +/// Returns length of UTF-8 character in bytes by first UTF-8 character byte. +/// \param c first byte of UTF-8 character. +int getUtf8Length(unsigned char c); + +#endif diff --git a/utils.cpp b/utils.cpp new file mode 100644 index 0000000..38c7780 --- /dev/null +++ b/utils.cpp @@ -0,0 +1,419 @@ +#include +#include +#include +#include +#include + +//#ifndef WIN32 +#include +#include +#include +//#endif + +#include + +#include "utils.h" +#include "main.h" +#include "unicode.h" +#include "sound.h" + + + +int getCornerPixel(SDL_Surface *surface) +{ + SDL_LockSurface(surface); + int bpp = surface->format->BytesPerPixel; + Uint8 *p = (Uint8*)surface->pixels; + int pixel = 0; + switch (bpp) { + case 1: pixel = *p; break; + case 2: pixel = *(Uint16 *)p; break; + case 3: + if (SDL_BYTEORDER == SDL_BIG_ENDIAN) + pixel = p[0] << 16 | p[1] << 8 | p[2]; + else + pixel = p[0] | p[1] << 8 | p[2] << 16; + break; + case 4: pixel = *(Uint32 *)p; break; + default: pixel = 0; /* shouldn't happen, but avoids warnings */ + } + SDL_UnlockSurface(surface); + return pixel; +} + + + +SDL_Surface* loadImage(const std::wstring &name, bool transparent) +{ + int size; + void *bmp; + + bmp = resources->getRef(name, size); + if (! bmp) + throw Exception(name + L" is not found"); + SDL_RWops *op = SDL_RWFromMem(bmp, size); + SDL_Surface *s = SDL_LoadBMP_RW(op, 0); + SDL_FreeRW(op); + resources->delRef(bmp); + if (! s) + throw Exception(L"Error loading " + name); + SDL_Surface *screenS = SDL_DisplayFormat(s); + SDL_FreeSurface(s); + if (! screenS) + throw Exception(L"Error translating to screen format " + name); + if (transparent) + SDL_SetColorKey(screenS, SDL_SRCCOLORKEY, getCornerPixel(screenS)); + return screenS; +} + + +#ifdef WIN32 +#include +struct timezone { }; + +int gettimeofday(struct timeval* tp, int* /*tz*/) +{ + struct timeb tb; + ftime(&tb); + tp->tv_sec = tb.time; + tp->tv_usec = 1000*tb.millitm; + return 0; +} + +int gettimeofday(struct timeval* tp, struct timezone* /*tz*/) +{ + return gettimeofday(tp, (int*)NULL); +} +#endif + + + +int gettimeofday(struct timeval* tp) +{ +#ifdef WIN32 + return gettimeofday(tp, (int*)NULL); +#else + struct timezone tz; + return gettimeofday(tp, &tz); +#endif +} + +void drawWallpaper(const std::wstring &name) +{ + SDL_Surface *tile = loadImage(name); + SDL_Rect src = { 0, 0, tile->w, tile->h }; + SDL_Rect dst = { 0, 0, tile->w, tile->h }; + for (int y = 0; y < screen.getHeight(); y += tile->h) + for (int x = 0; x < screen.getWidth(); x += tile->w) { + dst.x = x; + dst.y = y; + SDL_BlitSurface(tile, &src, screen.getSurface(), &dst); + } + SDL_FreeSurface(tile); +} + + +void setPixel(SDL_Surface *s, int x, int y, int r, int g, int b) +{ + int bpp = s->format->BytesPerPixel; + Uint32 pixel = SDL_MapRGB(s->format, r, g, b); + /* Here p is the address to the pixel we want to set */ + Uint8 *p = (Uint8*)s->pixels + y * s->pitch + x * bpp; + + switch (bpp) { + case 1: + *p = pixel; + break; + case 2: + *(Uint16 *)p = pixel; + break; + case 3: + if (SDL_BYTEORDER == SDL_BIG_ENDIAN) { + p[0] = (pixel >> 16) & 0xff; + p[1] = (pixel >> 8) & 0xff; + p[2] = pixel & 0xff; + } else { + p[0] = pixel & 0xff; + p[1] = (pixel >> 8) & 0xff; + p[2] = (pixel >> 16) & 0xff; + } + break; + case 4: + *(Uint32 *)p = pixel; + break; + } +} + + +void getPixel(SDL_Surface *surface, int x, int y, + Uint8 *r, Uint8 *g, Uint8 *b) +{ + int bpp = surface->format->BytesPerPixel; + /* Here p is the address to the pixel we want to retrieve */ + Uint8 *p = (Uint8 *)surface->pixels + y * surface->pitch + x * bpp; + + Uint32 pixel; + switch (bpp) { + case 1: pixel = *p; break; + case 2: pixel = *(Uint16 *)p; break; + case 3: + if (SDL_BYTEORDER == SDL_BIG_ENDIAN) + pixel = p[0] << 16 | p[1] << 8 | p[2]; + else + pixel = p[0] | p[1] << 8 | p[2] << 16; + break; + case 4: pixel = *(Uint32 *)p; break; + default: pixel = 0; /* shouldn't happen, but avoids warnings */ + } + SDL_GetRGB(pixel, surface->format, r, g, b); +} + + +static int gammaTable[256]; +static double lastGamma = -1.0; + + +void adjustBrightness(SDL_Surface *image, int x, int y, double k) +{ + if (lastGamma != k) { + for (int i = 0; i <= 255; i++) { + gammaTable[i] = (int)(255.0 * pow((double)i / 255.0, 1.0 / k) + 0.5); + if (gammaTable[i] > 255) + gammaTable[i] = 255; + } + lastGamma = k; + } + + Uint8 r, g, b; + getPixel(image, x, y, &r, &g, &b); + setPixel(image, x, y, gammaTable[r], gammaTable[g], gammaTable[b]); +} + + +SDL_Surface* adjustBrightness(SDL_Surface *image, double k, bool transparent) +{ + if (lastGamma != k) { + for (int i = 0; i <= 255; i++) { + gammaTable[i] = (int)(255.0 * pow((double)i / 255.0, 1.0 / k) + 0.5); + if (gammaTable[i] > 255) + gammaTable[i] = 255; + } + lastGamma = k; + } + + SDL_Surface *s = SDL_DisplayFormat(image); + if (! s) + throw Exception(L"Error converting image to display format"); + + SDL_LockSurface(s); + + Uint8 r, g, b; + for (int j = 0; j < s->h; j++) + for (int i = 0; i < s->w; i++) { + getPixel(s, i, j, &r, &g, &b); + setPixel(s, i, j, gammaTable[r], gammaTable[g], gammaTable[b]); + } + + SDL_UnlockSurface(s); + + if (transparent) + SDL_SetColorKey(s, SDL_SRCCOLORKEY, getCornerPixel(s)); + + return s; +} + + +class CenteredBitmap: public Widget +{ + private: + SDL_Surface *tile; + int x, y; + + public: + CenteredBitmap(const std::wstring &fileName) { + tile = loadImage(fileName); + x = (screen.getWidth() - tile->w) / 2; + y = (screen.getHeight() - tile->h) / 2; + }; + + virtual ~CenteredBitmap() { + SDL_FreeSurface(tile); + }; + + virtual void draw() { + screen.draw(x, y, tile); + screen.addRegionToUpdate(x, y, tile->w, tile->h); + }; +}; + + +void showWindow(Area *parentArea, const std::wstring &fileName) +{ + Area area; + + area.add(parentArea); + area.add(new CenteredBitmap(fileName)); + area.add(new AnyKeyAccel()); + area.run(); + sound->play(L"click.wav"); +} + + +bool isInRect(int evX, int evY, int x, int y, int w, int h) +{ + return ((evX >= x) && (evX < x + w) && (evY >= y) && (evY < y + h)); +} + +std::wstring secToStr(int time) +{ + int hours = time / 3600; + int v = time - hours * 3600; + int minutes = v / 60; + int seconds = v - minutes * 60; + + wchar_t buf[50]; +#ifdef WIN32 + swprintf(buf, L"%02i:%02i:%02i", hours, minutes, seconds); +#else + swprintf(buf, 50, L"%02i:%02i:%02i", hours, minutes, seconds); +#endif + + return buf; +} + + +void showMessageWindow(Area *parentArea, const std::wstring &pattern, + int width, int height, Font *font, int r, int g, int b, + const std::wstring &msg) +{ + Area area; + + int x = (screen.getWidth() - width) / 2; + int y = (screen.getHeight() - height) / 2; + + area.add(parentArea); + area.add(new Window(x, y, width, height, pattern, 6)); + area.add(new Label(font, x, y, width, height, Label::ALIGN_CENTER, + Label::ALIGN_MIDDLE, r, g, b, msg)); + area.add(new AnyKeyAccel()); + area.run(); + sound->play(L"click.wav"); +} + + +void drawBevel(SDL_Surface *s, int left, int top, int width, int height, + bool raised, int size) +{ + double k, f, kAdv, fAdv; + if (raised) { + k = 2.6; + f = 0.1; + kAdv = -0.2; + fAdv = 0.1; + } else { + f = 2.6; + k = 0.1; + fAdv = -0.2; + kAdv = 0.1; + } + for (int i = 0; i < size; i++) { + for (int j = i; j < height - i - 1; j++) + adjustBrightness(s, left + i, top + j, k); + for (int j = i; j < width - i; j++) + adjustBrightness(s, left + j, top + i, k); + for (int j = i+1; j < height - i; j++) + adjustBrightness(s, left + width - i - 1, top + j, f); + for (int j = i; j < width - i - 1; j++) + adjustBrightness(s, left + j, top + height - i - 1, f); + k += kAdv; + f += fAdv; + } +} + +//#ifndef WIN32 + +void ensureDirExists(const std::wstring &fileName) +{ + std::string s(toMbcs(fileName)); + struct stat buf; + if (! stat(s.c_str(), &buf)) { + if (! S_ISDIR(buf.st_mode)) + unlink(s.c_str()); + else + return; + } +#ifndef WIN32 + mkdir(s.c_str(), S_IRUSR | S_IWUSR | S_IXUSR); +#else + mkdir(s.c_str()); +#endif +} + +/*#else + +void ensureDirExists(const std::wstring &fileName) +{ + PORT ME! +} + +#endif*/ + +int readInt(std::istream &stream) +{ + if (stream.fail()) + throw Exception(L"Error reading string"); + unsigned char buf[4]; + stream.read((char*)buf, 4); + if (stream.fail()) + throw Exception(L"Error reading string"); + return buf[0] + buf[1] * 256 + buf[2] * 256 * 256 + + buf[3] * 256 * 256 * 256; +} + + +std::wstring readString(std::istream &stream) +{ + std::string str; + char c; + + if (stream.fail()) + throw Exception(L"Error reading string"); + + c = stream.get(); + while (c && (! stream.fail())) { + str += c; + c = stream.get(); + } + + if (stream.fail()) + throw Exception(L"Error reading string"); + + return fromUtf8(str); +} + +void writeInt(std::ostream &stream, int v) +{ + unsigned char b[4]; + int i, ib; + + for (i = 0; i < 4; i++) { + ib = v & 0xFF; + v = v >> 8; + b[i] = ib; + } + + stream.write((char*)&b, 4); +} + +void writeString(std::ostream &stream, const std::wstring &value) +{ + std::string s(toUtf8(value)); + stream.write(s.c_str(), s.length() + 1); +} + +int readInt(unsigned char *buf) +{ + return buf[0] + buf[1] * 256 + buf[2] * 256 * 256 + + buf[3] * 256 * 256 * 256; +} + diff --git a/utils.h b/utils.h new file mode 100644 index 0000000..9ce7cb1 --- /dev/null +++ b/utils.h @@ -0,0 +1,44 @@ +#ifndef __UTILS_H__ +#define __UTILS_H__ + +#include +#include +#ifdef WIN32 +#include +#endif +#include +#include "resources.h" +#include "widgets.h" + + + +SDL_Surface* loadImage(const std::wstring &name, bool transparent=false); +SDL_Surface* adjustBrightness(SDL_Surface *image, double k, bool transparent=false); +int gettimeofday(struct timeval* tp); +void drawWallpaper(const std::wstring &name); +void showWindow(Area *area, const std::wstring &fileName); +bool isInRect(int evX, int evY, int x, int y, int w, int h); +std::wstring numToStr(int no); +void adjustBrightness(SDL_Surface *image, int x, int y, double k); +std::wstring secToStr(int time); +void showMessageWindow(Area *area, const std::wstring &pattern, + int width, int height, Font *font, int r, int g, int b, + const std::wstring &msg); +int getCornerPixel(SDL_Surface *surface); +void getPixel(SDL_Surface *surface, int x, int y, + Uint8 *r, Uint8 *g, Uint8 *b); +void setPixel(SDL_Surface *s, int x, int y, int r, int g, int b); +void drawBevel(SDL_Surface *s, int left, int top, int width, int height, + bool raised, int size); +void ensureDirExists(const std::wstring &fileName); +int readInt(std::istream &stream); +std::wstring readString(std::istream &stream); +void writeInt(std::ostream &stream, int value); +void writeString(std::ostream &stream, const std::wstring &value); + +/// Read 4-bytes integer from memory. +int readInt(unsigned char *buffer); + + +#endif + diff --git a/verthints.cpp b/verthints.cpp new file mode 100644 index 0000000..8d2ffd0 --- /dev/null +++ b/verthints.cpp @@ -0,0 +1,193 @@ +#include "verthints.h" +#include "main.h" +#include "utils.h" +#include "puzgen.h" +#include "sound.h" + + +#define TILE_NUM 15 +#define TILE_GAP 4 +#define TILE_X 12 +#define TILE_Y 495 +#define TILE_WIDTH 48 +#define TILE_HEIGHT 48 + + +VertHints::VertHints(IconSet &is, Rules &r): iconSet(is) +{ + reset(r); +} + + +VertHints::VertHints(IconSet &is, Rules &rl, std::istream &stream): iconSet(is) +{ + int qty = readInt(stream); + + for (int i = 0; i < qty; i++) { + int no = readInt(stream); + numbersArr.push_back(no); + Rule *r = getRule(rl, no); + int excluded = readInt(stream); + if (excluded) { + excludedRules.push_back(r); + rules.push_back(NULL); + } else { + excludedRules.push_back(NULL); + rules.push_back(r); + } + } + + showExcluded = readInt(stream); + + int x, y; + SDL_GetMouseState(&x, &y); + highlighted = getRuleNo(x, y); +} + +void VertHints::reset(Rules &r) +{ + rules.clear(); + excludedRules.clear(); + numbersArr.clear(); + + int no = 0; + for (Rules::iterator i = r.begin(); i != r.end(); i++) { + Rule *rule = *i; + if (rule->getShowOpts() == Rule::SHOW_VERT) { + rules.push_back(rule); + excludedRules.push_back(NULL); + numbersArr.push_back(no); + } + no++; + } + + showExcluded = false; + + int x, y; + SDL_GetMouseState(&x, &y); + highlighted = getRuleNo(x, y); +} + +void VertHints::draw() +{ + for (int i = 0; i < TILE_NUM; i++) + drawCell(i, true); +} + + +void VertHints::drawCell(int col, bool addToUpdate) +{ + int x = TILE_X + col * (TILE_WIDTH + TILE_GAP); + int y = TILE_Y; + + Rule *r = NULL; + if (col < (int)rules.size()) { + if (showExcluded) + r = excludedRules[col]; + else + r = rules[col]; + } + if (r) + r->draw(x, y, iconSet, highlighted == col); + else { + screen.draw(x, y, iconSet.getEmptyHintIcon()); + screen.draw(x, y + TILE_HEIGHT, iconSet.getEmptyHintIcon()); + } + + if (addToUpdate) + screen.addRegionToUpdate(x, y, TILE_WIDTH, TILE_HEIGHT*2); +} + + +bool VertHints::onMouseButtonDown(int button, int x, int y) +{ + if (button != 3) + return false; + + int no = getRuleNo(x, y); + if (no < 0) return false; + + if (no < (int)rules.size()) { + if (showExcluded) { + Rule *r = excludedRules[no]; + if (r) { + sound->play(L"whizz.wav"); + rules[no] = r; + excludedRules[no] = NULL; + drawCell(no); + } + } else { + Rule *r = rules[no]; + if (r) { + sound->play(L"whizz.wav"); + rules[no] = NULL; + excludedRules[no] = r; + drawCell(no); + } + } + } + + return true; +} + + +void VertHints::toggleExcluded() +{ + showExcluded = !showExcluded; + draw(); +} + + +bool VertHints::onMouseMove(int x, int y) +{ + int no = getRuleNo(x, y); + + if (no != highlighted) { + int old = highlighted; + highlighted = no; + if (isActive(old)) + drawCell(old); + if (isActive(no)) + drawCell(no); + } + + return false; +} + + +int VertHints::getRuleNo(int x, int y) +{ + if (! isInRect(x, y, TILE_X, TILE_Y, (TILE_WIDTH + TILE_GAP) * TILE_NUM, + TILE_HEIGHT * 2)) + return -1; + + x = x - TILE_X; + y = y - TILE_Y; + + int no = x / (TILE_WIDTH + TILE_GAP); + if (no * (TILE_WIDTH + TILE_GAP) + TILE_WIDTH < x) + return -1; + + return no; +} + +bool VertHints::isActive(int ruleNo) +{ + if ((ruleNo < 0) || (ruleNo >= (int)rules.size())) + return false; + Rule *r = showExcluded ? excludedRules[ruleNo] : rules[ruleNo]; + return r != NULL; +} + + +void VertHints::save(std::ostream &stream) +{ + int cnt = numbersArr.size(); + writeInt(stream, cnt); + for (int i = 0; i < cnt; i++) { + writeInt(stream, numbersArr[i]); + writeInt(stream, rules[i] ? 0 : 1); + } + writeInt(stream, showExcluded ? 1 : 0); +} + diff --git a/verthints.h b/verthints.h new file mode 100644 index 0000000..860657a --- /dev/null +++ b/verthints.h @@ -0,0 +1,41 @@ +#ifndef __VERTHINTS_H__ +#define __VERTHINTS_H__ + + +#include +#include "iconset.h" +#include "puzgen.h" +#include "widgets.h" + + + +class VertHints: public Widget +{ + private: + IconSet &iconSet; + typedef std::vector RulesArr; + RulesArr rules; + RulesArr excludedRules; + std::vector numbersArr; + bool showExcluded; + int highlighted; + + public: + VertHints(IconSet &is, Rules &rules); + VertHints(IconSet &is, Rules &rules, std::istream &stream); + + public: + virtual void draw(); + void drawCell(int col, bool addToUpdate=true); + virtual bool onMouseButtonDown(int button, int x, int y); + void toggleExcluded(); + int getRuleNo(int x, int y); + virtual bool onMouseMove(int x, int y); + bool isActive(int ruleNo); + void save(std::ostream &stream); + void reset(Rules &rules); +}; + + +#endif + diff --git a/visitor.h b/visitor.h new file mode 100644 index 0000000..35cb7d8 --- /dev/null +++ b/visitor.h @@ -0,0 +1,18 @@ +#ifndef __VISITOR_H__ +#define __VISITOR_H__ + + +/// Abstract visitor +template +class Visitor +{ + public: + virtual ~Visitor() { }; + + /// Called at every visit + virtual void onVisit(T &t) = 0; +}; + + +#endif + diff --git a/widgets.cpp b/widgets.cpp new file mode 100644 index 0000000..7730ee7 --- /dev/null +++ b/widgets.cpp @@ -0,0 +1,1013 @@ +#include "widgets.h" +#include "main.h" +#include "utils.h" +#include "sound.h" + + +////////////////////////////////////////////////////////////////// +// +// Button +// +////////////////////////////////////////////////////////////////// + + +Button::Button(int x, int y, const std::wstring &name, Command *cmd, + bool transparent) +{ + image = loadImage(name, transparent); + highlighted = adjustBrightness(image, 1.5, transparent); + + left = x; + top = y; + width = image->w; + height = image->h; + + mouseInside = false; + command = cmd; +} + + +Button::Button(int x, int y, int w, int h, Font *font, + int fR, int fG, int fB, int hR, int hG, int hB, + const std::wstring &text, Command *cmd) +{ + left = x; + top = y; + width = w; + height = h; + + SDL_Surface *s = SDL_CreateRGBSurface(SDL_SWSURFACE, w, h, + 24, 0x00FF0000, 0x0000FF00, 0x000000FF, 0/*0xFF000000*/); + SDL_Rect src = { x, y, width, height }; + SDL_Rect dst = { 0, 0, width, height }; + SDL_BlitSurface(screen.getSurface(), &src, s, &dst); + + int tW, tH; + font->getSize(text, tW, tH); + font->draw(s, (width - tW) / 2, (height - tH) / 2, fR, fG, fB, true, text); + image = SDL_DisplayFormat(s); + SDL_BlitSurface(screen.getSurface(), &src, s, &dst); + font->draw(s, (width - tW) / 2, (height - tH) / 2, hR, hG, hB, true, text); + highlighted = SDL_DisplayFormat(s); + SDL_FreeSurface(s); + + mouseInside = false; + command = cmd; +} + + +Button::Button(int x, int y, int w, int h, Font *font, + int r, int g, int b, const std::wstring &bg, + const std::wstring &text, bool bevel, Command *cmd) +{ + left = x; + top = y; + width = w; + height = h; + + SDL_Surface *s = screen.getSurface(); + image = SDL_CreateRGBSurface(SDL_SWSURFACE, width, height, + s->format->BitsPerPixel, s->format->Rmask, s->format->Gmask, + s->format->Bmask, s->format->Amask); + + SDL_Surface *tile = loadImage(bg, true); + SDL_Rect src = { 0, 0, tile->w, tile->h }; + SDL_Rect dst = { 0, 0, tile->w, tile->h }; + for (int j = 0; j < height; j += tile->h) + for (int i = 0; i < width; i += tile->w) { + dst.x = i; + dst.y = j; + SDL_BlitSurface(tile, &src, image, &dst); + } + SDL_FreeSurface(tile); + + if (bevel) { + SDL_LockSurface(image); + drawBevel(image, 0, 0, width, height, false, 1); + drawBevel(image, 1, 1, width - 2, height - 2, true, 1); + SDL_UnlockSurface(image); + } + + int tW, tH; + font->getSize(text, tW, tH); + font->draw(image, (width - tW) / 2, (height - tH) / 2, r, g, b, true, text); + + highlighted = adjustBrightness(image, 1.5, false); + SDL_SetColorKey(image, SDL_SRCCOLORKEY, getCornerPixel(image)); + SDL_SetColorKey(highlighted, SDL_SRCCOLORKEY, getCornerPixel(highlighted)); + + mouseInside = false; + command = cmd; +} + + + +Button::Button(int x, int y, int w, int h, Font *font, + int r, int g, int b, const std::wstring &bg, + const std::wstring &text, Command *cmd) +{ + left = x; + top = y; + width = w; + height = h; + + SDL_Surface *s = screen.getSurface(); + image = SDL_CreateRGBSurface(SDL_SWSURFACE, width, height, + s->format->BitsPerPixel, s->format->Rmask, s->format->Gmask, + s->format->Bmask, s->format->Amask); + + SDL_Surface *tile = loadImage(bg); + SDL_Rect src = { 0, 0, tile->w, tile->h }; + SDL_Rect dst = { 0, 0, tile->w, tile->h }; + for (int j = 0; j < height; j += tile->h) + for (int i = 0; i < width; i += tile->w) { + dst.x = i; + dst.y = j; + SDL_BlitSurface(tile, &src, image, &dst); + } + SDL_FreeSurface(tile); + + SDL_LockSurface(image); + drawBevel(image, 0, 0, width, height, false, 1); + drawBevel(image, 1, 1, width - 2, height - 2, true, 1); + SDL_UnlockSurface(image); + + int tW, tH; + font->getSize(text, tW, tH); + font->draw(image, (width - tW) / 2, (height - tH) / 2, r, g, b, true, text); + + highlighted = adjustBrightness(image, 1.5, false); + + mouseInside = false; + command = cmd; +} + + +Button::~Button() +{ + SDL_FreeSurface(image); + SDL_FreeSurface(highlighted); +} + + +void Button::draw() +{ + if (mouseInside) + screen.draw(left, top, highlighted); + else + screen.draw(left, top, image); + screen.addRegionToUpdate(left, top, width, height); +} + + +void Button::getBounds(int &l, int &t, int &w, int &h) +{ + l = left; + t = top; + w = width; + h = height; +} + + +bool Button::onMouseButtonDown(int button, int x, int y) +{ + if (isInRect(x, y, left, top, width, height)) { + sound->play(L"click.wav"); + if (command) + command->doAction(); + return true; + } else + return false; +} + + +bool Button::onMouseMove(int x, int y) +{ + bool in = isInRect(x, y, left, top, width, height); + if (in != mouseInside) { + mouseInside = in; + draw(); + } + return false; +} + + +////////////////////////////////////////////////////////////////// +// +// KeyAccel +// +////////////////////////////////////////////////////////////////// + + +KeyAccel::KeyAccel(SDLKey sym, Command *cmd) +{ + command = cmd; + key = sym; +} + + +bool KeyAccel::onKeyDown(SDLKey k, unsigned char ch) +{ + if (key == k) { + if (command) + command->doAction(); + return true; + } else + return false; +} + + +////////////////////////////////////////////////////////////////// +// +// Area +// +////////////////////////////////////////////////////////////////// + + +Area::Area() +{ + timer = NULL; +} + +Area::~Area() +{ + for (WidgetsList::iterator i = widgets.begin(); i != widgets.end(); i++) { + Widget *w = *i; + if (w && w->destroyByArea() && (! notManagedWidgets.count(w))) + delete w; + } +} + +void Area::add(Widget *widget, bool managed) +{ + widgets.push_back(widget); + if (! managed) + notManagedWidgets.insert(widget); + widget->setParent(this); +} + +void Area::remove(Widget *widget) +{ + widgets.remove(widget); + notManagedWidgets.insert(widget); +} + +void Area::handleEvent(const SDL_Event &event) +{ + switch (event.type) { + case SDL_MOUSEBUTTONDOWN: + for (WidgetsList::iterator i = widgets.begin(); i != widgets.end(); i++) + if ((*i)->onMouseButtonDown(event.button.button, + event.button.x, event.button.y)) + return; + break; + + case SDL_MOUSEBUTTONUP: + for (WidgetsList::iterator i = widgets.begin(); i != widgets.end(); i++) + if ((*i)->onMouseButtonUp(event.button.button, + event.button.x, event.button.y)) + return; + break; + + case SDL_MOUSEMOTION: + for (WidgetsList::iterator i = widgets.begin(); i != widgets.end(); i++) + if ((*i)->onMouseMove(event.motion.x, event.motion.y)) + return; + break; + + case SDL_VIDEOEXPOSE: + for (WidgetsList::iterator i = widgets.begin(); i != widgets.end(); i++) + (*i)->draw(); + break; + + case SDL_KEYDOWN: + for (WidgetsList::iterator i = widgets.begin(); i != widgets.end(); i++) + if ((*i)->onKeyDown(event.key.keysym.sym, + (unsigned char)event.key.keysym.unicode)) + return; + break; + + case SDL_QUIT: + exit(0); + } +} + +void Area::run() +{ + terminate = false; + SDL_Event event; + + Uint32 lastTimer = 0; + draw(); + screen.showMouse(); + + bool runTimer = timer ? true : false; + bool dispetchEvent; + while (! terminate) { + dispetchEvent = true; + if (! timer) { + SDL_WaitEvent(&event); + } else { + Uint32 now = SDL_GetTicks(); + if (now - lastTimer > time) { + lastTimer = now; + runTimer = true; + } + if (! SDL_PollEvent(&event)) { + if (! runTimer) { + SDL_Delay(20); + continue; + } else + dispetchEvent = false; + } + } + screen.hideMouse(); + if (runTimer) { + if (timer) + timer->onTimer(); + runTimer = false; + } + if (dispetchEvent) + handleEvent(event); + if (! terminate) { + screen.showMouse(); + screen.flush(); + } + } +} + +void Area::finishEventLoop() +{ + terminate = true; +} + + +void Area::draw() +{ + for (WidgetsList::iterator i = widgets.begin(); i != widgets.end(); i++) + (*i)->draw(); +} + + +void Area::setTimer(Uint32 interval, TimerHandler *t) +{ + time = interval; + timer = t; +} + + +void Area::updateMouse() +{ + int x, y; + SDL_GetMouseState(&x, &y); + + for (WidgetsList::iterator i = widgets.begin(); i != widgets.end(); i++) + if ((*i)->onMouseMove(x, y)) + return; +} + + + +////////////////////////////////////////////////////////////////// +// +// AnyKeyAccel +// +////////////////////////////////////////////////////////////////// + + + +AnyKeyAccel::AnyKeyAccel() +{ + command = NULL; +} + +AnyKeyAccel::AnyKeyAccel(Command *cmd) +{ + command = cmd; +} + +AnyKeyAccel::~AnyKeyAccel() +{ +} + +bool AnyKeyAccel::onKeyDown(SDLKey key, unsigned char ch) +{ + if (((key >= SDLK_NUMLOCK) && (key <= SDLK_COMPOSE)) || + (key == SDLK_TAB) || (key == SDLK_UNKNOWN)) + return false; + + if (command) + command->doAction(); + else + area->finishEventLoop(); + return true; +} + +bool AnyKeyAccel::onMouseButtonDown(int button, int x, int y) +{ + if (command) + command->doAction(); + else + area->finishEventLoop(); + return true; +} + + + +////////////////////////////////////////////////////////////////// +// +// Window +// +////////////////////////////////////////////////////////////////// + + + +Window::Window(int x, int y, int w, int h, const std::wstring &bg, + bool frameWidth, bool raised) +{ + left = x; + top = y; + width = w; + height = h; + + SDL_Surface *s = screen.getSurface(); + SDL_Surface *win = SDL_CreateRGBSurface(SDL_SWSURFACE, width, height, + s->format->BitsPerPixel, s->format->Rmask, s->format->Gmask, + s->format->Bmask, s->format->Amask); + + SDL_Surface *tile = loadImage(bg); + SDL_Rect src = { 0, 0, tile->w, tile->h }; + SDL_Rect dst = { 0, 0, tile->w, tile->h }; + for (int j = 0; j < height; j += tile->h) + for (int i = 0; i < width; i += tile->w) { + dst.x = i; + dst.y = j; + SDL_BlitSurface(tile, &src, win, &dst); + } + SDL_FreeSurface(tile); + + SDL_LockSurface(win); + double k = 2.6; + double f = 0.1; + for (int i = 0; i < frameWidth; i++) { + double ltK, rbK; + if (raised) { + ltK = k; rbK = f; + } else { + ltK = f; rbK = k; + } + for (int j = i; j < height - i - 1; j++) + adjustBrightness(win, i, j, ltK); + for (int j = i; j < width - i; j++) + adjustBrightness(win, j, i, ltK); + for (int j = i+1; j < height - i; j++) + adjustBrightness(win, width - i - 1, j, rbK); + for (int j = i; j < width - i - 1; j++) + adjustBrightness(win, j, height - i - 1, rbK); + k -= 0.2; + f += 0.1; + } + SDL_UnlockSurface(win); + + background = SDL_DisplayFormat(win); + SDL_FreeSurface(win); +} + + +Window::~Window() +{ + SDL_FreeSurface(background); +} + + +void Window::draw() +{ + screen.draw(left, top, background); + screen.addRegionToUpdate(left, top, width, height); +} + + + +////////////////////////////////////////////////////////////////// +// +// Label +// +////////////////////////////////////////////////////////////////// + + + +Label::Label(Font *f, int x, int y, int r, int g, int b, std::wstring s, + bool sh): text(s) +{ + font = f; + left = x; + top = y; + red = r; + green = g; + blue = b; + hAlign = ALIGN_LEFT; + vAlign = ALIGN_TOP; + shadow = sh; +} + + +Label::Label(Font *f, int x, int y, int w, int h, HorAlign hA, VerAlign vA, + int r, int g, int b, const std::wstring &s): + text(s) +{ + font = f; + left = x; + top = y; + red = r; + green = g; + blue = b; + hAlign = hA; + vAlign = vA; + width = w; + height = h; + shadow = true; +} + + +void Label::draw() +{ + int w, h, x, y; + font->getSize(text, w, h); + + switch (hAlign) { + case ALIGN_RIGHT: x = left + width - w; break; + case ALIGN_CENTER: x = left + (width - w) / 2; break; + default: x = left; + } + + switch (vAlign) { + case ALIGN_BOTTOM: y = top + height - h; break; + case ALIGN_MIDDLE: y = top + (height - h) / 2; break; + default: y = top; + } + + font->draw(x, y, red,green,blue, shadow, text); + screen.addRegionToUpdate(x, y, w, h); +} + + + +////////////////////////////////////////////////////////////////// +// +// InputField +// +////////////////////////////////////////////////////////////////// + + +InputField::InputField(int x, int y, int w, int h, const std::wstring &background, + std::wstring &s, int maxLen, int r, int g, int b, Font *f): + Window(x, y, w, h, background, 1, false), text(s) +{ + maxLength = maxLen; + red = r; + green = g; + blue = b; + font = f; + moveCursor(text.length()); + SDL_EnableKeyRepeat(SDL_DEFAULT_REPEAT_DELAY, SDL_DEFAULT_REPEAT_INTERVAL); + SDL_EnableUNICODE(1); +} + +InputField::~InputField() +{ + SDL_EnableKeyRepeat(0, 0); +} + +void InputField::draw() +{ + Window::draw(); + + SDL_Rect rect = { left+1, top+1, width-2, height-2 }; + SDL_SetClipRect(screen.getSurface(), &rect); + + font->draw(left+1, top+1, red,green,blue, true, text); + + if (cursorVisible) { + int pos = 0; + if (cursorPos > 0) + pos += font->getWidth(text.substr(0, cursorPos)); + for (int i = 2; i < height-2; i++) { + screen.setPixel(left + pos, top + i, red, green, blue); + screen.setPixel(left + pos + 1, top + i, red, green, blue); + } + } + + SDL_SetClipRect(screen.getSurface(), NULL); +} + +void InputField::setParent(Area *a) +{ + Window::setParent(a); + area->setTimer(100, this); +} + + +void InputField::onTimer() +{ + Uint32 now = SDL_GetTicks(); + if (now - lastCursor > 1000) { + cursorVisible = ! cursorVisible; + lastCursor = now; + draw(); + } +} + + +bool InputField::onKeyDown(SDLKey key, unsigned char translatedChar) +{ + switch (key) { + case SDLK_BACKSPACE: + if (cursorPos > 0) { + text.erase(cursorPos - 1, 1); + moveCursor(cursorPos - 1); + } else + moveCursor(cursorPos); + draw(); + return true; + + case SDLK_LEFT: + if (cursorPos > 0) + moveCursor(cursorPos - 1); + else + moveCursor(cursorPos); + draw(); + return true; + + case SDLK_RIGHT: + if (cursorPos < (int)text.length()) + moveCursor(cursorPos + 1); + else + moveCursor(cursorPos); + draw(); + return true; + + case SDLK_HOME: + moveCursor(0); + draw(); + return true; + + case SDLK_END: + moveCursor(text.length()); + draw(); + return true; + + case SDLK_DELETE: + if (cursorPos < (int)text.length()) + text.erase(cursorPos, 1); + moveCursor(cursorPos); + draw(); + return true; + + default: ; + } + + if (translatedChar > 31) + onCharTyped(translatedChar); + return false; +} + +bool InputField::onKeyUp(SDLKey key) +{ + return false; +} + +void InputField::onCharTyped(unsigned char ch) +{ + if ((int)text.length() < maxLength) { + wchar_t buf[2]; + buf[0] = ch; + buf[1] = 0; + text.insert(cursorPos, buf); + moveCursor(cursorPos + 1); + } else + moveCursor(cursorPos); + draw(); +} + +void InputField::moveCursor(int pos) +{ + lastCursor = SDL_GetTicks(); + cursorVisible = true; + cursorPos = pos; +} + + +////////////////////////////////////////////////////////////////// +// +// Checkbox +// +////////////////////////////////////////////////////////////////// + + + +Checkbox::Checkbox(int x, int y, int w, int h, Font *font, + int r, int g, int b, const std::wstring &bg, + bool &chk): checked(chk) +{ + left = x; + top = y; + width = w; + height = h; + checked = chk; + + SDL_Surface *s = screen.getSurface(); + image = SDL_CreateRGBSurface(SDL_SWSURFACE, width, height, + s->format->BitsPerPixel, s->format->Rmask, s->format->Gmask, + s->format->Bmask, s->format->Amask); + + SDL_Surface *tile = loadImage(bg); + SDL_Rect src = { 0, 0, tile->w, tile->h }; + SDL_Rect dst = { 0, 0, tile->w, tile->h }; + for (int j = 0; j < height; j += tile->h) + for (int i = 0; i < width; i += tile->w) { + dst.x = i; + dst.y = j; + SDL_BlitSurface(tile, &src, image, &dst); + } + SDL_FreeSurface(tile); + + SDL_LockSurface(image); + drawBevel(image, 0, 0, width, height, false, 1); + drawBevel(image, 1, 1, width - 2, height - 2, true, 1); + SDL_UnlockSurface(image); + + highlighted = adjustBrightness(image, 1.5, false); + + checkedImage = SDL_DisplayFormat(image); + int tW, tH; + font->getSize(L"X", tW, tH); + tH += 2; + tW += 2; + font->draw(checkedImage, (width - tW) / 2, (height - tH) / 2, r, g, b, + true, L"X"); + checkedHighlighted = adjustBrightness(checkedImage, 1.5, false); + + mouseInside = false; +} + + +Checkbox::~Checkbox() +{ + SDL_FreeSurface(image); + SDL_FreeSurface(highlighted); + SDL_FreeSurface(checkedImage); + SDL_FreeSurface(checkedHighlighted); +} + + +void Checkbox::draw() +{ + if (checked) { + if (mouseInside) + screen.draw(left, top, checkedHighlighted); + else + screen.draw(left, top, checkedImage); + } else { + if (mouseInside) + screen.draw(left, top, highlighted); + else + screen.draw(left, top, image); + } + screen.addRegionToUpdate(left, top, width, height); +} + + +void Checkbox::getBounds(int &l, int &t, int &w, int &h) +{ + l = left; + t = top; + w = width; + h = height; +} + + +bool Checkbox::onMouseButtonDown(int button, int x, int y) +{ + if (isInRect(x, y, left, top, width, height)) { + sound->play(L"click.wav"); + checked = ! checked; + draw(); + return true; + } else + return false; +} + + +bool Checkbox::onMouseMove(int x, int y) +{ + bool in = isInRect(x, y, left, top, width, height); + if (in != mouseInside) { + mouseInside = in; + draw(); + } + return false; +} + + +////////////////////////////////////////////////////////////////////////////// +// +// Picture +// +////////////////////////////////////////////////////////////////////////////// + +Picture::Picture(int x, int y, const std::wstring &name, bool transparent) +{ + image = loadImage(name, transparent); + left = x; + top = y; + width = image->w; + height = image->h; + managed = true; +} + +Picture::Picture(int x, int y, SDL_Surface *img) +{ + image = img; + left = x; + top = y; + width = image->w; + height = image->h; + managed = false; +} + +Picture::~Picture() +{ + if (managed) + SDL_FreeSurface(image); +} + +void Picture::draw() +{ + screen.draw(left, top, image); + screen.addRegionToUpdate(left, top, width, height); +} + +void Picture::moveX(const int newX) +{ + left = newX; +} + +void Picture::getBounds(int &l, int &t, int &w, int &h) +{ + l = left; + t = top; + w = width; + h = height; +} + + +////////////////////////////////////////////////////////////////// +// +// Slider +// +////////////////////////////////////////////////////////////////// + +Slider::Slider(int x, int y, int w, int h, float &v): value(v) +{ + left = x; + top = y; + width = w; + height = h; + background = NULL; + createSlider(height); + highlight = false; + dragging = false; +} + +Slider::~Slider() +{ + if (background) + SDL_FreeSurface(background); + if (slider) + SDL_FreeSurface(slider); + if (activeSlider) + SDL_FreeSurface(activeSlider); +} + +void Slider::draw() +{ + if (! background) + createBackground(); + screen.draw(left, top, background); + screen.addRegionToUpdate(left, top, width, height); + int posX = valueToX(value); + SDL_Surface *s = highlight ? activeSlider : slider; + screen.draw(left + posX, top, s); +} + +void Slider::createBackground() +{ + background = screen.createSubimage(left, top, width, height); + int y = height / 2; + SDL_LockSurface(background); + drawBevel(background, 0, y - 2, width, 4, false, 1); + SDL_UnlockSurface(background); +} + +void Slider::createSlider(int size) +{ + SDL_Surface *s = screen.getSurface(); + SDL_Surface *image = SDL_CreateRGBSurface(SDL_SWSURFACE, size, size, + s->format->BitsPerPixel, s->format->Rmask, s->format->Gmask, + s->format->Bmask, s->format->Amask); + + SDL_Surface *tile = loadImage(L"blue.bmp"); + SDL_Rect src = { 0, 0, tile->w, tile->h }; + SDL_Rect dst = { 0, 0, tile->w, tile->h }; + for (int j = 0; j < size; j += tile->h) + for (int i = 0; i < size; i += tile->w) { + dst.x = i; + dst.y = j; + SDL_BlitSurface(tile, &src, image, &dst); + } + SDL_FreeSurface(tile); + + SDL_LockSurface(image); + drawBevel(image, 0, 0, size, size, false, 1); + drawBevel(image, 1, 1, size - 2, size - 2, true, 1); + SDL_UnlockSurface(image); + + activeSlider = adjustBrightness(image, 1.5, false); + slider = SDL_DisplayFormat(image); + + SDL_FreeSurface(image); +} + + +bool Slider::onMouseButtonDown(int button, int x, int y) +{ + bool in = isInRect(x, y, left, top, width, height); + if (in) { + int sliderX = valueToX(value); + bool hl = isInRect(x, y, left + sliderX, top, height, height); + if (hl) { + dragging = true; + dragOffsetX = x - left - sliderX; + } + } + return in; +} + +bool Slider::onMouseButtonUp(int button, int x, int y) +{ + if (dragging) { + dragging = false; + return true; + } else + return false; +} + + +int Slider::valueToX(float value) +{ + if (value < 0) + value = 0.0f; + if (value > 1) + value = 1.0f; + return (int)(((float)(width - height)) * value); +} + + +float Slider::xToValue(int pos) +{ + if (0 > pos) + pos = 0; + if (width - height < pos) + pos = width - height; + return (float)pos / (float)(width - height); +} + + + +bool Slider::onMouseMove(int x, int y) +{ + if (dragging) { + float val = xToValue(x - left - dragOffsetX); + if (val != value) { + value = val; + draw(); + } + return true; + } + + bool in = isInRect(x, y, left, top, width, height); + if (in) { + int sliderX = valueToX(value); + bool hl = isInRect(x, y, left + sliderX, top, height, height); + if (hl != highlight) { + highlight = hl; + draw(); + } + } else + if (highlight) { + highlight = false; + draw(); + } + return in; +} + diff --git a/widgets.h b/widgets.h new file mode 100644 index 0000000..0bd7753 --- /dev/null +++ b/widgets.h @@ -0,0 +1,322 @@ +#ifndef __WIDGETS_H__ +#define __WIDGETS_H__ + +#include +#include +#include +#include +#include "font.h" + + +class Command +{ + public: + virtual ~Command() { }; + virtual void doAction() = 0; +}; + + +class Area; + + +class Widget +{ + protected: + Area *area; + + public: + virtual ~Widget() { }; + + public: + virtual bool onMouseButtonDown(int button, int x, int y) { return false; }; + virtual bool onMouseButtonUp(int button, int x, int y) { return false; }; + virtual bool onMouseMove(int x, int y) { return false; }; + virtual void draw() { }; + virtual void setParent(Area *a) { area = a; }; + virtual bool onKeyDown(SDLKey key, unsigned char ch) { return false; }; + virtual bool destroyByArea() { return true; }; +}; + + +class Button: public Widget +{ + protected: + int left, top, width, height; + SDL_Surface *image, *highlighted; + bool mouseInside; + Command *command; + + public: + Button(int x, int y, const std::wstring &name, Command *cmd=NULL, + bool transparent=true); + Button(int x, int y, int width, int height, Font *font, + int fR, int fG, int fB, int hR, int hG, int hB, + const std::wstring &text, Command *cmd=NULL); + Button(int x, int y, int width, int height, Font *font, + int r, int g, int b, const std::wstring &background, + const std::wstring &text, Command *cmd=NULL); + Button(int x, int y, int width, int height, Font *font, + int r, int g, int b, const std::wstring &background, + const std::wstring &text, bool bevel, Command *cmd=NULL); + virtual ~Button(); + + public: + virtual void draw(); + void getBounds(int &left, int &top, int &width, int &height); + int getLeft() const { return left; }; + int getTop() const { return top; }; + int getWidth() const { return width; }; + int getHeight() const { return height; }; + virtual bool onMouseButtonDown(int button, int x, int y); + virtual bool onMouseMove(int x, int y); + void moveTo(int x, int y) { left = x; top = y; }; +}; + + + +class KeyAccel: public Widget +{ + protected: + SDLKey key; + Command *command; + + public: + KeyAccel(SDLKey key, Command *command); + virtual bool onKeyDown(SDLKey key, unsigned char ch); +}; + + +class TimerHandler +{ + public: + virtual ~TimerHandler() { }; + virtual void onTimer() = 0; +}; + + +class Area: public Widget +{ + private: + typedef std::list WidgetsList; + WidgetsList widgets; + std::set notManagedWidgets; + bool terminate; + Uint32 time; + TimerHandler *timer; + + public: + Area(); + virtual ~Area(); + + public: + void add(Widget *widget, bool manage=true); + void remove(Widget *widget); + void handleEvent(const SDL_Event &event); + void run(); + void finishEventLoop(); + virtual void draw(); + void setTimer(Uint32 interval, TimerHandler *handler); + void updateMouse(); + virtual bool destroyByArea() { return false; }; +}; + + +class ExitCommand: public Command +{ + private: + Area &area; + + public: + ExitCommand(Area &a): area(a) { } + + virtual void doAction() { + area.finishEventLoop(); + }; +}; + + +class AnyKeyAccel: public Widget +{ + protected: + Command *command; + + public: + AnyKeyAccel(); // use exit command by default + AnyKeyAccel(Command *command); + virtual ~AnyKeyAccel(); + + public: + virtual bool onKeyDown(SDLKey key, unsigned char ch); + virtual bool onMouseButtonDown(int button, int x, int y); +}; + + +class Window: public Widget +{ + protected: + int left, top, width, height; + SDL_Surface *background; + + public: + Window(int x, int y, int w, int h, const std::wstring &background, + bool frameWidth=4, bool raised=true); + virtual ~Window(); + + public: + virtual void draw(); +}; + + +class Label: public Widget +{ + public: + typedef enum { + ALIGN_LEFT, + ALIGN_CENTER, + ALIGN_RIGHT + } HorAlign; + + typedef enum { + ALIGN_TOP, + ALIGN_MIDDLE, + ALIGN_BOTTOM + } VerAlign; + + protected: + Font *font; + std::wstring text; + int left, top, width, height; + int red, green, blue; + HorAlign hAlign; + VerAlign vAlign; + bool shadow; + + public: + Label(Font *font, int x, int y, int r, int g, int b, + std::wstring text, bool shadow=true); + Label(Font *font, int x, int y, int width, int height, + HorAlign hAlign, VerAlign vAlign, int r, int g, int b, + const std::wstring &text); + + public: + virtual void draw(); +}; + + +class InputField: public Window, public TimerHandler +{ + private: + std::wstring &text; + int maxLength; + int cursorPos; + int red, green, blue; + Font *font; + Uint32 lastCursor; + bool cursorVisible; + char lastChar; + Uint32 lastKeyUpdate; + + public: + InputField(int x, int y, int w, int h, const std::wstring &background, + std::wstring &name, int maxLength, int r, int g, int b, Font *font); + ~InputField(); + + public: + virtual void draw(); + virtual void setParent(Area *a); + virtual void onTimer(); + virtual bool onKeyDown(SDLKey key, unsigned char ch); + virtual bool onKeyUp(SDLKey key); + virtual void onCharTyped(unsigned char ch); + + private: + void moveCursor(int pos); +}; + + +class Checkbox: public Widget +{ + protected: + int left, top, width, height; + SDL_Surface *image, *highlighted; + SDL_Surface *checkedImage, *checkedHighlighted; + bool &checked; + bool mouseInside; + + public: + Checkbox(int x, int y, int width, int height, Font *font, + int r, int g, int b, const std::wstring &background, + bool &checked); + virtual ~Checkbox(); + + public: + virtual void draw(); + void getBounds(int &left, int &top, int &width, int &height); + int getLeft() const { return left; }; + int getTop() const { return top; }; + int getWidth() const { return width; }; + int getHeight() const { return height; }; + virtual bool onMouseButtonDown(int button, int x, int y); + virtual bool onMouseMove(int x, int y); + void moveTo(int x, int y) { left = x; top = y; }; +}; + +class Picture: public Widget +{ + protected: + int left; + int top; + int width; + int height; + SDL_Surface *image; + bool managed; + + public: + Picture(int x, int y, const std::wstring &name, bool transparent=true); + Picture(int x, int y, SDL_Surface *image); + virtual ~Picture(); + + public: + virtual void draw(); + void moveX(const int newX); + void getBounds(int &l, int &t, int &w, int &h); + int getLeft() const { return left; }; + int getTop() const { return top; }; + int getWidth() const { return width; }; + int getHeight() const { return height; }; + +}; + + +class Slider: public Widget +{ + private: + int left, top, width, height; + float &value; + SDL_Surface *background; + SDL_Surface *slider; + SDL_Surface *activeSlider; + bool highlight; + bool dragging; + int dragOffsetX; + + public: + Slider(int x, int y, int width, int height, float &value); + virtual ~Slider(); + + public: + virtual void draw(); + virtual bool onMouseButtonDown(int button, int x, int y); + virtual bool onMouseButtonUp(int button, int x, int y); + virtual bool onMouseMove(int x, int y); + + private: + void createBackground(); + void createSlider(int size); + int valueToX(float value); + float xToValue(int pos); +}; + + +#endif +