Codebase list blockattack / e535fd1
New upstream version 2.3.0 Markus Koschany 5 years ago
31 changed file(s) with 507 addition(s) and 272 deletion(s). Raw diff Collapse all Expand all
22 set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${blockattack_SOURCE_DIR}/source/misc/cmake")
33 set(BIN_DIR ${blockattack_SOURCE_DIR}/Game)
44
5 SET(CPACK_PACKAGE_VERSION "2.2.0")
5 SET(CPACK_PACKAGE_VERSION "2.3.0")
66 SET(CPACK_PACKAGE_VERSION_MAJOR "2")
7 SET(CPACK_PACKAGE_VERSION_MINOR "2")
7 SET(CPACK_PACKAGE_VERSION_MINOR "3")
88 SET(CPACK_PACKAGE_VERSION_PATCH "0")
99 SET(CPACK_PACKAGE_DESCRIPTION_SUMMARY "Block Attack - Rise of the Blocks ${CPACK_PACKAGE_VERSION}")
1010 SET(CPACK_PACKAGE_VENDOR "Poul Sander")
386386 "number_of_frames" : 1,
387387 "frame_time" : 1
388388 },
389 "i_draw" : {
390 "texture" : "i_draw",
391 "topx" : 0,
392 "topy" : 0,
393 "height" : 100,
394 "width" : 300,
395 "number_of_frames" : 1,
396 "frame_time" : 1
397 },
398 "i_game_over" : {
399 "texture" : "i_game_over",
400 "topx" : 0,
401 "topy" : 0,
402 "height" : 100,
403 "width" : 300,
404 "number_of_frames" : 1,
405 "frame_time" : 1
406 },
407389 "i_level_check_box_marked" : {
408390 "texture" : "i_level_check_box_marked",
409391 "topx" : 0,
431413 "number_of_frames" : 1,
432414 "frame_time" : 1
433415 },
434 "i_loser" : {
435 "texture" : "i_loser",
436 "topx" : 0,
437 "topy" : 0,
438 "height" : 100,
439 "width" : 300,
440 "number_of_frames" : 1,
441 "frame_time" : 1
442 },
443416 "i_stage_clear_limit" : {
444417 "texture" : "i_stage_clear_limit",
445418 "topx" : 0,
446419 "topy" : 0,
447420 "height" : 50,
448421 "width" : 140,
449 "number_of_frames" : 1,
450 "frame_time" : 1
451 },
452 "i_winner" : {
453 "texture" : "i_winner",
454 "topx" : 0,
455 "topy" : 0,
456 "height" : 100,
457 "width" : 300,
458422 "number_of_frames" : 1,
459423 "frame_time" : 1
460424 },
Game/data/textures/i_draw.png less more
Binary diff not shown
Game/data/textures/i_game_over.png less more
Binary diff not shown
Game/data/textures/i_loser.png less more
Binary diff not shown
Game/data/textures/i_winner.png less more
Binary diff not shown
+0
-19
ReleaseNotes-2.2.0.txt less more
0 This is Block Attack - Rise of the Blocks - version 2.2.0
1
2 The primary change in this version is the font handling but I have also added a few help pages.
3
4 While an updated font handling may at first glance not seem so interesting the effect is actually quite bug. Most importantly the scaling is now a lot better. This is important as computer screens has gotten smaller and smaller in the past years. Another change is that the game now runs out of the box on Windows machines with high resolution displays.
5
6 Changes since 2.1.2:
7 * New font system
8 * Better scaling
9 * Works out of the box on Windows with high resolution displays
10 * New help menu with rule explanations
11
12 Known issues:
13 * Some string like "winner", "loser" and "draw" are not translatable.
14 * Keyboard key names are not translatable either
15 * A few screens like the "name" screen does not have gamepad support
16 * Only gamepads connected on startup can be used
17
18 Feedback can be given on https://blockattack.net or https://github.com/blockattack/blockattack-game
0 This is Block Attack - Rise of the Blocks - version 2.3.0
1
2 Changes since 2.2.0:
3 Several keyboard keys are now translatable
4 Window size is now restored on next startup
5 The back-button on the gamepad now goes back in menus
6 Gamepad L2 and R2 can now be used to push lines
7 Game Over, Winner and Draw are now translatable
8
9 Feedback can be given on https://blockattack.net or https://github.com/blockattack/blockattack-game
00 .\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.47.6.
1 .TH BLOCKATTACK "6" "May 2018" "blockattack 2.2.0" "Games"
1 .TH BLOCKATTACK "6" "July 2018" "blockattack 2.3.0" "Games"
22 .SH NAME
33 blockattack \- a puzzle game inspired by Tetris Attack
44 .SH SYNOPSIS
55 .B blockattack
66 [\fI\,OPTION\/\fR]...
77 .SH DESCRIPTION
8 Block Attack \- Rise of the blocks 2.2.0
8 Block Attack \- Rise of the blocks 2.3.0
99 .PP
1010 Block Attack \- Rise of the Blocks is a puzzle/blockfall game inspired by Tetris Attack for the SNES.
1111 .PP
2323 #include "BlockGame.hpp"
2424 #include "global.hpp"
2525 #include "sago/SagoTextField.hpp"
26 #include "mainVars.inc"
2627
2728 static void setScoreboardFont(const sago::SagoDataHolder* holder, sago::SagoTextField& field, const char* text){
2829 field.SetHolder(holder);
435436
436437 if (bGameOver) {
437438 if (hasWonTheGame) {
438 DrawImgBoard(iWinner, 0, 5*bsize);
439 tbWinner.Draw(globalData.screen, topx+150, topy+200, sago::SagoTextField::Alignment::center);
439440 }
440441 else {
441442 if (bDraw) {
442 DrawImgBoard(iDraw, 0, 5*bsize);
443 }
444 else {
445 DrawImgBoard(iGameOver, 0, 5*bsize);
443 tbDraw.Draw(globalData.screen, topx+150, topy+200, sago::SagoTextField::Alignment::center);
444 }
445 else {
446 tbGameOver.Draw(globalData.screen, topx+150, topy+200, sago::SagoTextField::Alignment::center);
446447 }
447448 }
448449 }
9292 SDL_RenderDrawLine(target, 100, 298, globalData.xsize/2-480/2+158, 298);
9393 SDL_RenderDrawLine(target, 100, 210, 100, 400);
9494 moveLabel.Draw(target, 100, 404, sago::SagoTextField::Alignment::center);
95 //Push lines
9596 SDL_RenderDrawLine(target, globalData.xsize/2-480/2+140, 90, globalData.xsize/2-480/2+140, 105);
9697 SDL_RenderDrawLine(target, globalData.xsize/2+480/2-140, 90, globalData.xsize/2+480/2-140, 105);
97 SDL_RenderDrawLine(target, globalData.xsize/2-480/2+140, 90, globalData.xsize/2+480/2-140, 90);
98 SDL_RenderDrawLine(target, globalData.xsize/2-480/2+140-38, 90, globalData.xsize/2+480/2-140+38, 90);
99 SDL_RenderDrawLine(target, globalData.xsize/2-480/2+140-38, 90, globalData.xsize/2-480/2+140-38, 110);
100 SDL_RenderDrawLine(target, globalData.xsize/2+480/2-140+38, 90, globalData.xsize/2+480/2-140+38, 110);
98101 SDL_RenderDrawLine(target, globalData.xsize/2, 80, globalData.xsize/2, 90);
99102 pushLabel.Draw(target, globalData.xsize/2, 80, sago::SagoTextField::Alignment::center, sago::SagoTextField::VerticalAlignment::bottom);
103 //Back lines
100104 SDL_RenderDrawLine(target, 625, 168, 800, 168);
101 SDL_RenderDrawLine(target, 800, 158, 800, 168);
105 SDL_RenderDrawLine(target, 800, 158, 800, 195);
106 SDL_RenderDrawLine(target, 490, 195, 800, 195);
102107 backLabel.Draw(target, 800, 156, sago::SagoTextField::Alignment::center, sago::SagoTextField::VerticalAlignment::bottom);
103108 SDL_RenderDrawLine(target, 625, 241, 900, 241);
104109 SDL_RenderDrawLine(target, 663, 207, 900, 207);
289289 }
290290 }
291291 if (event.type == SDL_CONTROLLERBUTTONDOWN) {
292 if (event.cbutton.button == SDL_CONTROLLER_BUTTON_Y ) {
292 if (event.cbutton.button == SDL_CONTROLLER_BUTTON_Y || event.cbutton.button == SDL_CONTROLLER_BUTTON_BACK ) {
293293 return true;
294294 }
295295 }
257257 return true;
258258 }
259259 }
260 if (event.type == SDL_CONTROLLERAXISMOTION && (event.caxis.axis == SDL_CONTROLLER_AXIS_TRIGGERLEFT || event.caxis.axis == SDL_CONTROLLER_AXIS_TRIGGERRIGHT ) ) {
261 checkDeadZone(event);
262 const SDL_ControllerAxisEvent& a = event.caxis;
263 if (getDeadZone(a.which, a.axis)) {
264 if (event.caxis.value > deadZoneLimit) {
265 setDeadZone(a.which,a.axis,false);
266 return true;
267 }
268 }
269 }
260270 return false;
261271 }
108108 PHYSFS_mkdir("screenshots");
109109 PHYSFS_mkdir("replays");
110110 PHYSFS_mkdir("puzzles");
111 }
112
113 static void setGameOverFont(const sago::SagoDataHolder* holder, sago::SagoTextBox& field, const char* text) {
114 field.SetHolder(holder);
115 field.SetFont("freeserif");
116 field.SetColor({0,0,255,255});
117 field.SetFontSize(60);
118 field.SetOutline(3, {192,192,255,255});
119 field.SetMaxWidth(280);
120 field.SetText(text);
111121 }
112122
113123 //Load all image files to memory
143153 counter[0] = holder.GetSprite("counter_1");
144154 counter[1] = holder.GetSprite("counter_2");
145155 counter[2] = holder.GetSprite("counter_3");
146 iGameOver = holder.GetSprite("i_game_over");
147 iWinner = holder.GetSprite("i_winner");
148 iDraw = holder.GetSprite("i_draw");
149 iLoser = holder.GetSprite("i_loser");
156 setGameOverFont(&holder.GetDataHolder(),tbGameOver, _("GAME OVER"));
157 setGameOverFont(&holder.GetDataHolder(),tbWinner, _("WINNER"));
158 setGameOverFont(&holder.GetDataHolder(),tbDraw, _("DRAW"));
150159 iChainFrame = holder.GetSprite("chain_frame");
151160 globalData.iLevelCheck = holder.GetSprite("i_level_check");
152161 globalData.iLevelCheckBox = holder.GetSprite("i_level_check_box");
321330 }
322331
323332 //Function to return the name of a key, to be displayed...
324 static string getKeyName(SDL_Keycode key) {
325 string keyname(SDL_GetKeyName(key));
326 return keyname;
327 }
333 string getKeyName(SDL_Keycode key);
328334
329335
330336 void RunGameState(sago::GameStateInterface& state ) {
9971003 Config* configSettings = Config::getInstance();
9981004 //configSettings->setString("aNumber"," A string");
9991005 //configSettings->save();
1006 int screenHeight = 768;
10001007 if (configSettings->exists("fullscreen")) { //Test if an configFile exists
10011008 globalData.bFullscreen = (bool)configSettings->getInt("fullscreen");
10021009 globalData.MusicEnabled = (bool)configSettings->getInt("musicenabled");
10501057 }
10511058 if (configSettings->exists("ysize")) {
10521059 globalData.ysize = configSettings->getInt("ysize");
1060 }
1061 if (configSettings->exists("screenHeight")) {
1062 screenHeight = configSettings->getInt("screenHeight");
10531063 }
10541064 if (globalData.verboseLevel) {
10551065 cout << "Data loaded from config file" << "\n";
10711081 sdlWindow = SDL_CreateWindow("Block Attack - Rise of the Blocks " VERSION_NUMBER,
10721082 SDL_WINDOWPOS_UNDEFINED,
10731083 SDL_WINDOWPOS_UNDEFINED,
1074 globalData.xsize, globalData.ysize,
1084 (screenHeight)*4/3, screenHeight,
10751085 createWindowParams );
10761086 dieOnNullptr(sdlWindow, "Unable to create window");
10771087 int rendererFlags = 0;
11601170
11611171 configSettings->setString("player1name", globalData.player1name);
11621172 configSettings->setString("player2name", globalData.player2name);
1163 if (!config.autoScale) {
1164 //autoScale is always equal the logical size, so it makes no sense to save it
1165 configSettings->setInt("xsize", globalData.xsize);
1166 configSettings->setInt("ysize", globalData.ysize);
1173 {
1174 //Store physical height of window
1175 int height = 0;
1176 SDL_GetWindowSize(sdlWindow, nullptr, &height);
1177 configSettings->setInt("screenHeight", height);
11671178 }
11681179 configSettings->save();
11691180 }
13281339
13291340 if (theGame.isGameOver() && isEscapeEvent(event)) {
13301341 done = 1;
1342 }
1343
1344 if (event.type == SDL_CONTROLLERBUTTONDOWN) {
1345 if ( event.cbutton.button == SDL_CONTROLLER_BUTTON_BACK ) {
1346 done=1;
1347 DrawBackground(globalData.screen);
1348 }
13311349 }
13321350
13331351 if ( event.type == SDL_KEYDOWN ) {
2727 #include "sago/SagoSprite.hpp"
2828 #include "BlockGame.hpp"
2929 #include "sago/SagoTextField.hpp"
30 #include "sago/SagoTextBox.hpp"
3031
3132
3233 //main variables and constants
5657 static sago::SagoSprite blackLine; //The seperator in stage clear
5758 static sago::SagoSprite stageBobble; //The bobble instage clear
5859 SDL_Renderer *screen; //The whole screen;
59 static sago::SagoSprite iGameOver; //The gameOver image
60 static sago::SagoSprite iWinner; //the "winner" image
61 static sago::SagoSprite iDraw; //the "draw" image
62 static sago::SagoSprite iLoser; //the "loser" image
60 static sago::SagoTextBox tbGameOver;
61 static sago::SagoTextBox tbWinner;
62 static sago::SagoTextBox tbDraw;
6363 static sago::SagoSprite iChainFrame;
6464 //Animations:
6565 static sago::SagoSprite cursor; //The animated cursor
5555 extern control keySettings[3];
5656
5757 //Function to return the name of a key, to be displayed...
58 static string getKeyName(SDL_Keycode key) {
58 string getKeyName(SDL_Keycode key) {
5959 string keyname(SDL_GetKeyName(key));
60 if (key == SDLK_UP) {
61 keyname = _("Up arrow");
62 }
63 if (key == SDLK_DOWN) {
64 keyname = _("Down arrow");
65 }
66 if (key == SDLK_LEFT) {
67 keyname = _("Left arrow");
68 }
69 if (key == SDLK_RIGHT) {
70 keyname = _("Right arrow");
71 }
72 if (key == SDLK_RCTRL) {
73 keyname = _("Right Ctrl");
74 }
75 if (key == SDLK_LCTRL) {
76 keyname = _("Left Ctrl");
77 }
78 if (key == SDLK_RSHIFT) {
79 keyname = _("Right shift");
80 }
81 if (key == SDLK_LSHIFT) {
82 keyname = _("Left shift");
83 }
84 if (key == SDLK_RALT) {
85 keyname = _("Right alt");
86 }
87 if (key == SDLK_LALT) {
88 keyname = _("Left alt");
89 }
90 if (key == SDLK_RETURN) {
91 keyname = _("Return");
92 }
93 if (key == SDLK_SPACE) {
94 keyname = _("Space");
95 }
6096 if (globalData.verboseLevel) {
6197 cout << key << " translated to " << keyname << "\n";
6298 }
177177 data->renderedText = data->text;
178178 }
179179
180 void SagoTextBox::Draw(SDL_Renderer* target, int x, int y) {
180 void SagoTextBox::Draw(SDL_Renderer* target, int x, int y, SagoTextField::Alignment alignment ) {
181181 if (data->text != data->renderedText) {
182182 UpdateCache();
183183 }
184184 TTF_Font *font = data->tex->getFontPtr(data->fontName, data->fontSize);
185185 int lineSkip = TTF_FontLineSkip(font);
186186 for (size_t i = 0; i < data->lines.size(); ++i) {
187 data->lines[i].Draw(target, x, y+i*lineSkip);
187 data->lines[i].Draw(target, x, y+i*lineSkip, alignment);
188188 }
189189 }
190190
5555 */
5656 void SetMaxWidth(int width);
5757 const std::string& GetText() const;
58 void Draw(SDL_Renderer* target, int x, int y);
58 void Draw(SDL_Renderer* target, int x, int y, SagoTextField::Alignment alignment = SagoTextField::Alignment::left);
5959 void UpdateCache();
6060 private:
6161 void AppendLineToCache(const std::string& text);
2929 #include <iostream>
3030 #include <stdexcept>
3131 #include <string.h>
32 #include <stdio.h>
32 #include <cstdio>
3333 #include <cstdlib>
3434
3535 #if defined(_WIN32)
3636 #include <windows.h>
3737 #include <shlobj.h>
3838
39 #define strtok_r strtok_s
40
41 static std::string win32_utf16_to_utf8(const wchar_t* wstr)
42 {
39 static std::string win32_utf16_to_utf8(const wchar_t* wstr) {
4340 std::string res;
4441 // If the 6th parameter is 0 then WideCharToMultiByte returns the number of bytes needed to store the result.
4542 int actualSize = WideCharToMultiByte(CP_UTF8, 0, wstr, -1, NULL, 0, NULL, NULL);
5148 }
5249 if (actualSize == 0) {
5350 // WideCharToMultiByte return 0 for errors.
54 std::string errorMsg = "UTF16 to UTF8 failed with error code: " + GetLastError();
51 const std::string errorMsg = "UTF16 to UTF8 failed with error code: " + GetLastError();
5552 throw std::runtime_error(errorMsg.c_str());
5653 }
5754 return res;
6057 static std::string GetWindowsFolder(int folderId, const char* errorMsg) {
6158 wchar_t szPath[MAX_PATH];
6259 szPath[0] = 0;
63 if ( !SUCCEEDED( SHGetFolderPathW( NULL, folderId, NULL, 0, szPath ) ) )
64 {
60 if ( !SUCCEEDED( SHGetFolderPathW( NULL, folderId, NULL, 0, szPath ) ) ) {
6561 throw std::runtime_error(errorMsg);
6662 }
6763 return win32_utf16_to_utf8(szPath);
10096 #include <pwd.h>
10197 #include <unistd.h>
10298 #include <sys/types.h>
99 // For strlen and strtok
100 #include <cstring>
103101 //Typically Linux. For easy reading the comments will just say Linux but should work with most *nixes
104102
105103 static void throwOnRelative(const char* envName, const char* envValue) {
106104 if (envValue[0] != '/') {
107105 char buffer[200];
108 snprintf(buffer, sizeof(buffer), "Environment \"%s\" does not start with an '/'. XDG specifies that the value must be absolute. The current value is: \"%s\"", envName, envValue);
106 std::snprintf(buffer, sizeof(buffer), "Environment \"%s\" does not start with an '/'. XDG specifies that the value must be absolute. The current value is: \"%s\"", envName, envValue);
109107 throw std::runtime_error(buffer);
110108 }
111109 }
119117 static std::string getHome() {
120118 std::string res;
121119 int uid = getuid();
122 const char* homeEnv = getenv("HOME");
120 const char* homeEnv = std::getenv("HOME");
123121 if ( uid != 0 && homeEnv) {
124122 //We only acknowlegde HOME if not root.
125123 res = homeEnv;
126124 return res;
127125 }
128 struct passwd *pw = getpwuid(uid);
126 struct passwd* pw = getpwuid(uid);
129127 if (!pw) {
130128 throw std::runtime_error("Unable to get passwd struct.");
131129 }
139137
140138 static std::string getLinuxFolderDefault(const char* envName, const char* defaultRelativePath) {
141139 std::string res;
142 const char* tempRes = getenv(envName);
140 const char* tempRes = std::getenv(envName);
143141 if (tempRes) {
144142 throwOnRelative(envName, tempRes);
145143 res = tempRes;
150148 }
151149
152150 static void appendExtraFoldersTokenizer(const char* envName, const char* envValue, std::vector<std::string>& folders) {
153 std::vector<char> buffer(envValue, envValue + strlen(envValue) + 1);
154 char *saveptr;
155 const char* p = strtok_r ( &buffer[0], ":", &saveptr);
151 std::vector<char> buffer(envValue, envValue + std::strlen(envValue) + 1);
152 char* p = std::strtok ( &buffer[0], ":");
156153 while (p != NULL) {
157154 if (p[0] == '/') {
158155 folders.push_back(p);
162159 //The XDG documentation indicates that the folder should be ignored but that the program should continue.
163160 std::cerr << "Skipping path \"" << p << "\" in \"" << envName << "\" because it does not start with a \"/\"\n";
164161 }
165 p = strtok_r (NULL, ":", &saveptr);
162 p = std::strtok (NULL, ":");
166163 }
167164 }
168165
169166 static void appendExtraFolders(const char* envName, const char* defaultValue, std::vector<std::string>& folders) {
170 const char* envValue = getenv(envName);
167 const char* envValue = std::getenv(envName);
171168 if (!envValue) {
172169 envValue = defaultValue;
173170 }
205202 #elif defined(__APPLE__)
206203 return GetMacFolder(kCachedDataFolderType, "Failed to find the Application Support Folder");
207204 #else
208 return getLinuxFolderDefault("XDG_CONFIG_HOME", ".cache");
205 return getLinuxFolderDefault("XDG_CACHE_HOME", ".cache");
209206 #endif
210207 }
211208
238235 std::ifstream infile(filename.c_str());
239236 std::string line;
240237 while (std::getline(infile, line)) {
241 if (line.length() == 0 || line.at(0) == '#') {
238 if (line.length() == 0 || line.at(0) == '#' || line.substr(0, 4) != "XDG_" || line.find("_DIR") == std::string::npos) {
242239 continue;
243240 }
244 std::size_t splitPos = line.find("=");
245 std::string key = line.substr(0, splitPos);
246 std::string value = line.substr(splitPos+2, line.length()-splitPos-3);
247 folders[key] = value;
248 //std::cout << key << " : " << value << "\n";
241 try {
242 std::size_t splitPos = line.find('=');
243 std::string key = line.substr(0, splitPos);
244 std::size_t valueStart = line.find('"', splitPos);
245 std::size_t valueEnd = line.find('"', valueStart+1);
246 std::string value = line.substr(valueStart+1, valueEnd - valueStart - 1);
247 folders[key] = value;
248 } catch (std::exception& e) {
249 std::cerr << "WARNING: Failed to process \"" << line << "\" from \"" << filename << "\". Error: "<< e.what() << "\n";
250 continue;
251 }
249252 }
250253 }
251254
275278 this->data = new PlatformFolders::PlatformFoldersData();
276279 try {
277280 PlatformFoldersFillData(data->folders);
278 } catch (...) {
281 }
282 catch (...) {
279283 delete this->data;
280284 throw;
281285 }
363367 #endif
364368 }
365369
370 std::string getDesktopFolder() {
371 return PlatformFolders().getDesktopFolder();
372 }
373
374 std::string getDocumentsFolder() {
375 return PlatformFolders().getDocumentsFolder();
376 }
377
378 std::string getDownloadFolder1() {
379 return PlatformFolders().getDownloadFolder1();
380 }
381
382 std::string getPicturesFolder() {
383 return PlatformFolders().getPicturesFolder();
384 }
385
386 std::string getMusicFolder() {
387 return PlatformFolders().getMusicFolder();
388 }
389
390 std::string getVideoFolder() {
391 return PlatformFolders().getVideoFolder();
392 }
393
394 std::string getSaveGamesFolder1() {
395 return PlatformFolders().getSaveGamesFolder1();
396 }
366397
367398
368399 } //namespace sago
4747 * @return The base folder for storring program data.
4848 */
4949 std::string getDataHome();
50
5051 /**
5152 * Retrives the base folder for storring config files.
5253 * You must add the program name yourself like this:
5859 * @return The base folder for storring config data.
5960 */
6061 std::string getConfigHome();
62
6163 /**
6264 * Retrives the base folder for storring cache files.
6365 * You must add the program name yourself like this:
6971 * @return The base folder for storring data that do not need to be backed up.
7072 */
7173 std::string getCacheDir();
74
7275 /**
7376 * This will append extra folders that your program should be looking for data files in.
7477 * This does not normally include the path returned by GetDataHome().
8689 * @param homes A vector that extra folders will be appended to.
8790 */
8891 void appendAdditionalDataDirectories(std::vector<std::string>& homes);
92
8993 /**
9094 * This will append extra folders that your program should be looking for config files in.
9195 * This does not normally include the path returned by GetConfigHome().
103107 * @param homes A vector that extra folders will be appended to.
104108 */
105109 void appendAdditionalConfigDirectories(std::vector<std::string>& homes);
110
111 /**
112 * The folder that represents the desktop.
113 * Normally you should try not to use this folder.
114 * @return Absolute path to the user's desktop
115 */
116 std::string getDesktopFolder();
117
118 /**
119 * The folder to store user documents to
120 * @return Absolute path to the "Documents" folder
121 */
122 std::string getDocumentsFolder();
123
124 /**
125 * The folder where files are downloaded.
126 * @note Windows: This version is XP compatible and returns the Desktop. Vista and later has a dedicated folder.
127 * @return Absolute path to the folder where files are downloaded to.
128 */
129 std::string getDownloadFolder1();
130
131 /**
132 * The folder for storring the user's pictures.
133 * @return Absolute path to the "Picture" folder
134 */
135 std::string getPicturesFolder();
136
137 /**
138 * The folder where music is stored
139 * @return Absolute path to the music folder
140 */
141 std::string getMusicFolder();
142
143 /**
144 * The folder where video is stored
145 * @return Absolute path to the video folder
146 */
147 std::string getVideoFolder();
148
149 /**
150 * The base folder for storring saved games.
151 * You must add the program name to it like this:
152 * @code{.cpp}
153 * string saved_games_folder = sago::getSaveGamesFolder1()+"/My Program Name/";
154 * @endcode
155 * @note Windows: This is an XP compatible version and returns the path to "My Games" in Documents. Vista and later has an official folder.
156 * @note Linux: XDF does not define a folder for saved games. This will just return the same as GetDataHome()
157 * @return The folder base folder for storring save games.
158 */
159 std::string getSaveGamesFolder1();
160
161 #ifndef DOXYGEN_SHOULD_SKIP_THIS
106162
107163 /**
108164 * This class contains methods for finding the system depended special folders.
165221 #elif defined(__APPLE__)
166222 #else
167223 struct PlatformFoldersData;
168 PlatformFoldersData *data;
224 PlatformFoldersData* data;
169225 #endif
170226 };
171227
228 #endif // skip doxygen
229
230
172231 } //namespace sago
173232
174233 #endif /* PLATFORM_FOLDERS_H */
2121 */
2222
2323 #ifndef VERSION_NUMBER
24 #define VERSION_NUMBER "2.2.0"
24 #define VERSION_NUMBER "2.3.0"
2525 #endif
1414
1515 COPY . /staging/blockattack-game
1616
17 ENV BLOCKATTACK_VERSION 2.2.0
17 ENV BLOCKATTACK_VERSION 2.3.0
1818
1919 RUN cd /staging/blockattack-game && \
2020 ./packdata.sh && \
1515
1616 COPY . /staging/blockattack-game
1717
18 ENV BLOCKATTACK_VERSION 2.2.0
18 ENV BLOCKATTACK_VERSION 2.3.0
1919
2020 RUN cd /staging/blockattack-game && \
2121 ./packdata.sh && \
55
66 COPY . /staging/blockattack-game
77
8 ENV BLOCKATTACK_VERSION 2.2.0
8 ENV BLOCKATTACK_VERSION 2.3.0
99
1010 RUN cd /staging/blockattack-game && \
1111 ./packdata.sh && \
66
77 COPY . /staging/blockattack-game
88
9 ENV BLOCKATTACK_VERSION 2.2.0
9 ENV BLOCKATTACK_VERSION 2.3.0
1010
1111 RUN cd /staging/blockattack-game && \
1212 ./packdata.sh && \
66
77 COPY . /staging/blockattack-game
88
9 ENV BLOCKATTACK_VERSION 2.2.0
9 ENV BLOCKATTACK_VERSION 2.3.0
1010
1111 RUN cd /staging/blockattack-game && \
1212 ./packdata.sh && \
77
88 COPY . /staging/blockattack-game
99
10 ENV BLOCKATTACK_VERSION 2.2.0
10 ENV BLOCKATTACK_VERSION 2.3.0
1111
1212 RUN cd /staging/blockattack-game && \
1313 ./packdata.sh && \
4646 scp -r . blockattack_build:/staging/blockattack-game
4747 ssh blockattack_build rm -f /staging/blockattack-game/CMakeCache.txt
4848
49 ssh blockattack_build "BLOCKATTACK_VERSION=2.2.0 && cd /staging/blockattack-game && \
49 ssh blockattack_build "BLOCKATTACK_VERSION=2.2.0-SNAPSHOT && cd /staging/blockattack-game && \
5050 ./packdata.sh && \
5151 cp source/misc/travis_help/utf8_v2_3_4/source/utf8.h source/code/ && \
5252 cp source/misc/travis_help/utf8_v2_3_4/source/utf8.h source/code/sago/ && \
66 msgstr ""
77 "Project-Id-Version: \n"
88 "Report-Msgid-Bugs-To: \n"
9 "POT-Creation-Date: 2018-05-19 18:29+0200\n"
10 "PO-Revision-Date: 2018-05-19 18:30+0200\n"
9 "POT-Creation-Date: 2018-06-30 14:36+0200\n"
10 "PO-Revision-Date: 2018-06-30 14:37+0200\n"
1111 "Last-Translator: \n"
1212 "Language-Team: \n"
1313 "Language: da\n"
6161 msgid "Locale:"
6262 msgstr "Lokalitet:"
6363
64 #: ../../code/HelpAboutState.cpp:70 ../../code/menudef.cpp:309
64 #: ../../code/HelpAboutState.cpp:70 ../../code/menudef.cpp:345
6565 msgid "About"
6666 msgstr "Om"
6767
141141 msgid "Total score: %i in %i:%02i"
142142 msgstr "Sammenlagt: %i på %i:%02i"
143143
144 #: ../../code/main.cpp:452 ../../code/main.cpp:583
144 #: ../../code/main.cpp:157
145 msgid "GAME OVER"
146 msgstr "SPILLET ER SLUT"
147
148 #: ../../code/main.cpp:158
149 msgid "WINNER"
150 msgstr "VINDER"
151
152 #: ../../code/main.cpp:159
153 msgid "DRAW"
154 msgstr "UAFGJORT"
155
156 #: ../../code/main.cpp:458 ../../code/main.cpp:589
145157 msgid "AI"
146158 msgstr "Computer"
147159
148 #: ../../code/main.cpp:455
160 #: ../../code/main.cpp:461
149161 msgid "Playing field"
150162 msgstr "Spilleflade"
151163
152 #: ../../code/main.cpp:529
164 #: ../../code/main.cpp:535
153165 msgid "Time Trial"
154166 msgstr "På tid"
155167
156 #: ../../code/main.cpp:530
168 #: ../../code/main.cpp:536
157169 msgid "Score as much as possible in 2 minutes"
158170 msgstr "Se hvor mange point du kan opnå på 2 minutter"
159171
160 #: ../../code/main.cpp:534
172 #: ../../code/main.cpp:540
161173 msgid "Stage Clear"
162174 msgstr "Stage Clear"
163175
164 #: ../../code/main.cpp:535
176 #: ../../code/main.cpp:541
165177 msgid "You must clear a number of lines. Speed is rapidly increased."
166178 msgstr "Fjern et specifik antal linjer. Hastigheden stiger hurtigt."
167179
168 #: ../../code/main.cpp:538
180 #: ../../code/main.cpp:544
169181 msgid "Puzzle"
170182 msgstr "Gåde"
171183
172 #: ../../code/main.cpp:539
184 #: ../../code/main.cpp:545
173185 msgid "Clear the entire board with a limited number of moves."
174186 msgstr "Fjern alle blokke med et begrænset antal flyt."
175187
176 #: ../../code/main.cpp:542
188 #: ../../code/main.cpp:548
177189 msgid "Endless"
178190 msgstr "Evighed"
179191
180 #: ../../code/main.cpp:543
192 #: ../../code/main.cpp:549
181193 msgid "Score as much as possible. No time limit."
182194 msgstr "Opnå så mange point som muligt. Ingen tidsbegrænsning."
183195
184 #: ../../code/main.cpp:553
196 #: ../../code/main.cpp:559
185197 msgid "Objective:"
186198 msgstr "Formål:"
187199
188 #: ../../code/main.cpp:563
200 #: ../../code/main.cpp:569
189201 msgid "Movement keys:"
190202 msgstr "Bevægelsestaster:"
191203
192 #: ../../code/main.cpp:565
204 #: ../../code/main.cpp:571
193205 msgid "Switch: "
194206 msgstr "Skift: "
195207
196 #: ../../code/main.cpp:567
208 #: ../../code/main.cpp:573
197209 msgid "Restart: "
198210 msgstr "Genstart: "
199211
200 #: ../../code/main.cpp:570
212 #: ../../code/main.cpp:576
201213 msgid "Push line: "
202214 msgstr "Skub linje: "
203215
204 #: ../../code/main.cpp:995
216 #: ../../code/main.cpp:1001
205217 msgid "Player 1"
206218 msgstr "Spiller 1"
207219
208 #: ../../code/main.cpp:996
220 #: ../../code/main.cpp:1002
209221 msgid "Player 2"
210222 msgstr "Spiller 2"
211223
212 #: ../../code/menudef.cpp:138 ../../code/menudef.cpp:206
224 #: ../../code/menudef.cpp:62
225 msgid "Up arrow"
226 msgstr "Pil op"
227
228 #: ../../code/menudef.cpp:65
229 msgid "Down arrow"
230 msgstr "Pil ned"
231
232 #: ../../code/menudef.cpp:68
233 msgid "Left arrow"
234 msgstr "Pil venstre"
235
236 #: ../../code/menudef.cpp:71
237 msgid "Right arrow"
238 msgstr "Pil højre"
239
240 #: ../../code/menudef.cpp:74
241 msgid "Right Ctrl"
242 msgstr "Højre Ctrl"
243
244 #: ../../code/menudef.cpp:77
245 msgid "Left Ctrl"
246 msgstr "Venstre Ctrl"
247
248 #: ../../code/menudef.cpp:80
249 msgid "Right shift"
250 msgstr "Højre skift"
251
252 #: ../../code/menudef.cpp:83
253 msgid "Left shift"
254 msgstr "Venstre skift"
255
256 #: ../../code/menudef.cpp:86
257 msgid "Right alt"
258 msgstr "AltGr"
259
260 #: ../../code/menudef.cpp:89
261 msgid "Left alt"
262 msgstr "Alt"
263
264 #: ../../code/menudef.cpp:92
265 msgid "Return"
266 msgstr "Enter"
267
268 #: ../../code/menudef.cpp:95
269 msgid "Space"
270 msgstr ""
271
272 #: ../../code/menudef.cpp:174 ../../code/menudef.cpp:242
213273 msgid "Music: On"
214274 msgstr "Musik: Til"
215275
216 #: ../../code/menudef.cpp:138 ../../code/menudef.cpp:206
276 #: ../../code/menudef.cpp:174 ../../code/menudef.cpp:242
217277 msgid "Music: Off"
218278 msgstr "Musik: Fra"
219279
220 #: ../../code/menudef.cpp:146 ../../code/menudef.cpp:207
280 #: ../../code/menudef.cpp:182 ../../code/menudef.cpp:243
221281 msgid "Sound: On"
222282 msgstr "Lyd: Til"
223283
224 #: ../../code/menudef.cpp:146 ../../code/menudef.cpp:207
284 #: ../../code/menudef.cpp:182 ../../code/menudef.cpp:243
225285 msgid "Sound: Off"
226286 msgstr "Lyd: Fra"
227287
228 #: ../../code/menudef.cpp:153 ../../code/menudef.cpp:208
288 #: ../../code/menudef.cpp:189 ../../code/menudef.cpp:244
229289 msgid "Fullscreen: On"
230290 msgstr "Fuldskærm: Til"
231291
232 #: ../../code/menudef.cpp:153 ../../code/menudef.cpp:208
292 #: ../../code/menudef.cpp:189 ../../code/menudef.cpp:244
233293 msgid "Fullscreen: Off"
234294 msgstr "Fuldskærm: Fra"
235295
236 #: ../../code/menudef.cpp:159
296 #: ../../code/menudef.cpp:195
237297 msgid "Enter player 1 name:"
238298 msgstr "Indtast navnet på spiller 1:"
239299
240 #: ../../code/menudef.cpp:165
300 #: ../../code/menudef.cpp:201
241301 msgid "Enter player 2 name:"
242302 msgstr "Indtast navnet på spiller 2:"
243303
244 #: ../../code/menudef.cpp:175
304 #: ../../code/menudef.cpp:211
245305 msgid "Change key bindings"
246306 msgstr "Skift taster"
247307
248 #: ../../code/menudef.cpp:176
308 #: ../../code/menudef.cpp:212
249309 msgid "Left"
250310 msgstr "Venstre"
251311
252 #: ../../code/menudef.cpp:177
312 #: ../../code/menudef.cpp:213
253313 msgid "Right"
254314 msgstr "Højre"
255315
256 #: ../../code/menudef.cpp:178
316 #: ../../code/menudef.cpp:214
257317 msgid "Up"
258318 msgstr "Op"
259319
260 #: ../../code/menudef.cpp:179
320 #: ../../code/menudef.cpp:215
261321 msgid "Down"
262322 msgstr "Ned"
263323
264 #: ../../code/menudef.cpp:180
324 #: ../../code/menudef.cpp:216
265325 msgid "Push"
266326 msgstr "Skub"
267327
268 #: ../../code/menudef.cpp:181
328 #: ../../code/menudef.cpp:217
269329 msgid "Change"
270330 msgstr "Skift"
271331
272 #: ../../code/menudef.cpp:200
332 #: ../../code/menudef.cpp:236
273333 msgid "Configuration"
274334 msgstr "Konfiguration"
275335
276 #: ../../code/menudef.cpp:210
336 #: ../../code/menudef.cpp:246
277337 msgid "Change player 1's name"
278338 msgstr "Skift navn på spiller 1"
279339
280 #: ../../code/menudef.cpp:212
340 #: ../../code/menudef.cpp:248
281341 msgid "Change player 2's name"
282342 msgstr "Skift navn på spiller 2"
283343
284 #: ../../code/menudef.cpp:214
344 #: ../../code/menudef.cpp:250
285345 msgid "Change player 1's keys"
286346 msgstr "Tildel taster til spiller 1"
287347
288 #: ../../code/menudef.cpp:216
348 #: ../../code/menudef.cpp:252
289349 msgid "Change player 2's keys"
290350 msgstr "Tildel taster til spiller 2"
291351
292 #: ../../code/menudef.cpp:228
352 #: ../../code/menudef.cpp:264
293353 msgid "Single player VS"
294354 msgstr "En spiller - VS"
295355
296 #: ../../code/menudef.cpp:244
356 #: ../../code/menudef.cpp:280
297357 msgid "Very easy"
298358 msgstr "Meget let"
299359
300 #: ../../code/menudef.cpp:245
360 #: ../../code/menudef.cpp:281
301361 msgid "Easy"
302362 msgstr "Let"
303363
304 #: ../../code/menudef.cpp:246
364 #: ../../code/menudef.cpp:282
305365 msgid "Below normal"
306366 msgstr "Under normal"
307367
308 #: ../../code/menudef.cpp:247
368 #: ../../code/menudef.cpp:283
309369 msgid "Normal"
310370 msgstr "Normal"
311371
312 #: ../../code/menudef.cpp:248
372 #: ../../code/menudef.cpp:284
313373 msgid "Above normal"
314374 msgstr "Over normal"
315375
316 #: ../../code/menudef.cpp:249
376 #: ../../code/menudef.cpp:285
317377 msgid "Hard"
318378 msgstr "Svær"
319379
320 #: ../../code/menudef.cpp:250
380 #: ../../code/menudef.cpp:286
321381 msgid "Hardest"
322382 msgstr "Meget svær"
323383
324 #: ../../code/menudef.cpp:262
384 #: ../../code/menudef.cpp:298
325385 msgid "Multiplayer"
326386 msgstr "Flerspiller"
327387
328 #: ../../code/menudef.cpp:264
388 #: ../../code/menudef.cpp:300
329389 msgid "Two player - time trial"
330390 msgstr "To spillere - På tid"
331391
332 #: ../../code/menudef.cpp:266
392 #: ../../code/menudef.cpp:302
333393 msgid "Two player - vs"
334394 msgstr "To spillere - VS"
335395
336 #: ../../code/menudef.cpp:290 ../../code/menudef.cpp:305
396 #: ../../code/menudef.cpp:326 ../../code/menudef.cpp:341
337397 msgid "Credits"
338398 msgstr "Bidragydere"
339399
340 #: ../../code/menudef.cpp:295 ../../code/menudef.cpp:348
400 #: ../../code/menudef.cpp:331 ../../code/menudef.cpp:384
341401 msgid "Help"
342402 msgstr "Hjælp"
343403
344 #: ../../code/menudef.cpp:297
404 #: ../../code/menudef.cpp:333
345405 msgid "How to"
346406 msgstr "Guide"
347407
348 #: ../../code/menudef.cpp:301
408 #: ../../code/menudef.cpp:337
349409 msgid "Gamepad"
350410 msgstr "Spilkontroller"
351411
352 #: ../../code/menudef.cpp:316 ../../code/menudef.cpp:340
412 #: ../../code/menudef.cpp:352 ../../code/menudef.cpp:376
353413 msgid "Single player"
354414 msgstr "Enkeltspiller"
355415
356 #: ../../code/menudef.cpp:318
416 #: ../../code/menudef.cpp:354
357417 msgid "Single player - endless"
358418 msgstr "En spiller - Evighed"
359419
360 #: ../../code/menudef.cpp:320
420 #: ../../code/menudef.cpp:356
361421 msgid "Single player - time trial"
362422 msgstr "En spiller - På tid"
363423
364 #: ../../code/menudef.cpp:322
424 #: ../../code/menudef.cpp:358
365425 msgid "Single player - stage clear"
366426 msgstr "En spiller - Stage Clear"
367427
368 #: ../../code/menudef.cpp:324
428 #: ../../code/menudef.cpp:360
369429 msgid "Single player - puzzle mode"
370430 msgstr "En spiller - Gåde"
371431
372 #: ../../code/menudef.cpp:326
432 #: ../../code/menudef.cpp:362
373433 msgid "Single player - vs"
374434 msgstr "En spiller - VS"
375435
376 #: ../../code/menudef.cpp:338
436 #: ../../code/menudef.cpp:374
377437 msgid "Block Attack - Rise of the blocks"
378438 msgstr "Block Attack - Blokkenes opstand"
379439
380 #: ../../code/menudef.cpp:342
440 #: ../../code/menudef.cpp:378
381441 msgid "Multi player"
382442 msgstr "Flere spillere"
383443
384 #: ../../code/menudef.cpp:344
444 #: ../../code/menudef.cpp:380
385445 msgid "Configure"
386446 msgstr "Instillinger"
387447
388 #: ../../code/menudef.cpp:346
448 #: ../../code/menudef.cpp:382
389449 msgid "Highscores"
390450 msgstr "Bedste resultater"
391451
454514 msgid "VS CPU (win/loss)"
455515 msgstr "Mod computeren (vundet/tabt)"
456516
457 #: ../../code/ScoresDisplay.cpp:188 ../../code/BlockGameSdl.inc:54
517 #: ../../code/ScoresDisplay.cpp:188 ../../code/BlockGameSdl.inc:55
458518 msgid "Next"
459519 msgstr "Næste"
460520
463523 msgid "Page %i of %i"
464524 msgstr "Side %i af %i"
465525
466 #: ../../code/BlockGameSdl.inc:50
526 #: ../../code/BlockGameSdl.inc:51
467527 msgid "Score:"
468528 msgstr "Resultat:"
469529
470 #: ../../code/BlockGameSdl.inc:51
530 #: ../../code/BlockGameSdl.inc:52
471531 msgid "Time:"
472532 msgstr "Tid:"
473533
474 #: ../../code/BlockGameSdl.inc:52
534 #: ../../code/BlockGameSdl.inc:53
475535 msgid "Chain:"
476536 msgstr "Kæde:"
477537
478 #: ../../code/BlockGameSdl.inc:53
538 #: ../../code/BlockGameSdl.inc:54
479539 msgid "Speed:"
480540 msgstr "Hastighed:"
481541
482 #: ../../code/BlockGameSdl.inc:55
542 #: ../../code/BlockGameSdl.inc:56
483543 msgid "Retry"
484544 msgstr "Prøv igen"
485545
486 #: ../../code/BlockGameSdl.inc:56
546 #: ../../code/BlockGameSdl.inc:57
487547 msgid "Skip"
488548 msgstr "Spring over"
489549
490 #: ../../code/BlockGameSdl.inc:327
550 #: ../../code/BlockGameSdl.inc:328
491551 msgid "Moves left: "
492552 msgstr "Træk tilbage: "
493553
494 #: ../../code/BlockGameSdl.inc:350
554 #: ../../code/BlockGameSdl.inc:351
495555 msgid "Last puzzle"
496556 msgstr "Sidste gåde"
497557
498 #: ../../code/BlockGameSdl.inc:370
558 #: ../../code/BlockGameSdl.inc:371
499559 msgid "Last stage"
500560 msgstr "Sidste bane"
501561
77 msgstr ""
88 "Project-Id-Version: PACKAGE VERSION\n"
99 "Report-Msgid-Bugs-To: \n"
10 "POT-Creation-Date: 2018-05-19 18:29+0200\n"
10 "POT-Creation-Date: 2018-06-30 14:36+0200\n"
1111 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
1212 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
1313 "Language-Team: LANGUAGE <LL@li.org>\n"
6060 msgid "Locale:"
6161 msgstr ""
6262
63 #: ../../code/HelpAboutState.cpp:70 ../../code/menudef.cpp:309
63 #: ../../code/HelpAboutState.cpp:70 ../../code/menudef.cpp:345
6464 msgid "About"
6565 msgstr ""
6666
138138 msgid "Total score: %i in %i:%02i"
139139 msgstr ""
140140
141 #: ../../code/main.cpp:452 ../../code/main.cpp:583
141 #: ../../code/main.cpp:157
142 msgid "GAME OVER"
143 msgstr ""
144
145 #: ../../code/main.cpp:158
146 msgid "WINNER"
147 msgstr ""
148
149 #: ../../code/main.cpp:159
150 msgid "DRAW"
151 msgstr ""
152
153 #: ../../code/main.cpp:458 ../../code/main.cpp:589
142154 msgid "AI"
143155 msgstr ""
144156
145 #: ../../code/main.cpp:455
157 #: ../../code/main.cpp:461
146158 msgid "Playing field"
147159 msgstr ""
148160
149 #: ../../code/main.cpp:529
161 #: ../../code/main.cpp:535
150162 msgid "Time Trial"
151163 msgstr ""
152164
153 #: ../../code/main.cpp:530
165 #: ../../code/main.cpp:536
154166 msgid "Score as much as possible in 2 minutes"
155167 msgstr ""
156168
157 #: ../../code/main.cpp:534
169 #: ../../code/main.cpp:540
158170 msgid "Stage Clear"
159171 msgstr ""
160172
161 #: ../../code/main.cpp:535
173 #: ../../code/main.cpp:541
162174 msgid "You must clear a number of lines. Speed is rapidly increased."
163175 msgstr ""
164176
165 #: ../../code/main.cpp:538
177 #: ../../code/main.cpp:544
166178 msgid "Puzzle"
167179 msgstr ""
168180
169 #: ../../code/main.cpp:539
181 #: ../../code/main.cpp:545
170182 msgid "Clear the entire board with a limited number of moves."
171183 msgstr ""
172184
173 #: ../../code/main.cpp:542
185 #: ../../code/main.cpp:548
174186 msgid "Endless"
175187 msgstr ""
176188
177 #: ../../code/main.cpp:543
189 #: ../../code/main.cpp:549
178190 msgid "Score as much as possible. No time limit."
179191 msgstr ""
180192
181 #: ../../code/main.cpp:553
193 #: ../../code/main.cpp:559
182194 msgid "Objective:"
183195 msgstr ""
184196
185 #: ../../code/main.cpp:563
197 #: ../../code/main.cpp:569
186198 msgid "Movement keys:"
187199 msgstr ""
188200
189 #: ../../code/main.cpp:565
201 #: ../../code/main.cpp:571
190202 msgid "Switch: "
191203 msgstr ""
192204
193 #: ../../code/main.cpp:567
205 #: ../../code/main.cpp:573
194206 msgid "Restart: "
195207 msgstr ""
196208
197 #: ../../code/main.cpp:570
209 #: ../../code/main.cpp:576
198210 msgid "Push line: "
199211 msgstr ""
200212
201 #: ../../code/main.cpp:995
213 #: ../../code/main.cpp:1001
202214 msgid "Player 1"
203215 msgstr ""
204216
205 #: ../../code/main.cpp:996
217 #: ../../code/main.cpp:1002
206218 msgid "Player 2"
207219 msgstr ""
208220
209 #: ../../code/menudef.cpp:138 ../../code/menudef.cpp:206
221 #: ../../code/menudef.cpp:62
222 msgid "Up arrow"
223 msgstr ""
224
225 #: ../../code/menudef.cpp:65
226 msgid "Down arrow"
227 msgstr ""
228
229 #: ../../code/menudef.cpp:68
230 msgid "Left arrow"
231 msgstr ""
232
233 #: ../../code/menudef.cpp:71
234 msgid "Right arrow"
235 msgstr ""
236
237 #: ../../code/menudef.cpp:74
238 msgid "Right Ctrl"
239 msgstr ""
240
241 #: ../../code/menudef.cpp:77
242 msgid "Left Ctrl"
243 msgstr ""
244
245 #: ../../code/menudef.cpp:80
246 msgid "Right shift"
247 msgstr ""
248
249 #: ../../code/menudef.cpp:83
250 msgid "Left shift"
251 msgstr ""
252
253 #: ../../code/menudef.cpp:86
254 msgid "Right alt"
255 msgstr ""
256
257 #: ../../code/menudef.cpp:89
258 msgid "Left alt"
259 msgstr ""
260
261 #: ../../code/menudef.cpp:92
262 msgid "Return"
263 msgstr ""
264
265 #: ../../code/menudef.cpp:95
266 msgid "Space"
267 msgstr ""
268
269 #: ../../code/menudef.cpp:174 ../../code/menudef.cpp:242
210270 msgid "Music: On"
211271 msgstr ""
212272
213 #: ../../code/menudef.cpp:138 ../../code/menudef.cpp:206
273 #: ../../code/menudef.cpp:174 ../../code/menudef.cpp:242
214274 msgid "Music: Off"
215275 msgstr ""
216276
217 #: ../../code/menudef.cpp:146 ../../code/menudef.cpp:207
277 #: ../../code/menudef.cpp:182 ../../code/menudef.cpp:243
218278 msgid "Sound: On"
219279 msgstr ""
220280
221 #: ../../code/menudef.cpp:146 ../../code/menudef.cpp:207
281 #: ../../code/menudef.cpp:182 ../../code/menudef.cpp:243
222282 msgid "Sound: Off"
223283 msgstr ""
224284
225 #: ../../code/menudef.cpp:153 ../../code/menudef.cpp:208
285 #: ../../code/menudef.cpp:189 ../../code/menudef.cpp:244
226286 msgid "Fullscreen: On"
227287 msgstr ""
228288
229 #: ../../code/menudef.cpp:153 ../../code/menudef.cpp:208
289 #: ../../code/menudef.cpp:189 ../../code/menudef.cpp:244
230290 msgid "Fullscreen: Off"
231291 msgstr ""
232292
233 #: ../../code/menudef.cpp:159
293 #: ../../code/menudef.cpp:195
234294 msgid "Enter player 1 name:"
235295 msgstr ""
236296
237 #: ../../code/menudef.cpp:165
297 #: ../../code/menudef.cpp:201
238298 msgid "Enter player 2 name:"
239299 msgstr ""
240300
241 #: ../../code/menudef.cpp:175
301 #: ../../code/menudef.cpp:211
242302 msgid "Change key bindings"
243303 msgstr ""
244304
245 #: ../../code/menudef.cpp:176
305 #: ../../code/menudef.cpp:212
246306 msgid "Left"
247307 msgstr ""
248308
249 #: ../../code/menudef.cpp:177
309 #: ../../code/menudef.cpp:213
250310 msgid "Right"
251311 msgstr ""
252312
253 #: ../../code/menudef.cpp:178
313 #: ../../code/menudef.cpp:214
254314 msgid "Up"
255315 msgstr ""
256316
257 #: ../../code/menudef.cpp:179
317 #: ../../code/menudef.cpp:215
258318 msgid "Down"
259319 msgstr ""
260320
261 #: ../../code/menudef.cpp:180
321 #: ../../code/menudef.cpp:216
262322 msgid "Push"
263323 msgstr ""
264324
265 #: ../../code/menudef.cpp:181
325 #: ../../code/menudef.cpp:217
266326 msgid "Change"
267327 msgstr ""
268328
269 #: ../../code/menudef.cpp:200
329 #: ../../code/menudef.cpp:236
270330 msgid "Configuration"
271331 msgstr ""
272332
273 #: ../../code/menudef.cpp:210
333 #: ../../code/menudef.cpp:246
274334 msgid "Change player 1's name"
275335 msgstr ""
276336
277 #: ../../code/menudef.cpp:212
337 #: ../../code/menudef.cpp:248
278338 msgid "Change player 2's name"
279339 msgstr ""
280340
281 #: ../../code/menudef.cpp:214
341 #: ../../code/menudef.cpp:250
282342 msgid "Change player 1's keys"
283343 msgstr ""
284344
285 #: ../../code/menudef.cpp:216
345 #: ../../code/menudef.cpp:252
286346 msgid "Change player 2's keys"
287347 msgstr ""
288348
289 #: ../../code/menudef.cpp:228
349 #: ../../code/menudef.cpp:264
290350 msgid "Single player VS"
291351 msgstr ""
292352
293 #: ../../code/menudef.cpp:244
353 #: ../../code/menudef.cpp:280
294354 msgid "Very easy"
295355 msgstr ""
296356
297 #: ../../code/menudef.cpp:245
357 #: ../../code/menudef.cpp:281
298358 msgid "Easy"
299359 msgstr ""
300360
301 #: ../../code/menudef.cpp:246
361 #: ../../code/menudef.cpp:282
302362 msgid "Below normal"
303363 msgstr ""
304364
305 #: ../../code/menudef.cpp:247
365 #: ../../code/menudef.cpp:283
306366 msgid "Normal"
307367 msgstr ""
308368
309 #: ../../code/menudef.cpp:248
369 #: ../../code/menudef.cpp:284
310370 msgid "Above normal"
311371 msgstr ""
312372
313 #: ../../code/menudef.cpp:249
373 #: ../../code/menudef.cpp:285
314374 msgid "Hard"
315375 msgstr ""
316376
317 #: ../../code/menudef.cpp:250
377 #: ../../code/menudef.cpp:286
318378 msgid "Hardest"
319379 msgstr ""
320380
321 #: ../../code/menudef.cpp:262
381 #: ../../code/menudef.cpp:298
322382 msgid "Multiplayer"
323383 msgstr ""
324384
325 #: ../../code/menudef.cpp:264
385 #: ../../code/menudef.cpp:300
326386 msgid "Two player - time trial"
327387 msgstr ""
328388
329 #: ../../code/menudef.cpp:266
389 #: ../../code/menudef.cpp:302
330390 msgid "Two player - vs"
331391 msgstr ""
332392
333 #: ../../code/menudef.cpp:290 ../../code/menudef.cpp:305
393 #: ../../code/menudef.cpp:326 ../../code/menudef.cpp:341
334394 msgid "Credits"
335395 msgstr ""
336396
337 #: ../../code/menudef.cpp:295 ../../code/menudef.cpp:348
397 #: ../../code/menudef.cpp:331 ../../code/menudef.cpp:384
338398 msgid "Help"
339399 msgstr ""
340400
341 #: ../../code/menudef.cpp:297
401 #: ../../code/menudef.cpp:333
342402 msgid "How to"
343403 msgstr ""
344404
345 #: ../../code/menudef.cpp:301
405 #: ../../code/menudef.cpp:337
346406 msgid "Gamepad"
347407 msgstr ""
348408
349 #: ../../code/menudef.cpp:316 ../../code/menudef.cpp:340
409 #: ../../code/menudef.cpp:352 ../../code/menudef.cpp:376
350410 msgid "Single player"
351411 msgstr ""
352412
353 #: ../../code/menudef.cpp:318
413 #: ../../code/menudef.cpp:354
354414 msgid "Single player - endless"
355415 msgstr ""
356416
357 #: ../../code/menudef.cpp:320
417 #: ../../code/menudef.cpp:356
358418 msgid "Single player - time trial"
359419 msgstr ""
360420
361 #: ../../code/menudef.cpp:322
421 #: ../../code/menudef.cpp:358
362422 msgid "Single player - stage clear"
363423 msgstr ""
364424
365 #: ../../code/menudef.cpp:324
425 #: ../../code/menudef.cpp:360
366426 msgid "Single player - puzzle mode"
367427 msgstr ""
368428
369 #: ../../code/menudef.cpp:326
429 #: ../../code/menudef.cpp:362
370430 msgid "Single player - vs"
371431 msgstr ""
372432
373 #: ../../code/menudef.cpp:338
433 #: ../../code/menudef.cpp:374
374434 msgid "Block Attack - Rise of the blocks"
375435 msgstr ""
376436
377 #: ../../code/menudef.cpp:342
437 #: ../../code/menudef.cpp:378
378438 msgid "Multi player"
379439 msgstr ""
380440
381 #: ../../code/menudef.cpp:344
441 #: ../../code/menudef.cpp:380
382442 msgid "Configure"
383443 msgstr ""
384444
385 #: ../../code/menudef.cpp:346
445 #: ../../code/menudef.cpp:382
386446 msgid "Highscores"
387447 msgstr ""
388448
451511 msgid "VS CPU (win/loss)"
452512 msgstr ""
453513
454 #: ../../code/ScoresDisplay.cpp:188 ../../code/BlockGameSdl.inc:54
514 #: ../../code/ScoresDisplay.cpp:188 ../../code/BlockGameSdl.inc:55
455515 msgid "Next"
456516 msgstr ""
457517
460520 msgid "Page %i of %i"
461521 msgstr ""
462522
463 #: ../../code/BlockGameSdl.inc:50
523 #: ../../code/BlockGameSdl.inc:51
464524 msgid "Score:"
465525 msgstr ""
466526
467 #: ../../code/BlockGameSdl.inc:51
527 #: ../../code/BlockGameSdl.inc:52
468528 msgid "Time:"
469529 msgstr ""
470530
471 #: ../../code/BlockGameSdl.inc:52
531 #: ../../code/BlockGameSdl.inc:53
472532 msgid "Chain:"
473533 msgstr ""
474534
475 #: ../../code/BlockGameSdl.inc:53
535 #: ../../code/BlockGameSdl.inc:54
476536 msgid "Speed:"
477537 msgstr ""
478538
479 #: ../../code/BlockGameSdl.inc:55
539 #: ../../code/BlockGameSdl.inc:56
480540 msgid "Retry"
481541 msgstr ""
482542
483 #: ../../code/BlockGameSdl.inc:56
543 #: ../../code/BlockGameSdl.inc:57
484544 msgid "Skip"
485545 msgstr ""
486546
487 #: ../../code/BlockGameSdl.inc:327
547 #: ../../code/BlockGameSdl.inc:328
488548 msgid "Moves left: "
489549 msgstr ""
490550
491 #: ../../code/BlockGameSdl.inc:350
551 #: ../../code/BlockGameSdl.inc:351
492552 msgid "Last puzzle"
493553 msgstr ""
494554
495 #: ../../code/BlockGameSdl.inc:370
555 #: ../../code/BlockGameSdl.inc:371
496556 msgid "Last stage"
497557 msgstr ""
498558
11
22 ; HM NIS Edit Wizard helper defines
33 !define PRODUCT_NAME "Block Attack - Rise Of the Blocks"
4 !define PRODUCT_VERSION "2.2.0"
4 !define PRODUCT_VERSION "2.3.0"
55 !define PRODUCT_PUBLISHER "Poul Sander"
66 !define PRODUCT_WEB_SITE "http://www.blockattack.net"
77 !define PRODUCT_DIR_REGKEY "Software\Microsoft\Windows\CurrentVersion\App Paths\blockattack.exe"