Page MenuHomePhabricator (Chris)

No OneTemporary

Authored By
Unknown
Size
96 KB
Referenced Files
None
Subscribers
None
diff --git a/data/Credits.txt b/data/Credits.txt
index cfd85d1..4136908 100644
--- a/data/Credits.txt
+++ b/data/Credits.txt
@@ -1,134 +1,138 @@
The following list contains the data files in Me and My Shadow.
It should contain all files with their correct attribution and license information.
If something is missing please contact the developers.
font/
- Blokletters-Viltstift.ttf
Name: Blokletters Viltstift
License: CC BY-SA 2.5 <http://creativecommons.org/licenses/by-sa/2.5/>
Attribution: http://lefly.vepar.nl/
- knewave.ttf
License: Open Font License <http://scripts.sil.org/OFL>
Attribution: Tyler Finck (http://www.sursly.com)
- DroidSansFallback.ttf
License: Apache License <http://www.apache.org/licenses/LICENSE-2.0>
Source: http://www.droidfonts.com
gfx/menu/
- background.png
License: CC BY-SA 3.0 <http://creativecommons.org/licenses/by-sa/3.0/>
Attribution: Tedium
Note: Part of the Cloudscape theme
- moving.png
License: CC0 <http://creativecommons.org/publicdomain/zero/1.0/>
- selection.png
License: CC0 <http://creativecommons.org/publicdomain/zero/1.0/>
- title.png
License: CC0 <http://creativecommons.org/publicdomain/zero/1.0/>
- credits.png
License: CC0 <http://creativecommons.org/publicdomain/zero/1.0/>
- toolbar.png
License: CC BY-SA 3.0 <http://creativecommons.org/licenses/by-sa/3.0/>
Attribution: odamite, Tedium
- statistics.png
License: CC BY 3.0 <http://creativecommons.org/licenses/by/3.0/>
Attribution: odamite
+ - questionmark.png
+ License: GNU LGPL <http://www.gnu.org/licenses/lgpl>
+ Source: Wine <http://www.winehq.org/>
+ Note: Modified by acme_pjz
gfx/
- actions.png
License: CC0 <http://creativecommons.org/publicdomain/zero/1.0/>
- dropshadow.png
License: CC BY-SA 3.0 <http://creativecommons.org/licenses/by-sa/3.0/>
Attribution: Me and My Shadow <http://meandmyshadow.sf.net>
- gui.png
License: CC BY-SA 3.0 <http://creativecommons.org/licenses/by-sa/3.0/>
Attribution: Me and My Shadow <http://meandmyshadow.sf.net>
- level.png
License: CC BY-SA 3.0 <http://creativecommons.org/licenses/by-sa/3.0/>
Attribution: Tedium
Note: Part of the Cloudscape theme
- levellocked.png
License: CC BY-SA 3.0 <http://creativecommons.org/licenses/by-sa/3.0/>
Attribution: Tedium
Note: Part of the Cloudscape theme
- medals.png
License: CC BY-SA 3.0 <http://creativecommons.org/licenses/by-sa/3.0/>
Attribution: Tedium
- playbutton.png
License: CC BY-SA 3.0 <http://creativecommons.org/licenses/by-sa/3.0/>
Attribution: Tedium
- recordings.png
License: CC BY-SA 3.0 <http://creativecommons.org/licenses/by-sa/3.0/>
Attribution: Tedium
- time.png
License: CC BY-SA 3.0 <http://creativecommons.org/licenses/by-sa/3.0/>
Attribution: Tedium
levelpacks/
Note that the translations inside the levelpacks are all licensed under the GNU GPLv3.
For the copyright notice(s) of the individual translations see the relevant .po file's header.
- classic/
License: CC0 <http://creativecommons.org/publicdomain/zero/1.0/>
- default/
License: CC0 <http://creativecommons.org/publicdomain/zero/1.0/>
- tutorial/
License: GPLv3 <http://www.gnu.org/licenses/gpl>
Copyright: 2011 Luka Horvat
Copyright: 2011-2012 Me and My Shadow
Note: Levels originally made by Luka Horvat and extended and updated by Me and My Shadow.
levels/
License: CC0 <http://creativecommons.org/publicdomain/zero/1.0/>
Note: All single levels distributed with Me and My Shadow are public domain.
locale/
For the copyright notice(s) of the translations see the header of the relevant .po file.
- messages.pot
License: GPLv3 <http://www.gnu.org/licenses/gpl>
Copyright: 2012 Me and My Shadow <http://meandmyshadow.sf.net>
music/
See the header of the .music files for the license and attribution of the music files.
sfx/
- checkpoint.wav
License: GNU GPL <http://www.gnu.org/licenses/gpl>
Copyright: XMoto <http://xmoto.tuxfamily.org>
- swap.wav
Name: Ambient Pulse Noise
License: CC BY-SA 3.0 <http://creativecommons.org/licenses/by-sa/3.0/>
Attribution: Gobusto
Source: http://opengameart.org/content/ambient-pulse-noise
- toggle.wav
License: CC0 <http://creativecommons.org/publicdomain/zero/1.0/>
Source: http://www.opengameart.org/content/hit-sounds
- error.wav
License: CC0 <http://creativecommons.org/publicdomain/zero/1.0/>
Source: http://opengameart.org/content/skweaks
Note: converted to .wav
- collect.wav
License: CC BY 3.0 <http://creativecommons.org/licenses/by/3.0/>
Attribution: odamite
- hit.wav
License: CC0 <http://creativecommons.org/publicdomain/zero/1.0/>
Note: Made with sfxr <http://www.drpetter.se/project_sfxr.html>
- jump.wav
License: CC0 <http://creativecommons.org/publicdomain/zero/1.0/>
Note: Made with sfxr <http://www.drpetter.se/project_sfxr.html>
- achievement.ogg
Name: UI Sound effects pack
License: CC BY 3.0 <http://creativecommons.org/licenses/by/3.0/>
Attribution: David McKee (ViRiX) soundcloud.com/virix
Source: http://opengameart.org/content/ui-sound-effects-pack
themes/
See the individual themes for their license(s).
diff --git a/data/gfx/menu/questionmark.png b/data/gfx/menu/questionmark.png
new file mode 100644
index 0000000..4cff4d5
Binary files /dev/null and b/data/gfx/menu/questionmark.png differ
diff --git a/data/locale/zh_CN.po b/data/locale/zh_CN.po
index 52214c8..b1f3bf8 100644
--- a/data/locale/zh_CN.po
+++ b/data/locale/zh_CN.po
@@ -1,1295 +1,1333 @@
# Simplified Chinese translation for Me and My Shadow
# Copyright (C) 2012 Me and My Shadow
# This file is distributed under the same license (GNU GPLv3) as the meandmyshadow package.
# acme_pjz <acme_pjz@hotmail.com>, 2012
#
msgid ""
msgstr ""
"Project-Id-Version: Me and my shadow\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2012-07-31 22:23+0800\n"
-"PO-Revision-Date: 2012-07-31 22:30+0800\n"
+"POT-Creation-Date: 2012-08-19 16:33+0800\n"
+"PO-Revision-Date: 2012-08-19 16:36+0800\n"
"Last-Translator: acme_pjz <acme_pjz@hotmail.com>\n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: \n"
"X-Poedit-Language: Chinese\n"
"X-Poedit-Country: CHINA\n"
"X-Poedit-SourceCharset: utf-8\n"
"X-Poedit-Basepath: .\n"
"X-Poedit-KeywordsList: _;__\n"
"X-Poedit-SearchPath-0: F:\\Projects\\meandmyshadow\\src\n"
-#: F:\Projects\meandmyshadow\src/Addons.cpp:40
+#: F:\Projects\meandmyshadow\src/Addons.cpp:46
msgid "Addons"
msgstr "附加组件"
-#: F:\Projects\meandmyshadow\src/Addons.cpp:58
+#: F:\Projects\meandmyshadow\src/Addons.cpp:64
msgid "Unable to initialize addon menu:"
msgstr "不能初始化附加组件菜单:"
-#: F:\Projects\meandmyshadow\src/Addons.cpp:66
-#: F:\Projects\meandmyshadow\src/Addons.cpp:115
+#: F:\Projects\meandmyshadow\src/Addons.cpp:72
+#: F:\Projects\meandmyshadow\src/Addons.cpp:121
msgid "Back"
msgstr "后退"
-#: F:\Projects\meandmyshadow\src/Addons.cpp:97
+#: F:\Projects\meandmyshadow\src/Addons.cpp:103
msgid "Levels"
msgstr "关卡列表"
-#: F:\Projects\meandmyshadow\src/Addons.cpp:98
+#: F:\Projects\meandmyshadow\src/Addons.cpp:104
msgid "Level Packs"
msgstr "关卡包"
-#: F:\Projects\meandmyshadow\src/Addons.cpp:99
+#: F:\Projects\meandmyshadow\src/Addons.cpp:105
msgid "Themes"
msgstr "主题"
-#: F:\Projects\meandmyshadow\src/Addons.cpp:119
-#: F:\Projects\meandmyshadow\src/Addons.cpp:600
+#: F:\Projects\meandmyshadow\src/Addons.cpp:125
+#: F:\Projects\meandmyshadow\src/Addons.cpp:606
msgid "Install"
msgstr "安装"
-#: F:\Projects\meandmyshadow\src/Addons.cpp:123
+#: F:\Projects\meandmyshadow\src/Addons.cpp:129
msgid "Update"
msgstr "升级"
-#: F:\Projects\meandmyshadow\src/Addons.cpp:134
+#: F:\Projects\meandmyshadow\src/Addons.cpp:140
msgid "ERROR: unable to download addons file!"
msgstr "错误:无法下载附加组件!"
-#: F:\Projects\meandmyshadow\src/Addons.cpp:146
+#: F:\Projects\meandmyshadow\src/Addons.cpp:152
msgid "ERROR: unable to load addon_list file!"
msgstr "错误:无法加载文件addon_list!"
-#: F:\Projects\meandmyshadow\src/Addons.cpp:157
+#: F:\Projects\meandmyshadow\src/Addons.cpp:163
msgid "ERROR: Invalid file format of addons file!"
msgstr "错误:文件addons的格式无效!"
-#: F:\Projects\meandmyshadow\src/Addons.cpp:178
+#: F:\Projects\meandmyshadow\src/Addons.cpp:184
msgid "ERROR: Unable to create the installed_addons file."
msgstr "错误:无法创建文件installed_addons。"
-#: F:\Projects\meandmyshadow\src/Addons.cpp:190
+#: F:\Projects\meandmyshadow\src/Addons.cpp:196
msgid "ERROR: Invalid file format of the installed_addons!"
msgstr "错误:文件installed_addons的格式无效!"
-#: F:\Projects\meandmyshadow\src/Addons.cpp:405
-#: F:\Projects\meandmyshadow\src/Addons.cpp:422
-#: F:\Projects\meandmyshadow\src/Addons.cpp:439
-#: F:\Projects\meandmyshadow\src/Addons.cpp:466
-#: F:\Projects\meandmyshadow\src/Addons.cpp:483
-#: F:\Projects\meandmyshadow\src/Addons.cpp:497
+#: F:\Projects\meandmyshadow\src/Addons.cpp:411
+#: F:\Projects\meandmyshadow\src/Addons.cpp:428
+#: F:\Projects\meandmyshadow\src/Addons.cpp:445
+#: F:\Projects\meandmyshadow\src/Addons.cpp:472
+#: F:\Projects\meandmyshadow\src/Addons.cpp:489
+#: F:\Projects\meandmyshadow\src/Addons.cpp:503
msgid "ERROR: Unable to download addon!"
msgstr "错误:无法下载附加组件"
-#: F:\Projects\meandmyshadow\src/Addons.cpp:405
-#: F:\Projects\meandmyshadow\src/Addons.cpp:422
-#: F:\Projects\meandmyshadow\src/Addons.cpp:439
-#: F:\Projects\meandmyshadow\src/Addons.cpp:466
-#: F:\Projects\meandmyshadow\src/Addons.cpp:483
-#: F:\Projects\meandmyshadow\src/Addons.cpp:497
+#: F:\Projects\meandmyshadow\src/Addons.cpp:411
+#: F:\Projects\meandmyshadow\src/Addons.cpp:428
+#: F:\Projects\meandmyshadow\src/Addons.cpp:445
+#: F:\Projects\meandmyshadow\src/Addons.cpp:472
+#: F:\Projects\meandmyshadow\src/Addons.cpp:489
+#: F:\Projects\meandmyshadow\src/Addons.cpp:503
msgid "ERROR:"
msgstr "错误:"
-#: F:\Projects\meandmyshadow\src/Addons.cpp:595
+#: F:\Projects\meandmyshadow\src/Addons.cpp:601
msgid "Uninstall"
msgstr "卸载"
#: F:\Projects\meandmyshadow\src/Block.cpp:547
msgid "On"
msgstr "开启"
#: F:\Projects\meandmyshadow\src/Block.cpp:548
msgid "Off"
msgstr "关闭"
-#: F:\Projects\meandmyshadow\src/Functions.cpp:599
-#: F:\Projects\meandmyshadow\src/Functions.cpp:600
-#: F:\Projects\meandmyshadow\src/Functions.cpp:601
-#: F:\Projects\meandmyshadow\src/Functions.cpp:617
+#: F:\Projects\meandmyshadow\src/Functions.cpp:605
+#: F:\Projects\meandmyshadow\src/Functions.cpp:606
+#: F:\Projects\meandmyshadow\src/Functions.cpp:607
+#: F:\Projects\meandmyshadow\src/Functions.cpp:623
msgid "knewave"
msgstr "DroidSansFallback"
-#: F:\Projects\meandmyshadow\src/Functions.cpp:605
+#: F:\Projects\meandmyshadow\src/Functions.cpp:611
msgid "Blokletters-Viltstift"
msgstr "DroidSansFallback"
-#: F:\Projects\meandmyshadow\src/Functions.cpp:678
+#: F:\Projects\meandmyshadow\src/Functions.cpp:684
msgid "Loading..."
msgstr "正在读取..."
-#: F:\Projects\meandmyshadow\src/Functions.cpp:1210
-#: F:\Projects\meandmyshadow\src/Functions.cpp:1237
-#: F:\Projects\meandmyshadow\src/Functions.cpp:1575
+#: F:\Projects\meandmyshadow\src/Functions.cpp:1215
+#: F:\Projects\meandmyshadow\src/Functions.cpp:1242
+#: F:\Projects\meandmyshadow\src/Functions.cpp:1580
#: F:\Projects\meandmyshadow\src/InputManager.cpp:233
msgid "OK"
msgstr "确定"
-#: F:\Projects\meandmyshadow\src/Functions.cpp:1211
-#: F:\Projects\meandmyshadow\src/Functions.cpp:1223
-#: F:\Projects\meandmyshadow\src/Functions.cpp:1233
-#: F:\Projects\meandmyshadow\src/Functions.cpp:1579
+#: F:\Projects\meandmyshadow\src/Functions.cpp:1216
+#: F:\Projects\meandmyshadow\src/Functions.cpp:1228
+#: F:\Projects\meandmyshadow\src/Functions.cpp:1238
+#: F:\Projects\meandmyshadow\src/Functions.cpp:1584
msgid "Cancel"
msgstr "取消"
-#: F:\Projects\meandmyshadow\src/Functions.cpp:1215
+#: F:\Projects\meandmyshadow\src/Functions.cpp:1220
msgid "Abort"
msgstr "终止"
-#: F:\Projects\meandmyshadow\src/Functions.cpp:1216
-#: F:\Projects\meandmyshadow\src/Functions.cpp:1232
+#: F:\Projects\meandmyshadow\src/Functions.cpp:1221
+#: F:\Projects\meandmyshadow\src/Functions.cpp:1237
msgid "Retry"
msgstr "重试"
-#: F:\Projects\meandmyshadow\src/Functions.cpp:1217
+#: F:\Projects\meandmyshadow\src/Functions.cpp:1222
msgid "Ignore"
msgstr "忽略"
-#: F:\Projects\meandmyshadow\src/Functions.cpp:1221
-#: F:\Projects\meandmyshadow\src/Functions.cpp:1227
+#: F:\Projects\meandmyshadow\src/Functions.cpp:1226
+#: F:\Projects\meandmyshadow\src/Functions.cpp:1232
msgid "Yes"
msgstr "是"
-#: F:\Projects\meandmyshadow\src/Functions.cpp:1222
-#: F:\Projects\meandmyshadow\src/Functions.cpp:1228
+#: F:\Projects\meandmyshadow\src/Functions.cpp:1227
+#: F:\Projects\meandmyshadow\src/Functions.cpp:1233
msgid "No"
msgstr "否"
-#: F:\Projects\meandmyshadow\src/Functions.cpp:1346
+#: F:\Projects\meandmyshadow\src/Functions.cpp:1351
#, c-format
msgid ""
"%s already exists.\n"
"Do you want to overwrite it?"
msgstr ""
"%s 已经存在。\n"
"你是否想要覆盖它?"
-#: F:\Projects\meandmyshadow\src/Functions.cpp:1346
+#: F:\Projects\meandmyshadow\src/Functions.cpp:1351
msgid "Overwrite Prompt"
msgstr "文件覆盖提示"
-#: F:\Projects\meandmyshadow\src/Functions.cpp:1367
-#: F:\Projects\meandmyshadow\src/Functions.cpp:1385
+#: F:\Projects\meandmyshadow\src/Functions.cpp:1372
+#: F:\Projects\meandmyshadow\src/Functions.cpp:1390
#, c-format
msgid "Can't open file %s."
msgstr "不能打开文件 %s。"
-#: F:\Projects\meandmyshadow\src/Functions.cpp:1367
-#: F:\Projects\meandmyshadow\src/Functions.cpp:1385
+#: F:\Projects\meandmyshadow\src/Functions.cpp:1372
+#: F:\Projects\meandmyshadow\src/Functions.cpp:1390
msgid "Error"
msgstr "错误"
-#: F:\Projects\meandmyshadow\src/Functions.cpp:1516
+#: F:\Projects\meandmyshadow\src/Functions.cpp:1521
msgid "Save File"
msgstr "保存文件"
-#: F:\Projects\meandmyshadow\src/Functions.cpp:1516
+#: F:\Projects\meandmyshadow\src/Functions.cpp:1521
msgid "Load File"
msgstr "打开文件"
-#: F:\Projects\meandmyshadow\src/Functions.cpp:1520
+#: F:\Projects\meandmyshadow\src/Functions.cpp:1525
msgid "Search In"
msgstr "查找范围"
-#: F:\Projects\meandmyshadow\src/Functions.cpp:1530
+#: F:\Projects\meandmyshadow\src/Functions.cpp:1535
msgid "File Name"
msgstr "文件名"
#: F:\Projects\meandmyshadow\src/Game.cpp:246
-#: F:\Projects\meandmyshadow\src/Game.cpp:917
+#: F:\Projects\meandmyshadow\src/Game.cpp:915
#, c-format
msgid "Level %d %s"
msgstr "第 %d 关 %s"
#: F:\Projects\meandmyshadow\src/Game.cpp:735
#, c-format
msgid "Press %s key to save the game."
msgstr "按 %s 键来保存游戏。"
#: F:\Projects\meandmyshadow\src/Game.cpp:740
#, c-format
msgid "Press %s key to swap the position of player and shadow."
msgstr "按 %s 键交换你和阴影的位置。"
#: F:\Projects\meandmyshadow\src/Game.cpp:745
#, c-format
msgid "Press %s key to activate the switch."
msgstr "按 %s 键来激活开关。"
#: F:\Projects\meandmyshadow\src/Game.cpp:750
#, c-format
msgid "Press %s key to teleport."
msgstr "按 %s 键传送。"
#: F:\Projects\meandmyshadow\src/Game.cpp:791
#, c-format
msgid "Press %s to restart current level or press %s to load the game."
msgstr "按 %s 键重新开始游戏,或者按 %s 键读取进度。"
#: F:\Projects\meandmyshadow\src/Game.cpp:803
#, c-format
msgid "Press %s to restart current level."
msgstr "按 %s 键重新开始游戏。"
#: F:\Projects\meandmyshadow\src/Game.cpp:817
msgid "Your shadow has died."
msgstr "你的阴影死掉了。"
-#: F:\Projects\meandmyshadow\src/Game.cpp:869
+#: F:\Projects\meandmyshadow\src/Game.cpp:868
#, c-format
msgid "%d recordings"
msgstr "记录数 %d"
-#: F:\Projects\meandmyshadow\src/Game.cpp:909
+#: F:\Projects\meandmyshadow\src/Game.cpp:907
msgid "You've finished:"
msgstr "恭喜你完成了:"
-#: F:\Projects\meandmyshadow\src/Game.cpp:1094
+#: F:\Projects\meandmyshadow\src/Game.cpp:1093
#, c-format
msgid "Time: %-.2fs"
msgstr "时间: %-.2f秒"
-#: F:\Projects\meandmyshadow\src/Game.cpp:1103
+#: F:\Projects\meandmyshadow\src/Game.cpp:1102
#, c-format
msgid "Best time: %-.2fs"
msgstr "最佳时间: %-.2f秒"
-#: F:\Projects\meandmyshadow\src/Game.cpp:1114
+#: F:\Projects\meandmyshadow\src/Game.cpp:1113
#, c-format
msgid "Target time: %-.2fs"
msgstr "目标时间: %-.2f秒"
-#: F:\Projects\meandmyshadow\src/Game.cpp:1135
+#: F:\Projects\meandmyshadow\src/Game.cpp:1134
#, c-format
msgid "Recordings: %d"
msgstr "记录次数: %d"
-#: F:\Projects\meandmyshadow\src/Game.cpp:1143
+#: F:\Projects\meandmyshadow\src/Game.cpp:1142
#, c-format
msgid "Best recordings: %d"
msgstr "最佳记录次数: %d"
-#: F:\Projects\meandmyshadow\src/Game.cpp:1153
+#: F:\Projects\meandmyshadow\src/Game.cpp:1152
#, c-format
msgid "Target recordings: %d"
msgstr "目标记录次数: %d"
-#: F:\Projects\meandmyshadow\src/Game.cpp:1166
+#: F:\Projects\meandmyshadow\src/Game.cpp:1165
#, c-format
msgid "You earned the %s medal"
msgstr "你拿到了%s"
-#: F:\Projects\meandmyshadow\src/Game.cpp:1166
+#: F:\Projects\meandmyshadow\src/Game.cpp:1165
msgid "GOLD"
msgstr "金牌"
-#: F:\Projects\meandmyshadow\src/Game.cpp:1166
+#: F:\Projects\meandmyshadow\src/Game.cpp:1165
msgid "SILVER"
msgstr "银牌"
-#: F:\Projects\meandmyshadow\src/Game.cpp:1166
+#: F:\Projects\meandmyshadow\src/Game.cpp:1165
msgid "BRONZE"
msgstr "铜牌"
-#: F:\Projects\meandmyshadow\src/Game.cpp:1181
+#: F:\Projects\meandmyshadow\src/Game.cpp:1180
msgid "Menu"
msgstr "菜单"
-#: F:\Projects\meandmyshadow\src/Game.cpp:1188
+#: F:\Projects\meandmyshadow\src/Game.cpp:1187
#: F:\Projects\meandmyshadow\src/InputManager.cpp:44
msgid "Restart"
msgstr "重新开始"
-#: F:\Projects\meandmyshadow\src/Game.cpp:1195
+#: F:\Projects\meandmyshadow\src/Game.cpp:1194
msgid "Next"
msgstr "下一关"
-#: F:\Projects\meandmyshadow\src/Game.cpp:1250
+#: F:\Projects\meandmyshadow\src/Game.cpp:1249
msgid "Game replay is done."
msgstr "游戏重放已经完成。"
-#: F:\Projects\meandmyshadow\src/Game.cpp:1250
+#: F:\Projects\meandmyshadow\src/Game.cpp:1249
msgid "Game Replay"
msgstr "游戏重放"
-#: F:\Projects\meandmyshadow\src/Game.cpp:1421
-#: F:\Projects\meandmyshadow\src/Game.cpp:1423
+#: F:\Projects\meandmyshadow\src/Game.cpp:1420
+#: F:\Projects\meandmyshadow\src/Game.cpp:1422
msgid "Congratulations"
msgstr "恭喜你"
-#: F:\Projects\meandmyshadow\src/Game.cpp:1423
+#: F:\Projects\meandmyshadow\src/Game.cpp:1422
msgid "You have finished the levelpack!"
msgstr "你已经完成了整个关卡包!"
#: F:\Projects\meandmyshadow\src/InputManager.cpp:43
msgid "Up (in menu)"
msgstr "上(在菜单中)"
#: F:\Projects\meandmyshadow\src/InputManager.cpp:43
msgid "Down (in menu)"
msgstr "下(在菜单中)"
#: F:\Projects\meandmyshadow\src/InputManager.cpp:43
msgid "Left"
msgstr "左"
#: F:\Projects\meandmyshadow\src/InputManager.cpp:43
msgid "Right"
msgstr "右"
#: F:\Projects\meandmyshadow\src/InputManager.cpp:43
msgid "Jump"
msgstr "跳跃"
#: F:\Projects\meandmyshadow\src/InputManager.cpp:43
msgid "Action"
msgstr "动作键"
#: F:\Projects\meandmyshadow\src/InputManager.cpp:43
msgid "Space (Record)"
msgstr "空格(记录键)"
#: F:\Projects\meandmyshadow\src/InputManager.cpp:43
msgid "Cancel recording"
msgstr "取消记录"
#: F:\Projects\meandmyshadow\src/InputManager.cpp:44
msgid "Escape"
msgstr "退出"
#: F:\Projects\meandmyshadow\src/InputManager.cpp:44
msgid "Tab (View shadow/Level prop.)"
msgstr "Tab (切换视角/关卡属性)"
#: F:\Projects\meandmyshadow\src/InputManager.cpp:44
msgid "Save game (in editor)"
msgstr "保存游戏(在地图编辑器中)"
#: F:\Projects\meandmyshadow\src/InputManager.cpp:44
msgid "Load game"
msgstr "读取游戏"
#: F:\Projects\meandmyshadow\src/InputManager.cpp:44
msgid "Swap (in editor)"
msgstr "交换玩家和阴影的位置(在地图编辑器中)"
#: F:\Projects\meandmyshadow\src/InputManager.cpp:45
msgid "Teleport (in editor)"
msgstr "传送(在地图编辑器中)"
#: F:\Projects\meandmyshadow\src/InputManager.cpp:45
msgid "Suicide (in editor)"
msgstr "自杀(在地图编辑器中)"
#: F:\Projects\meandmyshadow\src/InputManager.cpp:45
msgid "Shift (in editor)"
msgstr "Shift (地图编辑器辅助按键)"
#: F:\Projects\meandmyshadow\src/InputManager.cpp:45
msgid "Next block type (in Editor)"
msgstr "下一个砖块类型(在地图编辑器中)"
#: F:\Projects\meandmyshadow\src/InputManager.cpp:46
msgid "Previous block type (in editor)"
msgstr "上一个砖块类型(在地图编辑器中)"
#: F:\Projects\meandmyshadow\src/InputManager.cpp:46
msgid "Select (in menu)"
msgstr "选择键(在菜单中)"
#: F:\Projects\meandmyshadow\src/InputManager.cpp:204
msgid "Config Keys"
msgstr "设置按键"
#: F:\Projects\meandmyshadow\src/InputManager.cpp:207
msgid "Select an item and press a key to config it."
msgstr "选择一个项目,然后按键进行设置。"
#: F:\Projects\meandmyshadow\src/InputManager.cpp:221
msgid "Primary key"
msgstr "主按键"
#: F:\Projects\meandmyshadow\src/InputManager.cpp:222
msgid "Alternative key"
msgstr "辅助按键"
#: F:\Projects\meandmyshadow\src/InputManager.cpp:228
msgid "Unset the key"
msgstr "取消设置"
#: F:\Projects\meandmyshadow\src/InputManager.cpp:298
msgid "(Not set)"
msgstr "(未设置)"
#: F:\Projects\meandmyshadow\src/LevelEditor.cpp:63
msgid "Block"
msgstr "砖块"
#: F:\Projects\meandmyshadow\src/LevelEditor.cpp:63
msgid "Player Start"
msgstr "玩家起点"
#: F:\Projects\meandmyshadow\src/LevelEditor.cpp:63
msgid "Shadow Start"
msgstr "阴影起点"
#: F:\Projects\meandmyshadow\src/LevelEditor.cpp:64
msgid "Exit"
msgstr "终点"
#: F:\Projects\meandmyshadow\src/LevelEditor.cpp:64
msgid "Shadow Block"
msgstr "阴影砖块"
#: F:\Projects\meandmyshadow\src/LevelEditor.cpp:64
msgid "Spikes"
msgstr "带刺砖块"
#: F:\Projects\meandmyshadow\src/LevelEditor.cpp:65
msgid "Checkpoint"
msgstr "记录点"
#: F:\Projects\meandmyshadow\src/LevelEditor.cpp:65
-#: F:\Projects\meandmyshadow\src/LevelEditSelect.cpp:291
+#: F:\Projects\meandmyshadow\src/LevelEditSelect.cpp:293
msgid "Swap"
msgstr "交换点"
#: F:\Projects\meandmyshadow\src/LevelEditor.cpp:65
#: F:\Projects\meandmyshadow\src/LevelEditor.cpp:2468
msgid "Fragile"
msgstr "易碎砖块"
#: F:\Projects\meandmyshadow\src/LevelEditor.cpp:66
msgid "Moving Block"
msgstr "移动砖块"
#: F:\Projects\meandmyshadow\src/LevelEditor.cpp:66
msgid "Moving Shadow Block"
msgstr "移动阴影砖块"
#: F:\Projects\meandmyshadow\src/LevelEditor.cpp:66
msgid "Moving Spikes"
msgstr "移动的刺"
#: F:\Projects\meandmyshadow\src/LevelEditor.cpp:67
msgid "Teleporter"
msgstr "传送点"
#: F:\Projects\meandmyshadow\src/LevelEditor.cpp:67
#: F:\Projects\meandmyshadow\src/LevelEditor.cpp:2387
msgid "Button"
msgstr "按钮"
#: F:\Projects\meandmyshadow\src/LevelEditor.cpp:67
#: F:\Projects\meandmyshadow\src/LevelEditor.cpp:2389
msgid "Switch"
msgstr "开关"
#: F:\Projects\meandmyshadow\src/LevelEditor.cpp:68
msgid "Conveyor Belt"
msgstr "传送带"
#: F:\Projects\meandmyshadow\src/LevelEditor.cpp:68
msgid "Shadow Conveyor Belt"
msgstr "阴影传送带"
#: F:\Projects\meandmyshadow\src/LevelEditor.cpp:68
msgid "Notification Block"
msgstr "消息方块"
#: F:\Projects\meandmyshadow\src/LevelEditor.cpp:68
msgid "Collectable"
msgstr "可收集的物品"
#: F:\Projects\meandmyshadow\src/LevelEditor.cpp:154
msgid "Toolbox"
msgstr "工具箱"
#: F:\Projects\meandmyshadow\src/LevelEditor.cpp:506
-#: F:\Projects\meandmyshadow\src/LevelEditor.cpp:3124
+#: F:\Projects\meandmyshadow\src/LevelEditor.cpp:3126
msgid "Select"
msgstr "选择"
#: F:\Projects\meandmyshadow\src/LevelEditor.cpp:521
-#: F:\Projects\meandmyshadow\src/LevelEditor.cpp:3133
+#: F:\Projects\meandmyshadow\src/LevelEditor.cpp:3135
msgid "Configure"
msgstr "设置"
#: F:\Projects\meandmyshadow\src/LevelEditor.cpp:536
msgid "Link"
msgstr "链接"
#: F:\Projects\meandmyshadow\src/LevelEditor.cpp:551
-#: F:\Projects\meandmyshadow\src/LevelEditor.cpp:3130
+#: F:\Projects\meandmyshadow\src/LevelEditor.cpp:3132
msgid "Delete"
msgstr "删除"
#: F:\Projects\meandmyshadow\src/LevelEditor.cpp:946
msgid "Are you sure you want to quit?"
msgstr "你确定要退出吗?"
#: F:\Projects\meandmyshadow\src/LevelEditor.cpp:946
msgid "Quit prompt"
msgstr "退出提示"
#: F:\Projects\meandmyshadow\src/LevelEditor.cpp:1045
#: F:\Projects\meandmyshadow\src/LevelEditor.cpp:1047
#: F:\Projects\meandmyshadow\src/LevelEditor.cpp:1505
#: F:\Projects\meandmyshadow\src/LevelEditor.cpp:1507
#, c-format
msgid "Level \"%s\" saved"
msgstr "关卡“%s”已保存"
#: F:\Projects\meandmyshadow\src/LevelEditor.cpp:1045
#: F:\Projects\meandmyshadow\src/LevelEditor.cpp:1047
#: F:\Projects\meandmyshadow\src/LevelEditor.cpp:1505
#: F:\Projects\meandmyshadow\src/LevelEditor.cpp:1507
msgid "Saved"
msgstr "已保存"
#: F:\Projects\meandmyshadow\src/LevelEditor.cpp:1520
-#: F:\Projects\meandmyshadow\src/LevelEditor.cpp:3139
+#: F:\Projects\meandmyshadow\src/LevelEditor.cpp:3141
msgid "Level settings"
msgstr "关卡设置"
#: F:\Projects\meandmyshadow\src/LevelEditor.cpp:1524
-#: F:\Projects\meandmyshadow\src/LevelEditSelect.cpp:203
+#: F:\Projects\meandmyshadow\src/LevelEditSelect.cpp:205
msgid "Name:"
msgstr "名称:"
#: F:\Projects\meandmyshadow\src/LevelEditor.cpp:1530
msgid "Theme:"
msgstr "主题:"
#: F:\Projects\meandmyshadow\src/LevelEditor.cpp:1545
msgid "Target time (s):"
msgstr "目标时间(秒):"
#: F:\Projects\meandmyshadow\src/LevelEditor.cpp:1556
msgid "Target recordings:"
msgstr "目标记录数:"
#: F:\Projects\meandmyshadow\src/LevelEditor.cpp:2117
#: F:\Projects\meandmyshadow\src/LevelEditor.cpp:2307
msgid "Defined"
msgstr "已设置"
#: F:\Projects\meandmyshadow\src/LevelEditor.cpp:2120
#: F:\Projects\meandmyshadow\src/LevelEditor.cpp:2310
#: F:\Projects\meandmyshadow\src/LevelEditor.cpp:2381
msgid "None"
msgstr "无"
#: F:\Projects\meandmyshadow\src/LevelEditor.cpp:2127
msgid "Moving block"
msgstr "移动砖块"
#: F:\Projects\meandmyshadow\src/LevelEditor.cpp:2130
msgid "Moving shadow block"
msgstr "移动阴影砖块"
#: F:\Projects\meandmyshadow\src/LevelEditor.cpp:2133
msgid "Moving spikes"
msgstr "移动的刺"
#: F:\Projects\meandmyshadow\src/LevelEditor.cpp:2140
#: F:\Projects\meandmyshadow\src/LevelEditor.cpp:2259
msgid "Enabled"
msgstr "启用"
#: F:\Projects\meandmyshadow\src/LevelEditor.cpp:2146
msgid "Loop"
msgstr "循环"
#: F:\Projects\meandmyshadow\src/LevelEditor.cpp:2152
msgid "Path"
msgstr "路径"
#: F:\Projects\meandmyshadow\src/LevelEditor.cpp:2203
msgid "Notification block"
msgstr "消息方块"
#: F:\Projects\meandmyshadow\src/LevelEditor.cpp:2206
msgid "Enter message here:"
msgstr "输入消息:"
#: F:\Projects\meandmyshadow\src/LevelEditor.cpp:2251
msgid "Shadow Conveyor belt"
msgstr "阴影传送带"
#: F:\Projects\meandmyshadow\src/LevelEditor.cpp:2253
msgid "Conveyor belt"
msgstr "传送带"
#: F:\Projects\meandmyshadow\src/LevelEditor.cpp:2265
msgid "Enter speed here:"
msgstr "输入速度:"
#: F:\Projects\meandmyshadow\src/LevelEditor.cpp:2314
msgid "Portal"
msgstr "传送门"
#: F:\Projects\meandmyshadow\src/LevelEditor.cpp:2317
msgid "Activate on touch"
msgstr "接触时传送"
#: F:\Projects\meandmyshadow\src/LevelEditor.cpp:2323
#: F:\Projects\meandmyshadow\src/LevelEditor.cpp:2417
msgid "Targets:"
msgstr "目标:"
#: F:\Projects\meandmyshadow\src/LevelEditor.cpp:2378
#, c-format
msgid "%d Defined"
msgstr "已设置 %d 个"
#: F:\Projects\meandmyshadow\src/LevelEditor.cpp:2394
msgid "Behaviour:"
msgstr "行为:"
#: F:\Projects\meandmyshadow\src/LevelEditor.cpp:2402
msgid "Toggle"
msgstr "切换"
#: F:\Projects\meandmyshadow\src/LevelEditor.cpp:2471
msgid "State:"
msgstr "状态:"
#: F:\Projects\meandmyshadow\src/LevelEditor.cpp:2477
msgid "Complete"
msgstr "完整的"
#: F:\Projects\meandmyshadow\src/LevelEditor.cpp:2478
msgid "One step"
msgstr "踩了一次"
#: F:\Projects\meandmyshadow\src/LevelEditor.cpp:2479
msgid "Two steps"
msgstr "踩了两次"
#: F:\Projects\meandmyshadow\src/LevelEditor.cpp:2480
msgid "Gone"
msgstr "已经破碎"
-#: F:\Projects\meandmyshadow\src/LevelEditor.cpp:3127
+#: F:\Projects\meandmyshadow\src/LevelEditor.cpp:3129
msgid "Add"
msgstr "添加"
-#: F:\Projects\meandmyshadow\src/LevelEditor.cpp:3136
-#: F:\Projects\meandmyshadow\src/LevelPlaySelect.cpp:66
+#: F:\Projects\meandmyshadow\src/LevelEditor.cpp:3138
+#: F:\Projects\meandmyshadow\src/LevelPlaySelect.cpp:69
msgid "Play"
msgstr "开始游戏"
-#: F:\Projects\meandmyshadow\src/LevelEditor.cpp:3142
+#: F:\Projects\meandmyshadow\src/LevelEditor.cpp:3144
msgid "Save level"
msgstr "保存关卡"
-#: F:\Projects\meandmyshadow\src/LevelEditor.cpp:3145
+#: F:\Projects\meandmyshadow\src/LevelEditor.cpp:3147
msgid "Back to menu"
msgstr "回主菜单"
-#: F:\Projects\meandmyshadow\src/LevelEditor.cpp:3194
-#: F:\Projects\meandmyshadow\src/LevelEditor.cpp:3200
+#: F:\Projects\meandmyshadow\src/LevelEditor.cpp:3196
+#: F:\Projects\meandmyshadow\src/LevelEditor.cpp:3202
#, c-format
msgid "Movespeed: %s"
msgstr "移动速度: %s"
-#: F:\Projects\meandmyshadow\src/LevelEditSelect.cpp:44
+#: F:\Projects\meandmyshadow\src/LevelEditSelect.cpp:46
msgid "Map Editor"
msgstr "地图编辑器"
-#: F:\Projects\meandmyshadow\src/LevelEditSelect.cpp:81
+#: F:\Projects\meandmyshadow\src/LevelEditSelect.cpp:83
msgid "New Levelpack"
msgstr "新建关卡包"
-#: F:\Projects\meandmyshadow\src/LevelEditSelect.cpp:86
+#: F:\Projects\meandmyshadow\src/LevelEditSelect.cpp:88
msgid "Pack Properties"
msgstr "关卡包属性"
-#: F:\Projects\meandmyshadow\src/LevelEditSelect.cpp:91
+#: F:\Projects\meandmyshadow\src/LevelEditSelect.cpp:93
msgid "Remove Pack"
msgstr "删除关卡包"
-#: F:\Projects\meandmyshadow\src/LevelEditSelect.cpp:96
+#: F:\Projects\meandmyshadow\src/LevelEditSelect.cpp:98
msgid "Move Map"
msgstr "移动地图"
-#: F:\Projects\meandmyshadow\src/LevelEditSelect.cpp:104
+#: F:\Projects\meandmyshadow\src/LevelEditSelect.cpp:106
msgid "Remove Map"
msgstr "删除地图"
-#: F:\Projects\meandmyshadow\src/LevelEditSelect.cpp:109
+#: F:\Projects\meandmyshadow\src/LevelEditSelect.cpp:111
msgid "Edit Map"
msgstr "编辑地图"
-#: F:\Projects\meandmyshadow\src/LevelEditSelect.cpp:200
+#: F:\Projects\meandmyshadow\src/LevelEditSelect.cpp:202
msgid "Properties"
msgstr "属性"
-#: F:\Projects\meandmyshadow\src/LevelEditSelect.cpp:212
+#: F:\Projects\meandmyshadow\src/LevelEditSelect.cpp:214
msgid "Description:"
msgstr "描述:"
-#: F:\Projects\meandmyshadow\src/LevelEditSelect.cpp:221
+#: F:\Projects\meandmyshadow\src/LevelEditSelect.cpp:223
msgid "Congratulation text:"
msgstr "完成提示:"
-#: F:\Projects\meandmyshadow\src/LevelEditSelect.cpp:249
-#: F:\Projects\meandmyshadow\src/LevelEditSelect.cpp:402
+#: F:\Projects\meandmyshadow\src/LevelEditSelect.cpp:251
+#: F:\Projects\meandmyshadow\src/LevelEditSelect.cpp:404
msgid "Add level"
msgstr "增加关卡"
-#: F:\Projects\meandmyshadow\src/LevelEditSelect.cpp:252
+#: F:\Projects\meandmyshadow\src/LevelEditSelect.cpp:254
msgid "File name:"
msgstr "文件名:"
-#: F:\Projects\meandmyshadow\src/LevelEditSelect.cpp:276
+#: F:\Projects\meandmyshadow\src/LevelEditSelect.cpp:278
msgid "Move level"
msgstr "移动关卡"
-#: F:\Projects\meandmyshadow\src/LevelEditSelect.cpp:279
+#: F:\Projects\meandmyshadow\src/LevelEditSelect.cpp:281
msgid "Level: "
msgstr "关卡:"
-#: F:\Projects\meandmyshadow\src/LevelEditSelect.cpp:289
+#: F:\Projects\meandmyshadow\src/LevelEditSelect.cpp:291
msgid "Before"
msgstr "之前"
-#: F:\Projects\meandmyshadow\src/LevelEditSelect.cpp:290
+#: F:\Projects\meandmyshadow\src/LevelEditSelect.cpp:292
msgid "After"
msgstr "之后"
-#: F:\Projects\meandmyshadow\src/LevelEditSelect.cpp:465
+#: F:\Projects\meandmyshadow\src/LevelEditSelect.cpp:467
msgid "Are you sure?"
msgstr "你确定吗?"
-#: F:\Projects\meandmyshadow\src/LevelEditSelect.cpp:465
+#: F:\Projects\meandmyshadow\src/LevelEditSelect.cpp:467
msgid "Remove prompt"
msgstr "删除提示"
-#: F:\Projects\meandmyshadow\src/LevelEditSelect.cpp:610
+#: F:\Projects\meandmyshadow\src/LevelEditSelect.cpp:612
msgid "No file name given for the new level."
msgstr "没有给新关卡指定文件名。"
-#: F:\Projects\meandmyshadow\src/LevelEditSelect.cpp:610
+#: F:\Projects\meandmyshadow\src/LevelEditSelect.cpp:612
msgid "Missing file name"
msgstr "文件名未指定"
-#: F:\Projects\meandmyshadow\src/LevelEditSelect.cpp:691
+#: F:\Projects\meandmyshadow\src/LevelEditSelect.cpp:693
msgid "The entered level number isn't valid!"
msgstr "输入的关卡编号无效!"
-#: F:\Projects\meandmyshadow\src/LevelEditSelect.cpp:691
+#: F:\Projects\meandmyshadow\src/LevelEditSelect.cpp:693
msgid "Illegal number"
msgstr "无效编号"
-#: F:\Projects\meandmyshadow\src/LevelPlaySelect.cpp:44
+#: F:\Projects\meandmyshadow\src/LevelPlaySelect.cpp:47
msgid "Select Level"
msgstr "选择关卡"
-#: F:\Projects\meandmyshadow\src/LevelPlaySelect.cpp:93
+#: F:\Projects\meandmyshadow\src/LevelPlaySelect.cpp:96
msgid "Choose a level"
msgstr "选择一个关卡"
-#: F:\Projects\meandmyshadow\src/LevelPlaySelect.cpp:94
+#: F:\Projects\meandmyshadow\src/LevelPlaySelect.cpp:97
msgid "Time:"
msgstr "时间:"
-#: F:\Projects\meandmyshadow\src/LevelPlaySelect.cpp:95
-#: F:\Projects\meandmyshadow\src/StatisticsScreen.cpp:171
+#: F:\Projects\meandmyshadow\src/LevelPlaySelect.cpp:98
+#: F:\Projects\meandmyshadow\src/StatisticsScreen.cpp:178
msgid "Recordings:"
msgstr "记录次数:"
-#: F:\Projects\meandmyshadow\src/StatisticsManager.cpp:59
-msgid "Newbie"
-msgstr "新手"
-
-#: F:\Projects\meandmyshadow\src/StatisticsManager.cpp:59
-msgid "Congratulations, you completed one level!"
-msgstr "恭喜你成功完成了一个关卡!"
-
-#: F:\Projects\meandmyshadow\src/StatisticsManager.cpp:60
-msgid "Experienced player"
-msgstr "有经验的玩家"
-
-#: F:\Projects\meandmyshadow\src/StatisticsManager.cpp:60
-msgid "Completed 50 levels."
-msgstr "完成50个关卡。"
-
-#: F:\Projects\meandmyshadow\src/StatisticsManager.cpp:61
-msgid "Good job!"
-msgstr "干得好!"
-
-#: F:\Projects\meandmyshadow\src/StatisticsManager.cpp:61
-msgid "Get your first gold medal."
-msgstr "拿到你的第一个金牌。"
-
-#: F:\Projects\meandmyshadow\src/StatisticsManager.cpp:62
-msgid "Expert"
-msgstr "专家"
-
-#: F:\Projects\meandmyshadow\src/StatisticsManager.cpp:62
-msgid "Earned 50 gold medal."
-msgstr "拿到50个金牌。"
-
-#: F:\Projects\meandmyshadow\src/StatisticsManager.cpp:64
-msgid "Graduate"
-msgstr "毕业生"
-
-#: F:\Projects\meandmyshadow\src/StatisticsManager.cpp:64
-msgid "Complete the tutorial level pack."
-msgstr "完成教程关卡包。"
-
-#: F:\Projects\meandmyshadow\src/StatisticsManager.cpp:65
-msgid "Outstanding graduate"
-msgstr "优秀毕业生"
-
-#: F:\Projects\meandmyshadow\src/StatisticsManager.cpp:65
-msgid "Complete the tutorial level pack with all levels gold medal."
-msgstr "以全部金牌的成绩完成教学关卡包。"
-
-#: F:\Projects\meandmyshadow\src/StatisticsManager.cpp:67
-msgid "Addicted"
-msgstr "入迷"
-
-#: F:\Projects\meandmyshadow\src/StatisticsManager.cpp:67
-msgid "Played Me and My Shadow for more than 2 hours."
-msgstr "玩Me and My Shadow超过2小时。"
-
-#: F:\Projects\meandmyshadow\src/StatisticsManager.cpp:68
-msgid "Me and My Shadow loyal fan"
-msgstr "Me and My Shadow忠实粉丝"
-
-#: F:\Projects\meandmyshadow\src/StatisticsManager.cpp:68
-msgid "Played Me and My Shadow for more than 24 hours."
-msgstr "玩Me and My Shadow超过24小时。"
-
-#: F:\Projects\meandmyshadow\src/StatisticsManager.cpp:70
-msgid "Constructor"
-msgstr "建造师"
-
-#: F:\Projects\meandmyshadow\src/StatisticsManager.cpp:70
-msgid "Use the level editor for more than 2 hours."
-msgstr "使用地图编辑器超过2小时。"
-
-#: F:\Projects\meandmyshadow\src/StatisticsManager.cpp:71
-msgid "The creator"
-msgstr "造物主"
-
-#: F:\Projects\meandmyshadow\src/StatisticsManager.cpp:71
-msgid "Use the level editor for more than 24 hours."
-msgstr "使用地图编辑器超过24小时。"
-
-#: F:\Projects\meandmyshadow\src/StatisticsManager.cpp:73
-msgid "Look, cute level!"
-msgstr "看,可爱的关卡!"
-
-#: F:\Projects\meandmyshadow\src/StatisticsManager.cpp:73
-msgid "Created your first level."
-msgstr "创建你的第一个关卡。"
-
-#: F:\Projects\meandmyshadow\src/StatisticsManager.cpp:74
-msgid "The level museum"
-msgstr "关卡博物馆"
-
-#: F:\Projects\meandmyshadow\src/StatisticsManager.cpp:74
-msgid "Created 50 levels."
-msgstr "创建了50个关卡。"
-
-#: F:\Projects\meandmyshadow\src/StatisticsManager.cpp:76
-msgid "Frog"
-msgstr "青蛙"
-
-#: F:\Projects\meandmyshadow\src/StatisticsManager.cpp:76
-msgid "Jump for 1000 times."
-msgstr "跳跃了1000次。"
-
-#: F:\Projects\meandmyshadow\src/StatisticsManager.cpp:78
-msgid "Be careful!"
-msgstr "小心!"
-
-#: F:\Projects\meandmyshadow\src/StatisticsManager.cpp:78
-msgid "The first death."
-msgstr "第一次挂掉。"
-
-#: F:\Projects\meandmyshadow\src/StatisticsManager.cpp:79
-msgid "It doesn't matter..."
-msgstr "没关系……"
-
-#: F:\Projects\meandmyshadow\src/StatisticsManager.cpp:79
-msgid "Died for 50 times."
-msgstr "挂掉50次。"
-
-#: F:\Projects\meandmyshadow\src/StatisticsManager.cpp:80
-msgid "Expert of trial and error"
-msgstr "试错专家"
-
-#: F:\Projects\meandmyshadow\src/StatisticsManager.cpp:80
-msgid "Died for 1000 times."
-msgstr "挂掉1000次。"
-
-#: F:\Projects\meandmyshadow\src/StatisticsManager.cpp:82
-msgid "Double kill"
-msgstr "双重击杀"
+#: F:\Projects\meandmyshadow\src/StatisticsManager.cpp:359
+msgid "New achievement:"
+msgstr "新成就:"
-#: F:\Projects\meandmyshadow\src/StatisticsManager.cpp:82
-msgid "Make both player and shadow die."
-msgstr "让玩家和阴影都挂掉。"
+#: F:\Projects\meandmyshadow\src/StatisticsManager.cpp:367
+#, c-format
+msgid "Achieved at %s"
+msgstr "完成于 %s"
-#: F:\Projects\meandmyshadow\src/StatisticsManager.cpp:85
-msgid "Programmer"
-msgstr "程序员"
+#: F:\Projects\meandmyshadow\src/StatisticsManager.cpp:373
+msgid "Unknown achievement"
+msgstr "未知成就"
-#: F:\Projects\meandmyshadow\src/StatisticsManager.cpp:85
-msgid "Played the development version of Me and My Shadow."
-msgstr "玩过Me and My Shadow的开发版本。"
+#: F:\Projects\meandmyshadow\src/StatisticsManager.cpp:379
+#, c-format
+msgid "Achieved %0.1f%%"
+msgstr "已完成 %0.1f%%"
-#: F:\Projects\meandmyshadow\src/StatisticsManager.cpp:318
-msgid "New achievement:"
-msgstr "新成就:"
+#: F:\Projects\meandmyshadow\src/StatisticsManager.cpp:383
+msgid "Not achieved"
+msgstr "未完成"
-#: F:\Projects\meandmyshadow\src/StatisticsScreen.cpp:129
+#: F:\Projects\meandmyshadow\src/StatisticsScreen.cpp:135
msgid "Achievements and Statistics"
msgstr "成就与统计信息"
-#: F:\Projects\meandmyshadow\src/StatisticsScreen.cpp:153
+#: F:\Projects\meandmyshadow\src/StatisticsScreen.cpp:159
msgid "Total"
msgstr "总计"
-#: F:\Projects\meandmyshadow\src/StatisticsScreen.cpp:162
+#: F:\Projects\meandmyshadow\src/StatisticsScreen.cpp:168
msgid "Traveling distance (m)"
msgstr "旅行距离(米)"
-#: F:\Projects\meandmyshadow\src/StatisticsScreen.cpp:163
+#: F:\Projects\meandmyshadow\src/StatisticsScreen.cpp:169
msgid "Jump times"
msgstr "跳跃次数"
-#: F:\Projects\meandmyshadow\src/StatisticsScreen.cpp:164
+#: F:\Projects\meandmyshadow\src/StatisticsScreen.cpp:170
msgid "Die times"
msgstr "死亡次数"
#: F:\Projects\meandmyshadow\src/StatisticsScreen.cpp:171
+msgid "Squashed times"
+msgstr "被夹次数:"
+
+#: F:\Projects\meandmyshadow\src/StatisticsScreen.cpp:178
msgid "Switch pulled times:"
msgstr "使用开关次数:"
-#: F:\Projects\meandmyshadow\src/StatisticsScreen.cpp:172
+#: F:\Projects\meandmyshadow\src/StatisticsScreen.cpp:179
msgid "Swap times:"
msgstr "交换次数:"
-#: F:\Projects\meandmyshadow\src/StatisticsScreen.cpp:179
+#: F:\Projects\meandmyshadow\src/StatisticsScreen.cpp:186
msgid "Completed levels:"
msgstr "完成关卡数:"
-#: F:\Projects\meandmyshadow\src/StatisticsScreen.cpp:221
+#: F:\Projects\meandmyshadow\src/StatisticsScreen.cpp:228
msgid "In-game time:"
msgstr "游戏用时:"
-#: F:\Projects\meandmyshadow\src/StatisticsScreen.cpp:234
+#: F:\Projects\meandmyshadow\src/StatisticsScreen.cpp:241
msgid "Level editing time:"
msgstr "地图编辑用时:"
-#: F:\Projects\meandmyshadow\src/StatisticsScreen.cpp:246
+#: F:\Projects\meandmyshadow\src/StatisticsScreen.cpp:253
msgid "Created levels:"
msgstr "创建的关卡:"
-#: F:\Projects\meandmyshadow\src/StatisticsScreen.cpp:292
-msgid "You don't have any achievements now. Play the game and try to earn some!"
-msgstr "你目前没有获得任何成就。试着通过玩游戏获取一些!"
-
-#: F:\Projects\meandmyshadow\src/StatisticsScreen.cpp:321
+#: F:\Projects\meandmyshadow\src/StatisticsScreen.cpp:341
msgid "Achievements"
msgstr "成就"
-#: F:\Projects\meandmyshadow\src/StatisticsScreen.cpp:322
+#: F:\Projects\meandmyshadow\src/StatisticsScreen.cpp:342
msgid "Statistics"
msgstr "统计信息"
#: F:\Projects\meandmyshadow\src/TitleMenu.cpp:50
msgid "Options"
msgstr "选项"
#: F:\Projects\meandmyshadow\src/TitleMenu.cpp:53
msgid "Quit"
msgstr "退出"
#: F:\Projects\meandmyshadow\src/TitleMenu.cpp:129
msgid "Enable internet in order to install addons."
msgstr "启用网络访问,才能下载附加组件。"
#: F:\Projects\meandmyshadow\src/TitleMenu.cpp:129
msgid "Internet disabled"
msgstr "网络已禁用"
#: F:\Projects\meandmyshadow\src/TitleMenu.cpp:206
#: F:\Projects\meandmyshadow\src/TitleMenu.cpp:710
msgid "Credits"
msgstr "作者"
#: F:\Projects\meandmyshadow\src/TitleMenu.cpp:237
msgid "Settings"
msgstr "选项"
#: F:\Projects\meandmyshadow\src/TitleMenu.cpp:281
msgid "Music"
msgstr "音乐"
#: F:\Projects\meandmyshadow\src/TitleMenu.cpp:289
msgid "Sound"
msgstr "音效"
#: F:\Projects\meandmyshadow\src/TitleMenu.cpp:297
msgid "Fullscreen"
msgstr "全屏幕"
#: F:\Projects\meandmyshadow\src/TitleMenu.cpp:302
msgid "Resolution"
msgstr "分辨率"
#: F:\Projects\meandmyshadow\src/TitleMenu.cpp:384
msgid "Language"
msgstr "语言"
#: F:\Projects\meandmyshadow\src/TitleMenu.cpp:393
msgid "Auto-Detect"
msgstr "自动检测"
#: F:\Projects\meandmyshadow\src/TitleMenu.cpp:421
msgid "Theme"
msgstr "主题"
#: F:\Projects\meandmyshadow\src/TitleMenu.cpp:454
msgid "Level themes"
msgstr "默认主题"
#: F:\Projects\meandmyshadow\src/TitleMenu.cpp:459
msgid "Internet"
msgstr "网络"
#: F:\Projects\meandmyshadow\src/TitleMenu.cpp:465
msgid "Internet proxy"
msgstr "网络代理"
#: F:\Projects\meandmyshadow\src/TitleMenu.cpp:482
msgid "Clear Progress"
msgstr "清除进度"
#: F:\Projects\meandmyshadow\src/TitleMenu.cpp:501
msgid "Save Changes"
msgstr "保存变更"
#: F:\Projects\meandmyshadow\src/TitleMenu.cpp:611
msgid "Do you really want to reset level progress?"
msgstr "你确定要清除游戏进度吗?"
#: F:\Projects\meandmyshadow\src/TitleMenu.cpp:611
msgid "Warning"
msgstr "警告"
+#: F:\Projects\meandmyshadow\src/AchievementList.h:24
+msgid "Newbie"
+msgstr "新手"
+
+#: F:\Projects\meandmyshadow\src/AchievementList.h:24
+msgid "Congratulations, you completed one level!"
+msgstr "恭喜你成功完成了一个关卡!"
+
+#: F:\Projects\meandmyshadow\src/AchievementList.h:25
+msgid "Experienced player"
+msgstr "有经验的玩家"
+
+#: F:\Projects\meandmyshadow\src/AchievementList.h:25
+msgid "Completed 50 levels."
+msgstr "完成50个关卡。"
+
+#: F:\Projects\meandmyshadow\src/AchievementList.h:26
+msgid "Good job!"
+msgstr "干得好!"
+
+#: F:\Projects\meandmyshadow\src/AchievementList.h:26
+msgid "Get your first gold medal."
+msgstr "拿到你的第一个金牌。"
+
+#: F:\Projects\meandmyshadow\src/AchievementList.h:27
+msgid "Expert"
+msgstr "专家"
+
+#: F:\Projects\meandmyshadow\src/AchievementList.h:27
+msgid "Earned 50 gold medal."
+msgstr "拿到50个金牌。"
+
+#: F:\Projects\meandmyshadow\src/AchievementList.h:29
+msgid "Graduate"
+msgstr "毕业生"
+
+#: F:\Projects\meandmyshadow\src/AchievementList.h:29
+msgid "Complete the tutorial level pack."
+msgstr "完成教程关卡包。"
+
+#: F:\Projects\meandmyshadow\src/AchievementList.h:30
+msgid "Outstanding graduate"
+msgstr "优秀毕业生"
+
+#: F:\Projects\meandmyshadow\src/AchievementList.h:30
+msgid "Complete the tutorial level pack with all levels gold medal."
+msgstr "以全部金牌的成绩完成教学关卡包。"
+
+#: F:\Projects\meandmyshadow\src/AchievementList.h:32
+msgid "Addicted"
+msgstr "入迷"
+
+#: F:\Projects\meandmyshadow\src/AchievementList.h:32
+msgid "Played Me and My Shadow for more than 2 hours."
+msgstr "玩Me and My Shadow超过2小时。"
+
+#: F:\Projects\meandmyshadow\src/AchievementList.h:33
+msgid "Me and My Shadow loyal fan"
+msgstr "Me and My Shadow忠实粉丝"
+
+#: F:\Projects\meandmyshadow\src/AchievementList.h:33
+msgid "Played Me and My Shadow for more than 24 hours."
+msgstr "玩Me and My Shadow超过24小时。"
+
+#: F:\Projects\meandmyshadow\src/AchievementList.h:35
+msgid "Constructor"
+msgstr "建造师"
+
+#: F:\Projects\meandmyshadow\src/AchievementList.h:35
+msgid "Use the level editor for more than 2 hours."
+msgstr "使用地图编辑器超过2小时。"
+
+#: F:\Projects\meandmyshadow\src/AchievementList.h:36
+msgid "The creator"
+msgstr "造物主"
+
+#: F:\Projects\meandmyshadow\src/AchievementList.h:36
+msgid "Use the level editor for more than 24 hours."
+msgstr "使用地图编辑器超过24小时。"
+
+#: F:\Projects\meandmyshadow\src/AchievementList.h:38
+msgid "Look, cute level!"
+msgstr "看,可爱的关卡!"
+
+#: F:\Projects\meandmyshadow\src/AchievementList.h:38
+msgid "Created your first level."
+msgstr "创建你的第一个关卡。"
+
+#: F:\Projects\meandmyshadow\src/AchievementList.h:39
+msgid "The level museum"
+msgstr "关卡博物馆"
+
+#: F:\Projects\meandmyshadow\src/AchievementList.h:39
+msgid "Created 50 levels."
+msgstr "创建了50个关卡。"
+
+#: F:\Projects\meandmyshadow\src/AchievementList.h:41
+msgid "Frog"
+msgstr "青蛙"
+
+#: F:\Projects\meandmyshadow\src/AchievementList.h:41
+msgid "Jump for 1000 times."
+msgstr "跳跃了1000次。"
+
+#: F:\Projects\meandmyshadow\src/AchievementList.h:43
+msgid "Be careful!"
+msgstr "小心!"
+
+#: F:\Projects\meandmyshadow\src/AchievementList.h:43
+msgid "The first death."
+msgstr "第一次挂掉。"
+
+#: F:\Projects\meandmyshadow\src/AchievementList.h:44
+msgid "It doesn't matter..."
+msgstr "没关系……"
+
+#: F:\Projects\meandmyshadow\src/AchievementList.h:44
+msgid "Died for 50 times."
+msgstr "挂掉50次。"
+
+#: F:\Projects\meandmyshadow\src/AchievementList.h:45
+msgid "Expert of trial and error"
+msgstr "试错专家"
+
+#: F:\Projects\meandmyshadow\src/AchievementList.h:45
+msgid "Died for 1000 times."
+msgstr "挂掉1000次。"
+
+#: F:\Projects\meandmyshadow\src/AchievementList.h:47
+msgid "Keep an eye for moving walls!"
+msgstr "小心移动的墙!"
+
+#: F:\Projects\meandmyshadow\src/AchievementList.h:47
+msgid "First time being squashed."
+msgstr "第一次被夹死。"
+
+#: F:\Projects\meandmyshadow\src/AchievementList.h:48
+msgid "Potato masher"
+msgstr "马铃薯捣碎器"
+
+#: F:\Projects\meandmyshadow\src/AchievementList.h:48
+msgid "Squashed for 50 times."
+msgstr "被夹死50次。"
+
+#: F:\Projects\meandmyshadow\src/AchievementList.h:50
+msgid "Double kill"
+msgstr "双重击杀"
+
+#: F:\Projects\meandmyshadow\src/AchievementList.h:50
+msgid "Make both player and shadow die."
+msgstr "让玩家和阴影都挂掉。"
+
+#: F:\Projects\meandmyshadow\src/AchievementList.h:52
+msgid "Programmer"
+msgstr "程序员"
+
+#: F:\Projects\meandmyshadow\src/AchievementList.h:52
+msgid "Played the development version of Me and My Shadow."
+msgstr "玩过Me and My Shadow的开发版本。"
+
# TRANSLATORS: name of a key
#: F:\Projects\meandmyshadow\src/dummy.h:1
msgid "backspace"
msgstr "backspace"
# TRANSLATORS: name of a key
#: F:\Projects\meandmyshadow\src/dummy.h:1
msgid "tab"
msgstr "tab"
# TRANSLATORS: name of a key
#: F:\Projects\meandmyshadow\src/dummy.h:1
msgid "clear"
msgstr "clear"
# TRANSLATORS: name of a key
#: F:\Projects\meandmyshadow\src/dummy.h:1
msgid "return"
msgstr "回车"
# TRANSLATORS: name of a key
#: F:\Projects\meandmyshadow\src/dummy.h:1
msgid "pause"
msgstr "pause"
# TRANSLATORS: name of a key
#: F:\Projects\meandmyshadow\src/dummy.h:1
msgid "escape"
msgstr "escape"
# TRANSLATORS: name of a key
#: F:\Projects\meandmyshadow\src/dummy.h:1
msgid "space"
msgstr "空格"
#: F:\Projects\meandmyshadow\src/dummy.h:1
msgid "delete"
msgstr "delete"
#: F:\Projects\meandmyshadow\src/dummy.h:1
msgid "enter"
msgstr "enter"
# TRANSLATORS: name of a key
#: F:\Projects\meandmyshadow\src/dummy.h:1
msgid "equals"
msgstr "equals"
# TRANSLATORS: name of a key
#: F:\Projects\meandmyshadow\src/dummy.h:2
msgid "up"
msgstr "上"
#: F:\Projects\meandmyshadow\src/dummy.h:2
msgid "down"
msgstr "下"
# TRANSLATORS: name of a key
#: F:\Projects\meandmyshadow\src/dummy.h:2
msgid "right"
msgstr "右"
#: F:\Projects\meandmyshadow\src/dummy.h:2
msgid "left"
msgstr "左"
# TRANSLATORS: name of a key
#: F:\Projects\meandmyshadow\src/dummy.h:2
msgid "insert"
msgstr "insert"
#: F:\Projects\meandmyshadow\src/dummy.h:2
msgid "home"
msgstr "home"
#: F:\Projects\meandmyshadow\src/dummy.h:2
msgid "end"
msgstr "end"
# TRANSLATORS: name of a key
#: F:\Projects\meandmyshadow\src/dummy.h:2
msgid "page up"
msgstr "page up"
# TRANSLATORS: name of a key
#: F:\Projects\meandmyshadow\src/dummy.h:2
msgid "page down"
msgstr "page down"
# TRANSLATORS: name of a key
#: F:\Projects\meandmyshadow\src/dummy.h:2
msgid "numlock"
msgstr "numlock"
# TRANSLATORS: name of a key
#: F:\Projects\meandmyshadow\src/dummy.h:2
msgid "caps lock"
msgstr "caps lock"
# TRANSLATORS: name of a key
#: F:\Projects\meandmyshadow\src/dummy.h:3
msgid "scroll lock"
msgstr "scroll lock"
# TRANSLATORS: name of a key
#: F:\Projects\meandmyshadow\src/dummy.h:3
msgid "right shift"
msgstr "右 shift"
# TRANSLATORS: name of a key
#: F:\Projects\meandmyshadow\src/dummy.h:3
msgid "left shift"
msgstr "左 shift"
# TRANSLATORS: name of a key
#: F:\Projects\meandmyshadow\src/dummy.h:3
msgid "right ctrl"
msgstr "右 ctrl"
# TRANSLATORS: name of a key
#: F:\Projects\meandmyshadow\src/dummy.h:3
msgid "left ctrl"
msgstr "左 ctrl"
# TRANSLATORS: name of a key
#: F:\Projects\meandmyshadow\src/dummy.h:3
msgid "right alt"
msgstr "右 alt"
# TRANSLATORS: name of a key
#: F:\Projects\meandmyshadow\src/dummy.h:3
msgid "left alt"
msgstr "左 alt"
# TRANSLATORS: name of a key
#: F:\Projects\meandmyshadow\src/dummy.h:4
msgid "right meta"
msgstr "右 meta"
# TRANSLATORS: name of a key
#: F:\Projects\meandmyshadow\src/dummy.h:4
msgid "left meta"
msgstr "左 meta"
# TRANSLATORS: name of a key
#: F:\Projects\meandmyshadow\src/dummy.h:4
msgid "left super"
msgstr "左 super"
# TRANSLATORS: name of a key
#: F:\Projects\meandmyshadow\src/dummy.h:4
msgid "right super"
msgstr "右 super"
# TRANSLATORS: name of a key
#: F:\Projects\meandmyshadow\src/dummy.h:4
msgid "alt gr"
msgstr "alt gr"
# TRANSLATORS: name of a key
#: F:\Projects\meandmyshadow\src/dummy.h:4
msgid "compose"
msgstr "compose"
# TRANSLATORS: name of a key
#: F:\Projects\meandmyshadow\src/dummy.h:4
msgid "help"
msgstr "help"
# TRANSLATORS: name of a key
#: F:\Projects\meandmyshadow\src/dummy.h:4
msgid "print screen"
msgstr "print screen"
# TRANSLATORS: name of a key
#: F:\Projects\meandmyshadow\src/dummy.h:5
msgid "sys req"
msgstr "sys req"
# TRANSLATORS: name of a key
#: F:\Projects\meandmyshadow\src/dummy.h:5
msgid "break"
msgstr "break"
#: F:\Projects\meandmyshadow\src/dummy.h:5
msgid "menu"
msgstr "menu"
# TRANSLATORS: name of a key
#: F:\Projects\meandmyshadow\src/dummy.h:5
msgid "power"
msgstr "power"
# TRANSLATORS: name of a key
#: F:\Projects\meandmyshadow\src/dummy.h:5
msgid "euro"
msgstr "euro"
#: F:\Projects\meandmyshadow\src/dummy.h:5
msgid "undo"
msgstr "undo"
+#~ msgid ""
+#~ "You don't have any achievements now. Play the game and try to earn some!"
+#~ msgstr "你目前没有获得任何成就。试着通过玩游戏获取一些!"
+
#, fuzzy
#~ msgid "Record times:"
#~ msgstr "记录次数:"
diff --git a/src/AchievementList.h b/src/AchievementList.h
index 00edd66..f07f1af 100644
--- a/src/AchievementList.h
+++ b/src/AchievementList.h
@@ -1,56 +1,56 @@
/*
* Copyright (C) 2012 Me and My Shadow
*
* This file is part of Me and My Shadow.
*
* Me and My Shadow is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Me and My Shadow is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Me and My Shadow. If not, see <http://www.gnu.org/licenses/>.
*/
// Note: This is an internal file for all avaliable achievements.
// Don't include it in other files!
AchievementInfo achievementList[]={
{"newbie",__("Newbie"),"themes/Cloudscape/player.png",{0,0,23,40},__("Congratulations, you completed one level!"),ACHIEVEMT_TITLE},
{"experienced",__("Experienced player"),"themes/Cloudscape/player.png",{0,0,23,40},__("Completed 50 levels."),ACHIEVEMT_PROGRESS},
{"goodjob",__("Good job!"),"gfx/medals.png",{60,0,30,30},__("Get your first gold medal."),ACHIEVEMT_ALL},
{"expert",__("Expert"),"gfx/medals.png",{60,0,30,30},__("Earned 50 gold medal."),ACHIEVEMT_PROGRESS},
{"tutorial",__("Graduate"),"gfx/medals.png",{60,0,30,30},__("Complete the tutorial level pack."),ACHIEVEMT_PROGRESS},
{"tutorialGold",__("Outstanding graduate"),"gfx/medals.png",{60,0,30,30},__("Complete the tutorial level pack with all levels gold medal."),ACHIEVEMT_PROGRESS},
{"addicted",__("Addicted"),"themes/Cloudscape/player.png",{0,0,23,40},__("Played Me and My Shadow for more than 2 hours.")},
{"loyalFan",__("Me and My Shadow loyal fan"),"themes/Cloudscape/player.png",{0,0,23,40},__("Played Me and My Shadow for more than 24 hours.")},
{"constructor",__("Constructor"),"gfx/gui.png",{112,16,16,16},__("Use the level editor for more than 2 hours.")},
{"constructor2",__("The creator"),"gfx/gui.png",{112,16,16,16},__("Use the level editor for more than 24 hours.")},
{"create1",__("Look, cute level!"),"gfx/gui.png",{112,16,16,16},__("Created your first level."),ACHIEVEMT_ALL},
{"create50",__("The level museum"),"gfx/gui.png",{112,16,16,16},__("Created 50 levels."),ACHIEVEMT_PROGRESS},
{"frog",__("Frog"),"themes/Cloudscape/player.png",{0,0,23,40},__("Jump for 1000 times."),ACHIEVEMT_PROGRESS},
- {"die1",__("Be careful!"),"themes/Cloudscape/deathright.png",{0,14,23,40},__("The first death.")},
+ {"die1",__("Be careful!"),"themes/Cloudscape/deathright.png",{0,14,23,40},__("The first death."),ACHIEVEMT_ALL},
{"die50",__("It doesn't matter..."),"themes/Cloudscape/deathright.png",{0,14,23,40},__("Died for 50 times.")},
- {"die1000",__("Expert of trial and error"),"themes/Cloudscape/deathright.png",{0,14,23,40},__("Died for 1000 times."),ACHIEVEMT_TITLE},
+ {"die1000",__("Expert of trial and error"),"themes/Cloudscape/deathright.png",{0,14,23,40},__("Died for 1000 times.")},
{"squash1",__("Keep an eye for moving walls!"),"themes/Cloudscape/deathright.png",{0,14,23,40},__("First time being squashed.")},
{"suqash50",__("Potato masher"),"themes/Cloudscape/deathright.png",{0,14,23,40},__("Squashed for 50 times.")},
{"doubleKill",__("Double kill"),"themes/Cloudscape/deathright.png",{0,14,23,40},__("Make both player and shadow die.")},
- {"programmer",__("Programmer"),"gfx/gui.png",{112,16,16,16},__("Played the development version of Me and My Shadow.")},
+ {"programmer",__("Programmer"),"gfx/gui.png",{112,16,16,16},__("Played the development version of Me and My Shadow."),ACHIEVEMT_TITLE},
//end of achievements
{}
};
diff --git a/src/StatisticsManager.cpp b/src/StatisticsManager.cpp
index 9843719..4745a9f 100644
--- a/src/StatisticsManager.cpp
+++ b/src/StatisticsManager.cpp
@@ -1,636 +1,720 @@
/*
* Copyright (C) 2012 Me and My Shadow
*
* This file is part of Me and My Shadow.
*
* Me and My Shadow is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Me and My Shadow is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Me and My Shadow. If not, see <http://www.gnu.org/licenses/>.
*/
#include "StatisticsManager.h"
#include "FileManager.h"
#include "TreeStorageNode.h"
#include "POASerializer.h"
#include "Functions.h"
#include "LevelPackManager.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <iostream>
#include <fstream>
#include <sstream>
#include <vector>
#include <map>
#include "libs/tinyformat/tinyformat.h"
using namespace std;
StatisticsManager statsMgr;
static const int achievementDisplayTime=100;
static const int achievementIntervalTime=120;
#include "AchievementList.h"
static map<string,AchievementInfo*> avaliableAchievements;
//================================================================
StatisticsManager::StatisticsManager(){
bmDropShadow=NULL;
+ bmQuestionMark=NULL;
bmAchievement=NULL;
startTime=time(NULL);
+ tutorialLevels=0;
+
clear();
}
StatisticsManager::~StatisticsManager(){
if(bmAchievement){
SDL_FreeSurface(bmAchievement);
bmAchievement=NULL;
}
}
void StatisticsManager::clear(){
playerTravelingDistance=shadowTravelingDistance=0.0f;
playerJumps=shadowJumps
=playerDies=shadowDies
=playerSquashed=shadowSquashed
=completedLevels=silverLevels=goldLevels
=recordTimes=switchTimes=swapTimes
=playTime=levelEditTime
- =createdLevels=0;
+ =createdLevels=tutorialCompleted=tutorialGold=0;
achievements.clear();
queuedAchievements.clear();
achievementTime=0;
currentAchievement=0;
if(bmAchievement){
SDL_FreeSurface(bmAchievement);
bmAchievement=NULL;
}
}
#define LOAD_STATS(var,func) { \
vector<string> &v=node.attributes[ #var ]; \
if(!v.empty() && !v[0].empty()) \
var=func(v[0].c_str()); \
}
void StatisticsManager::loadFile(const std::string& fileName){
clear();
ifstream file(fileName.c_str());
if(!file) return;
TreeStorageNode node;
POASerializer serializer;
if(!serializer.readNode(file,&node,true)) return;
//load statistics
LOAD_STATS(playerTravelingDistance,atof);
LOAD_STATS(shadowTravelingDistance,atof);
LOAD_STATS(playerJumps,atoi);
LOAD_STATS(shadowJumps,atoi);
LOAD_STATS(playerDies,atoi);
LOAD_STATS(shadowDies,atoi);
LOAD_STATS(playerSquashed,atoi);
LOAD_STATS(shadowSquashed,atoi);
LOAD_STATS(recordTimes,atoi);
LOAD_STATS(switchTimes,atoi);
LOAD_STATS(swapTimes,atoi);
LOAD_STATS(playTime,atoi);
LOAD_STATS(levelEditTime,atoi);
LOAD_STATS(createdLevels,atoi);
//load achievements.
//format is: name;time,name;time,...
{
vector<string> &v=node.attributes["achievements"];
for(unsigned int i=0;i<v.size();i++){
string s=v[i];
time_t t=0;
string::size_type lps=s.find(';');
if(lps!=string::npos){
string s1=s.substr(lps+1);
s=s.substr(0,lps);
long long n;
sscanf(s1.c_str(),
#ifdef WIN32
"%I64d",
#else
"%Ld",
#endif
&n);
t=(time_t)n;
}
map<string,AchievementInfo*>::iterator it=avaliableAchievements.find(s);
if(it!=avaliableAchievements.end()){
OwnedAchievement ach={t,it->second};
achievements[it->first]=ach;
}
}
}
}
//Call when level edit is start
void StatisticsManager::startLevelEdit(){
levelEditStartTime=time(NULL);
}
//Call when level edit is end
void StatisticsManager::endLevelEdit(){
levelEditTime+=time(NULL)-levelEditStartTime;
}
//update in-game time
void StatisticsManager::updatePlayTime(){
time_t endTime=time(NULL);
playTime+=endTime-startTime;
startTime=endTime;
}
#define SAVE_STATS(var,pattern) { \
sprintf(s,pattern,var); \
node.attributes[ #var ].push_back(s); \
}
void StatisticsManager::saveFile(const std::string& fileName){
char s[64];
//update in-game time
updatePlayTime();
ofstream file(fileName.c_str());
if(!file) return;
TreeStorageNode node;
//save statistics
SAVE_STATS(playerTravelingDistance,"%.2f");
SAVE_STATS(shadowTravelingDistance,"%.2f");
SAVE_STATS(playerJumps,"%d");
SAVE_STATS(shadowJumps,"%d");
SAVE_STATS(playerDies,"%d");
SAVE_STATS(shadowDies,"%d");
SAVE_STATS(playerSquashed,"%d");
SAVE_STATS(shadowSquashed,"%d");
SAVE_STATS(recordTimes,"%d");
SAVE_STATS(switchTimes,"%d");
SAVE_STATS(swapTimes,"%d");
SAVE_STATS(playTime,"%d");
SAVE_STATS(levelEditTime,"%d");
SAVE_STATS(createdLevels,"%d");
//save achievements.
//format is: name;time,name;time,...
{
vector<string>& v=node.attributes["achievements"];
for(map<string,OwnedAchievement>::iterator it=achievements.begin();it!=achievements.end();++it){
stringstream strm;
char s[32];
long long n=it->second.achievedTime;
sprintf(s,
#ifdef WIN32
"%I64d",
#else
"%Ld",
#endif
n);
strm<<it->first<<";"<<s;
v.push_back(strm.str());
}
}
POASerializer serializer;
serializer.writeNode(&node,file,true,true);
}
void StatisticsManager::loadPicture(){
//Load drop shadow picture
bmDropShadow=loadImage(getDataPath()+"gfx/dropshadow.png");
+ bmQuestionMark=loadImage(getDataPath()+"gfx/menu/questionmark.png");
}
void StatisticsManager::registerAchievements(){
if(!avaliableAchievements.empty()) return;
for(int i=0;achievementList[i].id!=NULL;i++){
avaliableAchievements[achievementList[i].id]=&achievementList[i];
if(achievementList[i].imageFile!=NULL){
achievementList[i].imageSurface=loadImage(getDataPath()+achievementList[i].imageFile);
}
}
}
void StatisticsManager::render(){
if(achievementTime==0 && bmAchievement==NULL && currentAchievement<(int)queuedAchievements.size()){
//create surface
bmAchievement=createAchievementSurface(queuedAchievements[currentAchievement++]);
drawGUIBox(0,0,bmAchievement->w,bmAchievement->h,bmAchievement,0xFFFFFF00);
//check if queue is empty
if(currentAchievement>=(int)queuedAchievements.size()){
queuedAchievements.clear();
currentAchievement=0;
}
//play a sound
if(getSettings()->getBoolValue("sound")){
Mix_PlayChannel(-1,achievementSound,0);
}
}
//check if we need to display achievements
if(bmAchievement){
achievementTime++;
if(achievementTime<=0){
return;
}else if(achievementTime<=5){
drawAchievement(achievementTime);
}else if(achievementTime<=achievementDisplayTime-5){
drawAchievement(5);
}else if(achievementTime<achievementDisplayTime){
drawAchievement(achievementDisplayTime-achievementTime);
}else if(achievementTime>=achievementIntervalTime){
if(bmAchievement){
SDL_FreeSurface(bmAchievement);
bmAchievement=NULL;
}
achievementTime=0;
}
}
}
void StatisticsManager::newAchievement(const std::string& id,bool save){
//check avaliable achievements
map<string,AchievementInfo*>::iterator it=avaliableAchievements.find(id);
if(it==avaliableAchievements.end()) return;
//check if already have this achievement
if(save){
map<string,OwnedAchievement>::iterator it2=achievements.find(id);
if(it2!=achievements.end()) return;
OwnedAchievement ach={time(NULL),it->second};
achievements[id]=ach;
}
//add it to queue
queuedAchievements.push_back(it->second);
}
float StatisticsManager::getAchievementProgress(AchievementInfo* info){
- //TODO:
- return -3.0f;
+ if(!strcmp(info->id,"experienced")){
+ return float(completedLevels)/50.0f*100.0f;
+ }
+ if(!strcmp(info->id,"expert")){
+ return float(goldLevels)/50.0f*100.0f;
+ }
+ if(!strcmp(info->id,"tutorial")){
+ if(tutorialLevels>0)
+ return float(tutorialCompleted)/float(tutorialLevels)*100.0f;
+ else
+ return 0.0f;
+ }
+ if(!strcmp(info->id,"tutorialGold")){
+ if(tutorialLevels>0)
+ return float(tutorialCompleted)/float(tutorialLevels)*100.0f;
+ else
+ return 0.0f;
+ }
+ if(!strcmp(info->id,"create50")){
+ return float(createdLevels)/50.0f*100.0f;
+ }
+ if(!strcmp(info->id,"frog")){
+ return float(playerJumps+shadowJumps)/1000.0f*100.0f;
+ }
+ if(!strcmp(info->id,"die50")){
+ return float(playerDies+shadowDies)/50.0f*100.0f;
+ }
+ if(!strcmp(info->id,"die1000")){
+ return float(playerDies+shadowDies)/1000.0f*100.0f;
+ }
+ if(!strcmp(info->id,"suqash50")){
+ return float(playerSquashed+shadowSquashed)/50.0f*100.0f;
+ }
+
+ //not found
+ return 0.0f;
}
SDL_Surface* StatisticsManager::createAchievementSurface(AchievementInfo* info,SDL_Surface* surface,SDL_Rect* rect,bool showTip,const time_t *achievedTime){
if(info==NULL || info->id==NULL) return NULL;
//prepare text
SDL_Surface *title0=NULL,*title1=NULL;
vector<SDL_Surface*> descSurfaces;
SDL_Color fg={0,0,0};
int fontHeight=TTF_FontLineSkip(fontText);
bool showDescription=false;
bool showImage=false;
float achievementProgress=0.0f;
if(showTip){
title0=TTF_RenderUTF8_Blended(fontText,_("New achievement:"),fg);
title1=TTF_RenderUTF8_Blended(fontGUISmall,_(info->name),fg);
showDescription=showImage=true;
}else if(achievedTime){
char s[128];
strftime(s,sizeof(s),"%c",localtime(achievedTime));
stringstream strm;
tinyformat::format(strm,_("Achieved at %s"),s);
title1=TTF_RenderUTF8_Blended(fontText,strm.str().c_str(),fg);
title0=TTF_RenderUTF8_Blended(fontGUISmall,_(info->name),fg);
showDescription=showImage=true;
}else if(info->displayStyle==ACHIEVEMT_HIDDEN){
title0=TTF_RenderUTF8_Blended(fontGUISmall,_("Unknown achievement"),fg);
}else{
if(info->displayStyle==ACHIEVEMT_PROGRESS){
achievementProgress=getAchievementProgress(info);
stringstream strm;
tinyformat::format(strm,_("Achieved %0.1f%%"),achievementProgress);
title1=TTF_RenderUTF8_Blended(fontText,strm.str().c_str(),fg);
}else{
title1=TTF_RenderUTF8_Blended(fontText,_("Not achieved"),fg);
}
title0=TTF_RenderUTF8_Blended(fontGUISmall,_(info->name),fg);
showDescription= info->displayStyle==ACHIEVEMT_ALL || info->displayStyle==ACHIEVEMT_PROGRESS;
showImage=true;
}
if(info->description!=NULL && showDescription){
string description=_(info->description);
string::size_type lps=0,lpe;
for(;;){
lpe=description.find('\n',lps);
if(lpe==string::npos){
descSurfaces.push_back(TTF_RenderUTF8_Blended(fontText,(description.substr(lps)+' ').c_str(),fg));
break;
}else{
descSurfaces.push_back(TTF_RenderUTF8_Blended(fontText,(description.substr(lps,lpe-lps)+' ').c_str(),fg));
lps=lpe+1;
}
}
}
//calculate the size
int w=0,h=0,w1=8,h1=0;
if(title0!=NULL){
if(title0->w>w) w=title0->w;
h1+=title0->h;
}
if(title1!=NULL){
if(title1->w>w) w=title1->w;
h1+=title1->h;
+ /*//calc progress bar size
+ if(!showTip && !achievedTime && info->displayStyle==ACHIEVEMT_PROGRESS){
+ h1+=4;
+ }*/
}
- if(info->imageSurface!=NULL && showImage){
- w1+=info->r.w+8;
- w+=info->r.w+8;
- if(info->r.h>h1) h1=info->r.h;
+
+ if(showImage){
+ if(info->imageSurface!=NULL){
+ w1+=info->r.w+8;
+ w+=info->r.w+8;
+ if(info->r.h>h1) h1=info->r.h;
+ }
+ }else{
+ w1+=bmQuestionMark->w+8;
+ w+=bmQuestionMark->w+8;
+ if(bmQuestionMark->h>h1) h1=bmQuestionMark->h;
}
+
h=h1+8;
for(unsigned int i=0;i<descSurfaces.size();i++){
if(descSurfaces[i]!=NULL){
if(descSurfaces[i]->w>w) w=descSurfaces[i]->w;
}
}
h+=descSurfaces.size()*fontHeight;
w+=16;
h+=16;
//check if size is specified
int left=0,top=0;
if(rect!=NULL){
if(surface!=NULL){
left=rect->x;
top=rect->y;
}
if(rect->w>0) w=rect->w;
else rect->w=w;
rect->h=h;
}
//create surface if necessary
if(surface==NULL){
surface=SDL_CreateRGBSurface(SDL_HWSURFACE,w,h,
screen->format->BitsPerPixel,screen->format->Rmask,screen->format->Gmask,screen->format->Bmask,0);
}
//draw background
SDL_Rect r={left,top,w,h};
if(showTip || achievedTime){
SDL_FillRect(surface,&r,SDL_MapRGB(surface->format,255,255,255));
}else{
SDL_FillRect(surface,&r,SDL_MapRGB(surface->format,192,192,192));
}
//draw picture
- if(info->imageSurface!=NULL && showImage){
- SDL_Rect r={left+8,top+8+(h1-info->r.h)/2,0,0};
- SDL_BlitSurface(info->imageSurface,&info->r,surface,&r);
+ if(showImage){
+ if(info->imageSurface!=NULL){
+ SDL_Rect r={left+8,top+8+(h1-info->r.h)/2,0,0};
+ SDL_BlitSurface(info->imageSurface,&info->r,surface,&r);
+ }
+ }else{
+ SDL_Rect r={left+8,top+8+(h1-bmQuestionMark->h)/2,0,0};
+ SDL_BlitSurface(bmQuestionMark,NULL,surface,&r);
}
//draw text
h=8;
if(title0!=NULL){
SDL_Rect r={left+w1,top+h,0,0};
SDL_BlitSurface(title0,NULL,surface,&r);
h+=title0->h;
}
if(title1!=NULL){
SDL_Rect r={left+w1,top+h,0,0};
+
+ //draw progress bar
+ if(!showTip && !achievedTime && info->displayStyle==ACHIEVEMT_PROGRESS){
+ SDL_Rect r1={r.x,r.y,w-8-r.x,title1->h};
+ SDL_FillRect(surface,&r1,SDL_MapRGB(surface->format,96,96,96));
+ r1.x++;
+ r1.y++;
+ r1.w-=2;
+ r1.h-=2;
+ SDL_FillRect(surface,&r1,SDL_MapRGB(surface->format,216,216,216));
+ r1.w=int(achievementProgress/100.0f*float(r1.w));
+ SDL_FillRect(surface,&r1,SDL_MapRGB(surface->format,144,144,144));
+
+ //???
+ r.x+=2;
+ r.y+=2;
+ }
+
SDL_BlitSurface(title1,NULL,surface,&r);
}
h=h1+16;
for(unsigned int i=0;i<descSurfaces.size();i++){
if(descSurfaces[i]!=NULL){
SDL_Rect r={left+8,top+h+i*fontHeight,0,0};
SDL_BlitSurface(descSurfaces[i],NULL,surface,&r);
}
}
//clean up
if(title0) SDL_FreeSurface(title0);
if(title1) SDL_FreeSurface(title1);
for(unsigned int i=0;i<descSurfaces.size();i++){
if(descSurfaces[i]!=NULL){
SDL_FreeSurface(descSurfaces[i]);
}
}
//over
return surface;
}
void StatisticsManager::drawAchievement(int alpha){
if(bmAchievement==NULL) return;
if(alpha<=0) return;
if(alpha>5) alpha=5;
SDL_Rect r={screen->w-32-bmAchievement->w,32,
bmAchievement->w,bmAchievement->h};
//draw the surface
SDL_SetAlpha(bmAchievement,SDL_SRCALPHA,alpha*40);
SDL_BlitSurface(bmAchievement,NULL,screen,&r);
//draw drop shadow - corner
{
int w1=r.w/2,w2=r.w-w1,h1=r.h/2,h2=r.h-h1;
if(w1>16) w1=16;
if(w2>16) w2=16;
if(h1>16) h1=16;
if(h2>16) h2=16;
int x=(5-alpha)*64;
//top-left
SDL_Rect r1={x,0,w1+16,h1+16},r2={r.x-16,r.y-16,0,0};
SDL_BlitSurface(bmDropShadow,&r1,screen,&r2);
//top-right
r1.x=x+48-w2;r1.w=w2+16;r2.x=r.x+r.w-w2;
SDL_BlitSurface(bmDropShadow,&r1,screen,&r2);
//bottom-right
r1.y=48-h2;r1.h=h2+16;r2.y=r.y+r.h-h2;
SDL_BlitSurface(bmDropShadow,&r1,screen,&r2);
//bottom-left
r1.x=x;r1.w=w1+16;r2.x=r.x-16;
SDL_BlitSurface(bmDropShadow,&r1,screen,&r2);
}
//draw drop shadow - border
int i=r.w-32;
while(i>0){
int ii=i>128?128:i;
//top
SDL_Rect r1={0,256-alpha*16,ii,16},r2={r.x+r.w-16-i,r.y-16,0,0};
SDL_BlitSurface(bmDropShadow,&r1,screen,&r2);
//bottom
r1.x=128;r2.y=r.y+r.h;
SDL_BlitSurface(bmDropShadow,&r1,screen,&r2);
i-=ii;
}
i=r.h-32;
while(i>0){
int ii=i>128?128:i;
//top
SDL_Rect r1={512-alpha*16,0,16,ii},r2={r.x-16,r.y+r.h-16-i,0,0};
SDL_BlitSurface(bmDropShadow,&r1,screen,&r2);
//bottom
r1.y=128;r2.x=r.x+r.w;
SDL_BlitSurface(bmDropShadow,&r1,screen,&r2);
i-=ii;
}
}
void StatisticsManager::reloadCompletedLevelsAndAchievements(){
completedLevels=silverLevels=goldLevels=0;
LevelPackManager *lpm=getLevelPackManager();
vector<string> v=lpm->enumLevelPacks();
- bool tutorial=false,tutorialGold=false;
+ bool tutorial=false,tutorialIsGold=false;
for(unsigned int i=0;i<v.size();i++){
string& s=v[i];
LevelPack *levels=lpm->getLevelPack(s);
levels->loadProgress(getUserPath(USER_DATA)+"progress/"+s+".progress");
bool b=false;
if(s=="tutorial"){
- b=tutorial=tutorialGold=true;
+ tutorialLevels=levels->getLevelCount();
+ tutorialCompleted=tutorialGold=0;
+ b=tutorial=tutorialIsGold=true;
}
for(int n=0,m=levels->getLevelCount();n<m;n++){
LevelPack::Level *lv=levels->getLevel(n);
int medal=lv->won;
if(medal){
if(lv->targetTime<0 || lv->time<=lv->targetTime)
medal++;
if(lv->targetRecordings<0 || lv->recordings<=lv->targetRecordings)
medal++;
completedLevels++;
+ if(b) tutorialCompleted++;
if(medal==2) silverLevels++;
- if(medal==3) goldLevels++;
+ if(medal==3){
+ goldLevels++;
+ if(b) tutorialGold++;
+ }
- if(medal!=3 && b) tutorialGold=false;
+ if(medal!=3 && b) tutorialIsGold=false;
}else if(b){
- tutorial=tutorialGold=false;
+ tutorial=tutorialIsGold=false;
}
}
}
//upadte achievements
updateLevelAchievements();
- updateTutorialAchievementsInternal((tutorial?1:0)|(tutorialGold?2:0));
+ updateTutorialAchievementsInternal((tutorial?1:0)|(tutorialIsGold?2:0));
}
void StatisticsManager::reloadOtherAchievements(){
int i;
if(playTime>=7200) newAchievement("addicted");
if(playTime>=86400) newAchievement("loyalFan");
if(levelEditTime>=7200) newAchievement("constructor");
if(levelEditTime>=86400) newAchievement("constructor2");
if(createdLevels>=1) newAchievement("create1");
if(createdLevels>=50) newAchievement("create50");
i=playerJumps+shadowJumps;
if(i>=1000) newAchievement("frog");
i=playerDies+shadowDies;
if(i>=1) newAchievement("die1");
if(i>=50) newAchievement("die50");
if(i>=1000) newAchievement("die1000");
i=playerSquashed+shadowSquashed;
if(i>=1) newAchievement("squash1");
if(i>=50) newAchievement("squash50");
if(version.find("Development")!=string::npos) newAchievement("programmer");
}
//Update level specified achievements.
//Make sure the completed level count is correct.
void StatisticsManager::updateLevelAchievements(){
if(completedLevels>=1) newAchievement("newbie");
if(goldLevels>=1) newAchievement("goodjob");
if(completedLevels>=50) newAchievement("experienced");
if(goldLevels>=50) newAchievement("expert");
}
//Update tutorial specified achievements.
//Make sure the level progress of tutorial is correct.
void StatisticsManager::updateTutorialAchievements(){
//find tutorial level pack
LevelPackManager *lpm=getLevelPackManager();
LevelPack *levels=lpm->getLevelPack("tutorial");
if(levels==NULL) return;
- bool tutorial=true,tutorialGold=true;
+ bool tutorial=true,tutorialIsGold=true;
+ tutorialLevels=levels->getLevelCount();
+ tutorialCompleted=tutorialGold=0;
for(int n=0,m=levels->getLevelCount();n<m;n++){
LevelPack::Level *lv=levels->getLevel(n);
int medal=lv->won;
if(medal){
if(lv->targetTime<0 || lv->time<=lv->targetTime)
medal++;
if(lv->targetRecordings<0 || lv->recordings<=lv->targetRecordings)
medal++;
- if(medal!=3) tutorialGold=false;
+ tutorialCompleted++;
+
+ if(medal!=3) tutorialIsGold=false;
+ else tutorialGold++;
}else{
- tutorial=tutorialGold=false;
+ tutorial=tutorialIsGold=false;
break;
}
}
//upadte achievements
- updateTutorialAchievementsInternal((tutorial?1:0)|(tutorialGold?2:0));
+ updateTutorialAchievementsInternal((tutorial?1:0)|(tutorialIsGold?2:0));
}
//internal function
//flags: a bit-field value indicates which achievements we have.
void StatisticsManager::updateTutorialAchievementsInternal(int flags){
if(flags&1) newAchievement("tutorial");
if(flags&2) newAchievement("tutorialGold");
}
diff --git a/src/StatisticsManager.h b/src/StatisticsManager.h
index cc4a7d7..aa26b50 100644
--- a/src/StatisticsManager.h
+++ b/src/StatisticsManager.h
@@ -1,175 +1,177 @@
/*
* Copyright (C) 2012 Me and My Shadow
*
* This file is part of Me and My Shadow.
*
* Me and My Shadow is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Me and My Shadow is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Me and My Shadow. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef STATISTICSMANAGER_H
#define STATISTICSMANAGER_H
#include <SDL/SDL.h>
#include <string>
#include <vector>
#include <map>
#include <time.h>
enum AchievementDisplayStyle{
ACHIEVEMT_HIDDEN,
ACHIEVEMT_TITLE,
ACHIEVEMT_ALL,
ACHIEVEMT_PROGRESS,
};
//internal struct for achievement info
struct AchievementInfo{
//achievement id for save to statistics file
const char* id;
//achievement name for display
const char* name;
//achievement image. NULL for no image. will be loaded at getDataPath()+imageFile
const char* imageFile;
//image offset and size.
SDL_Rect r;
//achievement description. supports multi-line text
const char* description;
//display style
AchievementDisplayStyle displayStyle;
//SDL_Surface of achievement image.
SDL_Surface* imageSurface;
};
struct OwnedAchievement{
time_t achievedTime;
AchievementInfo* info;
};
class StatisticsScreen;
class StatisticsManager{
friend class StatisticsScreen;
public:
//Player and shadow traveling distance (m), 1 block = 1 meter
float playerTravelingDistance,shadowTravelingDistance;
//Player and shadow jumps
int playerJumps,shadowJumps;
//Player and shadow dies
int playerDies,shadowDies;
//Player and shadow squashed
int playerSquashed,shadowSquashed;
//Completed levels. Note: this is dynamically calculated, and doesn't save to file.
int completedLevels,silverLevels,goldLevels;
//Record times
int recordTimes;
//number of switched pulled
int switchTimes;
//swap times
int swapTimes;
//play time (s)
int playTime;
//level edit time (s)
int levelEditTime;
//created levels
int createdLevels;
private:
//current achievement displayed time
int achievementTime;
//some picture
- SDL_Surface *bmDropShadow;
+ SDL_Surface *bmDropShadow,*bmQuestionMark;
//SDL_Surface for current achievement (excluding drop shadow)
SDL_Surface *bmAchievement;
//currently owned achievements
std::map<std::string,OwnedAchievement> achievements;
//queued achievements for display
std::vector<AchievementInfo*> queuedAchievements;
//currently displayed achievement
int currentAchievement;
//starting time
time_t startTime;
//level edit starting time
time_t levelEditStartTime;
+ //statistics for tutorial level pack
+ int tutorialLevels,tutorialCompleted,tutorialGold;
public:
StatisticsManager();
~StatisticsManager();
//clear the statistics and achievements.
void clear();
//load needed picture
void loadPicture();
//register avaliable achievements
static void registerAchievements();
//load statistics file.
void loadFile(const std::string& fileName);
//save statistics file.
void saveFile(const std::string& fileName);
//add or display a new achievement.
//name: the achievement id. if can't find it in avaliable achievement, nothing happens.
//save: if true then save to currently owned achievements. if it already exists in
//currently owned achievements, nothing happens.
//if false then just added it to queue, including duplicated achievements.
void newAchievement(const std::string& id,bool save=true);
//if there are new achievements, draw it on the screen,
//otherwise do nothing.
void render();
//Call this function to update completed levels.
//Note: Level progress files are reloaded, so it's slow.
void reloadCompletedLevelsAndAchievements();
//Call this function to update other achievements at game startup.
void reloadOtherAchievements();
//Update level specified achievements.
//Make sure the completed level count is correct.
void updateLevelAchievements();
//Update tutorial specified achievements.
//Make sure the level progress of tutorial is correct.
void updateTutorialAchievements();
//Call when level edit is start
void startLevelEdit();
//Call when level edit is end
void endLevelEdit();
//update in-game time
void updatePlayTime();
//create a SDL_Surface contains specified achievements or draw to existing surface.
//info: achievement info.
//surface: specifies SDL_Surface to draw on. if NULL then new surface will be created.
//rect [in, out, optional]: specifies position and optionally width to draw on. height will be returned.
// if NULL then will be drawn on top-left corner. if surface is NULL then rect->x and rect->y are ignored.
//showTip: shows "New achievement" tip
//achievedTime: if we should show achieved time (and progress bar if AchievementInfo specifies) and when is it.
// Note: if showTip=true then this argument does nothing.
//return value: SDL_Surface contains specified achievements or NULL if any error occured.
SDL_Surface* createAchievementSurface(AchievementInfo* info,SDL_Surface* surface=NULL,SDL_Rect* rect=NULL,bool showTip=true,const time_t *achievedTime=NULL);
private:
//internal function
//flags: a bit-field value indicates which achievements we have.
void updateTutorialAchievementsInternal(int flags);
//internal function. alpha should be 1-5, 5 means fully opaque (not really)
void drawAchievement(int alpha);
//internal function for get progress (in percent, 0-100)
float getAchievementProgress(AchievementInfo* info);
};
extern StatisticsManager statsMgr;
extern AchievementInfo achievementList[];
#endif
\ No newline at end of file
diff --git a/src/StatisticsScreen.cpp b/src/StatisticsScreen.cpp
index 20f12c9..9c41f08 100644
--- a/src/StatisticsScreen.cpp
+++ b/src/StatisticsScreen.cpp
@@ -1,423 +1,423 @@
/*
* Copyright (C) 2012 Me and My Shadow
*
* This file is part of Me and My Shadow.
*
* Me and My Shadow is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Me and My Shadow is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Me and My Shadow. If not, see <http://www.gnu.org/licenses/>.
*/
#include <stdio.h>
#include <string>
#include <vector>
#include <map>
#include "StatisticsManager.h"
#include "StatisticsScreen.h"
#include "Globals.h"
#include "Functions.h"
#include "ThemeManager.h"
#include "InputManager.h"
#include "GUIListBox.h"
#include "GUIScrollBar.h"
#ifdef __APPLE__
#include <SDL_image/SDL_image.h>
#include <SDL_gfx/SDL_gfxPrimitives.h>
#else
#include <SDL/SDL_image.h>
#include <SDL/SDL_gfxPrimitives.h>
#endif
using namespace std;
//GUI events are handled here.
//name: The name of the element that invoked the event.
//obj: Pointer to the object that invoked the event.
//eventType: Integer containing the type of event.
void StatisticsScreen::GUIEventCallback_OnEvent(std::string name,GUIObject* obj,int eventType){
//Check what type of event it was.
if(eventType==GUIEventClick){
if(name=="cmdBack"){
//Goto the main menu.
setNextState(STATE_MENU);
}
}
}
#define DRAW_PLAYER_STATISTICS(name,var,format) { \
surface=TTF_RenderUTF8_Blended(fontGUISmall,name,themeTextColor); \
SDL_SetAlpha(surface,0,0xFF); \
applySurface(0,y,surface,stats,NULL); \
y+=(h1=surface->h); \
SDL_FreeSurface(surface); \
sprintf(s,format,statsMgr.player##var+statsMgr.shadow##var); \
surface=TTF_RenderUTF8_Blended(fontText,s,themeTextColor); \
SDL_SetAlpha(surface,0,0xFF); \
applySurface(400-surface->w,y-(surface->h+h1)/2,surface,stats,NULL); \
SDL_FreeSurface(surface); \
sprintf(s,format,statsMgr.player##var); \
surface=TTF_RenderUTF8_Blended(fontText,s,themeTextColor); \
SDL_SetAlpha(surface,0,0xFF); \
applySurface(520-surface->w,y-(surface->h+h1)/2,surface,stats,NULL); \
SDL_FreeSurface(surface); \
sprintf(s,format,statsMgr.shadow##var); \
surface=TTF_RenderUTF8_Blended(fontText,s,themeTextColor); \
SDL_SetAlpha(surface,0,0xFF); \
applySurface(640-surface->w,y-(surface->h+h1)/2,surface,stats,NULL); \
SDL_FreeSurface(surface); \
}
#define DRAW_MISC_STATISTICS_1(name1,var1,format1) { \
surface=TTF_RenderUTF8_Blended(fontGUISmall,name1,themeTextColor); \
SDL_SetAlpha(surface,0,0xFF); \
applySurface(0,y,surface,stats,NULL); \
x=surface->w+8; \
y+=(h1=surface->h); \
SDL_FreeSurface(surface); \
sprintf(s,format1,statsMgr.var1); \
surface=TTF_RenderUTF8_Blended(fontText,s,themeTextColor); \
SDL_SetAlpha(surface,0,0xFF); \
applySurface(x,y-(surface->h+h1)/2,surface,stats,NULL); \
SDL_FreeSurface(surface); \
}
//we are so lazy that we just use height of the first one, ignore second one
#define DRAW_MISC_STATISTICS_2(name1,var1,format1,name2,var2,format2) { \
surface=TTF_RenderUTF8_Blended(fontGUISmall,name1,themeTextColor); \
SDL_SetAlpha(surface,0,0xFF); \
applySurface(0,y,surface,stats,NULL); \
x=surface->w+8; \
y+=(h1=surface->h); \
SDL_FreeSurface(surface); \
sprintf(s,format1,statsMgr.var1); \
surface=TTF_RenderUTF8_Blended(fontText,s,themeTextColor); \
SDL_SetAlpha(surface,0,0xFF); \
applySurface(x,y-(surface->h+h1)/2,surface,stats,NULL); \
SDL_FreeSurface(surface); \
surface=TTF_RenderUTF8_Blended(fontGUISmall,name2,themeTextColor); \
SDL_SetAlpha(surface,0,0xFF); \
applySurface(320,y-surface->h,surface,stats,NULL); \
x=surface->w+328; \
SDL_FreeSurface(surface); \
sprintf(s,format2,statsMgr.var2); \
surface=TTF_RenderUTF8_Blended(fontText,s,themeTextColor); \
SDL_SetAlpha(surface,0,0xFF); \
applySurface(x,y-(surface->h+h1)/2,surface,stats,NULL); \
SDL_FreeSurface(surface); \
}
//Constructor.
StatisticsScreen::StatisticsScreen(){
//update in-game time
statsMgr.updatePlayTime();
//Load needed pictures.
//Note: we don't use ImageManager because we need to process these pictures.
SDL_Surface *bmPlayer=IMG_Load((getDataPath()+"themes/Cloudscape/player.png").c_str());
SDL_Surface *bmShadow=IMG_Load((getDataPath()+"themes/Cloudscape/shadow.png").c_str());
SDL_Surface *bmMedal=IMG_Load((getDataPath()+"gfx/medals.png").c_str());
//disable the alpha channel
SDL_SetAlpha(bmPlayer,0,0xFF);
SDL_SetAlpha(bmShadow,0,0xFF);
SDL_SetAlpha(bmMedal,0,0xFF);
//Render the title.
title=TTF_RenderUTF8_Blended(fontTitle,_("Achievements and Statistics"),themeTextColor);
//Render stats.
Uint32 rmask, gmask, bmask, amask;
#if SDL_BYTEORDER == SDL_BIG_ENDIAN
rmask = 0xff000000;
gmask = 0x00ff0000;
bmask = 0x0000ff00;
amask = 0x000000ff;
#else
rmask = 0x000000ff;
gmask = 0x0000ff00;
bmask = 0x00ff0000;
amask = 0xff000000;
#endif
stats=SDL_CreateRGBSurface(SDL_SWSURFACE,640,400,32,rmask,gmask,bmask,amask);
char s[64];
SDL_Surface *surface;
SDL_Rect r;
int x,y=0,h1;
Uint32 clr=SDL_MapRGB(stats->format,themeTextColor.r,themeTextColor.g,themeTextColor.b);
//Player and shadow specific statistics
surface=TTF_RenderUTF8_Blended(fontGUISmall,_("Total"),themeTextColor);
SDL_SetAlpha(surface,0,0xFF);
applySurface(400-surface->w,40-surface->h,surface,stats,NULL);
SDL_FreeSurface(surface);
r.x=0;r.y=0;r.w=23;r.h=40;
applySurface(520-r.w,0,bmPlayer,stats,&r);
applySurface(640-r.w,0,bmShadow,stats,&r);
y+=40;
DRAW_PLAYER_STATISTICS(_("Traveling distance (m)"),TravelingDistance,"%0.2f");
DRAW_PLAYER_STATISTICS(_("Jump times"),Jumps,"%d");
DRAW_PLAYER_STATISTICS(_("Die times"),Dies,"%d");
DRAW_PLAYER_STATISTICS(_("Squashed times"),Squashed,"%d");
//Game specific statistics
r.x=0;r.y=y;r.w=stats->w;r.h=2;
SDL_FillRect(stats,&r,clr);
y+=2;
DRAW_MISC_STATISTICS_2(_("Recordings:"),recordTimes,"%d",_("Switch pulled times:"),switchTimes,"%d");
DRAW_MISC_STATISTICS_1(_("Swap times:"),swapTimes,"%d");
//Level specific statistics
r.x=0;r.y=y;r.w=stats->w;r.h=2;
SDL_FillRect(stats,&r,clr);
y+=2;
surface=TTF_RenderUTF8_Blended(fontGUISmall,_("Completed levels:"),themeTextColor);
SDL_SetAlpha(surface,0,0xFF);
applySurface(0,y,surface,stats,NULL);
x=surface->w+8;
y+=(h1=surface->h);
SDL_FreeSurface(surface);
sprintf(s,"%d",statsMgr.completedLevels);
surface=TTF_RenderUTF8_Blended(fontText,s,themeTextColor);
SDL_SetAlpha(surface,0,0xFF);
applySurface(x,y-(surface->h+h1)/2,surface,stats,NULL);
SDL_FreeSurface(surface);
sprintf(s,"%d",statsMgr.completedLevels-statsMgr.goldLevels-statsMgr.silverLevels);
surface=TTF_RenderUTF8_Blended(fontText,s,themeTextColor);
SDL_SetAlpha(surface,0,0xFF);
applySurface(400-surface->w,y-(surface->h+h1)/2,surface,stats,NULL);
r.x=0;r.y=0;r.w=30;r.h=30;
applySurface(400-surface->w-30,y-(30+h1)/2,bmMedal,stats,&r);
SDL_FreeSurface(surface);
sprintf(s,"%d",statsMgr.silverLevels);
surface=TTF_RenderUTF8_Blended(fontText,s,themeTextColor);
SDL_SetAlpha(surface,0,0xFF);
applySurface(520-surface->w,y-(surface->h+h1)/2,surface,stats,NULL);
r.x+=30;
applySurface(520-surface->w-30,y-(30+h1)/2,bmMedal,stats,&r);
SDL_FreeSurface(surface);
sprintf(s,"%d",statsMgr.goldLevels);
surface=TTF_RenderUTF8_Blended(fontText,s,themeTextColor);
SDL_SetAlpha(surface,0,0xFF);
applySurface(640-surface->w,y-(surface->h+h1)/2,surface,stats,NULL);
r.x+=30;
applySurface(640-surface->w-30,y-(30+h1)/2,bmMedal,stats,&r);
SDL_FreeSurface(surface);
//Other statistics
r.x=0;r.y=y;r.w=stats->w;r.h=2;
SDL_FillRect(stats,&r,clr);
y+=2;
surface=TTF_RenderUTF8_Blended(fontGUISmall,_("In-game time:"),themeTextColor);
SDL_SetAlpha(surface,0,0xFF);
applySurface(0,y,surface,stats,NULL);
x=surface->w+8;
y+=(h1=surface->h);
SDL_FreeSurface(surface);
sprintf(s,"%02d:%02d:%02d",statsMgr.playTime/3600,(statsMgr.playTime/60)%60,statsMgr.playTime%60);
surface=TTF_RenderUTF8_Blended(fontText,s,themeTextColor);
SDL_SetAlpha(surface,0,0xFF);
applySurface(x,y-(surface->h+h1)/2,surface,stats,NULL);
SDL_FreeSurface(surface);
surface=TTF_RenderUTF8_Blended(fontGUISmall,_("Level editing time:"),themeTextColor);
SDL_SetAlpha(surface,0,0xFF);
applySurface(320,y-surface->h,surface,stats,NULL);
x=surface->w+328;
SDL_FreeSurface(surface);
sprintf(s,"%02d:%02d:%02d",statsMgr.levelEditTime/3600,(statsMgr.levelEditTime/60)%60,statsMgr.levelEditTime%60);
surface=TTF_RenderUTF8_Blended(fontText,s,themeTextColor);
SDL_SetAlpha(surface,0,0xFF);
applySurface(x,y-(surface->h+h1)/2,surface,stats,NULL);
SDL_FreeSurface(surface);
DRAW_MISC_STATISTICS_1(_("Created levels:"),createdLevels,"%d");
//Free loaded surface
SDL_FreeSurface(bmPlayer);
SDL_FreeSurface(bmShadow);
SDL_FreeSurface(bmMedal);
//Create GUI
achievements=NULL;
createGUI();
}
//Destructor.
StatisticsScreen::~StatisticsScreen(){
//Delete the GUI.
if(GUIObjectRoot){
delete GUIObjectRoot;
GUIObjectRoot=NULL;
}
//Free images
SDL_FreeSurface(title);
SDL_FreeSurface(stats);
SDL_FreeSurface(achievements);
}
//Method that will create the GUI for the options menu.
void StatisticsScreen::createGUI(){
//Draw achievements
if(achievements) SDL_FreeSurface(achievements);
vector<SDL_Surface*> surfaces;
int w=SCREEN_WIDTH-128-16,h=0;
for(int idx=0;achievementList[idx].id!=NULL;++idx){
SDL_Rect r={0,0,w,0};
time_t *lpt=NULL;
map<string,OwnedAchievement>::iterator it=statsMgr.achievements.find(achievementList[idx].id);
if(it!=statsMgr.achievements.end()){
lpt=&it->second.achievedTime;
}
SDL_Surface *surface=statsMgr.createAchievementSurface(&achievementList[idx],NULL,&r,false,lpt);
if(surface!=NULL){
//Draw single smooth line for separating items in a list.
lineRGBA(surface,0,surface->h-1,surface->w,surface->h-1,0,0,0,128);
lineRGBA(surface,0,surface->h-2,surface->w,surface->h-2,0,0,0,32);
lineRGBA(surface,0,0,surface->w,0,0,0,0,32);
surfaces.push_back(surface);
h+=r.h;
}
}
if(surfaces.empty()){
//impossible now
- achievements=TTF_RenderUTF8_Blended(fontText,_("You don't have any achievements now. Play the game and try to earn some!"),themeTextColor);
+ abort();
}else{
achievements=SDL_CreateRGBSurface(SDL_HWSURFACE,w,h,
screen->format->BitsPerPixel,screen->format->Rmask,screen->format->Gmask,screen->format->Bmask,0);
h=0;
for(unsigned int i=0;i<surfaces.size();i++){
SDL_Rect r={0,h,0,0};
SDL_BlitSurface(surfaces[i],NULL,achievements,&r);
h+=surfaces[i]->h;
SDL_FreeSurface(surfaces[i]);
}
}
//Create the root element of the GUI.
if(GUIObjectRoot){
delete GUIObjectRoot;
GUIObjectRoot=NULL;
}
GUIObjectRoot=new GUIObject(0,0,SCREEN_WIDTH,SCREEN_HEIGHT,GUIObjectNone);
//Create back button.
GUIObject* obj=new GUIObject(SCREEN_WIDTH*0.5,SCREEN_HEIGHT-60,-1,36,GUIObjectButton,_("Back"),0,true,true,GUIGravityCenter);
obj->name="cmdBack";
obj->eventCallback=this;
GUIObjectRoot->addChild(obj);
//Create list box
listBox=new GUISingleLineListBox((SCREEN_WIDTH-500)/2,104,500,32);
listBox->item.push_back(_("Achievements"));
listBox->item.push_back(_("Statistics"));
listBox->value=0;
GUIObjectRoot->addChild(listBox);
//Create vertical scrollbar.
h-=SCREEN_HEIGHT-144-80;
if(h<0) h=0;
scrollbarV=new GUIScrollBar(SCREEN_WIDTH-64-16,144,16,SCREEN_HEIGHT-144-80,1,0,0,h,16,SCREEN_HEIGHT-144-80,true,false);
GUIObjectRoot->addChild(scrollbarV);
}
//In this method all the key and mouse events should be handled.
//Note: The GUIEvents won't be handled here.
void StatisticsScreen::handleEvents(){
//Check if we need to quit, if so enter the exit state.
if(event.type==SDL_QUIT){
setNextState(STATE_EXIT);
}
//Check if the escape button is pressed, if so go back to the main menu.
if(inputMgr.isKeyUpEvent(INPUTMGR_ESCAPE)){
setNextState(STATE_MENU);
}
//Check for scrolling down and up with mouse scroll wheel.
if(event.type==SDL_MOUSEBUTTONDOWN && event.button.button==SDL_BUTTON_WHEELDOWN && scrollbarV->visible){
if(scrollbarV->value<scrollbarV->maxValue)
scrollbarV->value+=scrollbarV->smallChange*4;
if(scrollbarV->value>scrollbarV->maxValue)
scrollbarV->value=scrollbarV->maxValue;
return;
}else if(event.type==SDL_MOUSEBUTTONDOWN && event.button.button==SDL_BUTTON_WHEELUP && scrollbarV->visible){
if(scrollbarV->value>0)
scrollbarV->value-=scrollbarV->smallChange*4;
if(scrollbarV->value<0)
scrollbarV->value=0;
return;
}
}
//All the logic that needs to be done should go in this method.
void StatisticsScreen::logic(){
}
//This method handles all the rendering.
void StatisticsScreen::render(){
//Draw background.
objThemes.getBackground(true)->draw(screen);
objThemes.getBackground(true)->updateAnimation();
//Draw title.
applySurface((SCREEN_WIDTH-title->w)/2,40-TITLE_FONT_RAISE,title,screen,NULL);
switch(listBox->value){
case 0:
//achievements
{
scrollbarV->visible=(scrollbarV->maxValue>0);
SDL_Rect r1={0,scrollbarV->value,achievements->w,SCREEN_HEIGHT-144-80};
SDL_Rect r2={64,144,0,0};
SDL_BlitSurface(achievements,&r1,screen,&r2);
if(scrollbarV->visible)
drawGUIBox(63,144,achievements->w+3,SCREEN_HEIGHT-144-80,screen,SDL_MapRGB(screen->format,0,0,0));
else
drawGUIBox(63,144,achievements->w+1,achievements->h,screen,SDL_MapRGB(screen->format,0,0,0));
}
break;
case 1:
//statistics
scrollbarV->visible=false;
applySurface((SCREEN_WIDTH-stats->w)/2,144,stats,screen,NULL);
break;
}
}
//Method that will be called when the screen size has been changed in runtime.
void StatisticsScreen::resize(){
//Recreate the gui to fit the new resolution.
createGUI();
}

File Metadata

Mime Type
text/x-diff
Expires
Sat, May 16, 12:31 PM (1 d, 1 h)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
64153
Default Alt Text
(96 KB)

Event Timeline