diff options
author | toma <toma@283d02a7-25f6-0310-bc7c-ecb5cbfe19da> | 2009-11-25 17:56:58 +0000 |
---|---|---|
committer | toma <toma@283d02a7-25f6-0310-bc7c-ecb5cbfe19da> | 2009-11-25 17:56:58 +0000 |
commit | c90c389a8a8d9d8661e9772ec4144c5cf2039f23 (patch) | |
tree | 6d8391395bce9eaea4ad78958617edb20c6a7573 /ksokoban/InternalCollections.cpp | |
download | tdegames-c90c389a8a8d9d8661e9772ec4144c5cf2039f23.tar.gz tdegames-c90c389a8a8d9d8661e9772ec4144c5cf2039f23.zip |
Copy the KDE 3.5 branch to branches/trinity for new KDE 3.5 features.
BUG:215923
git-svn-id: svn://anonsvn.kde.org/home/kde/branches/trinity/kdegames@1054174 283d02a7-25f6-0310-bc7c-ecb5cbfe19da
Diffstat (limited to 'ksokoban/InternalCollections.cpp')
-rw-r--r-- | ksokoban/InternalCollections.cpp | 148 |
1 files changed, 148 insertions, 0 deletions
diff --git a/ksokoban/InternalCollections.cpp b/ksokoban/InternalCollections.cpp new file mode 100644 index 00000000..cdc3dbb3 --- /dev/null +++ b/ksokoban/InternalCollections.cpp @@ -0,0 +1,148 @@ +#include <klocale.h> +#include <stdio.h> +#include <stdlib.h> +#include <ctype.h> + +#ifdef USE_LIBZ +#include <zlib.h> +#endif + +#include "InternalCollections.h" + +#ifndef LEVELS_INCLUDED +#define LEVELS_INCLUDED 1 +#include "levels/data.c" +#endif + +#define BUFSIZE (128*1024) + +// static const int collection_save_id[] = { +// 0, 1, 3, 5, 9, 6, 7, 8, 2, 4 +// }; + +static const int collection_save_id[] = { + 10, 11, 12, 13, 14 +}; + +int +InternalCollections::configCollection2Real (int collection) { + for (int i=0; i < (int) (sizeof (collection_save_id) / sizeof (int)); i++) { + if (collection_save_id[i] == collection) return i; + } + return 0; +} + +int +InternalCollections::realCollection2Config(int collection) { + assert(collection < (int) (sizeof (collection_save_id) / sizeof (int))); + return collection_save_id[collection]; +} + +QString +InternalCollections::collectionName(int _level) { + switch (_level) { + case 0: + return i18n("Sasquatch"); + break; + + case 1: + return i18n("Mas Sasquatch"); + break; + + case 2: + return i18n("Sasquatch III"); + break; + + case 3: + return i18n("Microban (easy)"); + break; + + case 4: + return i18n("Sasquatch IV"); + break; + } + + assert(false); + return QString(); +} + + +InternalCollections::InternalCollections() { + int datasize, levelnum=0; + +#ifdef USE_LIBZ + data_ = (char *) malloc(BUFSIZE); + if (data_ == NULL) abort(); + + datasize = BUFSIZE; + uncompress ((unsigned char *) data_, (long unsigned int *) &datasize, level_data_, sizeof (level_data_)); + data_ = (char *) realloc(data_, datasize); + if (data_ == NULL) abort (); +#else + datasize = sizeof (level_data_); + data_ = (char *) malloc(datasize); + if (data_ == NULL) abort(); + memcpy(data_, level_data_, datasize); +#endif + + int start=0, end=0, name=0; + enum {NAME, DATA} state=NAME; + while (end < datasize) { + switch (state) { + case NAME: + if (data_[end] == '\n') { + data_[end] = '\0'; + state = DATA; + } + end++; + start = end; + break; + + case DATA: + if (isalpha(data_[end])) { +// collections_.add(new LevelCollection(data_+start, end-start, data_+name, collection_save_id[levelnum])); + add(new LevelCollection(data_+start, end-start, collectionName(levelnum), collection_save_id[levelnum])); + //printf("Level found: '%s'\n", data_+name); + levelnum++; + name = end; + state = NAME; + } + end++; + break; + + default: + assert(0); + } + } + if (state == DATA) { +// collections_.add(new LevelCollection(data_+start, end-start, data_+name, collection_save_id[levelnum])); + add(new LevelCollection(data_+start, end-start, collectionName(levelnum), collection_save_id[levelnum])); + //printf("***Level found: '%s'\n", data_+name); + } + //printf("numlevels: %d/%d\n", levelnum+1, collections_.size()); +} + +InternalCollections::~InternalCollections() { + for (unsigned i=0; i<collections_.size(); i++) { + delete collections_[i]; + } + + free(data_); +} + +int +InternalCollections::collections() { + return collections_.size(); +} + +LevelCollection * +InternalCollections::operator[](int n) { + return collections_[n]; +} + +void +InternalCollections::add(LevelCollection* c) { + unsigned s = collections_.size(); + collections_.resize(s + 1); + collections_.insert(s, c); +} |