New upstream version 2.3.0
Markus Koschany
5 years ago
2 | 2 | set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${blockattack_SOURCE_DIR}/source/misc/cmake") |
3 | 3 | set(BIN_DIR ${blockattack_SOURCE_DIR}/Game) |
4 | 4 | |
5 | SET(CPACK_PACKAGE_VERSION "2.2.0") | |
5 | SET(CPACK_PACKAGE_VERSION "2.3.0") | |
6 | 6 | SET(CPACK_PACKAGE_VERSION_MAJOR "2") |
7 | SET(CPACK_PACKAGE_VERSION_MINOR "2") | |
7 | SET(CPACK_PACKAGE_VERSION_MINOR "3") | |
8 | 8 | SET(CPACK_PACKAGE_VERSION_PATCH "0") |
9 | 9 | SET(CPACK_PACKAGE_DESCRIPTION_SUMMARY "Block Attack - Rise of the Blocks ${CPACK_PACKAGE_VERSION}") |
10 | 10 | SET(CPACK_PACKAGE_VENDOR "Poul Sander") |
386 | 386 | "number_of_frames" : 1, |
387 | 387 | "frame_time" : 1 |
388 | 388 | }, |
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 | }, | |
407 | 389 | "i_level_check_box_marked" : { |
408 | 390 | "texture" : "i_level_check_box_marked", |
409 | 391 | "topx" : 0, |
431 | 413 | "number_of_frames" : 1, |
432 | 414 | "frame_time" : 1 |
433 | 415 | }, |
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 | }, | |
443 | 416 | "i_stage_clear_limit" : { |
444 | 417 | "texture" : "i_stage_clear_limit", |
445 | 418 | "topx" : 0, |
446 | 419 | "topy" : 0, |
447 | 420 | "height" : 50, |
448 | 421 | "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, | |
458 | 422 | "number_of_frames" : 1, |
459 | 423 | "frame_time" : 1 |
460 | 424 | }, |
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 |
0 | 0 | .\" 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" | |
2 | 2 | .SH NAME |
3 | 3 | blockattack \- a puzzle game inspired by Tetris Attack |
4 | 4 | .SH SYNOPSIS |
5 | 5 | .B blockattack |
6 | 6 | [\fI\,OPTION\/\fR]... |
7 | 7 | .SH DESCRIPTION |
8 | Block Attack \- Rise of the blocks 2.2.0 | |
8 | Block Attack \- Rise of the blocks 2.3.0 | |
9 | 9 | .PP |
10 | 10 | Block Attack \- Rise of the Blocks is a puzzle/blockfall game inspired by Tetris Attack for the SNES. |
11 | 11 | .PP |
23 | 23 | #include "BlockGame.hpp" |
24 | 24 | #include "global.hpp" |
25 | 25 | #include "sago/SagoTextField.hpp" |
26 | #include "mainVars.inc" | |
26 | 27 | |
27 | 28 | static void setScoreboardFont(const sago::SagoDataHolder* holder, sago::SagoTextField& field, const char* text){ |
28 | 29 | field.SetHolder(holder); |
435 | 436 | |
436 | 437 | if (bGameOver) { |
437 | 438 | if (hasWonTheGame) { |
438 | DrawImgBoard(iWinner, 0, 5*bsize); | |
439 | tbWinner.Draw(globalData.screen, topx+150, topy+200, sago::SagoTextField::Alignment::center); | |
439 | 440 | } |
440 | 441 | else { |
441 | 442 | 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); | |
446 | 447 | } |
447 | 448 | } |
448 | 449 | } |
92 | 92 | SDL_RenderDrawLine(target, 100, 298, globalData.xsize/2-480/2+158, 298); |
93 | 93 | SDL_RenderDrawLine(target, 100, 210, 100, 400); |
94 | 94 | moveLabel.Draw(target, 100, 404, sago::SagoTextField::Alignment::center); |
95 | //Push lines | |
95 | 96 | SDL_RenderDrawLine(target, globalData.xsize/2-480/2+140, 90, globalData.xsize/2-480/2+140, 105); |
96 | 97 | 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); | |
98 | 101 | SDL_RenderDrawLine(target, globalData.xsize/2, 80, globalData.xsize/2, 90); |
99 | 102 | pushLabel.Draw(target, globalData.xsize/2, 80, sago::SagoTextField::Alignment::center, sago::SagoTextField::VerticalAlignment::bottom); |
103 | //Back lines | |
100 | 104 | 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); | |
102 | 107 | backLabel.Draw(target, 800, 156, sago::SagoTextField::Alignment::center, sago::SagoTextField::VerticalAlignment::bottom); |
103 | 108 | SDL_RenderDrawLine(target, 625, 241, 900, 241); |
104 | 109 | SDL_RenderDrawLine(target, 663, 207, 900, 207); |
289 | 289 | } |
290 | 290 | } |
291 | 291 | 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 ) { | |
293 | 293 | return true; |
294 | 294 | } |
295 | 295 | } |
257 | 257 | return true; |
258 | 258 | } |
259 | 259 | } |
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 | } | |
260 | 270 | return false; |
261 | 271 | }⏎ |
108 | 108 | PHYSFS_mkdir("screenshots"); |
109 | 109 | PHYSFS_mkdir("replays"); |
110 | 110 | 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); | |
111 | 121 | } |
112 | 122 | |
113 | 123 | //Load all image files to memory |
143 | 153 | counter[0] = holder.GetSprite("counter_1"); |
144 | 154 | counter[1] = holder.GetSprite("counter_2"); |
145 | 155 | 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")); | |
150 | 159 | iChainFrame = holder.GetSprite("chain_frame"); |
151 | 160 | globalData.iLevelCheck = holder.GetSprite("i_level_check"); |
152 | 161 | globalData.iLevelCheckBox = holder.GetSprite("i_level_check_box"); |
321 | 330 | } |
322 | 331 | |
323 | 332 | //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); | |
328 | 334 | |
329 | 335 | |
330 | 336 | void RunGameState(sago::GameStateInterface& state ) { |
997 | 1003 | Config* configSettings = Config::getInstance(); |
998 | 1004 | //configSettings->setString("aNumber"," A string"); |
999 | 1005 | //configSettings->save(); |
1006 | int screenHeight = 768; | |
1000 | 1007 | if (configSettings->exists("fullscreen")) { //Test if an configFile exists |
1001 | 1008 | globalData.bFullscreen = (bool)configSettings->getInt("fullscreen"); |
1002 | 1009 | globalData.MusicEnabled = (bool)configSettings->getInt("musicenabled"); |
1050 | 1057 | } |
1051 | 1058 | if (configSettings->exists("ysize")) { |
1052 | 1059 | globalData.ysize = configSettings->getInt("ysize"); |
1060 | } | |
1061 | if (configSettings->exists("screenHeight")) { | |
1062 | screenHeight = configSettings->getInt("screenHeight"); | |
1053 | 1063 | } |
1054 | 1064 | if (globalData.verboseLevel) { |
1055 | 1065 | cout << "Data loaded from config file" << "\n"; |
1071 | 1081 | sdlWindow = SDL_CreateWindow("Block Attack - Rise of the Blocks " VERSION_NUMBER, |
1072 | 1082 | SDL_WINDOWPOS_UNDEFINED, |
1073 | 1083 | SDL_WINDOWPOS_UNDEFINED, |
1074 | globalData.xsize, globalData.ysize, | |
1084 | (screenHeight)*4/3, screenHeight, | |
1075 | 1085 | createWindowParams ); |
1076 | 1086 | dieOnNullptr(sdlWindow, "Unable to create window"); |
1077 | 1087 | int rendererFlags = 0; |
1160 | 1170 | |
1161 | 1171 | configSettings->setString("player1name", globalData.player1name); |
1162 | 1172 | 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); | |
1167 | 1178 | } |
1168 | 1179 | configSettings->save(); |
1169 | 1180 | } |
1328 | 1339 | |
1329 | 1340 | if (theGame.isGameOver() && isEscapeEvent(event)) { |
1330 | 1341 | 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 | } | |
1331 | 1349 | } |
1332 | 1350 | |
1333 | 1351 | if ( event.type == SDL_KEYDOWN ) { |
27 | 27 | #include "sago/SagoSprite.hpp" |
28 | 28 | #include "BlockGame.hpp" |
29 | 29 | #include "sago/SagoTextField.hpp" |
30 | #include "sago/SagoTextBox.hpp" | |
30 | 31 | |
31 | 32 | |
32 | 33 | //main variables and constants |
56 | 57 | static sago::SagoSprite blackLine; //The seperator in stage clear |
57 | 58 | static sago::SagoSprite stageBobble; //The bobble instage clear |
58 | 59 | 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; | |
63 | 63 | static sago::SagoSprite iChainFrame; |
64 | 64 | //Animations: |
65 | 65 | static sago::SagoSprite cursor; //The animated cursor |
55 | 55 | extern control keySettings[3]; |
56 | 56 | |
57 | 57 | //Function to return the name of a key, to be displayed... |
58 | static string getKeyName(SDL_Keycode key) { | |
58 | string getKeyName(SDL_Keycode key) { | |
59 | 59 | 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 | } | |
60 | 96 | if (globalData.verboseLevel) { |
61 | 97 | cout << key << " translated to " << keyname << "\n"; |
62 | 98 | } |
177 | 177 | data->renderedText = data->text; |
178 | 178 | } |
179 | 179 | |
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 ) { | |
181 | 181 | if (data->text != data->renderedText) { |
182 | 182 | UpdateCache(); |
183 | 183 | } |
184 | 184 | TTF_Font *font = data->tex->getFontPtr(data->fontName, data->fontSize); |
185 | 185 | int lineSkip = TTF_FontLineSkip(font); |
186 | 186 | 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); | |
188 | 188 | } |
189 | 189 | } |
190 | 190 |
55 | 55 | */ |
56 | 56 | void SetMaxWidth(int width); |
57 | 57 | 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); | |
59 | 59 | void UpdateCache(); |
60 | 60 | private: |
61 | 61 | void AppendLineToCache(const std::string& text); |
29 | 29 | #include <iostream> |
30 | 30 | #include <stdexcept> |
31 | 31 | #include <string.h> |
32 | #include <stdio.h> | |
32 | #include <cstdio> | |
33 | 33 | #include <cstdlib> |
34 | 34 | |
35 | 35 | #if defined(_WIN32) |
36 | 36 | #include <windows.h> |
37 | 37 | #include <shlobj.h> |
38 | 38 | |
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) { | |
43 | 40 | std::string res; |
44 | 41 | // If the 6th parameter is 0 then WideCharToMultiByte returns the number of bytes needed to store the result. |
45 | 42 | int actualSize = WideCharToMultiByte(CP_UTF8, 0, wstr, -1, NULL, 0, NULL, NULL); |
51 | 48 | } |
52 | 49 | if (actualSize == 0) { |
53 | 50 | // 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(); | |
55 | 52 | throw std::runtime_error(errorMsg.c_str()); |
56 | 53 | } |
57 | 54 | return res; |
60 | 57 | static std::string GetWindowsFolder(int folderId, const char* errorMsg) { |
61 | 58 | wchar_t szPath[MAX_PATH]; |
62 | 59 | szPath[0] = 0; |
63 | if ( !SUCCEEDED( SHGetFolderPathW( NULL, folderId, NULL, 0, szPath ) ) ) | |
64 | { | |
60 | if ( !SUCCEEDED( SHGetFolderPathW( NULL, folderId, NULL, 0, szPath ) ) ) { | |
65 | 61 | throw std::runtime_error(errorMsg); |
66 | 62 | } |
67 | 63 | return win32_utf16_to_utf8(szPath); |
100 | 96 | #include <pwd.h> |
101 | 97 | #include <unistd.h> |
102 | 98 | #include <sys/types.h> |
99 | // For strlen and strtok | |
100 | #include <cstring> | |
103 | 101 | //Typically Linux. For easy reading the comments will just say Linux but should work with most *nixes |
104 | 102 | |
105 | 103 | static void throwOnRelative(const char* envName, const char* envValue) { |
106 | 104 | if (envValue[0] != '/') { |
107 | 105 | 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); | |
109 | 107 | throw std::runtime_error(buffer); |
110 | 108 | } |
111 | 109 | } |
119 | 117 | static std::string getHome() { |
120 | 118 | std::string res; |
121 | 119 | int uid = getuid(); |
122 | const char* homeEnv = getenv("HOME"); | |
120 | const char* homeEnv = std::getenv("HOME"); | |
123 | 121 | if ( uid != 0 && homeEnv) { |
124 | 122 | //We only acknowlegde HOME if not root. |
125 | 123 | res = homeEnv; |
126 | 124 | return res; |
127 | 125 | } |
128 | struct passwd *pw = getpwuid(uid); | |
126 | struct passwd* pw = getpwuid(uid); | |
129 | 127 | if (!pw) { |
130 | 128 | throw std::runtime_error("Unable to get passwd struct."); |
131 | 129 | } |
139 | 137 | |
140 | 138 | static std::string getLinuxFolderDefault(const char* envName, const char* defaultRelativePath) { |
141 | 139 | std::string res; |
142 | const char* tempRes = getenv(envName); | |
140 | const char* tempRes = std::getenv(envName); | |
143 | 141 | if (tempRes) { |
144 | 142 | throwOnRelative(envName, tempRes); |
145 | 143 | res = tempRes; |
150 | 148 | } |
151 | 149 | |
152 | 150 | 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], ":"); | |
156 | 153 | while (p != NULL) { |
157 | 154 | if (p[0] == '/') { |
158 | 155 | folders.push_back(p); |
162 | 159 | //The XDG documentation indicates that the folder should be ignored but that the program should continue. |
163 | 160 | std::cerr << "Skipping path \"" << p << "\" in \"" << envName << "\" because it does not start with a \"/\"\n"; |
164 | 161 | } |
165 | p = strtok_r (NULL, ":", &saveptr); | |
162 | p = std::strtok (NULL, ":"); | |
166 | 163 | } |
167 | 164 | } |
168 | 165 | |
169 | 166 | 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); | |
171 | 168 | if (!envValue) { |
172 | 169 | envValue = defaultValue; |
173 | 170 | } |
205 | 202 | #elif defined(__APPLE__) |
206 | 203 | return GetMacFolder(kCachedDataFolderType, "Failed to find the Application Support Folder"); |
207 | 204 | #else |
208 | return getLinuxFolderDefault("XDG_CONFIG_HOME", ".cache"); | |
205 | return getLinuxFolderDefault("XDG_CACHE_HOME", ".cache"); | |
209 | 206 | #endif |
210 | 207 | } |
211 | 208 | |
238 | 235 | std::ifstream infile(filename.c_str()); |
239 | 236 | std::string line; |
240 | 237 | 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) { | |
242 | 239 | continue; |
243 | 240 | } |
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 | } | |
249 | 252 | } |
250 | 253 | } |
251 | 254 | |
275 | 278 | this->data = new PlatformFolders::PlatformFoldersData(); |
276 | 279 | try { |
277 | 280 | PlatformFoldersFillData(data->folders); |
278 | } catch (...) { | |
281 | } | |
282 | catch (...) { | |
279 | 283 | delete this->data; |
280 | 284 | throw; |
281 | 285 | } |
363 | 367 | #endif |
364 | 368 | } |
365 | 369 | |
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 | } | |
366 | 397 | |
367 | 398 | |
368 | 399 | } //namespace sago |
47 | 47 | * @return The base folder for storring program data. |
48 | 48 | */ |
49 | 49 | std::string getDataHome(); |
50 | ||
50 | 51 | /** |
51 | 52 | * Retrives the base folder for storring config files. |
52 | 53 | * You must add the program name yourself like this: |
58 | 59 | * @return The base folder for storring config data. |
59 | 60 | */ |
60 | 61 | std::string getConfigHome(); |
62 | ||
61 | 63 | /** |
62 | 64 | * Retrives the base folder for storring cache files. |
63 | 65 | * You must add the program name yourself like this: |
69 | 71 | * @return The base folder for storring data that do not need to be backed up. |
70 | 72 | */ |
71 | 73 | std::string getCacheDir(); |
74 | ||
72 | 75 | /** |
73 | 76 | * This will append extra folders that your program should be looking for data files in. |
74 | 77 | * This does not normally include the path returned by GetDataHome(). |
86 | 89 | * @param homes A vector that extra folders will be appended to. |
87 | 90 | */ |
88 | 91 | void appendAdditionalDataDirectories(std::vector<std::string>& homes); |
92 | ||
89 | 93 | /** |
90 | 94 | * This will append extra folders that your program should be looking for config files in. |
91 | 95 | * This does not normally include the path returned by GetConfigHome(). |
103 | 107 | * @param homes A vector that extra folders will be appended to. |
104 | 108 | */ |
105 | 109 | 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 | |
106 | 162 | |
107 | 163 | /** |
108 | 164 | * This class contains methods for finding the system depended special folders. |
165 | 221 | #elif defined(__APPLE__) |
166 | 222 | #else |
167 | 223 | struct PlatformFoldersData; |
168 | PlatformFoldersData *data; | |
224 | PlatformFoldersData* data; | |
169 | 225 | #endif |
170 | 226 | }; |
171 | 227 | |
228 | #endif // skip doxygen | |
229 | ||
230 | ||
172 | 231 | } //namespace sago |
173 | 232 | |
174 | 233 | #endif /* PLATFORM_FOLDERS_H */ |
21 | 21 | */ |
22 | 22 | |
23 | 23 | #ifndef VERSION_NUMBER |
24 | #define VERSION_NUMBER "2.2.0" | |
24 | #define VERSION_NUMBER "2.3.0" | |
25 | 25 | #endif |
14 | 14 | |
15 | 15 | COPY . /staging/blockattack-game |
16 | 16 | |
17 | ENV BLOCKATTACK_VERSION 2.2.0 | |
17 | ENV BLOCKATTACK_VERSION 2.3.0 | |
18 | 18 | |
19 | 19 | RUN cd /staging/blockattack-game && \ |
20 | 20 | ./packdata.sh && \ |
15 | 15 | |
16 | 16 | COPY . /staging/blockattack-game |
17 | 17 | |
18 | ENV BLOCKATTACK_VERSION 2.2.0 | |
18 | ENV BLOCKATTACK_VERSION 2.3.0 | |
19 | 19 | |
20 | 20 | RUN cd /staging/blockattack-game && \ |
21 | 21 | ./packdata.sh && \ |
5 | 5 | |
6 | 6 | COPY . /staging/blockattack-game |
7 | 7 | |
8 | ENV BLOCKATTACK_VERSION 2.2.0 | |
8 | ENV BLOCKATTACK_VERSION 2.3.0 | |
9 | 9 | |
10 | 10 | RUN cd /staging/blockattack-game && \ |
11 | 11 | ./packdata.sh && \ |
6 | 6 | |
7 | 7 | COPY . /staging/blockattack-game |
8 | 8 | |
9 | ENV BLOCKATTACK_VERSION 2.2.0 | |
9 | ENV BLOCKATTACK_VERSION 2.3.0 | |
10 | 10 | |
11 | 11 | RUN cd /staging/blockattack-game && \ |
12 | 12 | ./packdata.sh && \ |
6 | 6 | |
7 | 7 | COPY . /staging/blockattack-game |
8 | 8 | |
9 | ENV BLOCKATTACK_VERSION 2.2.0 | |
9 | ENV BLOCKATTACK_VERSION 2.3.0 | |
10 | 10 | |
11 | 11 | RUN cd /staging/blockattack-game && \ |
12 | 12 | ./packdata.sh && \ |
7 | 7 | |
8 | 8 | COPY . /staging/blockattack-game |
9 | 9 | |
10 | ENV BLOCKATTACK_VERSION 2.2.0 | |
10 | ENV BLOCKATTACK_VERSION 2.3.0 | |
11 | 11 | |
12 | 12 | RUN cd /staging/blockattack-game && \ |
13 | 13 | ./packdata.sh && \ |
46 | 46 | scp -r . blockattack_build:/staging/blockattack-game |
47 | 47 | ssh blockattack_build rm -f /staging/blockattack-game/CMakeCache.txt |
48 | 48 | |
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 && \ | |
50 | 50 | ./packdata.sh && \ |
51 | 51 | cp source/misc/travis_help/utf8_v2_3_4/source/utf8.h source/code/ && \ |
52 | 52 | cp source/misc/travis_help/utf8_v2_3_4/source/utf8.h source/code/sago/ && \ |
6 | 6 | msgstr "" |
7 | 7 | "Project-Id-Version: \n" |
8 | 8 | "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" | |
11 | 11 | "Last-Translator: \n" |
12 | 12 | "Language-Team: \n" |
13 | 13 | "Language: da\n" |
61 | 61 | msgid "Locale:" |
62 | 62 | msgstr "Lokalitet:" |
63 | 63 | |
64 | #: ../../code/HelpAboutState.cpp:70 ../../code/menudef.cpp:309 | |
64 | #: ../../code/HelpAboutState.cpp:70 ../../code/menudef.cpp:345 | |
65 | 65 | msgid "About" |
66 | 66 | msgstr "Om" |
67 | 67 | |
141 | 141 | msgid "Total score: %i in %i:%02i" |
142 | 142 | msgstr "Sammenlagt: %i på %i:%02i" |
143 | 143 | |
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 | |
145 | 157 | msgid "AI" |
146 | 158 | msgstr "Computer" |
147 | 159 | |
148 | #: ../../code/main.cpp:455 | |
160 | #: ../../code/main.cpp:461 | |
149 | 161 | msgid "Playing field" |
150 | 162 | msgstr "Spilleflade" |
151 | 163 | |
152 | #: ../../code/main.cpp:529 | |
164 | #: ../../code/main.cpp:535 | |
153 | 165 | msgid "Time Trial" |
154 | 166 | msgstr "På tid" |
155 | 167 | |
156 | #: ../../code/main.cpp:530 | |
168 | #: ../../code/main.cpp:536 | |
157 | 169 | msgid "Score as much as possible in 2 minutes" |
158 | 170 | msgstr "Se hvor mange point du kan opnå på 2 minutter" |
159 | 171 | |
160 | #: ../../code/main.cpp:534 | |
172 | #: ../../code/main.cpp:540 | |
161 | 173 | msgid "Stage Clear" |
162 | 174 | msgstr "Stage Clear" |
163 | 175 | |
164 | #: ../../code/main.cpp:535 | |
176 | #: ../../code/main.cpp:541 | |
165 | 177 | msgid "You must clear a number of lines. Speed is rapidly increased." |
166 | 178 | msgstr "Fjern et specifik antal linjer. Hastigheden stiger hurtigt." |
167 | 179 | |
168 | #: ../../code/main.cpp:538 | |
180 | #: ../../code/main.cpp:544 | |
169 | 181 | msgid "Puzzle" |
170 | 182 | msgstr "Gåde" |
171 | 183 | |
172 | #: ../../code/main.cpp:539 | |
184 | #: ../../code/main.cpp:545 | |
173 | 185 | msgid "Clear the entire board with a limited number of moves." |
174 | 186 | msgstr "Fjern alle blokke med et begrænset antal flyt." |
175 | 187 | |
176 | #: ../../code/main.cpp:542 | |
188 | #: ../../code/main.cpp:548 | |
177 | 189 | msgid "Endless" |
178 | 190 | msgstr "Evighed" |
179 | 191 | |
180 | #: ../../code/main.cpp:543 | |
192 | #: ../../code/main.cpp:549 | |
181 | 193 | msgid "Score as much as possible. No time limit." |
182 | 194 | msgstr "Opnå så mange point som muligt. Ingen tidsbegrænsning." |
183 | 195 | |
184 | #: ../../code/main.cpp:553 | |
196 | #: ../../code/main.cpp:559 | |
185 | 197 | msgid "Objective:" |
186 | 198 | msgstr "Formål:" |
187 | 199 | |
188 | #: ../../code/main.cpp:563 | |
200 | #: ../../code/main.cpp:569 | |
189 | 201 | msgid "Movement keys:" |
190 | 202 | msgstr "Bevægelsestaster:" |
191 | 203 | |
192 | #: ../../code/main.cpp:565 | |
204 | #: ../../code/main.cpp:571 | |
193 | 205 | msgid "Switch: " |
194 | 206 | msgstr "Skift: " |
195 | 207 | |
196 | #: ../../code/main.cpp:567 | |
208 | #: ../../code/main.cpp:573 | |
197 | 209 | msgid "Restart: " |
198 | 210 | msgstr "Genstart: " |
199 | 211 | |
200 | #: ../../code/main.cpp:570 | |
212 | #: ../../code/main.cpp:576 | |
201 | 213 | msgid "Push line: " |
202 | 214 | msgstr "Skub linje: " |
203 | 215 | |
204 | #: ../../code/main.cpp:995 | |
216 | #: ../../code/main.cpp:1001 | |
205 | 217 | msgid "Player 1" |
206 | 218 | msgstr "Spiller 1" |
207 | 219 | |
208 | #: ../../code/main.cpp:996 | |
220 | #: ../../code/main.cpp:1002 | |
209 | 221 | msgid "Player 2" |
210 | 222 | msgstr "Spiller 2" |
211 | 223 | |
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 | |
213 | 273 | msgid "Music: On" |
214 | 274 | msgstr "Musik: Til" |
215 | 275 | |
216 | #: ../../code/menudef.cpp:138 ../../code/menudef.cpp:206 | |
276 | #: ../../code/menudef.cpp:174 ../../code/menudef.cpp:242 | |
217 | 277 | msgid "Music: Off" |
218 | 278 | msgstr "Musik: Fra" |
219 | 279 | |
220 | #: ../../code/menudef.cpp:146 ../../code/menudef.cpp:207 | |
280 | #: ../../code/menudef.cpp:182 ../../code/menudef.cpp:243 | |
221 | 281 | msgid "Sound: On" |
222 | 282 | msgstr "Lyd: Til" |
223 | 283 | |
224 | #: ../../code/menudef.cpp:146 ../../code/menudef.cpp:207 | |
284 | #: ../../code/menudef.cpp:182 ../../code/menudef.cpp:243 | |
225 | 285 | msgid "Sound: Off" |
226 | 286 | msgstr "Lyd: Fra" |
227 | 287 | |
228 | #: ../../code/menudef.cpp:153 ../../code/menudef.cpp:208 | |
288 | #: ../../code/menudef.cpp:189 ../../code/menudef.cpp:244 | |
229 | 289 | msgid "Fullscreen: On" |
230 | 290 | msgstr "Fuldskærm: Til" |
231 | 291 | |
232 | #: ../../code/menudef.cpp:153 ../../code/menudef.cpp:208 | |
292 | #: ../../code/menudef.cpp:189 ../../code/menudef.cpp:244 | |
233 | 293 | msgid "Fullscreen: Off" |
234 | 294 | msgstr "Fuldskærm: Fra" |
235 | 295 | |
236 | #: ../../code/menudef.cpp:159 | |
296 | #: ../../code/menudef.cpp:195 | |
237 | 297 | msgid "Enter player 1 name:" |
238 | 298 | msgstr "Indtast navnet på spiller 1:" |
239 | 299 | |
240 | #: ../../code/menudef.cpp:165 | |
300 | #: ../../code/menudef.cpp:201 | |
241 | 301 | msgid "Enter player 2 name:" |
242 | 302 | msgstr "Indtast navnet på spiller 2:" |
243 | 303 | |
244 | #: ../../code/menudef.cpp:175 | |
304 | #: ../../code/menudef.cpp:211 | |
245 | 305 | msgid "Change key bindings" |
246 | 306 | msgstr "Skift taster" |
247 | 307 | |
248 | #: ../../code/menudef.cpp:176 | |
308 | #: ../../code/menudef.cpp:212 | |
249 | 309 | msgid "Left" |
250 | 310 | msgstr "Venstre" |
251 | 311 | |
252 | #: ../../code/menudef.cpp:177 | |
312 | #: ../../code/menudef.cpp:213 | |
253 | 313 | msgid "Right" |
254 | 314 | msgstr "Højre" |
255 | 315 | |
256 | #: ../../code/menudef.cpp:178 | |
316 | #: ../../code/menudef.cpp:214 | |
257 | 317 | msgid "Up" |
258 | 318 | msgstr "Op" |
259 | 319 | |
260 | #: ../../code/menudef.cpp:179 | |
320 | #: ../../code/menudef.cpp:215 | |
261 | 321 | msgid "Down" |
262 | 322 | msgstr "Ned" |
263 | 323 | |
264 | #: ../../code/menudef.cpp:180 | |
324 | #: ../../code/menudef.cpp:216 | |
265 | 325 | msgid "Push" |
266 | 326 | msgstr "Skub" |
267 | 327 | |
268 | #: ../../code/menudef.cpp:181 | |
328 | #: ../../code/menudef.cpp:217 | |
269 | 329 | msgid "Change" |
270 | 330 | msgstr "Skift" |
271 | 331 | |
272 | #: ../../code/menudef.cpp:200 | |
332 | #: ../../code/menudef.cpp:236 | |
273 | 333 | msgid "Configuration" |
274 | 334 | msgstr "Konfiguration" |
275 | 335 | |
276 | #: ../../code/menudef.cpp:210 | |
336 | #: ../../code/menudef.cpp:246 | |
277 | 337 | msgid "Change player 1's name" |
278 | 338 | msgstr "Skift navn på spiller 1" |
279 | 339 | |
280 | #: ../../code/menudef.cpp:212 | |
340 | #: ../../code/menudef.cpp:248 | |
281 | 341 | msgid "Change player 2's name" |
282 | 342 | msgstr "Skift navn på spiller 2" |
283 | 343 | |
284 | #: ../../code/menudef.cpp:214 | |
344 | #: ../../code/menudef.cpp:250 | |
285 | 345 | msgid "Change player 1's keys" |
286 | 346 | msgstr "Tildel taster til spiller 1" |
287 | 347 | |
288 | #: ../../code/menudef.cpp:216 | |
348 | #: ../../code/menudef.cpp:252 | |
289 | 349 | msgid "Change player 2's keys" |
290 | 350 | msgstr "Tildel taster til spiller 2" |
291 | 351 | |
292 | #: ../../code/menudef.cpp:228 | |
352 | #: ../../code/menudef.cpp:264 | |
293 | 353 | msgid "Single player VS" |
294 | 354 | msgstr "En spiller - VS" |
295 | 355 | |
296 | #: ../../code/menudef.cpp:244 | |
356 | #: ../../code/menudef.cpp:280 | |
297 | 357 | msgid "Very easy" |
298 | 358 | msgstr "Meget let" |
299 | 359 | |
300 | #: ../../code/menudef.cpp:245 | |
360 | #: ../../code/menudef.cpp:281 | |
301 | 361 | msgid "Easy" |
302 | 362 | msgstr "Let" |
303 | 363 | |
304 | #: ../../code/menudef.cpp:246 | |
364 | #: ../../code/menudef.cpp:282 | |
305 | 365 | msgid "Below normal" |
306 | 366 | msgstr "Under normal" |
307 | 367 | |
308 | #: ../../code/menudef.cpp:247 | |
368 | #: ../../code/menudef.cpp:283 | |
309 | 369 | msgid "Normal" |
310 | 370 | msgstr "Normal" |
311 | 371 | |
312 | #: ../../code/menudef.cpp:248 | |
372 | #: ../../code/menudef.cpp:284 | |
313 | 373 | msgid "Above normal" |
314 | 374 | msgstr "Over normal" |
315 | 375 | |
316 | #: ../../code/menudef.cpp:249 | |
376 | #: ../../code/menudef.cpp:285 | |
317 | 377 | msgid "Hard" |
318 | 378 | msgstr "Svær" |
319 | 379 | |
320 | #: ../../code/menudef.cpp:250 | |
380 | #: ../../code/menudef.cpp:286 | |
321 | 381 | msgid "Hardest" |
322 | 382 | msgstr "Meget svær" |
323 | 383 | |
324 | #: ../../code/menudef.cpp:262 | |
384 | #: ../../code/menudef.cpp:298 | |
325 | 385 | msgid "Multiplayer" |
326 | 386 | msgstr "Flerspiller" |
327 | 387 | |
328 | #: ../../code/menudef.cpp:264 | |
388 | #: ../../code/menudef.cpp:300 | |
329 | 389 | msgid "Two player - time trial" |
330 | 390 | msgstr "To spillere - På tid" |
331 | 391 | |
332 | #: ../../code/menudef.cpp:266 | |
392 | #: ../../code/menudef.cpp:302 | |
333 | 393 | msgid "Two player - vs" |
334 | 394 | msgstr "To spillere - VS" |
335 | 395 | |
336 | #: ../../code/menudef.cpp:290 ../../code/menudef.cpp:305 | |
396 | #: ../../code/menudef.cpp:326 ../../code/menudef.cpp:341 | |
337 | 397 | msgid "Credits" |
338 | 398 | msgstr "Bidragydere" |
339 | 399 | |
340 | #: ../../code/menudef.cpp:295 ../../code/menudef.cpp:348 | |
400 | #: ../../code/menudef.cpp:331 ../../code/menudef.cpp:384 | |
341 | 401 | msgid "Help" |
342 | 402 | msgstr "Hjælp" |
343 | 403 | |
344 | #: ../../code/menudef.cpp:297 | |
404 | #: ../../code/menudef.cpp:333 | |
345 | 405 | msgid "How to" |
346 | 406 | msgstr "Guide" |
347 | 407 | |
348 | #: ../../code/menudef.cpp:301 | |
408 | #: ../../code/menudef.cpp:337 | |
349 | 409 | msgid "Gamepad" |
350 | 410 | msgstr "Spilkontroller" |
351 | 411 | |
352 | #: ../../code/menudef.cpp:316 ../../code/menudef.cpp:340 | |
412 | #: ../../code/menudef.cpp:352 ../../code/menudef.cpp:376 | |
353 | 413 | msgid "Single player" |
354 | 414 | msgstr "Enkeltspiller" |
355 | 415 | |
356 | #: ../../code/menudef.cpp:318 | |
416 | #: ../../code/menudef.cpp:354 | |
357 | 417 | msgid "Single player - endless" |
358 | 418 | msgstr "En spiller - Evighed" |
359 | 419 | |
360 | #: ../../code/menudef.cpp:320 | |
420 | #: ../../code/menudef.cpp:356 | |
361 | 421 | msgid "Single player - time trial" |
362 | 422 | msgstr "En spiller - På tid" |
363 | 423 | |
364 | #: ../../code/menudef.cpp:322 | |
424 | #: ../../code/menudef.cpp:358 | |
365 | 425 | msgid "Single player - stage clear" |
366 | 426 | msgstr "En spiller - Stage Clear" |
367 | 427 | |
368 | #: ../../code/menudef.cpp:324 | |
428 | #: ../../code/menudef.cpp:360 | |
369 | 429 | msgid "Single player - puzzle mode" |
370 | 430 | msgstr "En spiller - Gåde" |
371 | 431 | |
372 | #: ../../code/menudef.cpp:326 | |
432 | #: ../../code/menudef.cpp:362 | |
373 | 433 | msgid "Single player - vs" |
374 | 434 | msgstr "En spiller - VS" |
375 | 435 | |
376 | #: ../../code/menudef.cpp:338 | |
436 | #: ../../code/menudef.cpp:374 | |
377 | 437 | msgid "Block Attack - Rise of the blocks" |
378 | 438 | msgstr "Block Attack - Blokkenes opstand" |
379 | 439 | |
380 | #: ../../code/menudef.cpp:342 | |
440 | #: ../../code/menudef.cpp:378 | |
381 | 441 | msgid "Multi player" |
382 | 442 | msgstr "Flere spillere" |
383 | 443 | |
384 | #: ../../code/menudef.cpp:344 | |
444 | #: ../../code/menudef.cpp:380 | |
385 | 445 | msgid "Configure" |
386 | 446 | msgstr "Instillinger" |
387 | 447 | |
388 | #: ../../code/menudef.cpp:346 | |
448 | #: ../../code/menudef.cpp:382 | |
389 | 449 | msgid "Highscores" |
390 | 450 | msgstr "Bedste resultater" |
391 | 451 | |
454 | 514 | msgid "VS CPU (win/loss)" |
455 | 515 | msgstr "Mod computeren (vundet/tabt)" |
456 | 516 | |
457 | #: ../../code/ScoresDisplay.cpp:188 ../../code/BlockGameSdl.inc:54 | |
517 | #: ../../code/ScoresDisplay.cpp:188 ../../code/BlockGameSdl.inc:55 | |
458 | 518 | msgid "Next" |
459 | 519 | msgstr "Næste" |
460 | 520 | |
463 | 523 | msgid "Page %i of %i" |
464 | 524 | msgstr "Side %i af %i" |
465 | 525 | |
466 | #: ../../code/BlockGameSdl.inc:50 | |
526 | #: ../../code/BlockGameSdl.inc:51 | |
467 | 527 | msgid "Score:" |
468 | 528 | msgstr "Resultat:" |
469 | 529 | |
470 | #: ../../code/BlockGameSdl.inc:51 | |
530 | #: ../../code/BlockGameSdl.inc:52 | |
471 | 531 | msgid "Time:" |
472 | 532 | msgstr "Tid:" |
473 | 533 | |
474 | #: ../../code/BlockGameSdl.inc:52 | |
534 | #: ../../code/BlockGameSdl.inc:53 | |
475 | 535 | msgid "Chain:" |
476 | 536 | msgstr "Kæde:" |
477 | 537 | |
478 | #: ../../code/BlockGameSdl.inc:53 | |
538 | #: ../../code/BlockGameSdl.inc:54 | |
479 | 539 | msgid "Speed:" |
480 | 540 | msgstr "Hastighed:" |
481 | 541 | |
482 | #: ../../code/BlockGameSdl.inc:55 | |
542 | #: ../../code/BlockGameSdl.inc:56 | |
483 | 543 | msgid "Retry" |
484 | 544 | msgstr "Prøv igen" |
485 | 545 | |
486 | #: ../../code/BlockGameSdl.inc:56 | |
546 | #: ../../code/BlockGameSdl.inc:57 | |
487 | 547 | msgid "Skip" |
488 | 548 | msgstr "Spring over" |
489 | 549 | |
490 | #: ../../code/BlockGameSdl.inc:327 | |
550 | #: ../../code/BlockGameSdl.inc:328 | |
491 | 551 | msgid "Moves left: " |
492 | 552 | msgstr "Træk tilbage: " |
493 | 553 | |
494 | #: ../../code/BlockGameSdl.inc:350 | |
554 | #: ../../code/BlockGameSdl.inc:351 | |
495 | 555 | msgid "Last puzzle" |
496 | 556 | msgstr "Sidste gåde" |
497 | 557 | |
498 | #: ../../code/BlockGameSdl.inc:370 | |
558 | #: ../../code/BlockGameSdl.inc:371 | |
499 | 559 | msgid "Last stage" |
500 | 560 | msgstr "Sidste bane" |
501 | 561 |
7 | 7 | msgstr "" |
8 | 8 | "Project-Id-Version: PACKAGE VERSION\n" |
9 | 9 | "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" | |
11 | 11 | "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" |
12 | 12 | "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" |
13 | 13 | "Language-Team: LANGUAGE <LL@li.org>\n" |
60 | 60 | msgid "Locale:" |
61 | 61 | msgstr "" |
62 | 62 | |
63 | #: ../../code/HelpAboutState.cpp:70 ../../code/menudef.cpp:309 | |
63 | #: ../../code/HelpAboutState.cpp:70 ../../code/menudef.cpp:345 | |
64 | 64 | msgid "About" |
65 | 65 | msgstr "" |
66 | 66 | |
138 | 138 | msgid "Total score: %i in %i:%02i" |
139 | 139 | msgstr "" |
140 | 140 | |
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 | |
142 | 154 | msgid "AI" |
143 | 155 | msgstr "" |
144 | 156 | |
145 | #: ../../code/main.cpp:455 | |
157 | #: ../../code/main.cpp:461 | |
146 | 158 | msgid "Playing field" |
147 | 159 | msgstr "" |
148 | 160 | |
149 | #: ../../code/main.cpp:529 | |
161 | #: ../../code/main.cpp:535 | |
150 | 162 | msgid "Time Trial" |
151 | 163 | msgstr "" |
152 | 164 | |
153 | #: ../../code/main.cpp:530 | |
165 | #: ../../code/main.cpp:536 | |
154 | 166 | msgid "Score as much as possible in 2 minutes" |
155 | 167 | msgstr "" |
156 | 168 | |
157 | #: ../../code/main.cpp:534 | |
169 | #: ../../code/main.cpp:540 | |
158 | 170 | msgid "Stage Clear" |
159 | 171 | msgstr "" |
160 | 172 | |
161 | #: ../../code/main.cpp:535 | |
173 | #: ../../code/main.cpp:541 | |
162 | 174 | msgid "You must clear a number of lines. Speed is rapidly increased." |
163 | 175 | msgstr "" |
164 | 176 | |
165 | #: ../../code/main.cpp:538 | |
177 | #: ../../code/main.cpp:544 | |
166 | 178 | msgid "Puzzle" |
167 | 179 | msgstr "" |
168 | 180 | |
169 | #: ../../code/main.cpp:539 | |
181 | #: ../../code/main.cpp:545 | |
170 | 182 | msgid "Clear the entire board with a limited number of moves." |
171 | 183 | msgstr "" |
172 | 184 | |
173 | #: ../../code/main.cpp:542 | |
185 | #: ../../code/main.cpp:548 | |
174 | 186 | msgid "Endless" |
175 | 187 | msgstr "" |
176 | 188 | |
177 | #: ../../code/main.cpp:543 | |
189 | #: ../../code/main.cpp:549 | |
178 | 190 | msgid "Score as much as possible. No time limit." |
179 | 191 | msgstr "" |
180 | 192 | |
181 | #: ../../code/main.cpp:553 | |
193 | #: ../../code/main.cpp:559 | |
182 | 194 | msgid "Objective:" |
183 | 195 | msgstr "" |
184 | 196 | |
185 | #: ../../code/main.cpp:563 | |
197 | #: ../../code/main.cpp:569 | |
186 | 198 | msgid "Movement keys:" |
187 | 199 | msgstr "" |
188 | 200 | |
189 | #: ../../code/main.cpp:565 | |
201 | #: ../../code/main.cpp:571 | |
190 | 202 | msgid "Switch: " |
191 | 203 | msgstr "" |
192 | 204 | |
193 | #: ../../code/main.cpp:567 | |
205 | #: ../../code/main.cpp:573 | |
194 | 206 | msgid "Restart: " |
195 | 207 | msgstr "" |
196 | 208 | |
197 | #: ../../code/main.cpp:570 | |
209 | #: ../../code/main.cpp:576 | |
198 | 210 | msgid "Push line: " |
199 | 211 | msgstr "" |
200 | 212 | |
201 | #: ../../code/main.cpp:995 | |
213 | #: ../../code/main.cpp:1001 | |
202 | 214 | msgid "Player 1" |
203 | 215 | msgstr "" |
204 | 216 | |
205 | #: ../../code/main.cpp:996 | |
217 | #: ../../code/main.cpp:1002 | |
206 | 218 | msgid "Player 2" |
207 | 219 | msgstr "" |
208 | 220 | |
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 | |
210 | 270 | msgid "Music: On" |
211 | 271 | msgstr "" |
212 | 272 | |
213 | #: ../../code/menudef.cpp:138 ../../code/menudef.cpp:206 | |
273 | #: ../../code/menudef.cpp:174 ../../code/menudef.cpp:242 | |
214 | 274 | msgid "Music: Off" |
215 | 275 | msgstr "" |
216 | 276 | |
217 | #: ../../code/menudef.cpp:146 ../../code/menudef.cpp:207 | |
277 | #: ../../code/menudef.cpp:182 ../../code/menudef.cpp:243 | |
218 | 278 | msgid "Sound: On" |
219 | 279 | msgstr "" |
220 | 280 | |
221 | #: ../../code/menudef.cpp:146 ../../code/menudef.cpp:207 | |
281 | #: ../../code/menudef.cpp:182 ../../code/menudef.cpp:243 | |
222 | 282 | msgid "Sound: Off" |
223 | 283 | msgstr "" |
224 | 284 | |
225 | #: ../../code/menudef.cpp:153 ../../code/menudef.cpp:208 | |
285 | #: ../../code/menudef.cpp:189 ../../code/menudef.cpp:244 | |
226 | 286 | msgid "Fullscreen: On" |
227 | 287 | msgstr "" |
228 | 288 | |
229 | #: ../../code/menudef.cpp:153 ../../code/menudef.cpp:208 | |
289 | #: ../../code/menudef.cpp:189 ../../code/menudef.cpp:244 | |
230 | 290 | msgid "Fullscreen: Off" |
231 | 291 | msgstr "" |
232 | 292 | |
233 | #: ../../code/menudef.cpp:159 | |
293 | #: ../../code/menudef.cpp:195 | |
234 | 294 | msgid "Enter player 1 name:" |
235 | 295 | msgstr "" |
236 | 296 | |
237 | #: ../../code/menudef.cpp:165 | |
297 | #: ../../code/menudef.cpp:201 | |
238 | 298 | msgid "Enter player 2 name:" |
239 | 299 | msgstr "" |
240 | 300 | |
241 | #: ../../code/menudef.cpp:175 | |
301 | #: ../../code/menudef.cpp:211 | |
242 | 302 | msgid "Change key bindings" |
243 | 303 | msgstr "" |
244 | 304 | |
245 | #: ../../code/menudef.cpp:176 | |
305 | #: ../../code/menudef.cpp:212 | |
246 | 306 | msgid "Left" |
247 | 307 | msgstr "" |
248 | 308 | |
249 | #: ../../code/menudef.cpp:177 | |
309 | #: ../../code/menudef.cpp:213 | |
250 | 310 | msgid "Right" |
251 | 311 | msgstr "" |
252 | 312 | |
253 | #: ../../code/menudef.cpp:178 | |
313 | #: ../../code/menudef.cpp:214 | |
254 | 314 | msgid "Up" |
255 | 315 | msgstr "" |
256 | 316 | |
257 | #: ../../code/menudef.cpp:179 | |
317 | #: ../../code/menudef.cpp:215 | |
258 | 318 | msgid "Down" |
259 | 319 | msgstr "" |
260 | 320 | |
261 | #: ../../code/menudef.cpp:180 | |
321 | #: ../../code/menudef.cpp:216 | |
262 | 322 | msgid "Push" |
263 | 323 | msgstr "" |
264 | 324 | |
265 | #: ../../code/menudef.cpp:181 | |
325 | #: ../../code/menudef.cpp:217 | |
266 | 326 | msgid "Change" |
267 | 327 | msgstr "" |
268 | 328 | |
269 | #: ../../code/menudef.cpp:200 | |
329 | #: ../../code/menudef.cpp:236 | |
270 | 330 | msgid "Configuration" |
271 | 331 | msgstr "" |
272 | 332 | |
273 | #: ../../code/menudef.cpp:210 | |
333 | #: ../../code/menudef.cpp:246 | |
274 | 334 | msgid "Change player 1's name" |
275 | 335 | msgstr "" |
276 | 336 | |
277 | #: ../../code/menudef.cpp:212 | |
337 | #: ../../code/menudef.cpp:248 | |
278 | 338 | msgid "Change player 2's name" |
279 | 339 | msgstr "" |
280 | 340 | |
281 | #: ../../code/menudef.cpp:214 | |
341 | #: ../../code/menudef.cpp:250 | |
282 | 342 | msgid "Change player 1's keys" |
283 | 343 | msgstr "" |
284 | 344 | |
285 | #: ../../code/menudef.cpp:216 | |
345 | #: ../../code/menudef.cpp:252 | |
286 | 346 | msgid "Change player 2's keys" |
287 | 347 | msgstr "" |
288 | 348 | |
289 | #: ../../code/menudef.cpp:228 | |
349 | #: ../../code/menudef.cpp:264 | |
290 | 350 | msgid "Single player VS" |
291 | 351 | msgstr "" |
292 | 352 | |
293 | #: ../../code/menudef.cpp:244 | |
353 | #: ../../code/menudef.cpp:280 | |
294 | 354 | msgid "Very easy" |
295 | 355 | msgstr "" |
296 | 356 | |
297 | #: ../../code/menudef.cpp:245 | |
357 | #: ../../code/menudef.cpp:281 | |
298 | 358 | msgid "Easy" |
299 | 359 | msgstr "" |
300 | 360 | |
301 | #: ../../code/menudef.cpp:246 | |
361 | #: ../../code/menudef.cpp:282 | |
302 | 362 | msgid "Below normal" |
303 | 363 | msgstr "" |
304 | 364 | |
305 | #: ../../code/menudef.cpp:247 | |
365 | #: ../../code/menudef.cpp:283 | |
306 | 366 | msgid "Normal" |
307 | 367 | msgstr "" |
308 | 368 | |
309 | #: ../../code/menudef.cpp:248 | |
369 | #: ../../code/menudef.cpp:284 | |
310 | 370 | msgid "Above normal" |
311 | 371 | msgstr "" |
312 | 372 | |
313 | #: ../../code/menudef.cpp:249 | |
373 | #: ../../code/menudef.cpp:285 | |
314 | 374 | msgid "Hard" |
315 | 375 | msgstr "" |
316 | 376 | |
317 | #: ../../code/menudef.cpp:250 | |
377 | #: ../../code/menudef.cpp:286 | |
318 | 378 | msgid "Hardest" |
319 | 379 | msgstr "" |
320 | 380 | |
321 | #: ../../code/menudef.cpp:262 | |
381 | #: ../../code/menudef.cpp:298 | |
322 | 382 | msgid "Multiplayer" |
323 | 383 | msgstr "" |
324 | 384 | |
325 | #: ../../code/menudef.cpp:264 | |
385 | #: ../../code/menudef.cpp:300 | |
326 | 386 | msgid "Two player - time trial" |
327 | 387 | msgstr "" |
328 | 388 | |
329 | #: ../../code/menudef.cpp:266 | |
389 | #: ../../code/menudef.cpp:302 | |
330 | 390 | msgid "Two player - vs" |
331 | 391 | msgstr "" |
332 | 392 | |
333 | #: ../../code/menudef.cpp:290 ../../code/menudef.cpp:305 | |
393 | #: ../../code/menudef.cpp:326 ../../code/menudef.cpp:341 | |
334 | 394 | msgid "Credits" |
335 | 395 | msgstr "" |
336 | 396 | |
337 | #: ../../code/menudef.cpp:295 ../../code/menudef.cpp:348 | |
397 | #: ../../code/menudef.cpp:331 ../../code/menudef.cpp:384 | |
338 | 398 | msgid "Help" |
339 | 399 | msgstr "" |
340 | 400 | |
341 | #: ../../code/menudef.cpp:297 | |
401 | #: ../../code/menudef.cpp:333 | |
342 | 402 | msgid "How to" |
343 | 403 | msgstr "" |
344 | 404 | |
345 | #: ../../code/menudef.cpp:301 | |
405 | #: ../../code/menudef.cpp:337 | |
346 | 406 | msgid "Gamepad" |
347 | 407 | msgstr "" |
348 | 408 | |
349 | #: ../../code/menudef.cpp:316 ../../code/menudef.cpp:340 | |
409 | #: ../../code/menudef.cpp:352 ../../code/menudef.cpp:376 | |
350 | 410 | msgid "Single player" |
351 | 411 | msgstr "" |
352 | 412 | |
353 | #: ../../code/menudef.cpp:318 | |
413 | #: ../../code/menudef.cpp:354 | |
354 | 414 | msgid "Single player - endless" |
355 | 415 | msgstr "" |
356 | 416 | |
357 | #: ../../code/menudef.cpp:320 | |
417 | #: ../../code/menudef.cpp:356 | |
358 | 418 | msgid "Single player - time trial" |
359 | 419 | msgstr "" |
360 | 420 | |
361 | #: ../../code/menudef.cpp:322 | |
421 | #: ../../code/menudef.cpp:358 | |
362 | 422 | msgid "Single player - stage clear" |
363 | 423 | msgstr "" |
364 | 424 | |
365 | #: ../../code/menudef.cpp:324 | |
425 | #: ../../code/menudef.cpp:360 | |
366 | 426 | msgid "Single player - puzzle mode" |
367 | 427 | msgstr "" |
368 | 428 | |
369 | #: ../../code/menudef.cpp:326 | |
429 | #: ../../code/menudef.cpp:362 | |
370 | 430 | msgid "Single player - vs" |
371 | 431 | msgstr "" |
372 | 432 | |
373 | #: ../../code/menudef.cpp:338 | |
433 | #: ../../code/menudef.cpp:374 | |
374 | 434 | msgid "Block Attack - Rise of the blocks" |
375 | 435 | msgstr "" |
376 | 436 | |
377 | #: ../../code/menudef.cpp:342 | |
437 | #: ../../code/menudef.cpp:378 | |
378 | 438 | msgid "Multi player" |
379 | 439 | msgstr "" |
380 | 440 | |
381 | #: ../../code/menudef.cpp:344 | |
441 | #: ../../code/menudef.cpp:380 | |
382 | 442 | msgid "Configure" |
383 | 443 | msgstr "" |
384 | 444 | |
385 | #: ../../code/menudef.cpp:346 | |
445 | #: ../../code/menudef.cpp:382 | |
386 | 446 | msgid "Highscores" |
387 | 447 | msgstr "" |
388 | 448 | |
451 | 511 | msgid "VS CPU (win/loss)" |
452 | 512 | msgstr "" |
453 | 513 | |
454 | #: ../../code/ScoresDisplay.cpp:188 ../../code/BlockGameSdl.inc:54 | |
514 | #: ../../code/ScoresDisplay.cpp:188 ../../code/BlockGameSdl.inc:55 | |
455 | 515 | msgid "Next" |
456 | 516 | msgstr "" |
457 | 517 | |
460 | 520 | msgid "Page %i of %i" |
461 | 521 | msgstr "" |
462 | 522 | |
463 | #: ../../code/BlockGameSdl.inc:50 | |
523 | #: ../../code/BlockGameSdl.inc:51 | |
464 | 524 | msgid "Score:" |
465 | 525 | msgstr "" |
466 | 526 | |
467 | #: ../../code/BlockGameSdl.inc:51 | |
527 | #: ../../code/BlockGameSdl.inc:52 | |
468 | 528 | msgid "Time:" |
469 | 529 | msgstr "" |
470 | 530 | |
471 | #: ../../code/BlockGameSdl.inc:52 | |
531 | #: ../../code/BlockGameSdl.inc:53 | |
472 | 532 | msgid "Chain:" |
473 | 533 | msgstr "" |
474 | 534 | |
475 | #: ../../code/BlockGameSdl.inc:53 | |
535 | #: ../../code/BlockGameSdl.inc:54 | |
476 | 536 | msgid "Speed:" |
477 | 537 | msgstr "" |
478 | 538 | |
479 | #: ../../code/BlockGameSdl.inc:55 | |
539 | #: ../../code/BlockGameSdl.inc:56 | |
480 | 540 | msgid "Retry" |
481 | 541 | msgstr "" |
482 | 542 | |
483 | #: ../../code/BlockGameSdl.inc:56 | |
543 | #: ../../code/BlockGameSdl.inc:57 | |
484 | 544 | msgid "Skip" |
485 | 545 | msgstr "" |
486 | 546 | |
487 | #: ../../code/BlockGameSdl.inc:327 | |
547 | #: ../../code/BlockGameSdl.inc:328 | |
488 | 548 | msgid "Moves left: " |
489 | 549 | msgstr "" |
490 | 550 | |
491 | #: ../../code/BlockGameSdl.inc:350 | |
551 | #: ../../code/BlockGameSdl.inc:351 | |
492 | 552 | msgid "Last puzzle" |
493 | 553 | msgstr "" |
494 | 554 | |
495 | #: ../../code/BlockGameSdl.inc:370 | |
555 | #: ../../code/BlockGameSdl.inc:371 | |
496 | 556 | msgid "Last stage" |
497 | 557 | msgstr "" |
498 | 558 |
1 | 1 | |
2 | 2 | ; HM NIS Edit Wizard helper defines |
3 | 3 | !define PRODUCT_NAME "Block Attack - Rise Of the Blocks" |
4 | !define PRODUCT_VERSION "2.2.0" | |
4 | !define PRODUCT_VERSION "2.3.0" | |
5 | 5 | !define PRODUCT_PUBLISHER "Poul Sander" |
6 | 6 | !define PRODUCT_WEB_SITE "http://www.blockattack.net" |
7 | 7 | !define PRODUCT_DIR_REGKEY "Software\Microsoft\Windows\CurrentVersion\App Paths\blockattack.exe" |