--- a/CMakeLists.txt Wed Sep 14 22:27:22 2011 +0200
+++ b/CMakeLists.txt Wed Sep 14 22:39:39 2011 +0200
@@ -194,6 +194,7 @@
if(NOT BUILD_ENGINE_LIBRARY)
add_subdirectory(bin)
+ add_subdirectory(misc/quazip)
add_subdirectory(QTfrontend)
add_subdirectory(share)
add_subdirectory(tools)
--- a/ChangeLog.txt Wed Sep 14 22:27:22 2011 +0200
+++ b/ChangeLog.txt Wed Sep 14 22:39:39 2011 +0200
@@ -2,11 +2,16 @@
* bugfixes
0.9.15 -> ???:
- + New modes: The Specialists, Space Invasion
+ + New gameplay modes/styles: Racer, The Specialists, Tumbler, Space Invasion
+ Installing content (anything under Data/ - maps, sounds, and any such stuff) to user profile allows custom adding/overriding of any Data/ content
+ Sudden Death art
+ New Weapon/Utility: Land Spray Gun
+ + New Utility: Time Box
+ New Game mode: Tag team
+ + New Game option for map bottom border
+ + New Theme: Golf
+ + Many new hats
+ + Get away time modifier (in %)
+ Allow up to 8 teams in a game
+ Shoppa scheme by default resets ammo
+ Shots are on a tenth of a second delay instead of a 1 and a quarter second delay (fast deagle/portal fire)
@@ -22,9 +27,12 @@
+ Indicator for height of plane when using napalm
+ Land smoothing (looks less pixelated on generation and damage)
+ Improved lua script support (e.g. possibility to change hats)
+ + The names of the ShoppaKingTournament winners are now written on the Trophies in the ShoppaKing and TrophyRace maps!
+ + Allow window resizes during game.
* Prevent portaling to impossible locations better
* Snow accumulates more smoothly
* Rope should be less sticky now
+ * Rope shouldn't be able to get Hogs stuck on walls anymore
* Fix for last portal shot always being yellow
* More accurate napalm strike drop location
* AI fixes
--- a/QTfrontend/CMakeLists.txt Wed Sep 14 22:27:22 2011 +0200
+++ b/QTfrontend/CMakeLists.txt Wed Sep 14 22:39:39 2011 +0200
@@ -4,7 +4,6 @@
set(QT_USE_QTCORE TRUE)
set(QT_USE_QTGUI TRUE)
set(QT_USE_QTNETWORK TRUE)
-set(QT_USE_QTWEBKIT TRUE)
set(QT_USE_QTSVG FALSE)
set(QT_USE_QTXML FALSE)
set(QT_USE_QTOPENGL FALSE)
@@ -13,6 +12,16 @@
find_package(Qt4 REQUIRED)
include(${QT_USE_FILE})
+# Check if we need zlib
+check_library_exists(${QT_QTCORE_LIBRARY} inflateInit2_ ${QT_LIBRARY_DIR} QT_PROVIDES_ZLIB_FUNCTIONS)
+
+if(NOT QT_PROVIDES_ZLIB_FUNCTIONS)
+ find_package(ZLIB REQUIRED)
+
+ set(HW_LINK_LIBS ${ZLIB_LIBRARIES} ${HW_LINK_LIBS})
+endif()
+
+
# Configure for SDL
find_package(SDL REQUIRED)
find_package(SDL_mixer REQUIRED)
@@ -20,6 +29,7 @@
include_directories(.)
include_directories(${SDL_INCLUDE_DIR})
include_directories(${SDLMIXER_INCLUDE_DIR})
+include_directories(${CMAKE_SOURCE_DIR}/misc/quazip)
if(UNIX)
# HACK: in freebsd cannot find iconv.h included via SDL.h
include_directories("/usr/local/include")
@@ -115,6 +125,7 @@
drawmapwidget.cpp
drawmapscene.cpp
themesmodel.cpp
+ databrowser.cpp
)
#xfire integration
@@ -196,6 +207,7 @@
drawmapwidget.h
drawmapscene.h
themesmodel.h
+ databrowser.h
)
set(hwfr_hdrs
@@ -214,7 +226,7 @@
if(APPLE)
set(hwfr_src ${hwfr_src} InstallController.cpp CocoaInitializer.mm M3Panel.mm M3InstallController.m NSWorkspace_RBAdditions.m)
- set(HW_LINK_LIBS IOKit)
+ set(HW_LINK_LIBS IOKit ${HW_LINK_LIBS})
if(NOT NOAUTOUPDATE)
find_package(Sparkle)
@@ -236,6 +248,7 @@
set(HW_LINK_LIBS
+ quazip
${QT_LIBRARIES}
${SDL_LIBRARY}
${SDLMIXER_LIBRARY}
@@ -247,7 +260,7 @@
set(HW_LINK_LIBS ${HW_LINK_LIBS} SDL)
endif()
- set( HW_LINK_LIBS
+ set(HW_LINK_LIBS
${HW_LINK_LIBS}
ole32
oleaut32
@@ -257,7 +270,7 @@
endif()
-target_link_libraries(hedgewars ${HW_LINK_LIBS})
+target_link_libraries(hedgewars ${HW_LINK_LIBS})
install(PROGRAMS "${EXECUTABLE_OUTPUT_PATH}/hedgewars${CMAKE_EXECUTABLE_SUFFIX}" DESTINATION ${target_dir})
--- a/QTfrontend/SDLs.cpp Wed Sep 14 22:27:22 2011 +0200
+++ b/QTfrontend/SDLs.cpp Wed Sep 14 22:39:39 2011 +0200
@@ -104,11 +104,11 @@
// Entry for "Axis Up"
sprintf(sdlkeys[i][0], "j%da%du", jid, aid);
- sprintf(sdlkeys[i++][1], "%s", ((isxb && aid < 5) ? (prefix + HWApplication::translate("binds (keys)", xbox360axes[aid * 2])) : axis + HWApplication::translate("binds (keys)", "(Up)")).toStdString().c_str());
+ sprintf(sdlkeys[i++][1], "%s", ((isxb && aid < 5) ? (prefix + HWApplication::translate("binds (keys)", xbox360axes[aid * 2])) : axis + HWApplication::translate("binds (keys)", "(Up)")).toUtf8().constData());
// Entry for "Axis Down"
sprintf(sdlkeys[i][0], "j%da%dd", jid, aid);
- sprintf(sdlkeys[i++][1], "%s", ((isxb && aid < 5) ? (prefix + HWApplication::translate("binds (keys)", xbox360axes[aid * 2 + 1])) : axis + HWApplication::translate("binds (keys)", "(Down)")).toStdString().c_str());
+ sprintf(sdlkeys[i++][1], "%s", ((isxb && aid < 5) ? (prefix + HWApplication::translate("binds (keys)", xbox360axes[aid * 2 + 1])) : axis + HWApplication::translate("binds (keys)", "(Down)")).toUtf8().constData());
}
// Register entries for all coolie hats of this joystick/gamepad
@@ -119,19 +119,19 @@
// Entry for "Hat Up"
sprintf(sdlkeys[i][0], "j%dh%du", jid, hid);
- sprintf(sdlkeys[i++][1], "%s", (hat + HWApplication::translate("binds (keys)", "(Up)")).toStdString().c_str());
+ sprintf(sdlkeys[i++][1], "%s", (hat + HWApplication::translate("binds (keys)", "(Up)")).toUtf8().constData());
// Entry for "Hat Down"
sprintf(sdlkeys[i][0], "j%dh%dd", jid, hid);
- sprintf(sdlkeys[i++][1], "%s", (hat + HWApplication::translate("binds (keys)", "(Down)")).toStdString().c_str());
+ sprintf(sdlkeys[i++][1], "%s", (hat + HWApplication::translate("binds (keys)", "(Down)")).toUtf8().constData());
// Entry for "Hat Left"
sprintf(sdlkeys[i][0], "j%dh%dl", jid, hid);
- sprintf(sdlkeys[i++][1], "%s", (hat + HWApplication::translate("binds (keys)", "(Left)")).toStdString().c_str());
+ sprintf(sdlkeys[i++][1], "%s", (hat + HWApplication::translate("binds (keys)", "(Left)")).toUtf8().constData());
// Entry for "Hat Right"
sprintf(sdlkeys[i][0], "j%dh%dr", jid, hid);
- sprintf(sdlkeys[i++][1], "%s", (hat + HWApplication::translate("binds (keys)", "(Right)")).toStdString().c_str());
+ sprintf(sdlkeys[i++][1], "%s", (hat + HWApplication::translate("binds (keys)", "(Right)")).toUtf8().constData());
}
// Register entries for all buttons of this joystick/gamepad
@@ -139,7 +139,7 @@
{
// Buttons
sprintf(sdlkeys[i][0], "j%db%d", jid, bid);
- sprintf(sdlkeys[i++][1], "%s", (prefix + ((isxb && bid < 10) ? (HWApplication::translate("binds (keys)", xb360buttons[bid]) + QString(" ")) : HWApplication::translate("binds (keys)", "Button") + QString(" %1").arg(bid + 1))).toStdString().c_str());
+ sprintf(sdlkeys[i++][1], "%s", (prefix + ((isxb && bid < 10) ? (HWApplication::translate("binds (keys)", xb360buttons[bid]) + QString(" ")) : HWApplication::translate("binds (keys)", "Button") + QString(" %1").arg(bid + 1))).toUtf8().constData());
}
// Close the game controller as we no longer need it
SDL_JoystickClose(joy);
--- a/QTfrontend/ammoSchemeModel.cpp Wed Sep 14 22:27:22 2011 +0200
+++ b/QTfrontend/ammoSchemeModel.cpp Wed Sep 14 22:39:39 2011 +0200
@@ -48,21 +48,22 @@
<< QVariant(false) // no wind 22
<< QVariant(false) // more wind 23
<< QVariant(false) // tag team 24
- << QVariant(100) // damage modfier 25
- << QVariant(45) // turn time 26
- << QVariant(100) // init health 27
- << QVariant(15) // sudden death 28
- << QVariant(5) // case prob 29
- << QVariant(3) // mines time 30
- << QVariant(4) // mines number 31
- << QVariant(0) // mine dud pct 32
- << QVariant(2) // explosives 33
- << QVariant(35) // health case pct 34
- << QVariant(25) // health case amt 35
- << QVariant(47) // water rise amt 36
- << QVariant(5) // health dec amt 37
- << QVariant(100) // rope modfier 38
- << QVariant(100) // get away time 39
+ << QVariant(false) // bottom border 25
+ << QVariant(100) // damage modfier 26
+ << QVariant(45) // turn time 27
+ << QVariant(100) // init health 28
+ << QVariant(15) // sudden death 29
+ << QVariant(5) // case prob 30
+ << QVariant(3) // mines time 31
+ << QVariant(4) // mines number 32
+ << QVariant(0) // mine dud pct 33
+ << QVariant(2) // explosives 34
+ << QVariant(35) // health case pct 35
+ << QVariant(25) // health case amt 36
+ << QVariant(47) // water rise amt 37
+ << QVariant(5) // health dec amt 38
+ << QVariant(100) // rope modfier 39
+ << QVariant(100) // get away time 40
;
AmmoSchemeModel::AmmoSchemeModel(QObject* parent, const QString & fileName) :
@@ -111,21 +112,22 @@
<< "disablewind" // 22
<< "morewind" // 23
<< "tagteam" // 24
- << "damagefactor" // 25
- << "turntime" // 26
- << "health" // 27
- << "suddendeath" // 28
- << "caseprobability" // 29
- << "minestime" // 30
- << "minesnum" // 31
- << "minedudpct" // 32
- << "explosives" // 33
- << "healthprobability" // 34
- << "healthcaseamount" // 35
- << "waterrise" // 36
- << "healthdecrease" // 37
- << "ropepct" // 38
- << "getawaytime" // 39
+ << "bottomborder" // 25
+ << "damagefactor" // 26
+ << "turntime" // 27
+ << "health" // 28
+ << "suddendeath" // 29
+ << "caseprobability" // 30
+ << "minestime" // 31
+ << "minesnum" // 32
+ << "minedudpct" // 33
+ << "explosives" // 34
+ << "healthprobability" // 35
+ << "healthcaseamount" // 36
+ << "waterrise" // 37
+ << "healthdecrease" // 38
+ << "ropepct" // 39
+ << "getawaytime" // 40
;
QList<QVariant> proMode;
@@ -155,21 +157,22 @@
<< QVariant(false) // no wind 22
<< QVariant(false) // more wind 23
<< QVariant(false) // tag team 24
- << QVariant(100) // damage modfier 25
- << QVariant(15) // turn time 26
- << QVariant(100) // init health 27
- << QVariant(15) // sudden death 28
- << QVariant(0) // case prob 29
- << QVariant(3) // mines time 30
- << QVariant(0) // mines number 31
- << QVariant(0) // mine dud pct 32
- << QVariant(2) // explosives 33
- << QVariant(35) // health case pct 34
- << QVariant(25) // health case amt 35
- << QVariant(47) // water rise amt 36
- << QVariant(5) // health dec amt 37
- << QVariant(100) // rope modfier 38
- << QVariant(100) // get away time 39
+ << QVariant(false) // bottom border 25
+ << QVariant(100) // damage modfier 26
+ << QVariant(15) // turn time 27
+ << QVariant(100) // init health 28
+ << QVariant(15) // sudden death 29
+ << QVariant(0) // case prob 30
+ << QVariant(3) // mines time 31
+ << QVariant(0) // mines number 32
+ << QVariant(0) // mine dud pct 33
+ << QVariant(2) // explosives 34
+ << QVariant(35) // health case pct 35
+ << QVariant(25) // health case amt 36
+ << QVariant(47) // water rise amt 37
+ << QVariant(5) // health dec amt 38
+ << QVariant(100) // rope modfier 39
+ << QVariant(100) // get away time 40
;
QList<QVariant> shoppa;
@@ -199,21 +202,22 @@
<< QVariant(false) // no wind 22
<< QVariant(false) // more wind 23
<< QVariant(false) // tag team 24
- << QVariant(100) // damage modfier 25
- << QVariant(30) // turn time 26
- << QVariant(100) // init health 27
- << QVariant(50) // sudden death 28
- << QVariant(1) // case prob 29
- << QVariant(3) // mines time 30
- << QVariant(0) // mines number 31
- << QVariant(0) // mine dud pct 32
- << QVariant(0) // explosives 33
- << QVariant(0) // health case pct 34
- << QVariant(25) // health case amt 35
- << QVariant(47) // water rise amt 36
- << QVariant(5) // health dec amt 37
- << QVariant(100) // rope modfier 38
- << QVariant(100) // get away time 39
+ << QVariant(false) // bottom border 25
+ << QVariant(100) // damage modfier 26
+ << QVariant(30) // turn time 27
+ << QVariant(100) // init health 28
+ << QVariant(50) // sudden death 29
+ << QVariant(1) // case prob 30
+ << QVariant(3) // mines time 31
+ << QVariant(0) // mines number 32
+ << QVariant(0) // mine dud pct 33
+ << QVariant(0) // explosives 34
+ << QVariant(0) // health case pct 35
+ << QVariant(25) // health case amt 36
+ << QVariant(47) // water rise amt 37
+ << QVariant(5) // health dec amt 38
+ << QVariant(100) // rope modfier 39
+ << QVariant(100) // get away time 40
;
QList<QVariant> cleanslate;
@@ -243,21 +247,22 @@
<< QVariant(false) // no wind 22
<< QVariant(false) // more wind 23
<< QVariant(false) // tag team 24
- << QVariant(100) // damage modfier 25
- << QVariant(45) // turn time 26
- << QVariant(100) // init health 27
- << QVariant(15) // sudden death 28
- << QVariant(5) // case prob 29
- << QVariant(3) // mines time 30
- << QVariant(4) // mines number 31
- << QVariant(0) // mine dud pct 32
- << QVariant(2) // explosives 33
- << QVariant(35) // health case pct 34
- << QVariant(25) // health case amt 35
- << QVariant(47) // water rise amt 36
- << QVariant(5) // health dec amt 37
- << QVariant(100) // rope modfier 38
- << QVariant(100) // get away time 39
+ << QVariant(false) // bottom border 25
+ << QVariant(100) // damage modfier 26
+ << QVariant(45) // turn time 27
+ << QVariant(100) // init health 28
+ << QVariant(15) // sudden death 29
+ << QVariant(5) // case prob 30
+ << QVariant(3) // mines time 31
+ << QVariant(4) // mines number 32
+ << QVariant(0) // mine dud pct 33
+ << QVariant(2) // explosives 34
+ << QVariant(35) // health case pct 35
+ << QVariant(25) // health case amt 36
+ << QVariant(47) // water rise amt 37
+ << QVariant(5) // health dec amt 38
+ << QVariant(100) // rope modfier 39
+ << QVariant(100) // get away time 40
;
QList<QVariant> minefield;
@@ -287,21 +292,22 @@
<< QVariant(false) // no wind 22
<< QVariant(false) // more wind 23
<< QVariant(false) // tag team 24
- << QVariant(100) // damage modfier 25
- << QVariant(30) // turn time 26
- << QVariant(50) // init health 27
- << QVariant(15) // sudden death 28
- << QVariant(0) // case prob 29
- << QVariant(0) // mines time 30
- << QVariant(80) // mines number 31
- << QVariant(0) // mine dud pct 32
- << QVariant(0) // explosives 33
- << QVariant(35) // health case pct 34
- << QVariant(25) // health case amt 35
- << QVariant(47) // water rise amt 36
- << QVariant(5) // health dec amt 37
- << QVariant(100) // rope modfier 38
- << QVariant(100) // get away time 39
+ << QVariant(false) // bottom border 25
+ << QVariant(100) // damage modfier 26
+ << QVariant(30) // turn time 27
+ << QVariant(50) // init health 28
+ << QVariant(15) // sudden death 29
+ << QVariant(0) // case prob 30
+ << QVariant(0) // mines time 31
+ << QVariant(80) // mines number 32
+ << QVariant(0) // mine dud pct 33
+ << QVariant(0) // explosives 34
+ << QVariant(35) // health case pct 35
+ << QVariant(25) // health case amt 36
+ << QVariant(47) // water rise amt 37
+ << QVariant(5) // health dec amt 38
+ << QVariant(100) // rope modfier 39
+ << QVariant(100) // get away time 40
;
QList<QVariant> barrelmayhem;
@@ -331,21 +337,22 @@
<< QVariant(false) // no wind 22
<< QVariant(false) // more wind 23
<< QVariant(false) // tag team 24
- << QVariant(100) // damage modfier 25
- << QVariant(30) // turn time 26
- << QVariant(100) // init health 27
- << QVariant(15) // sudden death 28
- << QVariant(0) // case prob 29
- << QVariant(0) // mines time 30
- << QVariant(0) // mines number 31
- << QVariant(0) // mine dud pct 32
- << QVariant(80) // explosives 33
- << QVariant(35) // health case pct 34
- << QVariant(25) // health case amt 35
- << QVariant(47) // water rise amt 36
- << QVariant(5) // health dec amt 37
- << QVariant(100) // rope modfier 38
- << QVariant(100) // get away time 39
+ << QVariant(false) // bottom border 25
+ << QVariant(100) // damage modfier 26
+ << QVariant(30) // turn time 27
+ << QVariant(100) // init health 28
+ << QVariant(15) // sudden death 29
+ << QVariant(0) // case prob 30
+ << QVariant(0) // mines time 31
+ << QVariant(0) // mines number 32
+ << QVariant(0) // mine dud pct 33
+ << QVariant(80) // explosives 34
+ << QVariant(35) // health case pct 35
+ << QVariant(25) // health case amt 36
+ << QVariant(47) // water rise amt 37
+ << QVariant(5) // health dec amt 38
+ << QVariant(100) // rope modfier 39
+ << QVariant(100) // get away time 40
;
QList<QVariant> tunnelhogs;
@@ -375,21 +382,22 @@
<< QVariant(false) // no wind 22
<< QVariant(false) // more wind 23
<< QVariant(false) // tag team 24
- << QVariant(100) // damage modfier 25
- << QVariant(30) // turn time 26
- << QVariant(100) // init health 27
- << QVariant(15) // sudden death 28
- << QVariant(5) // case prob 29
- << QVariant(3) // mines time 30
- << QVariant(10) // mines number 31
- << QVariant(10) // mine dud pct 32
- << QVariant(10) // explosives 33
- << QVariant(35) // health case pct 34
- << QVariant(25) // health case amt 35
- << QVariant(47) // water rise amt 36
- << QVariant(5) // health dec amt 37
- << QVariant(100) // rope modfier 38
- << QVariant(100) // get away time 39
+ << QVariant(false) // bottom border 25
+ << QVariant(100) // damage modfier 26
+ << QVariant(30) // turn time 27
+ << QVariant(100) // init health 28
+ << QVariant(15) // sudden death 29
+ << QVariant(5) // case prob 30
+ << QVariant(3) // mines time 31
+ << QVariant(10) // mines number 32
+ << QVariant(10) // mine dud pct 33
+ << QVariant(10) // explosives 34
+ << QVariant(35) // health case pct 35
+ << QVariant(25) // health case amt 36
+ << QVariant(47) // water rise amt 37
+ << QVariant(5) // health dec amt 38
+ << QVariant(100) // rope modfier 39
+ << QVariant(100) // get away time 40
;
QList<QVariant> forts;
@@ -419,21 +427,22 @@
<< QVariant(false) // no wind 22
<< QVariant(false) // more wind 23
<< QVariant(false) // tag team 24
- << QVariant(100) // damage modfier 25
- << QVariant(45) // turn time 26
- << QVariant(100) // init health 27
- << QVariant(15) // sudden death 28
- << QVariant(5) // case prob 29
- << QVariant(3) // mines time 30
- << QVariant(0) // mines number 31
- << QVariant(0) // mine dud pct 32
- << QVariant(0) // explosives 33
- << QVariant(35) // health case pct 34
- << QVariant(25) // health case amt 35
- << QVariant(47) // water rise amt 36
- << QVariant(5) // health dec amt 37
- << QVariant(100) // rope modfier 38
- << QVariant(100) // get away time 39
+ << QVariant(false) // bottom border 25
+ << QVariant(100) // damage modfier 26
+ << QVariant(45) // turn time 27
+ << QVariant(100) // init health 28
+ << QVariant(15) // sudden death 29
+ << QVariant(5) // case prob 30
+ << QVariant(3) // mines time 31
+ << QVariant(0) // mines number 32
+ << QVariant(0) // mine dud pct 33
+ << QVariant(0) // explosives 34
+ << QVariant(35) // health case pct 35
+ << QVariant(25) // health case amt 36
+ << QVariant(47) // water rise amt 37
+ << QVariant(5) // health dec amt 38
+ << QVariant(100) // rope modfier 39
+ << QVariant(100) // get away time 40
;
QList<QVariant> timeless;
@@ -463,21 +472,22 @@
<< QVariant(false) // no wind 22
<< QVariant(false) // more wind 23
<< QVariant(false) // tag team 24
- << QVariant(100) // damage modfier 25
- << QVariant(9999) // turn time 26
- << QVariant(100) // init health 27
- << QVariant(15) // sudden death 28
- << QVariant(5) // case prob 29
- << QVariant(3) // mines time 30
- << QVariant(5) // mines number 31
- << QVariant(10) // mine dud pct 32
- << QVariant(2) // explosives 33
- << QVariant(35) // health case pct 34
- << QVariant(30) // health case amt 35
- << QVariant(0) // water rise amt 36
- << QVariant(0) // health dec amt 37
- << QVariant(100) // rope modfier 38
- << QVariant(100) // get away time 39
+ << QVariant(false) // bottom border 25
+ << QVariant(100) // damage modfier 26
+ << QVariant(9999) // turn time 27
+ << QVariant(100) // init health 28
+ << QVariant(15) // sudden death 29
+ << QVariant(5) // case prob 30
+ << QVariant(3) // mines time 31
+ << QVariant(5) // mines number 32
+ << QVariant(10) // mine dud pct 33
+ << QVariant(2) // explosives 34
+ << QVariant(35) // health case pct 35
+ << QVariant(30) // health case amt 36
+ << QVariant(0) // water rise amt 37
+ << QVariant(0) // health dec amt 38
+ << QVariant(100) // rope modfier 39
+ << QVariant(100) // get away time 40
;
QList<QVariant> thinkingportals;
@@ -507,21 +517,22 @@
<< QVariant(false) // no wind 22
<< QVariant(false) // more wind 23
<< QVariant(false) // tag team 24
- << QVariant(100) // damage modfier 25
- << QVariant(45) // turn time 26
- << QVariant(100) // init health 27
- << QVariant(15) // sudden death 28
- << QVariant(2) // case prob 29
- << QVariant(3) // mines time 30
- << QVariant(5) // mines number 31
- << QVariant(0) // mine dud pct 32
- << QVariant(5) // explosives 33
- << QVariant(25) // health case pct 34
- << QVariant(25) // health case amt 35
- << QVariant(47) // water rise amt 36
- << QVariant(5) // health dec amt 37
- << QVariant(100) // rope modfier 38
- << QVariant(100) // get away time 39
+ << QVariant(false) // bottom border 25
+ << QVariant(100) // damage modfier 26
+ << QVariant(45) // turn time 27
+ << QVariant(100) // init health 28
+ << QVariant(15) // sudden death 29
+ << QVariant(2) // case prob 30
+ << QVariant(3) // mines time 31
+ << QVariant(5) // mines number 32
+ << QVariant(0) // mine dud pct 33
+ << QVariant(5) // explosives 34
+ << QVariant(25) // health case pct 35
+ << QVariant(25) // health case amt 36
+ << QVariant(47) // water rise amt 37
+ << QVariant(5) // health dec amt 38
+ << QVariant(100) // rope modfier 39
+ << QVariant(100) // get away time 40
;
QList<QVariant> kingmode;
@@ -551,21 +562,22 @@
<< QVariant(false) // no wind 22
<< QVariant(false) // more wind 23
<< QVariant(false) // tag team 24
- << QVariant(100) // damage modfier 25
- << QVariant(45) // turn time 26
- << QVariant(100) // init health 27
- << QVariant(15) // sudden death 28
- << QVariant(5) // case prob 29
- << QVariant(3) // mines time 30
- << QVariant(4) // mines number 31
- << QVariant(0) // mine dud pct 32
- << QVariant(2) // explosives 33
- << QVariant(35) // health case pct 34
- << QVariant(25) // health case amt 35
- << QVariant(47) // water rise amt 36
- << QVariant(5) // health dec amt 37
- << QVariant(100) // rope modfier 38
- << QVariant(100) // get away time 39
+ << QVariant(false) // bottom border 25
+ << QVariant(100) // damage modfier 26
+ << QVariant(45) // turn time 27
+ << QVariant(100) // init health 28
+ << QVariant(15) // sudden death 29
+ << QVariant(5) // case prob 30
+ << QVariant(3) // mines time 31
+ << QVariant(4) // mines number 32
+ << QVariant(0) // mine dud pct 33
+ << QVariant(2) // explosives 34
+ << QVariant(35) // health case pct 35
+ << QVariant(25) // health case amt 36
+ << QVariant(47) // water rise amt 37
+ << QVariant(5) // health dec amt 38
+ << QVariant(100) // rope modfier 39
+ << QVariant(100) // get away time 40
;
@@ -771,4 +783,4 @@
netScheme[i] = QVariant(cfg[i]);
reset();
-}
+}
--- a/QTfrontend/binds.cpp Wed Sep 14 22:27:22 2011 +0200
+++ b/QTfrontend/binds.cpp Wed Sep 14 22:39:39 2011 +0200
@@ -62,9 +62,7 @@
{"confirm", "y", QT_TRANSLATE_NOOP("binds", "confirmation"), NULL, NULL},
{"+voldown", "9", QT_TRANSLATE_NOOP("binds", "volume down"), NULL, QT_TRANSLATE_NOOP("binds (descriptions)", "Modify the game's volume while playing:")},
{"+volup", "0", QT_TRANSLATE_NOOP("binds", "volume up"), NULL, NULL},
-#ifndef _WIN32
{"fullscr", "f12", QT_TRANSLATE_NOOP("binds", "change mode"), NULL, QT_TRANSLATE_NOOP("binds (descriptions)", "Toggle fullscreen mode:")},
-#endif
{"capture", "c", QT_TRANSLATE_NOOP("binds", "capture"), NULL, QT_TRANSLATE_NOOP("binds (descriptions)", "Take a screenshot:")},
{"rotmask", "delete", QT_TRANSLATE_NOOP("binds", "hedgehogs\ninfo"), NULL, QT_TRANSLATE_NOOP("binds (descriptions)", "Toggle labels above hedgehogs:")}
};
--- a/QTfrontend/binds.h Wed Sep 14 22:27:22 2011 +0200
+++ b/QTfrontend/binds.h Wed Sep 14 22:39:39 2011 +0200
@@ -21,11 +21,7 @@
#include <QString>
-#ifdef _WIN32
-#define BINDS_NUMBER 43
-#else
#define BINDS_NUMBER 44
-#endif
struct BindAction
{
--- a/QTfrontend/chatwidget.cpp Wed Sep 14 22:27:22 2011 +0200
+++ b/QTfrontend/chatwidget.cpp Wed Sep 14 22:39:39 2011 +0200
@@ -233,7 +233,7 @@
void HWChatWidget::loadList(QStringList & list, const QString & file)
{
list.clear();
- QFile txt((cfgdir->absolutePath() + "/" + file).toLocal8Bit().constData());
+ QFile txt(cfgdir->absolutePath() + "/" + file);
if(!txt.open(QIODevice::ReadOnly))
return;
QTextStream stream(&txt);
@@ -253,7 +253,7 @@
void HWChatWidget::saveList(QStringList & list, const QString & file)
{
- QFile txt((cfgdir->absolutePath() + "/" + file).toLocal8Bit().constData());
+ QFile txt(cfgdir->absolutePath() + "/" + file);
if(!txt.open(QIODevice::WriteOnly | QIODevice::Truncate))
return;
QTextStream stream(&txt);
@@ -400,9 +400,8 @@
void HWChatWidget::nickRemoved(const QString& nick)
{
- QList<QListWidgetItem *> items = chatNicks->findItems(nick, Qt::MatchExactly);
- QListIterator<QListWidgetItem *> it(items);
- while(it.hasNext()) chatNicks->takeItem(chatNicks->row(it.next()));
+ foreach(QListWidgetItem * item, chatNicks->findItems(nick, Qt::MatchExactly))
+ chatNicks->takeItem(chatNicks->row(item));
emit nickCountUpdate(chatNicks->count());
}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/QTfrontend/databrowser.cpp Wed Sep 14 22:39:39 2011 +0200
@@ -0,0 +1,57 @@
+#include <QNetworkAccessManager>
+#include <QNetworkRequest>
+#include <QNetworkReply>
+#include <QDebug>
+#include <QUrl>
+
+#include "databrowser.h"
+
+const QNetworkRequest::Attribute typeAttribute = (QNetworkRequest::Attribute)(QNetworkRequest::User + 1);
+const QNetworkRequest::Attribute urlAttribute = (QNetworkRequest::Attribute)(QNetworkRequest::User + 2);
+
+DataBrowser::DataBrowser(QWidget *parent) :
+ QTextBrowser(parent)
+{
+
+ manager = new QNetworkAccessManager(this);
+}
+
+QVariant DataBrowser::loadResource(int type, const QUrl & name)
+{
+ if(type == QTextDocument::ImageResource || type == QTextDocument::StyleSheetResource)
+ {
+ if(resources.contains(name.toString()))
+ {
+ return resources.take(name.toString());
+ }
+ else
+ if(!requestedResources.contains(name.toString()))
+ {
+ qDebug() << "Requesting resource" << name.toString();
+ requestedResources.insert(name.toString());
+
+ QNetworkRequest newRequest(QUrl("http://www.hedgewars.org" + name.toString()));
+ newRequest.setAttribute(typeAttribute, type);
+ newRequest.setAttribute(urlAttribute, name);
+
+ QNetworkReply *reply = manager->get(newRequest);
+ connect(reply, SIGNAL(finished()), this, SLOT(resourceDownloaded()));
+ }
+ }
+
+ return QVariant();
+}
+
+void DataBrowser::resourceDownloaded()
+{
+ QNetworkReply * reply = qobject_cast<QNetworkReply *>(sender());
+
+ if(reply)
+ {
+ int type = reply->request().attribute(typeAttribute).toInt();
+ QUrl url = reply->request().attribute(urlAttribute).toUrl();
+ resources.insert(url.toString(), reply->readAll());
+ document()->addResource(type, reply->request().url(), QVariant());
+ update();
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/QTfrontend/databrowser.h Wed Sep 14 22:39:39 2011 +0200
@@ -0,0 +1,33 @@
+#ifndef DATABROWSER_H
+#define DATABROWSER_H
+
+#include <QTextBrowser>
+#include <QSet>
+
+class QNetworkAccessManager;
+
+class DataBrowser : public QTextBrowser
+{
+ Q_OBJECT
+public:
+ explicit DataBrowser(QWidget *parent = 0);
+
+signals:
+
+public slots:
+
+private:
+ QNetworkAccessManager *manager;
+
+ // hash and set of QString instead of QUrl to support Qt versions
+ // older than 4.7 (those have no support for qHash(const QUrl &))
+ QHash<QString, QByteArray> resources;
+ QSet<QString> requestedResources;
+
+ QVariant loadResource(int type, const QUrl & name);
+
+private slots:
+ void resourceDownloaded();
+};
+
+#endif // DATABROWSER_H
--- a/QTfrontend/drawmapscene.cpp Wed Sep 14 22:27:22 2011 +0200
+++ b/QTfrontend/drawmapscene.cpp Wed Sep 14 22:39:39 2011 +0200
@@ -108,11 +108,32 @@
emit pathChanged();
}
+ else if(oldItems.size())
+ {
+ while(oldItems.size())
+ addItem(oldItems.takeFirst());
+ paths = oldPaths;
+
+ emit pathChanged();
+ }
}
void DrawMapScene::clearMap()
{
- clear();
+ // don't clear if already cleared
+ if(!items().size())
+ return;
+
+ oldItems.clear();
+
+ // do this since clear() would _destroy_ all items
+ while(items().size()) {
+ oldItems.push_front(items().first());
+ removeItem(items().first());
+ }
+
+ oldPaths = paths;
+
paths.clear();
emit pathChanged();
@@ -146,6 +167,8 @@
void DrawMapScene::decode(QByteArray data)
{
+ oldItems.clear();
+ oldPaths.clear();
clear();
paths.clear();
--- a/QTfrontend/drawmapscene.h Wed Sep 14 22:27:22 2011 +0200
+++ b/QTfrontend/drawmapscene.h Wed Sep 14 22:39:39 2011 +0200
@@ -48,6 +48,8 @@
QBrush m_brush;
QGraphicsPathItem * m_currPath;
Paths paths;
+ Paths oldPaths;
+ QList<QGraphicsItem *> oldItems;
virtual void mouseMoveEvent(QGraphicsSceneMouseEvent * mouseEvent);
virtual void mousePressEvent(QGraphicsSceneMouseEvent * mouseEvent);
--- a/QTfrontend/game.cpp Wed Sep 14 22:27:22 2011 +0200
+++ b/QTfrontend/game.cpp Wed Sep 14 22:39:39 2011 +0200
@@ -53,7 +53,14 @@
void HWGame::onClientDisconnect()
{
switch (gameType) {
- case gtDemo: break;
+ case gtSave:
+ if (gameState == gsInterrupted || gameState == gsHalted)
+ emit HaveRecord(false, demo);
+ else if (gameState == gsFinished)
+ emit HaveRecord(true, demo);
+ break;
+ case gtDemo:
+ break;
case gtNet:
emit HaveRecord(true, demo);
break;
@@ -84,8 +91,7 @@
if (m_pTeamSelWidget)
{
- QListIterator<HWTeam> it(m_pTeamSelWidget->getPlayingTeams());
- while(it.hasNext())
+ foreach(HWTeam team, m_pTeamSelWidget->getPlayingTeams())
{
HWProto::addStringToBuffer(buf, QString("eammloadt %1").arg(ammostr.mid(0, cAmmoNumber)));
HWProto::addStringToBuffer(buf, QString("eammprob %1").arg(ammostr.mid(cAmmoNumber, cAmmoNumber)));
@@ -93,7 +99,7 @@
HWProto::addStringToBuffer(buf, QString("eammreinf %1").arg(ammostr.mid(3 * cAmmoNumber, cAmmoNumber)));
if(!gamecfg->schemeData(21).toBool()) HWProto::addStringToBuffer(buf, QString("eammstore"));
HWProto::addStringListToBuffer(buf,
- it.next().TeamGameConfig(gamecfg->getInitHealth()));
+ team.TeamGameConfig(gamecfg->getInitHealth()));
;
}
}
@@ -187,6 +193,7 @@
SendQuickConfig();
break;
}
+ case gtSave:
case gtDemo: break;
case gtNet: {
SendNetConfig();
@@ -320,9 +327,9 @@
TeamCount++;
}
-void HWGame::PlayDemo(const QString & demofilename)
+void HWGame::PlayDemo(const QString & demofilename, bool isSave)
{
- gameType = gtDemo;
+ gameType = isSave ? gtSave : gtDemo;
QFile demofile(demofilename);
if (!demofile.open(QIODevice::ReadOnly))
{
@@ -392,9 +399,8 @@
if (m_pTeamSelWidget)
{
QByteArray buf;
- QListIterator<HWTeam> it(m_pTeamSelWidget->getPlayingTeams());
- while(it.hasNext())
- HWProto::addStringToBuffer(buf, QString("eteamgone %1").arg(it.next().TeamName));
+ foreach(HWTeam team, m_pTeamSelWidget->getPlayingTeams())
+ HWProto::addStringToBuffer(buf, QString("eteamgone %1").arg(team.TeamName));
RawSendIPC(buf);
}
}
--- a/QTfrontend/game.h Wed Sep 14 22:27:22 2011 +0200
+++ b/QTfrontend/game.h Wed Sep 14 22:39:39 2011 +0200
@@ -48,7 +48,7 @@
HWGame(GameUIConfig * config, GameCFGWidget * gamecfg, QString ammo, TeamSelWidget* pTeamSelWidget = 0);
virtual ~HWGame();
void AddTeam(const QString & team);
- void PlayDemo(const QString & demofilename);
+ void PlayDemo(const QString & demofilename, bool isSave);
void StartLocal();
void StartQuick();
void StartNet();
@@ -84,6 +84,7 @@
gtNet = 4,
gtTraining = 5,
gtCampaign = 6,
+ gtSave = 7,
};
char msgbuf[MAXMSGCHARS];
QString teams[5];
--- a/QTfrontend/gamecfgwidget.cpp Wed Sep 14 22:27:22 2011 +0200
+++ b/QTfrontend/gamecfgwidget.cpp Wed Sep 14 22:39:39 2011 +0200
@@ -215,13 +215,15 @@
result |= 0x01000000; // more wind
if (schemeData(24).toBool())
result |= 0x02000000; // tag team
+ if (schemeData(25).toBool())
+ result |= 0x04000000; // bottom border
return result;
}
quint32 GameCFGWidget::getInitHealth() const
{
- return schemeData(27).toInt();
+ return schemeData(28).toInt();
}
QByteArray GameCFGWidget::getFullConfig() const
@@ -245,20 +247,20 @@
bcfg << QString("eseed " + pMapContainer->getCurrentSeed()).toUtf8();
bcfg << QString("e$gmflags %1").arg(getGameFlags()).toUtf8();
- bcfg << QString("e$damagepct %1").arg(schemeData(25).toInt()).toUtf8();
- bcfg << QString("e$turntime %1").arg(schemeData(26).toInt() * 1000).toUtf8();
- bcfg << QString("e$sd_turns %1").arg(schemeData(28).toInt()).toUtf8();
- bcfg << QString("e$casefreq %1").arg(schemeData(29).toInt()).toUtf8();
- bcfg << QString("e$minestime %1").arg(schemeData(30).toInt() * 1000).toUtf8();
- bcfg << QString("e$minesnum %1").arg(schemeData(31).toInt()).toUtf8();
- bcfg << QString("e$minedudpct %1").arg(schemeData(32).toInt()).toUtf8();
- bcfg << QString("e$explosives %1").arg(schemeData(33).toInt()).toUtf8();
- bcfg << QString("e$healthprob %1").arg(schemeData(34).toInt()).toUtf8();
- bcfg << QString("e$hcaseamount %1").arg(schemeData(35).toInt()).toUtf8();
- bcfg << QString("e$waterrise %1").arg(schemeData(36).toInt()).toUtf8();
- bcfg << QString("e$healthdec %1").arg(schemeData(37).toInt()).toUtf8();
- bcfg << QString("e$ropepct %1").arg(schemeData(38).toInt()).toUtf8();
- bcfg << QString("e$getawaytime %1").arg(schemeData(39).toInt()).toUtf8();
+ bcfg << QString("e$damagepct %1").arg(schemeData(26).toInt()).toUtf8();
+ bcfg << QString("e$turntime %1").arg(schemeData(27).toInt() * 1000).toUtf8();
+ bcfg << QString("e$sd_turns %1").arg(schemeData(29).toInt()).toUtf8();
+ bcfg << QString("e$casefreq %1").arg(schemeData(30).toInt()).toUtf8();
+ bcfg << QString("e$minestime %1").arg(schemeData(31).toInt() * 1000).toUtf8();
+ bcfg << QString("e$minesnum %1").arg(schemeData(32).toInt()).toUtf8();
+ bcfg << QString("e$minedudpct %1").arg(schemeData(33).toInt()).toUtf8();
+ bcfg << QString("e$explosives %1").arg(schemeData(34).toInt()).toUtf8();
+ bcfg << QString("e$healthprob %1").arg(schemeData(35).toInt()).toUtf8();
+ bcfg << QString("e$hcaseamount %1").arg(schemeData(36).toInt()).toUtf8();
+ bcfg << QString("e$waterrise %1").arg(schemeData(37).toInt()).toUtf8();
+ bcfg << QString("e$healthdec %1").arg(schemeData(38).toInt()).toUtf8();
+ bcfg << QString("e$ropepct %1").arg(schemeData(39).toInt()).toUtf8();
+ bcfg << QString("e$getawaytime %1").arg(schemeData(40).toInt()).toUtf8();
bcfg << QString("e$template_filter %1").arg(pMapContainer->getTemplateFilter()).toUtf8();
bcfg << QString("e$mapgen %1").arg(mapgen).toUtf8();
--- a/QTfrontend/hedgewars.qrc Wed Sep 14 22:27:22 2011 +0200
+++ b/QTfrontend/hedgewars.qrc Wed Sep 14 22:39:39 2011 +0200
@@ -81,6 +81,7 @@
<file>res/btnNoWind.png</file>
<file>res/btnMoreWind.png</file>
<file>res/btnTagTeam.png</file>
+ <file>res/btnBottomBorder.png</file>
<file>res/iconBox.png</file>
<file>res/iconHealth.png</file>
<file>res/iconSuddenDeath.png</file>
--- a/QTfrontend/hwconsts.h Wed Sep 14 22:27:22 2011 +0200
+++ b/QTfrontend/hwconsts.h Wed Sep 14 22:39:39 2011 +0200
@@ -74,9 +74,9 @@
#define AMMOLINE_PROMODE_CRATE "111111111111111111111111111111111111111110010111111101"
#define AMMOLINE_SHOPPA_QT "000000990000000000000000000000000000000000000000000000"
-#define AMMOLINE_SHOPPA_PROB "444441004424440221011212122242200000000200040001001101"
+#define AMMOLINE_SHOPPA_PROB "444441004424440221011212122242200000000200040001001100"
#define AMMOLINE_SHOPPA_DELAY "000000000000000000000000000000000000000000000000000000"
-#define AMMOLINE_SHOPPA_CRATE "111111111111111111111111111111111111111110110111111101"
+#define AMMOLINE_SHOPPA_CRATE "111111111111111111111111111111111111111110110111111100"
#define AMMOLINE_CLEAN_QT "101000900001000001100000000000000000000000000000100000"
#define AMMOLINE_CLEAN_PROB "040504054160065554655446477657666666615551010111541101"
--- a/QTfrontend/hwform.cpp Wed Sep 14 22:27:22 2011 +0200
+++ b/QTfrontend/hwform.cpp Wed Sep 14 22:39:39 2011 +0200
@@ -38,6 +38,7 @@
#include <QSignalMapper>
#include <QShortcut>
#include <QDesktopServices>
+#include <QInputDialog>
#include "hwform.h"
#include "game.h"
@@ -92,7 +93,7 @@
bool frontendEffects = true;
QString playerHash;
-HWForm::HWForm(QWidget *parent)
+HWForm::HWForm(QWidget *parent, QString styleSheet)
: QMainWindow(parent), pnetserver(0), pRegisterServer(0), editedTeam(0), hwnet(0)
{
#ifdef USE_XFIRE
@@ -103,6 +104,7 @@
frontendEffects = gameSettings->value("frontend/effects", true).toBool();
playerHash = QString(QCryptographicHash::hash(gameSettings->value("net/nick","").toString().toLatin1(), QCryptographicHash::Md5).toHex());
+ this->setStyleSheet(styleSheet);
ui.setupUi(this);
setMinimumSize(760, 580);
//setFocusPolicy(Qt::StrongFocus);
@@ -151,12 +153,17 @@
connect(ui.pageMain->BtnNet, SIGNAL(clicked()), pageSwitchMapper, SLOT(map()));
pageSwitchMapper->setMapping(ui.pageMain->BtnNet, ID_PAGE_NETTYPE);
+
connect(ui.pageMain->BtnInfo, SIGNAL(clicked()), pageSwitchMapper, SLOT(map()));
- pageSwitchMapper->setMapping(ui.pageMain->BtnInfo, ID_PAGE_DATADOWNLOAD);
+ pageSwitchMapper->setMapping(ui.pageMain->BtnInfo, ID_PAGE_INFO);
+
+ connect(ui.pageMain->BtnDataDownload, SIGNAL(clicked()), pageSwitchMapper, SLOT(map()));
+ pageSwitchMapper->setMapping(ui.pageMain->BtnDataDownload, ID_PAGE_DATADOWNLOAD);
connect(ui.pageMain->BtnExit, SIGNAL(pressed()), this, SLOT(btnExitPressed()));
connect(ui.pageMain->BtnExit, SIGNAL(clicked()), this, SLOT(btnExitClicked()));
+ connect(ui.pageInfo->BtnBack, SIGNAL(clicked()), this, SLOT(GoBack()));
connect(ui.pageDataDownload->BtnBack, SIGNAL(clicked()), this, SLOT(GoBack()));
connect(ui.pageEditTeam->BtnTeamSave, SIGNAL(clicked()), this, SLOT(TeamSave()));
@@ -223,6 +230,7 @@
connect(ui.pageInfo->BtnBack, SIGNAL(clicked()), this, SLOT(GoBack()));
connect(ui.pageGameStats->BtnBack, SIGNAL(clicked()), this, SLOT(GoBack()));
+ connect(ui.pageGameStats, SIGNAL(saveDemoRequested()), this, SLOT(saveDemoWithCustomName()));
connect(ui.pageSinglePlayer->BtnSimpleGamePage, SIGNAL(clicked()), this, SLOT(SimpleGame()));
connect(ui.pageSinglePlayer->BtnTrainPage, SIGNAL(clicked()), pageSwitchMapper, SLOT(map()));
@@ -619,8 +627,9 @@
}
QStringList tmnames;
- QListIterator<HWTeam> it(curTeamSelWidget->getDontPlayingTeams());
- while(it.hasNext()) tmnames += it.next().TeamName;
+
+ foreach(HWTeam team, curTeamSelWidget->getNotPlayingTeams())
+ tmnames += team.TeamName;
//UpdateTeamsLists(&tmnames); // FIXME: still need more work if teamname is updated while configuring
UpdateTeamsLists();
@@ -722,7 +731,7 @@
return;
}
CreateGame(0, 0, 0);
- game->PlayDemo(curritem->data(Qt::UserRole).toString());
+ game->PlayDemo(curritem->data(Qt::UserRole).toString(), ui.pagePlayDemo->isSave());
}
void HWForm::PlayDemoQuick(const QString & demofilename)
@@ -731,7 +740,7 @@
GoBack(); //needed to cleanly disconnect from netgame
GoToPage(ID_PAGE_MAIN);
CreateGame(0, 0, 0);
- game->PlayDemo(demofilename);
+ game->PlayDemo(demofilename, false);
}
void HWForm::NetConnectServer(const QString & host, quint16 port)
@@ -1033,6 +1042,7 @@
connect(game, SIGNAL(GameStats(char, const QString &)), ui.pageGameStats, SLOT(GameStats(char, const QString &)));
connect(game, SIGNAL(ErrorMessage(const QString &)), this, SLOT(ShowErrorMessage(const QString &)), Qt::QueuedConnection);
connect(game, SIGNAL(HaveRecord(bool, const QByteArray &)), this, SLOT(GetRecord(bool, const QByteArray &)));
+ m_lastDemo = QByteArray();
}
void HWForm::ShowErrorMessage(const QString & msg)
@@ -1061,6 +1071,7 @@
demo.replace(QByteArray("\x02TN"), QByteArray("\x02TD"));
demo.replace(QByteArray("\x02TS"), QByteArray("\x02TD"));
filename = cfgdir->absolutePath() + "/Demos/" + recordFileName + "." + *cProtoVer + ".hwd";
+ m_lastDemo = demo;
} else
{
demo.replace(QByteArray("\x02TL"), QByteArray("\x02TS"));
@@ -1075,7 +1086,7 @@
ShowErrorMessage(tr("Cannot save record to file %1").arg(filename));
return ;
}
- demofile.write(demo.constData(), demo.size());
+ demofile.write(demo);
demofile.close();
}
@@ -1293,3 +1304,30 @@
else QMessageBox::information(0, "", QMessageBox::tr("File association failed."));
}
+void HWForm::saveDemoWithCustomName()
+{
+ if(!m_lastDemo.isEmpty())
+ {
+ QString fileName;
+ bool ok = false;
+ do
+ {
+ fileName = QInputDialog::getText(this, tr("Demo name"), tr("Demo name:"));
+
+ if(!fileName.isEmpty())
+ {
+ QString filePath = cfgdir->absolutePath() + "/Demos/" + fileName + "." + *cProtoVer + ".hwd";
+ QFile demofile(filePath);
+ ok = demofile.open(QIODevice::WriteOnly);
+ if (!ok)
+ ShowErrorMessage(tr("Cannot save record to file %1").arg(filePath));
+ else
+ {
+ ok = -1 != demofile.write(m_lastDemo);
+ demofile.close();
+ }
+ }
+ } while(!fileName.isEmpty() && !ok);
+ }
+}
+
--- a/QTfrontend/hwform.h Wed Sep 14 22:27:22 2011 +0200
+++ b/QTfrontend/hwform.h Wed Sep 14 22:39:39 2011 +0200
@@ -52,7 +52,7 @@
Q_OBJECT
public:
- HWForm(QWidget *parent = 0);
+ HWForm(QWidget *parent = 0, QString styleSheet = "");
Ui_HWForm ui;
SDLInteraction sdli;
GameUIConfig * config;
@@ -117,6 +117,8 @@
void AsyncNetServerStart();
void NetLeftRoom();
void selectFirstNetScheme();
+
+ void saveDemoWithCustomName();
private:
void _NetConnect(const QString & hostName, quint16 port, const QString & nick);
@@ -162,6 +164,7 @@
QTime eggTimer;
BGWidget * wBackground;
QSignalMapper * pageSwitchMapper;
+ QByteArray m_lastDemo;
#ifdef __APPLE__
InstallController * panel;
--- a/QTfrontend/main.cpp Wed Sep 14 22:27:22 2011 +0200
+++ b/QTfrontend/main.cpp Wed Sep 14 22:39:39 2011 +0200
@@ -96,8 +96,8 @@
Q_INIT_RESOURCE(hedgewars);
- qApp->setStyleSheet
- (QString(
+ QString styleSheetFromHell =
+ QString(
"HWForm,QDialog{"
"background-image: url(\":/res/Background.png\");"
"background-position: bottom center;"
@@ -315,8 +315,7 @@
"background-color: #ffcc00;"
"width: 8px;"
"}"
- )
- );
+ );
bindir->cd("bin"); // workaround over NSIS installer
@@ -470,8 +469,8 @@
app.installTranslator(&Translator);
}
+#ifdef _WIN32
// Win32 registry setup (used for xfire detection etc. - don't set it if we're running in "portable" mode with a custom config dir)
-#ifdef _WIN32
if(!custom_config)
{
QSettings registry_hklm("HKEY_LOCAL_MACHINE", QSettings::NativeFormat);
@@ -484,7 +483,7 @@
CocoaInitializer initializer;
#endif
- app.form = new HWForm();
+ app.form = new HWForm(NULL,styleSheetFromHell);
app.form->show();
return app.exec();
--- a/QTfrontend/mapContainer.cpp Wed Sep 14 22:27:22 2011 +0200
+++ b/QTfrontend/mapContainer.cpp Wed Sep 14 22:39:39 2011 +0200
@@ -64,8 +64,6 @@
imageButt->setFlat(true);
imageButt->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);//QSizePolicy::Minimum, QSizePolicy::Minimum);
mapLayout->addWidget(imageButt, 0, 0, 1, 2);
- //connect(imageButt, SIGNAL(clicked()), this, SLOT(setRandomSeed()));
- //connect(imageButt, SIGNAL(clicked()), this, SLOT(setRandomTheme()));
connect(imageButt, SIGNAL(clicked()), this, SLOT(setRandomMap()));
chooseMap = new QComboBox(mapWidget);
@@ -293,7 +291,6 @@
maze_size_label->hide();
cbMazeSize->hide();
emit mapChanged("+rnd+");
- emit mapgenChanged(mapgen);
emit themeChanged(chooseMap->itemData(index).toList()[1].toString());
break;
case MAPGEN_MAZE:
@@ -305,7 +302,6 @@
maze_size_label->show();
cbMazeSize->show();
emit mapChanged("+maze+");
- emit mapgenChanged(mapgen);
emit themeChanged(chooseMap->itemData(index).toList()[1].toString());
break;
case MAPGEN_DRAWN:
@@ -317,10 +313,10 @@
maze_size_label->hide();
cbMazeSize->hide();
emit mapChanged("+drawn+");
- emit mapgenChanged(mapgen);
emit themeChanged(chooseMap->itemData(index).toList()[1].toString());
break;
default:
+ mapgen = MAPGEN_MAP;
updatePreview();
gbThemes->hide();
lblFilter->hide();
@@ -329,6 +325,8 @@
cbMazeSize->hide();
emit mapChanged(chooseMap->itemData(index).toList()[0].toString());
}
+
+ emit mapgenChanged(mapgen);
}
// Should this add text to identify map size?
@@ -447,7 +445,7 @@
void HWMapContainer::setSeed(const QString & seed)
{
intSetSeed(seed);
- if (chooseMap->currentIndex() < MAPGEN_MAP)
+ if (chooseMap->currentIndex() < MAPGEN_DRAWN)
updatePreview();
}
@@ -511,15 +509,14 @@
{
int i = MAPGEN_MAP + 3 + numMissions + rand() % (chooseMap->count() - MAPGEN_MAP - 3 - numMissions);
chooseMap->setCurrentIndex(i);
- setRandomSeed();
+ updatePreview();
}
void HWMapContainer::setRandomMission()
{
int i = MAPGEN_MAP + 2 + rand() % numMissions;
- qDebug() << i << MAPGEN_MAP << numMissions;
chooseMap->setCurrentIndex(i);
- setRandomSeed();
+ updatePreview();
}
void HWMapContainer::setRandomSeed()
@@ -575,7 +572,10 @@
void HWMapContainer::intSetMapgen(MapGenerator m)
{
mapgen = m;
- chooseMap->setCurrentIndex(m);
+
+ if(m != MAPGEN_MAP)
+ chooseMap->setCurrentIndex(m);
+
emit mapgenChanged(m);
}
@@ -644,9 +644,8 @@
break;
default:
QPixmap mapImage;
- qDebug() << "Map data" << curIndex << chooseMap->currentText() << chooseMap->itemData(curIndex);
QFile tmpfile;
- tmpfile.setFileName(cfgdir->absolutePath() + "/Data//Maps/" + chooseMap->itemData(curIndex).toList()[0].toString() + "/preview.png");
+ tmpfile.setFileName(cfgdir->absolutePath() + "/Data/Maps/" + chooseMap->itemData(curIndex).toList()[0].toString() + "/preview.png");
if (!tmpfile.exists()) tmpfile.setFileName(datadir->absolutePath() + "/Maps/" + chooseMap->itemData(curIndex).toList()[0].toString() + "/preview.png");
if(!mapImage.load(QFileInfo(tmpfile).absoluteFilePath())) {
imageButt->setIcon(QIcon());
--- a/QTfrontend/newnetclient.cpp Wed Sep 14 22:27:22 2011 +0200
+++ b/QTfrontend/newnetclient.cpp Wed Sep 14 22:39:39 2011 +0200
@@ -496,17 +496,6 @@
emit AskForRunGame();
return;
}
-
- if (lst[0] == "BYE") {
- if (lst[1] == "Authentication failed")
- {
- // Set the password blank if case the user tries to join and enter his password again
- config->setValue("net/passwordlength", 0);
- config->setNetPasswordLength(0);
- }
- // return early so the user won't get an unknown error message dialog (the user already gets a server connection is lost one)
- return;
- }
if (lst[0] == "ASKPASSWORD") {
bool ok = false;
@@ -625,6 +614,12 @@
qWarning("Net: Bad BYE message");
return;
}
+ if (lst[1] == "Authentication failed")
+ {
+ // Set the password blank if case the user tries to join and enter his password again
+ config->setValue("net/passwordlength", 0);
+ config->setNetPasswordLength(0);
+ }
emit showMessage(HWNewNet::tr("Quit reason: ") + lst[1]);
return;
}
--- a/QTfrontend/pagedata.cpp Wed Sep 14 22:27:22 2011 +0200
+++ b/QTfrontend/pagedata.cpp Wed Sep 14 22:39:39 2011 +0200
@@ -20,10 +20,19 @@
#include <QPushButton>
#include <QNetworkAccessManager>
#include <QNetworkRequest>
+#include <QNetworkReply>
#include <QFileInfo>
#include <QFileDialog>
+#include <QDebug>
+#include <QProgressBar>
+#include <QBuffer>
#include "pagedata.h"
+#include "databrowser.h"
+#include "hwconsts.h"
+
+#include "quazip.h"
+#include "quazipfile.h"
PageDataDownload::PageDataDownload(QWidget* parent) : AbstractPage(parent)
{
@@ -32,25 +41,181 @@
pageLayout->setColumnStretch(1, 1);
pageLayout->setColumnStretch(2, 1);
- BtnBack = addButton(":/res/Exit.png", pageLayout, 1, 0, true);
+ BtnBack = addButton(":/res/Exit.png", pageLayout, 2, 0, true);
+
+ web = new DataBrowser(this);
+ connect(web, SIGNAL(anchorClicked(QUrl)), this, SLOT(request(const QUrl&)));
+ web->setOpenLinks(false);
+ pageLayout->addWidget(web, 0, 0, 1, 3);
+
+ progressBarsLayout = new QVBoxLayout();
+ pageLayout->addLayout(progressBarsLayout, 1, 0, 1, 3);
+
+ fetchList();
+}
+
+void PageDataDownload::request(const QUrl &url)
+{
+ QUrl finalUrl;
+ if(url.host().isEmpty())
+ finalUrl = QUrl("http://www.hedgewars.org" + url.path());
+ else
+ finalUrl = url;
+
+ if(url.path().endsWith(".zip"))
+ {
+ qWarning() << "Download Request" << url.toString();
+ QString fileName = QFileInfo(url.toString()).fileName();
+
+ QNetworkRequest newRequest(finalUrl);
+ newRequest.setAttribute(QNetworkRequest::User, fileName);
+
+ QNetworkAccessManager *manager = new QNetworkAccessManager(this);
+ QNetworkReply *reply = manager->get(newRequest);
+ connect(reply, SIGNAL(finished()), this, SLOT(fileDownloaded()));
+ connect(reply, SIGNAL(downloadProgress(qint64, qint64)), this, SLOT(downloadProgress(qint64, qint64)));
+
+ QProgressBar *progressBar = new QProgressBar(this);
+ progressBarsLayout->addWidget(progressBar);
+ progressBars.insert(reply, progressBar);
+ } else
+ {
+ qWarning() << "Page Request" << url.toString();
+
+ QNetworkRequest newRequest(finalUrl);
- web = new QWebView(this);
- connect(web, SIGNAL(linkClicked(const QUrl&)), this, SLOT(install(const QUrl&)));
- web->load(QUrl("http://m8y.org/hw/downloads/"));
- web->page()->setLinkDelegationPolicy(QWebPage::DelegateAllLinks);
- pageLayout->addWidget(web, 0, 0, 1, 3);
+ QNetworkAccessManager *manager = new QNetworkAccessManager(this);
+ QNetworkReply *reply = manager->get(newRequest);
+ connect(reply, SIGNAL(finished()), this, SLOT(pageDownloaded()));
+ }
+}
+
+
+void PageDataDownload::pageDownloaded()
+{
+ QNetworkReply * reply = qobject_cast<QNetworkReply *>(sender());
+
+ if(reply)
+ {
+ QString html = QString::fromUtf8(reply->readAll());
+ int begin = html.indexOf("<!-- BEGIN -->");
+ int end = html.indexOf("<!-- END -->");
+ if(begin != -1 && begin < end)
+ {
+ html.truncate(end);
+ html.remove(0, begin);
+ }
+ web->setHtml(html);
+ }
+}
+
+void PageDataDownload::fileDownloaded()
+{
+ QNetworkReply * reply = qobject_cast<QNetworkReply *>(sender());
+
+ if(reply)
+ {
+ QByteArray fileContents = reply->readAll();
+ QProgressBar *progressBar = progressBars.value(reply, 0);
+
+ if(progressBar)
+ {
+ progressBars.remove(reply);
+ progressBar->deleteLater();
+ }
+
+ extractDataPack(&fileContents);
+ }
}
-void PageDataDownload::install(const QUrl &url)
+void PageDataDownload::downloadProgress(qint64 bytesRecieved, qint64 bytesTotal)
+{
+ QNetworkReply * reply = qobject_cast<QNetworkReply *>(sender());
+
+ if(reply)
+ {
+ QProgressBar *progressBar = progressBars.value(reply, 0);
+
+ if(progressBar)
+ {
+ progressBar->setValue(bytesRecieved);
+ progressBar->setMaximum(bytesTotal);
+ }
+ }
+}
+
+void PageDataDownload::fetchList()
{
-qWarning("Download Request");
-QString fileName = QFileInfo(url.toString()).fileName();
+ request(QUrl("http://hedgewars.org/content.html"));
+}
+
+bool PageDataDownload::extractDataPack(QByteArray * buf)
+{
+ QBuffer buffer;
+ buffer.setBuffer(buf);
+
+ QuaZip zip;
+ zip.setIoDevice(&buffer);
+ if(!zip.open(QuaZip::mdUnzip))
+ {
+ qWarning("testRead(): zip.open(): %d", zip.getZipError());
+ return false;
+ }
+
+ QuaZipFile file(&zip);
+
+ QDir extractDir(*cfgdir);
+ extractDir.cd("Data");
-QNetworkRequest newRequest(url);
-newRequest.setAttribute(QNetworkRequest::User, fileName);
+ for(bool more = zip.goToFirstFile(); more; more = zip.goToNextFile())
+ {
+ if(!file.open(QIODevice::ReadOnly))
+ {
+ qWarning("file.open(): %d", file.getZipError());
+ return false;
+ }
+
+
+ QString fileName = file.getActualFileName();
+ QString filePath = extractDir.filePath(fileName);
+ if (fileName.endsWith("/"))
+ {
+ QFileInfo fi(filePath);
+ QDir().mkpath(fi.filePath());
+ } else
+ {
+ qDebug() << "Extracting" << filePath;
+ QFile out(filePath);
+ if(!out.open(QFile::WriteOnly))
+ {
+ qWarning() << "out.open():" << out.errorString();
+ return false;
+ }
-QNetworkAccessManager *manager = new QNetworkAccessManager(this);
-QNetworkReply *reply = manager->get(newRequest);
-//connect( reply, SIGNAL(downloadProgress(qint64, qint64)), this, SLOT(downloadProgress(qint64, qint64)) );
-//connect( reply, SIGNAL(finished()), this, SLOT(downloadIssueFinished()));
+ out.write(file.readAll());
+
+ out.close();
+
+ if(file.getZipError() != UNZ_OK) {
+ qWarning("file.getFileName(): %d", file.getZipError());
+ return false;
+ }
+
+ if(!file.atEnd()) {
+ qWarning("read all but not EOF");
+ return false;
+ }
+ }
+
+ file.close();
+
+ if(file.getZipError()!=UNZ_OK) {
+ qWarning("file.close(): %d", file.getZipError());
+ return false;
+ }
+ }
+
+ zip.close();
+
+ return true;
}
--- a/QTfrontend/pagedata.h Wed Sep 14 22:27:22 2011 +0200
+++ b/QTfrontend/pagedata.h Wed Sep 14 22:39:39 2011 +0200
@@ -18,10 +18,15 @@
#ifndef PAGE_DATA_H
#define PAGE_DATA_H
-#include <QWebView>
+
#include <QUrl>
#include "AbstractPage.h"
+class DataBrowser;
+class QProgressBar;
+class QNetworkReply;
+class QVBoxLayout;
+
class PageDataDownload : public AbstractPage
{
Q_OBJECT
@@ -30,10 +35,23 @@
PageDataDownload(QWidget* parent = 0);
QPushButton *BtnBack;
- QWebView *web;
+
+public slots:
+ void fetchList();
+
+private:
+ DataBrowser *web;
+ QHash<QNetworkReply*, QProgressBar *> progressBars;
+ QVBoxLayout *progressBarsLayout;
+
+ bool extractDataPack(QByteArray * buf);
private slots:
- void install(const QUrl &url);
+ void request(const QUrl &url);
+
+ void pageDownloaded();
+ void fileDownloaded();
+ void downloadProgress(qint64, qint64);
};
#endif
--- a/QTfrontend/pagedrawmap.cpp Wed Sep 14 22:27:22 2011 +0200
+++ b/QTfrontend/pagedrawmap.cpp Wed Sep 14 22:39:39 2011 +0200
@@ -45,7 +45,7 @@
void PageDrawMap::load()
{
- QString fileName = QFileDialog::getOpenFileName(this, tr("Load drawn map"), ".", tr("Drawn Maps (*.hwmap);;All files (*.*)"));
+ QString fileName = QFileDialog::getOpenFileName(NULL, tr("Load drawn map"), ".", tr("Drawn Maps (*.hwmap);;All files (*)"));
if(!fileName.isEmpty())
drawMapWidget->load(fileName);
@@ -53,7 +53,7 @@
void PageDrawMap::save()
{
- QString fileName = QFileDialog::getSaveFileName(this, tr("Save drawn map"), ".", tr("Drawn Maps (*.hwmap);;All files (*.*)"));
+ QString fileName = QFileDialog::getSaveFileName(NULL, tr("Save drawn map"), ".", tr("Drawn Maps (*.hwmap);;All files (*)"));
if(!fileName.isEmpty())
drawMapWidget->save(fileName);
--- a/QTfrontend/pageeditteam.cpp Wed Sep 14 22:27:22 2011 +0200
+++ b/QTfrontend/pageeditteam.cpp Wed Sep 14 22:39:39 2011 +0200
@@ -358,10 +358,8 @@
mySdli->SDLMusicInit();
tmpdir.cd(cfgdir->absolutePath());
- tmpdir.cd("Data/Sounds/voices");
- tmpdir.cd(CBVoicepack->currentText());
-
- if (!tmpdir.exists()) {
+ if (!tmpdir.cd("Data/Sounds/voices/"+CBVoicepack->currentText()))
+ {
tmpdir.cd(datadir->absolutePath());
tmpdir.cd("Sounds/voices");
tmpdir.cd(CBVoicepack->currentText());
--- a/QTfrontend/pagegamestats.cpp Wed Sep 14 22:27:22 2011 +0200
+++ b/QTfrontend/pagegamestats.cpp Wed Sep 14 22:39:39 2011 +0200
@@ -47,6 +47,11 @@
BtnBack = addButton(":/res/Exit.png", pageLayout, 3, 0, true);
BtnBack->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
+ BtnSave = addButton(":/res/Save.png", pageLayout, 3, 2, true);
+ BtnSave->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
+ BtnSave->setStyleSheet("QPushButton{margin: 12px 0px 12px 0px;}");
+ connect(BtnSave, SIGNAL(clicked()), this, SIGNAL(saveDemoRequested()));
+
QGroupBox * gb = new QGroupBox(this);
QVBoxLayout * gbl = new QVBoxLayout;
@@ -62,7 +67,7 @@
gbl->addWidget(l);
gbl->addWidget(labelGameStats);
gb->setLayout(gbl);
- pageLayout->addWidget(gb, 1, 1);
+ pageLayout->addWidget(gb, 1, 1, 1, 2);
// graph
graphic = new FitGraphicsView(gb);
--- a/QTfrontend/pagegamestats.h Wed Sep 14 22:27:22 2011 +0200
+++ b/QTfrontend/pagegamestats.h Wed Sep 14 22:39:39 2011 +0200
@@ -44,6 +44,7 @@
PageGameStats(QWidget* parent = 0);
QPushButton *BtnBack;
+ QPushButton *BtnSave;
QLabel *labelGameStats;
QLabel *labelGameWin;
QLabel *labelGameRank;
@@ -53,6 +54,9 @@
void GameStats(char type, const QString & info);
void clear();
void renderStats();
+
+signals:
+ void saveDemoRequested();
private:
void AddStatText(const QString & msg);
--- a/QTfrontend/pagemain.cpp Wed Sep 14 22:27:22 2011 +0200
+++ b/QTfrontend/pagemain.cpp Wed Sep 14 22:39:39 2011 +0200
@@ -41,6 +41,7 @@
pageLayout->setRowStretch(2, 0);
pageLayout->setRowStretch(3, 1);
pageLayout->setRowStretch(4, 1);
+ pageLayout->setRowStretch(5, 1);
BtnSinglePlayer = addButton(":/res/LocalPlay.png", pageLayout, 2, 0, 1, 2, true);
BtnSinglePlayer->setToolTip(tr("Local Game (Play a game on a single computer)"));
@@ -50,6 +51,9 @@
BtnNet->setToolTip(tr("Network Game (Play a game across a network)"));
pageLayout->setAlignment(BtnNet, Qt::AlignHCenter);
+ BtnDataDownload = addButton(tr("Downloadable Content"), pageLayout, 4, 0, 1, 4, false);
+ pageLayout->setAlignment(BtnDataDownload, Qt::AlignHCenter);
+
mainNote = new QLabel(this);
mainNote->setAlignment(Qt::AlignHCenter | Qt::AlignVCenter);
mainNote->setWordWrap(true);
@@ -119,9 +123,9 @@
else
mainNote->setText(QLabel::tr("This development build is 'work in progress' and may not be compatible with other versions of the game. Some features might be broken or incomplete. Use at your own risk!"));
- pageLayout->addWidget(mainNote, 4, 1, 1, 2);
+ pageLayout->addWidget(mainNote, 5, 1, 1, 2);
- BtnSetup = addButton(":/res/Settings.png", pageLayout, 4, 3, true);
+ BtnSetup = addButton(":/res/Settings.png", pageLayout, 5, 3, true);
//BtnInfo = addButton(":/res/About.png", pageLayout, 3, 1, 1, 2, true);
BtnInfo = addButton(":/res/HedgewarsTitle.png", pageLayout, 0, 0, 1, 4, true);
@@ -129,7 +133,7 @@
pageLayout->setAlignment(BtnInfo, Qt::AlignHCenter);
//pageLayout->setAlignment(BtnInfo, Qt::AlignHCenter);
- BtnExit = addButton(":/res/Exit.png", pageLayout, 4, 0, 1, 1, true);
+ BtnExit = addButton(":/res/Exit.png", pageLayout, 5, 0, 1, 1, true);
BtnExit->setFixedHeight(BtnSetup->height());
BtnExit->setStyleSheet("QPushButton{margin-top: 2px;}");
}
--- a/QTfrontend/pagemain.h Wed Sep 14 22:27:22 2011 +0200
+++ b/QTfrontend/pagemain.h Wed Sep 14 22:39:39 2011 +0200
@@ -33,6 +33,7 @@
QPushButton *BtnSetup;
QPushButton *BtnInfo;
QPushButton *BtnExit;
+ QPushButton *BtnDataDownload;
QLabel *mainNote;
};
--- a/QTfrontend/pageoptions.cpp Wed Sep 14 22:27:22 2011 +0200
+++ b/QTfrontend/pageoptions.cpp Wed Sep 14 22:39:39 2011 +0200
@@ -295,11 +295,12 @@
CBResolution = new QComboBox(AGGroupBox);
GBAreslayout->addWidget(CBResolution);
GBAlayout->addLayout(GBAreslayout);
+ connect(CBResolution, SIGNAL(currentIndexChanged(int)), this, SLOT(setResolution(int)));
CBFullscreen = new QCheckBox(AGGroupBox);
CBFullscreen->setText(QCheckBox::tr("Fullscreen"));
GBAlayout->addWidget(CBFullscreen);
- connect(CBFullscreen, SIGNAL(stateChanged(int)), this, SLOT(setFullscreen(void)));
+ connect(CBFullscreen, SIGNAL(stateChanged(int)), this, SLOT(setFullscreen(int)));
QLabel * quality = new QLabel(AGGroupBox);
quality->setText(QLabel::tr("Quality"));
@@ -313,6 +314,8 @@
SLQuality->setFixedWidth(150);
GBAqualayout->addWidget(SLQuality);
GBAlayout->addLayout(GBAqualayout);
+ connect(SLQuality, SIGNAL(valueChanged(int)), this, SLOT(setQuality(int)));
+
QLabel * stereo = new QLabel(AGGroupBox);
stereo->setText(QLabel::tr("Stereo rendering"));
GBAstereolayout->addWidget(stereo);
@@ -402,34 +405,50 @@
BtnBack->setFixedHeight(BtnSaveOptions->height());
BtnBack->setFixedWidth(BtnBack->width()+2);
BtnBack->setStyleSheet("QPushButton{margin: 22px 0 9px 2px;}");
+
+ previousQuality = this->SLQuality->value();
+ previousResolutionIndex = this->CBResolution->currentIndex();
+ previousFullscreenValue = this->CBFullscreen->isChecked();
}
void PageOptions::forceFullscreen(int index)
{
+ bool forced = (index == 7 || index == 8 || index == 9);
+
if (index != 0) {
- previousFullscreenValue = this->CBFullscreen->isChecked();
- this->CBFullscreen->setChecked(true);
- this->CBFullscreen->setEnabled(false);
- previousQuality = this->SLQuality->value();
this->SLQuality->setValue(this->SLQuality->maximum());
this->SLQuality->setEnabled(false);
+ this->CBFullscreen->setEnabled(!forced);
+ this->CBFullscreen->setChecked(forced ? true : previousFullscreenValue);
+ this->CBResolution->setCurrentIndex(forced ? 0 : previousResolutionIndex);
} else {
- this->CBFullscreen->setChecked(previousFullscreenValue);
+ this->SLQuality->setEnabled(true);
this->CBFullscreen->setEnabled(true);
this->SLQuality->setValue(previousQuality);
- this->SLQuality->setEnabled(true);
+ this->CBFullscreen->setChecked(previousFullscreenValue);
+ this->CBResolution->setCurrentIndex(previousResolutionIndex);
}
}
-void PageOptions::setFullscreen(void)
+void PageOptions::setQuality(int value)
+{
+ int index = this->CBStereoMode->currentIndex();
+ if (index == 0)
+ previousQuality = this->SLQuality->value();
+}
+
+void PageOptions::setFullscreen(int state)
{
- int tmp = this->CBResolution->currentIndex();
- if (this->CBFullscreen->isChecked())
- this->CBResolution->setCurrentIndex(0);
- else
- this->CBResolution->setCurrentIndex(previousResolutionIndex);
- previousResolutionIndex = tmp;
- this->CBResolution->setEnabled(!this->CBFullscreen->isChecked());
+ int index = this->CBStereoMode->currentIndex();
+ if (index != 7 && index != 8 && index != 9)
+ previousFullscreenValue = this->CBFullscreen->isChecked();
+}
+
+void PageOptions::setResolution(int state)
+{
+ int index = this->CBStereoMode->currentIndex();
+ if (index != 7 && index != 8 && index != 9)
+ previousResolutionIndex = this->CBResolution->currentIndex();
}
void PageOptions::trimNetNick()
--- a/QTfrontend/pageoptions.h Wed Sep 14 22:27:22 2011 +0200
+++ b/QTfrontend/pageoptions.h Wed Sep 14 22:39:39 2011 +0200
@@ -84,7 +84,9 @@
private slots:
void forceFullscreen(int index);
- void setFullscreen(void);
+ void setFullscreen(int state);
+ void setResolution(int state);
+ void setQuality(int value);
void trimNetNick();
};
--- a/QTfrontend/pageplayrecord.cpp Wed Sep 14 22:27:22 2011 +0200
+++ b/QTfrontend/pageplayrecord.cpp Wed Sep 14 22:39:39 2011 +0200
@@ -150,3 +150,8 @@
else
FillFromDir(recType);
}
+
+bool PagePlayDemo::isSave()
+{
+ return recType == RT_Save;
+}
--- a/QTfrontend/pageplayrecord.h Wed Sep 14 22:27:22 2011 +0200
+++ b/QTfrontend/pageplayrecord.h Wed Sep 14 22:39:39 2011 +0200
@@ -39,6 +39,7 @@
PagePlayDemo(QWidget* parent = 0);
void FillFromDir(RecordType rectype);
+ bool isSave();
QPushButton *BtnBack;
QPushButton *BtnPlayDemo;
--- a/QTfrontend/pagescheme.cpp Wed Sep 14 22:27:22 2011 +0200
+++ b/QTfrontend/pagescheme.cpp Wed Sep 14 22:39:39 2011 +0200
@@ -78,7 +78,7 @@
glGMLayout->addWidget(TBW_solid,0,2,1,1);
TBW_border = new ToggleButtonWidget(gbGameModes, ":/res/btnBorder.png");
- TBW_border->setToolTip("<b>" + ToggleButtonWidget::tr("Add Border") + "</b>:<br />" + tr("Add an indestructable border around the terrain"));
+ TBW_border->setToolTip("<b>" + ToggleButtonWidget::tr("Add Border") + "</b>:<br />" + tr("Add an indestructible border around the terrain"));
glGMLayout->addWidget(TBW_border,0,3,1,1);
TBW_lowGravity = new ToggleButtonWidget(gbGameModes, ":/res/btnLowGravity.png");
@@ -161,6 +161,11 @@
TBW_tagteam->setToolTip("<b>" + ToggleButtonWidget::tr("Tag Team") + "</b>:<br />" + tr("Teams in each clan take successive turns sharing their turn time."));
glGMLayout->addWidget(TBW_tagteam,4,3,1,1);
+ TBW_bottomborder = new ToggleButtonWidget(gbGameModes, ":/res/btnBottomBorder.png");
+ TBW_bottomborder->setToolTip("<b>" + ToggleButtonWidget::tr("Add Bottom Border") + "</b>:<br />" + tr("Add an indestructible border along the bottom"));
+ glGMLayout->addWidget(TBW_bottomborder,4,4,1,1);
+
+
// Right
QLabel * l;
@@ -430,21 +435,22 @@
mapper->addMapping(TBW_nowind, 22);
mapper->addMapping(TBW_morewind, 23);
mapper->addMapping(TBW_tagteam, 24);
- mapper->addMapping(SB_DamageModifier, 25);
- mapper->addMapping(SB_TurnTime, 26);
- mapper->addMapping(SB_InitHealth, 27);
- mapper->addMapping(SB_SuddenDeath, 28);
- mapper->addMapping(SB_CaseProb, 29);
- mapper->addMapping(SB_MinesTime, 30);
- mapper->addMapping(SB_Mines, 31);
- mapper->addMapping(SB_MineDuds, 32);
- mapper->addMapping(SB_Explosives, 33);
- mapper->addMapping(SB_HealthCrates, 34);
- mapper->addMapping(SB_CrateHealth, 35);
- mapper->addMapping(SB_WaterRise, 36);
- mapper->addMapping(SB_HealthDecrease, 37);
- mapper->addMapping(SB_RopeModifier, 38);
- mapper->addMapping(SB_GetAwayTime, 39);
+ mapper->addMapping(TBW_bottomborder, 25);
+ mapper->addMapping(SB_DamageModifier, 26);
+ mapper->addMapping(SB_TurnTime, 27);
+ mapper->addMapping(SB_InitHealth, 28);
+ mapper->addMapping(SB_SuddenDeath, 29);
+ mapper->addMapping(SB_CaseProb, 30);
+ mapper->addMapping(SB_MinesTime, 31);
+ mapper->addMapping(SB_Mines, 32);
+ mapper->addMapping(SB_MineDuds, 33);
+ mapper->addMapping(SB_Explosives, 34);
+ mapper->addMapping(SB_HealthCrates, 35);
+ mapper->addMapping(SB_CrateHealth, 36);
+ mapper->addMapping(SB_WaterRise, 37);
+ mapper->addMapping(SB_HealthDecrease, 38);
+ mapper->addMapping(SB_RopeModifier, 39);
+ mapper->addMapping(SB_GetAwayTime, 40);
mapper->toFirst();
}
--- a/QTfrontend/pagescheme.h Wed Sep 14 22:27:22 2011 +0200
+++ b/QTfrontend/pagescheme.h Wed Sep 14 22:39:39 2011 +0200
@@ -71,6 +71,7 @@
ToggleButtonWidget * TBW_nowind;
ToggleButtonWidget * TBW_morewind;
ToggleButtonWidget * TBW_tagteam;
+ ToggleButtonWidget * TBW_bottomborder;
QSpinBox * SB_DamageModifier;
QSpinBox * SB_TurnTime;
Binary file QTfrontend/res/btnBottomBorder.png has changed
Binary file QTfrontend/res/btnTagTeam.png has changed
--- a/QTfrontend/teamselect.cpp Wed Sep 14 22:27:22 2011 +0200
+++ b/QTfrontend/teamselect.cpp Wed Sep 14 22:39:39 2011 +0200
@@ -44,7 +44,7 @@
this, SLOT(proxyTeamColorChanged(const HWTeam&)));
} else {
frameDontPlaying->addTeam(team, false);
- curDontPlayingTeams.push_back(team);
+ m_curNotPlayingTeams.push_back(team);
if(m_acceptOuter) {
connect(frameDontPlaying->getTeamWidget(team), SIGNAL(teamStatusChanged(HWTeam)),
this, SLOT(pre_changeTeamStatus(HWTeam)));
@@ -144,14 +144,14 @@
void TeamSelWidget::changeTeamStatus(HWTeam team)
{
- QList<HWTeam>::iterator itDontPlay=std::find(curDontPlayingTeams.begin(), curDontPlayingTeams.end(), team);
+ QList<HWTeam>::iterator itDontPlay=std::find(m_curNotPlayingTeams.begin(), m_curNotPlayingTeams.end(), team);
QList<HWTeam>::iterator itPlay=std::find(curPlayingTeams.begin(), curPlayingTeams.end(), team);
- bool willBePlaying=itDontPlay!=curDontPlayingTeams.end();
+ bool willBePlaying=itDontPlay!=m_curNotPlayingTeams.end();
if(!willBePlaying) {
// playing team => dont playing
- curDontPlayingTeams.push_back(*itPlay);
+ m_curNotPlayingTeams.push_back(*itPlay);
emit teamNotPlaying(*itPlay);
curPlayingTeams.erase(itPlay);
} else {
@@ -162,7 +162,7 @@
itDontPlay->teamColor=framePlaying->getNextColor();
curPlayingTeams.push_back(*itDontPlay);
if(!m_acceptOuter) emit teamWillPlay(*itDontPlay);
- curDontPlayingTeams.erase(itDontPlay);
+ m_curNotPlayingTeams.erase(itDontPlay);
}
FrameTeams* pRemoveTeams;
@@ -253,10 +253,10 @@
//frameDontPlaying->removeTeam(*it);
//}
frameDontPlaying->resetTeams();
- curDontPlayingTeams.clear();
+ m_curNotPlayingTeams.clear();
- QListIterator<HWTeam> it(teamslist);
- while(it.hasNext()) addTeam(it.next());
+ foreach(HWTeam team, teamslist)
+ addTeam(team);
}
bool TeamSelWidget::isPlaying(HWTeam team) const
@@ -269,9 +269,9 @@
return curPlayingTeams;
}
-QList<HWTeam> TeamSelWidget::getDontPlayingTeams() const
+QList<HWTeam> TeamSelWidget::getNotPlayingTeams() const
{
- return curDontPlayingTeams;
+ return m_curNotPlayingTeams;
}
void TeamSelWidget::pre_changeTeamStatus(HWTeam team)
--- a/QTfrontend/teamselect.h Wed Sep 14 22:27:22 2011 +0200
+++ b/QTfrontend/teamselect.h Wed Sep 14 22:39:39 2011 +0200
@@ -45,7 +45,7 @@
void resetPlayingTeams(const QList<HWTeam>& teamslist);
bool isPlaying(HWTeam team) const;
QList<HWTeam> getPlayingTeams() const;
- QList<HWTeam> getDontPlayingTeams() const;
+ QList<HWTeam> getNotPlayingTeams() const;
void setInteractivity(bool interactive);
public slots:
@@ -77,7 +77,7 @@
bool m_acceptOuter;
QList<HWTeam> curPlayingTeams;
- QList<HWTeam> curDontPlayingTeams;
+ QList<HWTeam> m_curNotPlayingTeams;
};
#endif // _TEAM_SELECT_INCLUDED
--- a/gameServer/Utils.hs Wed Sep 14 22:27:22 2011 +0200
+++ b/gameServer/Utils.hs Wed Sep 14 22:39:39 2011 +0200
@@ -103,6 +103,8 @@
, (35, "0.9.14.1")
, (37, "0.9.15")
, (38, "0.9.16-dev")
+ , (39, "0.9.16")
+ , (40, "0.9.17-dev")
]
askFromConsole :: B.ByteString -> IO B.ByteString
--- a/hedgewars/CMakeLists.txt Wed Sep 14 22:27:22 2011 +0200
+++ b/hedgewars/CMakeLists.txt Wed Sep 14 22:39:39 2011 +0200
@@ -183,6 +183,8 @@
add_custom_target(${engine_output_name} ALL DEPENDS "${EXECUTABLE_OUTPUT_PATH}/${engine_output_name}${CMAKE_EXECUTABLE_SUFFIX}")
+add_custom_target(ENGINECLEAN COMMAND ${CMAKE_BUILD_TOOL} "clean" "${PROJECT_BINARY_DIR}" "${hedgewars_SOURCE_DIR}/hedgewars")
+add_dependencies(${engine_output_name} ENGINECLEAN)
install(PROGRAMS "${EXECUTABLE_OUTPUT_PATH}/${engine_output_name}${CMAKE_EXECUTABLE_SUFFIX}" DESTINATION ${target_dir})
--- a/hedgewars/GSHandlers.inc Wed Sep 14 22:27:22 2011 +0200
+++ b/hedgewars/GSHandlers.inc Wed Sep 14 22:39:39 2011 +0200
@@ -103,6 +103,35 @@
end;
end;
+procedure HideHog(HH: PHedgehog);
+begin
+ScriptCall('onHogHide', HH^.Gear^.Uid);
+DeleteCI(HH^.Gear);
+if FollowGear = HH^.Gear then FollowGear:= nil;
+if lastGearByUID = HH^.Gear then lastGearByUID := nil;
+RemoveGearFromList(HH^.Gear);
+with HH^.Gear^ do
+ begin
+ Z := cHHZ;
+ Active := false;
+ State:= State and not (gstHHDriven or gstAttacking or gstAttacked);
+ Message := Message and not gmAttack;
+ end;
+HH^.GearHidden:= HH^.Gear;
+HH^.Gear:= nil;
+end;
+
+procedure RestoreHog(HH: PHedgehog);
+begin
+HH^.Gear:=HH^.GearHidden;
+HH^.GearHidden:= nil;
+InsertGearToList(HH^.Gear);
+HH^.Gear^.State:= (HH^.Gear^.State and not (gstHHDriven or gstInvisible or gstAttacking)) or gstAttacked;
+AddGearCI(HH^.Gear);
+HH^.Gear^.Active:= true;
+ScriptCall('onHogRestore', HH^.Gear^.Uid)
+end;
+
////////////////////////////////////////////////////////////////////////////////
procedure doStepDrowningGear(Gear: PGear);
forward;
@@ -483,18 +512,39 @@
i, gX, gY: LongInt;
dX, dY: hwFloat;
Fire: PGear;
+ smoke, glass: PVisualGear;
begin
AllInactive := false;
doStepFallingGear(Gear);
CalcRotationDirAngle(Gear);
+ // let's add some smoke depending on speed
+ i:= max(32,152 - hwRound(Distance(Gear^.dX,Gear^.dY)*120))+random(10);
+ if (GameTicks mod i) = 0 then
+ begin
+ // adjust angle to match the texture
+ if Gear^.dX.isNegative then i:= 130 else i:= 50;
+ smoke:= AddVisualGear(hwRound(Gear^.X)-round(cos((Gear^.DirAngle+i) * pi / 180)*20), hwRound(Gear^.Y)-round(sin((Gear^.DirAngle+i) * pi / 180)*20), vgtSmoke);
+ if smoke <> nil then smoke^.Scale:= 0.75;
+ end;
+
if (Gear^.State and gstCollision) <> 0 then
begin
PlaySound(sndMolotov);
gX := hwRound(Gear^.X);
gY := hwRound(Gear^.Y);
- //doMakeExplosion(hwRound(Gear^.X), hwRound(Gear^.Y), 5, EXPLAutoSound);
+ for i:= 0 to 2 do
+ begin
+ glass:= AddVisualGear(gx+random(7)-3, gy+random(5)-2, vgtEgg);
+ if glass <> nil then
+ begin
+ glass^.Frame:= 2;
+ glass^.Tint:= $41B83ED0 - i * $10081000;
+ glass^.dX:= 1/(10*(random(11)-5));
+ glass^.dY:= -1/(random(4)+5);
+ end;
+ end;
for i:= 0 to 24 do
begin
dX := AngleCos(i * 2) * ((_0_15*(i div 5))) * (GetRandom + _1);
@@ -766,8 +816,9 @@
procedure doStepBeeWork(Gear: PGear);
var
t: hwFloat;
- gX,gY: LongInt;
+ gX,gY,i: LongInt;
nuw: boolean;
+ flower: PVisualGear;
const uw: boolean = false;
begin
@@ -816,6 +867,21 @@
begin
StopSound(Gear^.SoundChannel);
doMakeExplosion(hwRound(Gear^.X), hwRound(Gear^.Y), 50, Gear^.Hedgehog, EXPLAutoSound);
+ for i:= 0 to 31 do
+ begin
+ flower:= AddVisualGear(hwRound(Gear^.X), hwRound(Gear^.Y), vgtStraightShot);
+ if flower <> nil then
+ with flower^ do
+ begin
+ Scale:= 0.75;
+ dx:= 0.001 * (random(200));
+ dy:= 0.001 * (random(200));
+ if random(2) = 0 then dx := -dx;
+ if random(2) = 0 then dy := -dy;
+ FrameTicks:= random(250) + 250;
+ State:= ord(sprTargetBee);
+ end;
+ end;
DeleteGear(Gear);
end;
end;
@@ -914,6 +980,44 @@
end;
////////////////////////////////////////////////////////////////////////////////
+procedure spawnBulletTrail(Bullet: PGear);
+var oX, oY: hwFloat;
+ VGear: PVisualGear;
+begin
+ if Bullet^.PortalCounter = 0 then
+ begin
+ ox:= CurrentHedgehog^.Gear^.X + Int2hwFloat(GetLaunchX(CurrentHedgehog^.CurAmmoType, hwSign(CurrentHedgehog^.Gear^.dX), CurrentHedgehog^.Gear^.Angle));
+ oy:= CurrentHedgehog^.Gear^.Y + Int2hwFloat(GetLaunchY(CurrentHedgehog^.CurAmmoType, CurrentHedgehog^.Gear^.Angle));
+ end
+ else
+ begin
+ ox:= Bullet^.Elasticity;
+ oy:= Bullet^.Friction;
+ end;
+
+ // Bullet trail
+ VGear := AddVisualGear(hwRound(ox), hwRound(oy), vgtLineTrail);
+ if VGear <> nil then
+ begin
+ VGear^.X:= hwFloat2Float(ox);
+ VGear^.Y:= hwFloat2Float(oy);
+ VGear^.dX:= hwFloat2Float(Bullet^.X);
+ VGear^.dY:= hwFloat2Float(Bullet^.Y);
+
+ // reached edge of land. assume infinite beam. Extend it way out past camera
+ if (hwRound(Bullet^.X) and LAND_WIDTH_MASK <> 0)
+ or (hwRound(Bullet^.Y) and LAND_HEIGHT_MASK <> 0) then
+ // only extend if not under water
+ if hwRound(Bullet^.Y) < cWaterLine then
+ begin
+ VGear^.dX := VGear^.dX + LAND_WIDTH * (VGear^.dX - VGear^.X);
+ VGear^.dY := VGear^.dY + LAND_WIDTH * (VGear^.dY - VGear^.Y);
+ end;
+
+ VGear^.Timer := 200;
+ end;
+end;
+
procedure doStepBulletWork(Gear: PGear);
var
i, x, y: LongWord;
@@ -932,6 +1036,19 @@
y := hwRound(Gear^.Y);
if ((y and LAND_HEIGHT_MASK) = 0) and ((x and LAND_WIDTH_MASK) = 0)
and (Land[y, x] <> 0) then inc(Gear^.Damage);
+ // let's interrupt before a collision to give portals a chance to catch the bullet
+ if (Gear^.Damage = 1) and (Gear^.Tag = 0) and (Land[y, x] > 255) then
+ begin
+ Gear^.Tag := 1;
+ Gear^.Damage := 0;
+ Gear^.X := Gear^.X - Gear^.dX;
+ Gear^.Y := Gear^.Y - Gear^.dY;
+ CheckGearDrowning(Gear);
+ break;
+ end
+ else
+ Gear^.Tag := 0;
+
if Gear^.Damage > 5 then
if Gear^.AmmoType = amDEagle then
AmmoShove(Gear, 7, 20)
@@ -977,31 +1094,7 @@
end;
end;
- if Gear^.PortalCounter = 0 then
- begin
- // Bullet trail
- VGear := AddVisualGear(
- hwround(CurrentHedgehog^.Gear^.X) + GetLaunchX(CurrentHedgehog^.CurAmmoType, hwSign(CurrentHedgehog^.Gear^.dX), CurrentHedgehog^.Gear^.Angle),
- hwround(CurrentHedgehog^.Gear^.Y) + GetLaunchY(CurrentHedgehog^.CurAmmoType, CurrentHedgehog^.Gear^.Angle),
- vgtLineTrail
- );
- if VGear <> nil then
- begin
- // http://mantis.freepascal.org/view.php?id=17714 hits again
- VGear^.dX := Gear^.X.QWordValue / SignAs(_1,_1).QWordValue;
- VGear^.dY := Gear^.Y.QWordValue / SignAs(_1,_1).QWordValue;
-
- // reached edge of land. assume infinite beam. Extend it way out past camera
- if (hwRound(Gear^.X) and LAND_WIDTH_MASK <> 0)
- or (hwRound(Gear^.Y) and LAND_HEIGHT_MASK <> 0) then
- begin
- VGear^.dX := VGear^.dX + (CurrentHedgehog^.Gear^.dX * LAND_WIDTH).QWordValue / SignAs(_1,_1).QWordValue;
- VGear^.dY := VGear^.dY + (CurrentHedgehog^.Gear^.dY * LAND_WIDTH).QWordValue / SignAs(_1,_1).QWordValue;
- end;
-
- VGear^.Timer := 200;
- end
- end;
+ spawnBulletTrail(Gear);
Gear^.doStep := @doStepShotIdle
end;
end;
@@ -1110,7 +1203,8 @@
AllInactive := false;
HHGear := Gear^.Hedgehog^.Gear;
dec(Gear^.Timer);
- if (Gear^.Timer = 0)or((Gear^.Message and gmDestroy) <> 0)or((HHGear^.State and gstHHDriven) =
+ if ((GameFlags and gfInfAttack) <> 0) and (TurnTimeLeft > 0) then dec(TurnTimeLeft);
+ if (TurnTimeLeft = 0) or (Gear^.Timer = 0)or((Gear^.Message and gmDestroy) <> 0)or((HHGear^.State and gstHHDriven) =
0) then
begin
StopSound(Gear^.SoundChannel);
@@ -1219,6 +1313,8 @@
begin
AllInactive := false;
dec(Gear^.Timer);
+ if ((GameFlags and gfInfAttack) <> 0) and (TurnTimeLeft > 0) then dec(TurnTimeLeft);
+
HHGear := Gear^.Hedgehog^.Gear;
HedgehogChAngle(HHGear);
@@ -1226,21 +1322,21 @@
b := false;
if abs(LongInt(HHGear^.Angle) - BTPrevAngle) > 7 then
- begin
- Gear^.dX := SignAs(AngleSin(HHGear^.Angle) * _0_5, HHGear^.dX);
+ begin
+ Gear^.dX := SignAs(AngleSin(HHGear^.Angle) * _0_5, Gear^.dX);
Gear^.dY := AngleCos(HHGear^.Angle) * ( - _0_5);
BTPrevAngle := HHGear^.Angle;
b := true
- end;
+ end;
if ((HHGear^.State and gstMoving) <> 0) then
- begin
+ begin
doStepHedgehogMoving(HHGear);
if (HHGear^.State and gstHHDriven) = 0 then Gear^.Timer := 0
- end;
+ end;
if Gear^.Timer mod cHHStepTicks = 0 then
- begin
+ begin
b := true;
if Gear^.dX.isNegative then
HHGear^.Message := (HHGear^.Message and (gmAttack or gmUp or gmDown)) or gmLeft
@@ -1248,7 +1344,7 @@
HHGear^.Message := (HHGear^.Message and (gmAttack or gmUp or gmDown)) or gmRight;
if ((HHGear^.State and gstMoving) = 0) then
- begin
+ begin
HHGear^.State := HHGear^.State and not gstAttacking;
prevX := hwRound(HHGear^.X);
@@ -1261,24 +1357,24 @@
CheckLandValue(hwRound(HHGear^.X + SignAs(_6, HHGear^.dX)), hwRound(HHGear^.Y),
lfIndestructible) then HHGear^.X := HHGear^.X + SignAs(_1, HHGear^.dX);
HHGear^.State := HHGear^.State or gstAttacking
- end;
+ end;
inc(BTSteps);
if BTSteps = 7 then
- begin
+ begin
BTSteps := 0;
if CheckLandValue(hwRound(HHGear^.X + Gear^.dX * (cHHRadius + cBlowTorchC) + SignAs(_6,
Gear^.dX)), hwRound(HHGear^.Y + Gear^.dY * (cHHRadius + cBlowTorchC)),
lfIndestructible) then
- begin
+ begin
Gear^.X := HHGear^.X + Gear^.dX * (cHHRadius + cBlowTorchC);
Gear^.Y := HHGear^.Y + Gear^.dY * (cHHRadius + cBlowTorchC);
- end;
+ end;
HHGear^.State := HHGear^.State or gstNoDamage;
AmmoShove(Gear, 2, 15);
HHGear^.State := HHGear^.State and not gstNoDamage
+ end;
end;
- end;
if b then
DrawTunnel(HHGear^.X - Gear^.dX * cHHRadius, HHGear^.Y - _4 - Gear^.dY * cHHRadius + hwAbs(
@@ -1286,13 +1382,13 @@
Gear^.dX, Gear^.dY,
cHHRadius * 5, cHHRadius * 2 + 7);
- if (Gear^.Timer = 0) or ((HHGear^.Message and gmAttack) <> 0) then
- begin
+ if (TurnTimeLeft = 0) or (Gear^.Timer = 0) or ((HHGear^.Message and gmAttack) <> 0) then
+ begin
HHGear^.Message := 0;
HHGear^.State := HHGear^.State and (not gstNotKickable);
DeleteGear(Gear);
AfterAttack
- end
+ end
end;
procedure doStepBlowTorch(Gear: PGear);
@@ -1357,7 +1453,7 @@
var
HHGear: PGear;
len, tx, ty, nx, ny, ropeDx, ropeDy, mdX, mdY: hwFloat;
- lx, ly: LongInt;
+ lx, ly, cd: LongInt;
haveCollision,
haveDivided: boolean;
@@ -1398,16 +1494,30 @@
else
if (Gear^.Message and gmRight <> 0) then HHGear^.dX := HHGear^.dX + _0_0002;
- if not TestCollisionYwithGear(HHGear, 1) then
- begin
- HHGear^.dY := HHGear^.dY + cGravity;
- if (GameFlags and gfMoreWind) <> 0 then HHGear^.dX := HHGear^.dX + cWindSpeed / HHGear^.Density;
- end;
-
// vector between hedgehog and rope attaching point
ropeDx := HHGear^.X - Gear^.X;
ropeDy := HHGear^.Y - Gear^.Y;
+ if not TestCollisionYwithGear(HHGear, 1) then
+ begin
+
+ // depending on the rope vector we know which X-side to check for collision
+ // in order to find out if the hog can still be moved by gravity
+ if ropeDx.isNegative = RopeDy.IsNegative then
+ cd:= -1
+ else
+ cd:= 1;
+
+ // apply gravity if there is no obstacle
+ if not TestCollisionXwithGear(HHGear, cd) then
+ HHGear^.dY := HHGear^.dY + cGravity;
+
+ if (GameFlags and gfMoreWind) <> 0 then
+ // apply wind if there's no obstacle
+ if not TestCollisionXwithGear(HHGear, hwSign(cWindSpeed)) then
+ HHGear^.dX := HHGear^.dX + cWindSpeed / HHGear^.Density;
+ end;
+
mdX := ropeDx + HHGear^.dX;
mdY := ropeDy + HHGear^.dY;
len := _1 / Distance(mdX, mdY);
@@ -2603,7 +2713,7 @@
repeat
CurrentTeam^.CurrHedgehog := Succ(CurrentTeam^.CurrHedgehog) mod (CurrentTeam^.
HedgehogsNumber);
- until (CurrentTeam^.Hedgehogs[CurrentTeam^.CurrHedgehog].Gear <> nil);
+ until (CurrentTeam^.Hedgehogs[CurrentTeam^.CurrHedgehog].Gear <> nil) and (CurrentTeam^.Hedgehogs[CurrentTeam^.CurrHedgehog].Gear^.Damage = 0);
CurrentHedgehog := @CurrentTeam^.Hedgehogs[CurrentTeam^.CurrHedgehog];
@@ -2674,6 +2784,7 @@
var
i: LongWord;
HHGear: PGear;
+ sparkles: PVisualGear;
begin
AllInactive := false;
@@ -2683,9 +2794,15 @@
Gear^.X := HHGear^.X;
Gear^.Y := HHGear^.Y;
+ if (GameTicks mod 2 = 0) and ((Gear^.Message and (gmPrecise or gmSwitch)) = (gmPrecise or gmSwitch)) then
+ begin
+ sparkles:= AddVisualGear(hwRound(Gear^.X), hwRound(Gear^.Y), vgtDust, 1);
+ if sparkles <> nil then sparkles^.Tint:= ((random(210)+45) shl 24) or ((random(210)+45) shl 16) or ((random(210)+45) shl 8) or $FF;
+ end;
i := 2;
repeat
+
Gear^.X := Gear^.X + HHGear^.dX;
Gear^.Y := Gear^.Y + HHGear^.dY;
HHGear^.X := Gear^.X;
@@ -2884,7 +3001,7 @@
dec(Gear^.Health);
Gear^.Timer := Gear^.Health*10;
- Gear^.PortalCounter:= 0;
+ if Gear^.Health mod 100 = 0 then Gear^.PortalCounter:= 0;
// This is not seconds, but at least it is *some* feedback
if (Gear^.Health = 0) or ((Gear^.Message and gmAttack) <> 0) then
begin
@@ -2949,10 +3066,8 @@
////////////////////////////////////////////////////////////////////////////////
procedure doStepSeductionWork(Gear: PGear);
-var
- x, y, i: LongInt;
+var i: LongInt;
hogs: TPGearArray;
- d: hwFloat;
begin
AllInactive := false;
hogs := GearsNear(Gear^.X, Gear^.Y, gtHedgehog, Gear^.Radius);
@@ -3021,7 +3136,7 @@
if random(2) = 0 then dx := -dx;
if random(2) = 0 then dy := -dy;
FrameTicks:= random(750) + 1000;
- heart^.State:= ord(sprSeduction)
+ State:= ord(sprSeduction)
end;
end;
@@ -3678,10 +3793,10 @@
AllInactive := false;
FollowGear := HHGear;
with HHGear^ do
- begin
+ begin
State := State and not gstAttacking;
Message := Message and not (gmAttack or gmUp or gmPrecise or gmLeft or gmRight)
- end
+ end
end;
////////////////////////////////////////////////////////////////////////////////
@@ -3866,12 +3981,20 @@
continue;
end;
+ // draw bullet trail
+ if isbullet then
+ spawnBulletTrail(iterator);
+
// calc gear offset in portal vector direction
ox := (iterator^.X - Gear^.X);
oy := (iterator^.Y - Gear^.Y);
poffs:= (Gear^.dX * ox + Gear^.dY * oy);
- if poffs < _0 then
+ if not isBullet and poffs.isNegative then
+ continue;
+
+ // only port bullets close to the portal
+ if isBullet and not (hwAbs(poffs) < _3) then
continue;
//
@@ -3899,8 +4022,11 @@
// calc gear offset in portal normal vector direction
noffs:= (nx * ox + ny * oy);
+ if isBullet and (hwRound(hwAbs(noffs)) >= Gear^.Radius) then
+ continue;
+
// avoid gravity related loops of not really moving gear
- if not iscake and (Gear^.dY.isNegative) and (conPortal^.dY.isNegative)
+ if not (iscake or isbullet) and (Gear^.dY.isNegative) and (conPortal^.dY.isNegative)
and ((iterator^.dX.QWordValue + iterator^.dY.QWordValue) < _0_08.QWordValue)
and (iterator^.PortalCounter > 0) then
continue;
@@ -3927,8 +4053,7 @@
// inverse cake's normal movement direction,
// as if it just walked through a hole
- if iscake then
- nspeed.isNegative:= not nspeed.isNegative;
+ //if iscake then nspeed.isNegative:= not nspeed.isNegative;
//AddFileLog('poffs:'+cstr(poffs)+' noffs:'+cstr(noffs)+' pspeed:'+cstr(pspeed)+' nspeed:'+cstr(nspeed));
iterator^.dX := -pspeed * conPortal^.dX + nspeed * nx;
@@ -3979,8 +4104,8 @@
iterator^.Radius := iterator^.Radius - 1;
// check front
- isCollision := TestCollisionYwithGear(iterator, sy)
- or TestCollisionXwithGear(iterator, sx);
+ isCollision := TestCollisionY(iterator, sy)
+ or TestCollisionX(iterator, sx);
if not isCollision then
begin
@@ -3988,8 +4113,8 @@
// the square check won't check more pixels than we want to)
iterator^.Radius := 1 + resetr div 2;
rh := resetr div 4;
- isCollision := TestCollisionYwithXYShift(iterator, 0, -sy * rh, sy)
- or TestCollisionXwithXYShift(iterator, ox * rh, 0, sx);
+ isCollision := TestCollisionYwithXYShift(iterator, 0, -sy * rh, sy, false)
+ or TestCollisionXwithXYShift(iterator, ox * rh, 0, sx, false);
end;
iterator^.Radius := resetr;
@@ -4010,11 +4135,19 @@
//
// Until loops are reliably broken
- inc(iterator^.PortalCounter);
+ if iscake then iterator^.PortalCounter:= 33
+ else inc(iterator^.PortalCounter);
if not isbullet and (iterator^.Kind <> gtFlake) then
FollowGear := iterator;
+ // store X/Y values of exit for net bullet trail
+ if isbullet then
+ begin
+ iterator^.Elasticity:= iterator^.X;
+ iterator^.Friction := iterator^.Y;
+ end;
+
// This jiggles gears, to ensure a portal connection just placed under a gear takes effect.
iterator:= GearsList;
while iterator <> nil do
@@ -4076,7 +4209,7 @@
begin
Gear^.State := Gear^.State or gstCollision;
Gear^.State := Gear^.State and not gstMoving;
- if not calcSlopeTangent(Gear, x, y, tx, ty, 255)
+ if not CalcSlopeTangent(Gear, x, y, tx, ty, 255)
or (DistanceI(tx,ty) < _12) then // reject shots at too irregular terrain
begin
loadNewPortalBall(Gear, true);
@@ -4902,47 +5035,137 @@
end;
////////////////////////////////////////////////////////////////////////////////
-procedure doStepTardis(Gear: PGear);
-(*var
- i, x, y: LongInt;
- dX, dY: hwFloat;
- Fire: PGear;
- vg: PVisualGear;*)
+(*
+ TARDIS needs
+ Warp in. Pos = 1
+ Pause. Pos = 2
+ Hide gear (TARDIS hedgehog was nil)
+ Warp out. Pos = 3
+ ... idle active for some time period ... Pos = 4
+ Warp in. Pos = 1
+ Pause. Pos = 2
+ Restore gear (TARDIS hedgehog was not nil)
+ Warp out. Pos = 3
+*)
+
+procedure doStepTardisWarp(Gear: PGear);
+var HH: PHedgehog;
+ i,j,cnt: LongWord;
begin
- if (Gear^.State and gstTmpFlag) = 0 then dec(Gear^.Timer);
- if (Gear^.Timer = 0) and (CurAmmoGear = Gear) then
+
+HH:= Gear^.Hedgehog;
+if Gear^.Pos = 2 then
+ begin
+ StopSound(Gear^.SoundChannel);
+ if (Gear^.Timer = 0) then
begin
- if (CurrentHedgehog = nil) or (CurrentHedgehog^.Gear = nil) then
+ if (HH^.Gear <> nil) and (HH^.Gear^.State and gstInvisible = 0) then
begin
- DeleteGear(Gear);
- exit
- end;
- if Gear = CurAmmoGear then CurAmmoGear := nil;
- Gear^.Hedgehog:= CurrentHedgehog;
- RemoveGearFromList(CurrentHedgehog^.Gear);
- CurrentHedgehog^.Gear^.Z := cHHZ;
- CurrentHedgehog^.Gear^.Active := false;
- CurrentHedgehog^.Gear^.State:= CurrentHedgehog^.Gear^.State and not gstHHDriven;
- CurrentHedgehog^.GearHidden:= CurrentHedgehog^.Gear;
- CurrentHedgehog^.Gear:= nil;
- Gear^.State:= Gear^.State or gstTmpFlag;
- Gear^.Timer:= GameTicks + GetRandom(cHedgehogTurnTime*TeamsCount)+cHedgehogTurnTime;
+ AfterAttack;
+ if Gear = CurAmmoGear then CurAmmoGear := nil;
+ HideHog(HH)
+ end
+ //else if (HH^.Gear <> nil) and (HH^.Gear^.State and gstInvisible <> 0) then
+ else if (HH^.GearHidden <> nil) then// and (HH^.Gear^.State and gstInvisible <> 0) then
+ RestoreHog(HH)
+ end;
+
+ inc(Gear^.Timer);
+ if (Gear^.Timer > 2000) and ((GameTicks mod 2000) = 1000) then
+ begin
+ Gear^.SoundChannel := LoopSound(sndTardis);
+ Gear^.Pos:= 3
end
- else if (((Gear^.State and gstTmpFlag) <> 0) and (Gear^.Timer = GameTicks)) or SuddenDeath then
+ end;
+
+if (Gear^.Pos = 1) and (GameTicks and $1F = 0) and (Gear^.Power < 255) then inc(Gear^.Power);
+if (Gear^.Pos = 3) and (GameTicks and $1F = 0) and (Gear^.Power > 0) then dec(Gear^.Power);
+if (Gear^.Pos = 1) and (Gear^.Power = 255) and ((GameTicks mod 2000) = 1000) then Gear^.Pos:= 2;
+if (Gear^.Pos = 3) and (Gear^.Power = 0) then
+ begin
+ StopSound(Gear^.SoundChannel);
+ if HH^.GearHidden = nil then
begin
- if Gear^.Hedgehog <> nil then
+ DeleteGear(Gear);
+ exit
+ end;
+ Gear^.Pos:= 4;
+ // This condition might need tweaking
+ Gear^.Timer:= GetRandom(cHedgehogTurnTime*TeamsCount)+cHedgehogTurnTime
+ end;
+
+if (Gear^.Pos = 4) then
+ begin
+ cnt:= 0;
+ for j:= 0 to Pred(HH^.Team^.Clan^.TeamsNumber) do
+ for i:= 0 to Pred(HH^.Team^.Clan^.Teams[j]^.HedgehogsNumber) do
+ if (HH^.Team^.Clan^.Teams[j]^.Hedgehogs[i].Gear <> nil) and
+ ((HH^.Team^.Clan^.Teams[j]^.Hedgehogs[i].Gear^.State and gstDrowning) = 0) and
+ (HH^.Team^.Clan^.Teams[j]^.Hedgehogs[i].Gear^.Health >
+ HH^.Team^.Clan^.Teams[j]^.Hedgehogs[i].Gear^.Damage) then inc(cnt);
+ if (cnt = 0) or SuddenDeathDmg or (Gear^.Timer = 0) then
+ begin
+ Gear^.SoundChannel := LoopSound(sndTardis);
+ Gear^.Pos:= 1;
+ Gear^.Power:= 0;
+ Gear^.Timer:= 0;
+ if HH^.GearHidden <> nil then FindPlace(HH^.GearHidden, false, 0, LAND_WIDTH,true);
+ if HH^.GearHidden <> nil then
begin
- Gear^.Hedgehog^.Gear:= Gear^.Hedgehog^.GearHidden;
- Gear^.Hedgehog^.GearHidden:= nil;
- FindPlace(Gear^.Hedgehog^.Gear, false, 0, LAND_WIDTH,true);
- InsertGearToList(Gear^.Hedgehog^.Gear);
- Gear^.Hedgehog^.Gear^.State:= (Gear^.Hedgehog^.Gear^.State or gstTmpFlag or gstAttacked) and not gstHHDriven;
- Gear^.Hedgehog^.Gear^.Timer:= $FF;
- Gear^.Hedgehog^.Gear^.doStep:= @doStepHedgehogReturn;
- SetAllHHToActive;
- end;
- DeleteGear(Gear)
+ Gear^.X:= HH^.GearHidden^.X;
+ Gear^.Y:= HH^.GearHidden^.Y;
+ //HH^.Gear:=HH^.GearHidden;
+ //HH^.GearHidden:= nil;
+ //HH^.Gear^.State:= HH^.Gear^.State or gstInvisible;
+ end
end
+ else dec(Gear^.Timer);
+ end;
+
+end;
+
+procedure doStepTardis(Gear: PGear);
+var i,j,cnt: LongWord;
+ HH: PHedgehog;
+begin
+(*
+ Conditions for not activating.
+ 1. Hog is last of his clan
+ 2. Sudden Death is in play
+ 3. Hog is a king
+*)
+ HH:= Gear^.Hedgehog;
+ if (HH^.Gear = nil) or (HH^.King) or (SuddenDeathDmg) then
+ begin
+ if HH^.Gear <> nil then
+ begin
+ HH^.Gear^.Message := HH^.Gear^.Message and not gmAttack;
+ HH^.Gear^.State:= HH^.Gear^.State and not gstAttacking;
+ end;
+ PlaySound(sndDenied);
+ DeleteGear(gear);
+ exit
+ end;
+ cnt:= 0;
+ for j:= 0 to Pred(HH^.Team^.Clan^.TeamsNumber) do
+ for i:= 0 to Pred(HH^.Team^.Clan^.Teams[j]^.HedgehogsNumber) do
+ if (HH^.Team^.Clan^.Teams[j]^.Hedgehogs[i].Gear <> nil) and
+ ((HH^.Team^.Clan^.Teams[j]^.Hedgehogs[i].Gear^.State and gstDrowning) = 0) and
+ (HH^.Team^.Clan^.Teams[j]^.Hedgehogs[i].Gear^.Health >
+ HH^.Team^.Clan^.Teams[j]^.Hedgehogs[i].Gear^.Damage) then inc(cnt);
+ if cnt < 2 then
+ begin
+ if HH^.Gear <> nil then
+ begin
+ HH^.Gear^.Message := HH^.Gear^.Message and not gmAttack;
+ HH^.Gear^.State:= HH^.Gear^.State and not gstAttacking;
+ end;
+ PlaySound(sndDenied);
+ DeleteGear(gear);
+ exit
+ end;
+ Gear^.SoundChannel := LoopSound(sndTardis);
+ Gear^.doStep:= @doStepTardisWarp
end;
////////////////////////////////////////////////////////////////////////////////
--- a/hedgewars/HHHandlers.inc Wed Sep 14 22:27:22 2011 +0200
+++ b/hedgewars/HHHandlers.inc Wed Sep 14 22:39:39 2011 +0200
@@ -53,7 +53,6 @@
HHGear^.Message:= HHGear^.Message and not gmSlot;
ammoidx:= 0;
if ((HHGear^.State and (gstAttacking or gstAttacked)) <> 0) or
- (TargetPoint.X <> NoPointX) or
((MultiShootAttacks > 0) and ((Ammoz[CurAmmoType].Ammo.Propz and ammoprop_NoRoundEnd) = 0)) or
((HHGear^.State and gstHHDriven) = 0) then exit;
ChangeAmmo:= true;
@@ -423,7 +422,8 @@
end
end else Message:= Message and not gmAttack;
end;
- TargetPoint.X := NoPointX
+ TargetPoint.X := NoPointX;
+ ScriptCall('onHogAttack');
end;
procedure AfterAttack;
@@ -774,6 +774,11 @@
begin
if (Gear^.dY.isNegative) and TestCollisionYKick(Gear, -1) then Gear^.dY:= _0;
Gear^.State:= Gear^.State or gstMoving;
+ if (CurrentHedgehog^.Gear = Gear)
+ and (hwSqr(Gear^.dX) + hwSqr(Gear^.dY) > _0_003) then
+ begin
+ FollowGear:= Gear;
+ end;
if isUnderwater then Gear^.dY:= Gear^.dY + cGravity / _2
else
begin
@@ -1033,7 +1038,7 @@
PrvInactive:= false;
AllInactive:= false;
- if not Gear^.Hedgehog^.Team^.hasGone then
+ if (Gear^.State and gstHHGone) = 0 then
begin
Gear^.Hedgehog^.Effects[hePoisoned] := false;
if Gear^.Hedgehog^.Effects[heResurrectable] then begin
@@ -1047,8 +1052,8 @@
end
else
begin
- Gear^.State:= Gear^.State or gstHHGone;
Gear^.doStep:= @doStepHedgehogGone;
+
// Gone message
AddCaption(Format(GetEventString(eidGone), Gear^.Hedgehog^.Name), cWhiteColor, capgrpMessage);
end
@@ -1089,17 +1094,9 @@
else
begin
with Gear^.Hedgehog^ do
- if Team^.hasGone then TeamGoneEffect(Team^);
- doStepHedgehogDriven(Gear)
+ if Team^.hasGone then
+ TeamGoneEffect(Team^)
+ else
+ doStepHedgehogDriven(Gear)
end;
end;
-
-procedure doStepHedgehogReturn(Gear: PGear);
-begin
-if (Gear^.Timer > 0) and ((GameTicks mod 20) = 0) then dec(Gear^.Timer)
-else if (Gear^.Timer = 0) then
- begin
- Gear^.doStep:= @doStepHedgehog;
- Gear^.State:= Gear^.State and not gstTmpFlag;
- end
-end;
--- a/hedgewars/SDLh.pas Wed Sep 14 22:27:22 2011 +0200
+++ b/hedgewars/SDLh.pas Wed Sep 14 22:39:39 2011 +0200
@@ -278,6 +278,11 @@
IMG_INIT_PNG = $00000002;
IMG_INIT_TIF = $00000004;
+ {* SDL_EventMask type definition *}
+{$IFNDEF SDL13}
+ SDL_ALLEVENTS = $FFFFFFFF;
+{$ENDIF}
+
/////////////////////////////////////////////////////////////////
/////////////////////// TYPE DEFINITIONS ///////////////////////
/////////////////////////////////////////////////////////////////
@@ -347,6 +352,7 @@
{$ENDIF}
end;
+ SDL_eventaction = (SDL_ADDEVENT = 0, SDL_PEEPEVENT, SDL_GETEVENT);
PSDL_Surface = ^TSDL_Surface;
TSDL_Surface = record
@@ -612,6 +618,8 @@
{$ENDIF}
end;
+ TSDL_EventFilter = function( event : PSDL_Event ): Integer; cdecl;
+
PByteArray = ^TByteArray;
TByteArray = array[0..65535] of Byte;
PLongWordArray = ^TLongWordArray;
@@ -793,6 +801,10 @@
procedure SDL_WarpMouseInWindow(window: PSDL_Window; x, y: LongInt); cdecl; external SDLLibName;
function SDL_SetHint(name, value: PChar): boolean; cdecl; external SDLLibName;
+
+function SDL_PeepEvents(event: PSDL_Event; numevents: LongInt; action: SDL_eventaction; minType, maxType: LongInt): LongInt; cdecl; external SDLLibName;
+{$ELSE}
+function SDL_PeepEvents(event: PSDL_Event; numevents: LongInt; action: SDL_eventaction; mask: LongInt): LongInt; cdecl; external SDLLibName;
{$ENDIF}
function SDL_GetMouseState(x, y: PLongInt): Byte; cdecl; external SDLLibName;
@@ -801,6 +813,7 @@
procedure SDL_PumpEvents; cdecl; external SDLLibName;
function SDL_PollEvent(event: PSDL_Event): LongInt; cdecl; external SDLLibName;
function SDL_WaitEvent(event: PSDL_Event): LongInt; cdecl; external SDLLibName;
+procedure SDL_SetEventFilter( filter : TSDL_EventFilter ); cdecl; external SDLLibName;
function SDL_ShowCursor(toggle: LongInt): LongInt; cdecl; external SDLLibName;
--- a/hedgewars/VGSHandlers.inc Wed Sep 14 22:27:22 2011 +0200
+++ b/hedgewars/VGSHandlers.inc Wed Sep 14 22:39:39 2011 +0200
@@ -174,7 +174,10 @@
if Gear^.FrameTicks <= Steps then
DeleteVisualGear(Gear)
else
- dec(Gear^.FrameTicks, Steps)
+ dec(Gear^.FrameTicks, Steps);
+
+if Gear^.FrameTicks < $FF then
+ Gear^.Tint:= (Gear^.Tint and $FFFFFF00) or Gear^.FrameTicks
end;
////////////////////////////////////////////////////////////////////////////////
@@ -587,22 +590,16 @@
////////////////////////////////////////////////////////////////////////////////
procedure doStepBigExplosionWork(Gear: PVisualGear; Steps: Longword);
-//var maxMovement: LongInt;
+var maxMovement: LongInt;
begin
inc(Gear^.Timer, Steps);
-(*
-FIXME - This block desyncs due to the way WorldDx is important for various things network related.
-One possible solution is, instead of using WorldDx, to use straight gl/SDL calls to jitter the screen a bit.
-
-// a comment by unC0Rr: instead of changing WorldDx shake cursor coordinates, that should be safe
-
if (Gear^.Timer and 5) = 0 then
begin
maxMovement := max(1, 13 - ((Gear^.Timer * 15) div 250));
ShakeCamera(maxMovement);
end;
-*)
+
if Gear^.Timer > 250 then DeleteVisualGear(Gear);
end;
@@ -611,6 +608,9 @@
gX,gY: LongInt;
vg: PVisualGear;
begin
+//ScreenFade:= sfFromWhite;
+//ScreenFadeValue:= round(60 * zoom * zoom);
+//ScreenFadeSpeed:= 5;
gX:= round(Gear^.X);
gY:= round(Gear^.Y);
AddVisualGear(gX, gY, vgtSmokeRing);
--- a/hedgewars/hwengine.pas Wed Sep 14 22:27:22 2011 +0200
+++ b/hedgewars/hwengine.pas Wed Sep 14 22:39:39 2011 +0200
@@ -149,8 +149,12 @@
PrevTime:= SDL_GetTicks;
while isTerminated = false do
begin
-
- while SDL_PollEvent(@event) <> 0 do
+ SDL_PumpEvents();
+ {$IFDEF SDL13}
+ while SDL_PeepEvents(@event, 1, SDL_GETEVENT, SDL_FIRSTEVENT, SDL_LASTEVENT) > 0 do
+ {$ELSE}
+ while SDL_PeepEvents(@event, 1, SDL_GETEVENT, SDL_ALLEVENTS) > 0 do
+ {$ENDIF}
begin
case event.type_ of
SDL_KEYDOWN: if GameState = gsChat then
@@ -176,14 +180,13 @@
onFocusStateChanged()
end;
SDL_VIDEORESIZE: begin
- // using lower values causes widget overlap and video issues
- if event.resize.w > cMinScreenWidth then cScreenWidth:= event.resize.w
- else cScreenWidth:= cMinScreenWidth;
- if event.resize.h > cMinScreenHeight then cScreenHeight:= event.resize.h
- else cScreenHeight:= cMinScreenHeight;
- ParseCommand('fullscr '+intToStr(LongInt(cFullScreen)), true);
- WriteLnToConsole('window resize');
- InitCameraBorders();
+ // using lower values than cMinScreenWidth or cMinScreenHeight causes widget overlap and off-screen widget parts
+ // Change by sheepluva:
+ // Let's only use even numbers for custom width/height since I ran into scaling issues with odd width values.
+ // Maybe just fixes the symptom not the actual cause(?), I'm too tired to find out :P
+ cNewScreenWidth:= max(2 * (event.resize.w div 2), cMinScreenWidth);
+ cNewScreenHeight:= max(2 * (event.resize.h div 2), cMinScreenHeight);
+ cScreenResizeDelay:= RealTicks+500;
end;
{$ENDIF}
SDL_JOYAXISMOTION: ControllerAxisEvent(event.jaxis.which, event.jaxis.axis, event.jaxis.value);
@@ -193,6 +196,17 @@
SDL_QUITEV: isTerminated:= true
end; //end case event.type_ of
end; //end while SDL_PollEvent(@event) <> 0 do
+ if (cScreenResizeDelay <> 0) and (cScreenResizeDelay < RealTicks) and ((cNewScreenWidth <> cScreenWidth) or (cNewScreenHeight <> cScreenHeight)) then
+ begin
+ cScreenResizeDelay:= 0;
+ cScreenWidth:= cNewScreenWidth;
+ cScreenHeight:= cNewScreenHeight;
+
+ ParseCommand('fullscr '+intToStr(LongInt(cFullScreen)), true);
+ WriteLnToConsole('window resize: ' + IntToStr(cScreenWidth) + ' x ' + IntToStr(cScreenHeight));
+ ScriptOnScreenResize();
+ InitCameraBorders()
+ end;
if isTerminated = false then
begin
@@ -240,12 +254,10 @@
recordFileName:= gameArgs[10];
cStereoMode:= smNone;
{$ENDIF}
- cMinScreenWidth:= cScreenWidth;
- cMinScreenHeight:= cScreenHeight;
+ cMinScreenWidth:= min(cScreenWidth, cMinScreenWidth);
+ cMinScreenHeight:= min(cScreenHeight, cMinScreenHeight);
cOrigScreenWidth:= cScreenWidth;
cOrigScreenHeight:= cScreenHeight;
- if 480 < cMinScreenWidth then cMinScreenWidth:= 480;
- if 320 < cMinScreenHeight then cMinScreenHeight:= 320;
initEverything(true);
--- a/hedgewars/uAIMisc.pas Wed Sep 14 22:27:22 2011 +0200
+++ b/hedgewars/uAIMisc.pas Wed Sep 14 22:39:39 2011 +0200
@@ -112,7 +112,7 @@
end;
if e > f then friendlyfactor:= 300 + (e - f) * 30
-else friendlyfactor:= max(30, 300 - f * 80 div e)
+else friendlyfactor:= max(30, 300 - f * 80 div max(1,e))
end;
procedure FillBonuses(isAfterAttack: boolean; filter: TGearsType);
--- a/hedgewars/uAmmos.pas Wed Sep 14 22:27:22 2011 +0200
+++ b/hedgewars/uAmmos.pas Wed Sep 14 22:39:39 2011 +0200
@@ -215,7 +215,7 @@
FillAmmoStore(hhammo, ammos);
CurWeapon:= GetAmmoEntry(Hedgehog);
with Hedgehog, CurWeapon^ do
- if Count = 0 then
+ if (Count = 0) or (AmmoType = amNothing) then
begin
PackAmmo(Ammo, Ammoz[AmmoType].Slot);
CurAmmoType:= amNothing
--- a/hedgewars/uCollisions.pas Wed Sep 14 22:27:22 2011 +0200
+++ b/hedgewars/uCollisions.pas Wed Sep 14 22:39:39 2011 +0200
@@ -47,10 +47,11 @@
function TestCollisionX(Gear: PGear; Dir: LongInt): boolean;
function TestCollisionY(Gear: PGear; Dir: LongInt): boolean;
-function TestCollisionXwithXYShift(Gear: PGear; ShiftX: hwFloat; ShiftY: LongInt; Dir: LongInt): boolean;
-function TestCollisionYwithXYShift(Gear: PGear; ShiftX, ShiftY: LongInt; Dir: LongInt): boolean;
+function TestCollisionXwithXYShift(Gear: PGear; ShiftX: hwFloat; ShiftY: LongInt; Dir: LongInt; withGear: boolean = true): boolean;
+function TestCollisionYwithXYShift(Gear: PGear; ShiftX, ShiftY: LongInt; Dir: LongInt; withGear: boolean = true): boolean;
-function calcSlopeTangent(Gear: PGear; collisionX, collisionY: LongInt; var outDeltaX, outDeltaY: LongInt; TestWord: LongWord): Boolean;
+function TestRectancleForObstacle(x1, y1, x2, y2: LongInt; landOnly: boolean): boolean;
+function CalcSlopeTangent(Gear: PGear; collisionX, collisionY: LongInt; var outDeltaX, outDeltaY: LongInt; TestWord: LongWord): Boolean;
implementation
uses uConsts, uLandGraphics, uVariables, uDebug, uGears;
@@ -291,11 +292,13 @@
end
end;
-function TestCollisionXwithXYShift(Gear: PGear; ShiftX: hwFloat; ShiftY: LongInt; Dir: LongInt): boolean;
+function TestCollisionXwithXYShift(Gear: PGear; ShiftX: hwFloat; ShiftY: LongInt; Dir: LongInt; withGear: boolean = true): boolean;
begin
Gear^.X:= Gear^.X + ShiftX;
Gear^.Y:= Gear^.Y + int2hwFloat(ShiftY);
-TestCollisionXwithXYShift:= TestCollisionXwithGear(Gear, Dir);
+if withGear then
+ TestCollisionXwithXYShift:= TestCollisionXwithGear(Gear, Dir)
+else TestCollisionXwithXYShift:= TestCollisionX(Gear, Dir);
Gear^.X:= Gear^.X - ShiftX;
Gear^.Y:= Gear^.Y - int2hwFloat(ShiftY)
end;
@@ -337,17 +340,49 @@
TestCollisionY:= false
end;
-function TestCollisionYwithXYShift(Gear: PGear; ShiftX, ShiftY: LongInt; Dir: LongInt): boolean;
+function TestCollisionYwithXYShift(Gear: PGear; ShiftX, ShiftY: LongInt; Dir: LongInt; withGear: boolean = true): boolean;
begin
Gear^.X:= Gear^.X + int2hwFloat(ShiftX);
Gear^.Y:= Gear^.Y + int2hwFloat(ShiftY);
-TestCollisionYwithXYShift:= TestCollisionYwithGear(Gear, Dir);
+if withGear then TestCollisionYwithXYShift:= TestCollisionYwithGear(Gear, Dir)
+else TestCollisionYwithXYShift:= TestCollisionY(Gear, Dir);
Gear^.X:= Gear^.X - int2hwFloat(ShiftX);
Gear^.Y:= Gear^.Y - int2hwFloat(ShiftY)
end;
+function TestRectancleForObstacle(x1, y1, x2, y2: LongInt; landOnly: boolean): boolean;
+var x, y: LongInt;
+ TestWord: LongWord;
+begin
+if landOnly then
+ TestWord:= 255
+else
+ TestWord:= 0;
-function calcSlopeTangent(Gear: PGear; collisionX, collisionY: LongInt; var outDeltaX, outDeltaY: LongInt; TestWord: LongWord): boolean;
+if x1 > x2 then
+begin
+ x := x1;
+ x1 := x2;
+ x2 := x;
+end;
+
+if y1 > y2 then
+begin
+ y := y1;
+ y1 := y2;
+ y2 := y;
+end;
+
+for y := y1 to y2 do
+ for x := x1 to x2 do
+ if ((y and LAND_HEIGHT_MASK) = 0) and ((x and LAND_WIDTH_MASK) = 0)
+ and (Land[y, x] > TestWord) then
+ exit(true);
+
+TestRectancleForObstacle:= false
+end;
+
+function CalcSlopeTangent(Gear: PGear; collisionX, collisionY: LongInt; var outDeltaX, outDeltaY: LongInt; TestWord: LongWord): boolean;
var ldx, ldy, rdx, rdy: LongInt;
i, j, mx, my, li, ri, jfr, jto, tmpo : ShortInt;
tmpx, tmpy: LongWord;
--- a/hedgewars/uConsts.pas Wed Sep 14 22:27:22 2011 +0200
+++ b/hedgewars/uConsts.pas Wed Sep 14 22:39:39 2011 +0200
@@ -196,6 +196,7 @@
gfDisableWind = $00800000;
gfMoreWind = $01000000;
gfTagTeam = $02000000;
+ gfBottomBorder = $04000000;
// NOTE: When adding new game flags, ask yourself
// if a "game start notice" would be useful. If so,
// add one in uWorld.pas - look for "AddGoal".
--- a/hedgewars/uGame.pas Wed Sep 14 22:27:22 2011 +0200
+++ b/hedgewars/uGame.pas Wed Sep 14 22:39:39 2011 +0200
@@ -72,7 +72,7 @@
SetBinds(CurrentTeam^.Binds);
//CurrentHedgehog^.Gear^.Message:= 0; <- produces bugs with further save restoring and demos
isSoundEnabled:= isSEBackup;
- if isSoundEnabled then playMusic;
+ PlayMusic;
GameType:= gmtLocal;
AddVisualGear(0, 0, vgtTeamHealthSorter);
AddVisualGear(0, 0, vgtSmoothWindBar);
--- a/hedgewars/uGears.pas Wed Sep 14 22:27:22 2011 +0200
+++ b/hedgewars/uGears.pas Wed Sep 14 22:39:39 2011 +0200
@@ -43,6 +43,8 @@
function GetAmmo: TAmmoType;
function GetUtility: TAmmoType;
procedure ResurrectHedgehog(gear: PGear);
+procedure HideHog(HH: PHedgehog);
+procedure RestoreHog(HH: PHedgehog);
procedure ProcessGears;
procedure EndTurnCleanup;
procedure ApplyDamage(Gear: PGear; AttackerHog: PHedgehog; Damage: Longword; Source: TDamageSource);
@@ -75,7 +77,6 @@
procedure AfterAttack; forward;
procedure HedgehogStep(Gear: PGear); forward;
procedure doStepHedgehogMoving(Gear: PGear); forward;
-procedure doStepHedgehogReturn(Gear: PGear); forward;
procedure HedgehogChAngle(HHGear: PGear); forward;
procedure ShotgunShot(Gear: PGear); forward;
procedure PickUp(HH, Gear: PGear); forward;
@@ -218,7 +219,6 @@
gear^.doStep:= doStepHandlers[Kind];
gear^.CollisionIndex:= -1;
gear^.Timer:= Timer;
-gear^.Z:= cUsualZ;
gear^.FlightTime:= 0;
gear^.uid:= Counter;
gear^.SoundChannel:= -1;
@@ -226,6 +226,8 @@
gear^.nImpactSounds:= 0;
// Define ammo association, if any.
gear^.AmmoType:= GearKindAmmoTypeMap[Kind];
+if Ammoz[Gear^.AmmoType].Ammo.Propz and ammoprop_NeedTarget <> 0 then gear^.Z:= cHHZ+1
+else gear^.Z:= cUsualZ;
if CurrentHedgehog <> nil then
begin
@@ -372,7 +374,8 @@
gear^.Elasticity:= _0_4;
gear^.Friction:= _0_995;
gear^.Density:= _6;
- gear^.Health:= cBarrelHealth
+ gear^.Health:= cBarrelHealth;
+ gear^.Z:= cHHZ-1
end;
gtDEagleShot: begin
gear^.Radius:= 1;
@@ -428,6 +431,11 @@
gear^.Elasticity:= _0_3;
gear^.Timer:= 0
end;
+ gtTardis: begin
+ gear^.Timer:= 0;
+ gear^.Pos:= 1;
+ gear^.Z:= cCurrHHZ+1;
+ end;
gtMortar: begin
gear^.Radius:= 4;
gear^.Elasticity:= _0_2;
@@ -595,6 +603,7 @@
else if Gear^.Kind = gtHedgehog then
if (CurAmmoGear <> nil) and (CurrentHedgehog^.Gear = Gear) then
begin
+ AttackBar:= 0;
Gear^.Message:= gmDestroy;
CurAmmoGear^.Message:= gmDestroy;
exit
@@ -612,6 +621,7 @@
team:= Gear^.Hedgehog^.Team;
if CurrentHedgehog^.Gear = Gear then
begin
+ AttackBar:= 0;
FreeActionsList; // to avoid ThinkThread on drawned gear
if ((Ammoz[CurrentHedgehog^.CurAmmoType].Ammo.Propz and ammoprop_NoRoundEnd) <> 0) and (CurrentHedgehog^.MultiShootAttacks > 0) then OnUsedAmmo(CurrentHedgehog^);
end;
@@ -938,7 +948,7 @@
end;
if delay2 = 0 then
begin
- if (CurrentHedgehog^.Gear <> nil) and (CurrentHedgehog^.Gear^.State and gstAttacked = 0) then SweepDirty;
+ if (CurrentHedgehog^.Gear <> nil) and (CurrentHedgehog^.Gear^.State and gstAttacked = 0) and (CurAmmoGear = nil) then SweepDirty;
CheckNoDamage;
AliveCount:= 0; // shorter version of check for win to allow typical step activity to proceed
for i:= 0 to Pred(ClansCount) do
@@ -985,7 +995,10 @@
if ((GameTicks and $FFFF) = $FFFF) then
begin
if (not CurrentTeam^.ExtDriven) then
- SendIPCTimeInc;
+ begin
+ SendIPC('#');
+ AddFileLog('hiTicks increment message sent')
+ end;
if (not CurrentTeam^.ExtDriven) or CurrentTeam^.hasGone then
inc(hiTicks) // we do not recieve a message for this
@@ -1450,7 +1463,11 @@
ApplyDamage(Gear, Ammo^.Hedgehog, tmpDmg, dsShove)
else
Gear^.State:= Gear^.State or gstWinner;
- if (Gear^.Kind = gtExplosives) and (Ammo^.Kind = gtBlowtorch) then ApplyDamage(Gear, Ammo^.Hedgehog, tmpDmg * 100, dsUnknown); // crank up damage for explosives + blowtorch
+ if (Gear^.Kind = gtExplosives) and (Ammo^.Kind = gtBlowtorch) then
+ begin
+ if (Ammo^.Hedgehog^.Gear <> nil) then Ammo^.Hedgehog^.Gear^.State:= Ammo^.Hedgehog^.Gear^.State and not gstNotKickable;
+ ApplyDamage(Gear, Ammo^.Hedgehog, tmpDmg * 100, dsUnknown); // crank up damage for explosives + blowtorch
+ end;
DeleteCI(Gear);
if (Gear^.Kind = gtHedgehog) and Gear^.Hedgehog^.King then
@@ -1640,6 +1657,7 @@
procedure ResurrectHedgehog(gear: PGear);
var tempTeam : PTeam;
begin
+ AttackBar:= 0;
gear^.dX := _0;
gear^.dY := _0;
gear^.Damage := 0;
@@ -1737,7 +1755,6 @@
if (t > 0) then
begin
t:= GetRandom(t);
- AddFileLog(inttostr(t)+' --------------');
while t >= 0 do
begin
inc(i);
--- a/hedgewars/uGearsRender.pas Wed Sep 14 22:27:22 2011 +0200
+++ b/hedgewars/uGearsRender.pas Wed Sep 14 22:39:39 2011 +0200
@@ -227,13 +227,6 @@
Tint($FF, $FF, $FF, $FF)
end;
- if (CurAmmoGear <> nil) and
- (CurrentHedgehog^.Gear <> nil) and
- (CurrentHedgehog^.Gear = Gear) and
- (CurAmmoGear^.Kind = gtTardis) then Tint($FF, $FF, $FF, CurAmmoGear^.Timer div 20)
- // probably will need a new flag for this
- else if (Gear^.State and gstTmpFlag <> 0) then Tint($FF, $FF, $FF, $FF-Gear^.Timer);
-
if ((Gear^.State and gstWinner) <> 0) and
((CurAmmoGear = nil) or (CurAmmoGear^.Kind <> gtPickHammer)) then
begin
@@ -893,7 +886,10 @@
gtGrenade: DrawRotated(sprBomb, x, y, 0, Gear^.DirAngle);
gtSnowball: DrawRotated(sprSnowball, x, y, 0, Gear^.DirAngle);
gtGasBomb: DrawRotated(sprCheese, x, y, 0, Gear^.DirAngle);
- gtMolotov: DrawRotated(sprMolotov, x, y, 0, Gear^.DirAngle);
+
+ gtMolotov: if (Gear^.State and gstDrowning) = 0 then
+ DrawRotatedF(sprMolotov, x, y, (RealTicks div 125) mod 8, hwSign(Gear^.dX), Gear^.DirAngle * hwSign(Gear^.dX))
+ else DrawSprite(sprMolotov, x, y, 8);
gtRCPlane: begin
if (Gear^.Tag = -1) then
@@ -1078,16 +1074,36 @@
//DrawTexture(x, y, SpritesData[sprVampiric].Texture, 0.1);
Tint($FF, $FF, $FF, $FF);
end
- else if not isInLag then
+ else //if not isInLag then
begin
+ if isInLag and (Gear^.FlightTime < 256) then inc(Gear^.FlightTime, 8)
+ else if not isInLag and (Gear^.FlightTime > 0) then dec(Gear^.FlightTime, 8);
+ if Gear^.FlightTime > 0 then Tint($FF, $FF, $FF, $FF-min(255,Gear^.FlightTime));
if vobVelocity = 0 then
DrawSprite(sprFlake, x, y, Gear^.Timer)
else
- DrawRotatedF(sprFlake, x, y, Gear^.Timer, 1, Gear^.DirAngle)
+ DrawRotatedF(sprFlake, x, y, Gear^.Timer, 1, Gear^.DirAngle);
//DrawSprite(sprFlake, x-SpritesData[sprFlake].Width div 2, y-SpritesData[sprFlake].Height div 2, Gear^.Timer)
//DrawRotatedF(sprFlake, x-SpritesData[sprFlake].Width div 2, y-SpritesData[sprFlake].Height div 2, Gear^.Timer, 1, Gear^.DirAngle);
+ if Gear^.FlightTime > 0 then Tint($FF, $FF, $FF, $FF);
end;
gtStructure: DrawSprite(sprTarget, x - 16, y - 16, 0);
+ gtTardis: if Gear^.Pos <> 4 then
+ begin
+ if Gear^.Pos = 2 then Tint(Gear^.Hedgehog^.Team^.Clan^.Color shl 8 or $FF)
+ else Tint(Gear^.Hedgehog^.Team^.Clan^.Color shl 8 or max($00, round(Gear^.Power * (1-abs(0.5 - (GameTicks mod 2000) / 2000)))));
+ DrawSprite(sprTardis, x-24, y-63,0);
+ if Gear^.Pos = 2 then Tint($FF, $FF, $FF, $FF)
+ else Tint($FF,$FF,$FF,max($00, round(Gear^.Power * (1-abs(0.5 - (GameTicks mod 2000) / 2000)))));
+ DrawSprite(sprTardis, x-24, y-63,1);
+ if Gear^.Pos <> 2 then Tint($FF, $FF, $FF, $FF)
+(*
+ Tint(Gear^.Hedgehog^.Team^.Clan^.Color shl 8 or max($00, round(Gear^.Power * abs(1 - (RealTicks mod 500) / 250))));
+ DrawTexture(x-6, y-70, SpritesData[sprVampiric].Texture, 0.25);
+ Tint($FF, $FF, $FF, $FF)
+*)
+ end;
+
end;
if Gear^.RenderTimer and (Gear^.Tex <> nil) then DrawCentered(x + 8, y + 8, Gear^.Tex);
--- a/hedgewars/uIO.pas Wed Sep 14 22:27:22 2011 +0200
+++ b/hedgewars/uIO.pas Wed Sep 14 22:39:39 2011 +0200
@@ -29,7 +29,6 @@
procedure SendIPCXY(cmd: char; X, Y: SmallInt);
procedure SendIPCRaw(p: pointer; len: Longword);
procedure SendIPCAndWaitReply(s: shortstring);
-procedure SendIPCTimeInc;
procedure SendKeepAliveMessage(Lag: Longword);
procedure LoadRecordFromFile(fileName: shortstring);
procedure SendStat(sit: TStatInfoType; s: shortstring);
@@ -246,13 +245,6 @@
SendIPC(s)
end;
-procedure SendIPCTimeInc;
-const timeinc: shortstring = '#';
-begin
-AddFileLog('[IPC out] <time increment>');
-SendIPCRaw(@timeinc, 2)
-end;
-
procedure IPCWaitPongEvent;
begin
isPonged:= false;
@@ -288,13 +280,16 @@
and ((GameTicks = hiTicks shl 16 + headcmd^.loTime)
or (headcmd^.cmd = 's') // for these commands time is not specified
or (headcmd^.cmd = 'h') // seems the hedgewars protocol does not allow remote synced commands
- or (headcmd^.cmd = '#')
+ or (headcmd^.cmd = '#') // must be synced for saves to work
or (headcmd^.cmd = 'b')
or (headcmd^.cmd = 'F')) do
begin
case headcmd^.cmd of
'+': ; // do nothing - it is just an empty packet
- '#': inc(hiTicks);
+ '#': begin
+ AddFileLog('hiTicks increment by remote message');
+ inc(hiTicks);
+ end;
'L': ParseCommand('+left', true);
'l': ParseCommand('-left', true);
'R': ParseCommand('+right', true);
--- a/hedgewars/uLand.pas Wed Sep 14 22:27:22 2011 +0200
+++ b/hedgewars/uLand.pas Wed Sep 14 22:39:39 2011 +0200
@@ -30,6 +30,7 @@
procedure initModule;
procedure freeModule;
+procedure DrawBottomBorder;
procedure GenMap;
function GenPreview: TPreview;
@@ -1070,10 +1071,10 @@
begin
if (cReducedQuality and rqBlurryLand) = 0 then
begin
- if (Land[y, x-1] = lfBasic) and (Land[y, x-1] and AMask <> 0) then LandPixels[y, x]:= LandPixels[y, x-1]
- else if (Land[y, x+1] = lfBasic) and (Land[y, x+1] and AMask <> 0) then LandPixels[y, x]:= LandPixels[y, x+1]
- else if (Land[y-1, x] = lfBasic) and (Land[y-1, x] and AMask <> 0) then LandPixels[y, x]:= LandPixels[y-1, x]
- else if (Land[y+1, x] = lfBasic) and (Land[y+1, x] and AMask <> 0) then LandPixels[y, x]:= LandPixels[y+1, x];
+ if (Land[y, x-1] = lfBasic) and (LandPixels[y, x-1] and AMask <> 0) then LandPixels[y, x]:= LandPixels[y, x-1]
+ else if (Land[y, x+1] = lfBasic) and (LandPixels[y, x+1] and AMask <> 0) then LandPixels[y, x]:= LandPixels[y, x+1]
+ else if (Land[y-1, x] = lfBasic) and (LandPixels[y-1, x] and AMask <> 0) then LandPixels[y, x]:= LandPixels[y-1, x]
+ else if (Land[y+1, x] = lfBasic) and (LandPixels[y+1, x] and AMask <> 0) then LandPixels[y, x]:= LandPixels[y+1, x];
if (((LandPixels[y,x] and AMask) shr AShift) > 10) then LandPixels[y,x]:= (LandPixels[y,x] and not AMask) or (128 shl AShift)
end;
Land[y,x]:= lfObject
@@ -1090,10 +1091,10 @@
begin
if (cReducedQuality and rqBlurryLand) = 0 then
begin
- if (Land[y, x-1] = lfBasic) and (Land[y,x-1] and AMask <> 0) then LandPixels[y, x]:= LandPixels[y, x-1]
- else if (Land[y, x+1] = lfBasic) and (Land[y,x+1] and AMask <> 0) then LandPixels[y, x]:= LandPixels[y, x+1]
- else if (Land[y+1, x] = lfBasic) and (Land[y+1,x] and AMask <> 0) then LandPixels[y, x]:= LandPixels[y+1, x]
- else if (Land[y-1, x] = lfBasic) and (Land[y-1,x] and AMask <> 0) then LandPixels[y, x]:= LandPixels[y-1, x];
+ if (Land[y, x-1] = lfBasic) and (LandPixels[y,x-1] and AMask <> 0) then LandPixels[y, x]:= LandPixels[y, x-1]
+ else if (Land[y, x+1] = lfBasic) and (LandPixels[y,x+1] and AMask <> 0) then LandPixels[y, x]:= LandPixels[y, x+1]
+ else if (Land[y+1, x] = lfBasic) and (LandPixels[y+1,x] and AMask <> 0) then LandPixels[y, x]:= LandPixels[y+1, x]
+ else if (Land[y-1, x] = lfBasic) and (LandPixels[y-1,x] and AMask <> 0) then LandPixels[y, x]:= LandPixels[y-1, x];
if (((LandPixels[y,x] and AMask) shr AShift) > 10) then LandPixels[y,x]:= (LandPixels[y,x] and not AMask) or (64 shl AShift)
end;
Land[y,x]:= lfObject
@@ -1132,9 +1133,14 @@
p: PLongwordArray;
x, y, cpX, cpY: Longword;
begin
- tmpsurf:= LoadImage(Pathz[ptMapCurrent] + '/mask', ifAlpha or ifTransparent or ifIgnoreCaps);
- if (tmpsurf = nil) and (mapName <> '') then
- tmpsurf:= LoadImage(Pathz[ptMissionMaps] + '/' + mapName +'/mask', ifAlpha or ifTransparent or ifIgnoreCaps);
+tmpsurf:= LoadImage(UserPathz[ptMapCurrent] + '/mask', ifAlpha or ifTransparent or ifIgnoreCaps);
+if tmpsurf = nil then tmpsurf:= LoadImage(Pathz[ptMapCurrent] + '/mask', ifAlpha or ifTransparent or ifIgnoreCaps);
+if tmpsurf = nil then
+ begin
+ mapName:= ExtractFileName(Pathz[ptMapCurrent]);
+ tmpsurf:= LoadImage(UserPathz[ptMissionMaps] + '/' + mapName + '/mask', ifAlpha or ifTransparent or ifIgnoreCaps);
+ if tmpsurf = nil then tmpsurf:= LoadImage(Pathz[ptMissionMaps] + '/' + mapName + '/mask', ifAlpha or ifTransparent or ifIgnoreCaps);
+ end;
if (tmpsurf <> nil) and (tmpsurf^.w <= LAND_WIDTH) and (tmpsurf^.h <= LAND_HEIGHT) and (tmpsurf^.format^.BytesPerPixel = 4) then
begin
@@ -1178,11 +1184,11 @@
tmpsurf:= LoadImage(UserPathz[ptMapCurrent] + '/map', ifAlpha or ifTransparent or ifIgnoreCaps);
if tmpsurf = nil then tmpsurf:= LoadImage(Pathz[ptMapCurrent] + '/map', ifAlpha or ifTransparent or ifIgnoreCaps);
if tmpsurf = nil then
-begin
+ begin
mapName:= ExtractFileName(Pathz[ptMapCurrent]);
tmpsurf:= LoadImage(UserPathz[ptMissionMaps] + '/' + mapName + '/map', ifAlpha or ifTransparent or ifIgnoreCaps);
if tmpsurf = nil then tmpsurf:= LoadImage(Pathz[ptMissionMaps] + '/' + mapName + '/map', ifAlpha or ifCritical or ifTransparent or ifIgnoreCaps);
-end;
+ end;
TryDo((tmpsurf^.w <= LAND_WIDTH) and (tmpsurf^.h <= LAND_HEIGHT), 'Map dimensions too big!', true);
// unC0Rr - should this be passed from the GUI? I am not sure which layer does what
@@ -1222,6 +1228,25 @@
LoadMask(mapname);
end;
+procedure DrawBottomBorder; // broken out from other borders for doing a floor-only map, or possibly updating bottom during SD
+var x, w, c: Longword;
+begin
+for w:= 0 to 23 do
+ for x:= leftX to rightX do
+ begin
+ Land[cWaterLine-1 - w, x]:= lfIndestructible;
+ if (x + w) mod 32 < 16 then
+ c:= AMask
+ else
+ c:= AMask or RMask or GMask; // FF00FFFF
+
+ if (cReducedQuality and rqBlurryLand) = 0 then
+ LandPixels[cWaterLine-1 - w, x]:= c
+ else
+ LandPixels[(cWaterLine-1 - w) div 2, x div 2]:= c
+ end
+end;
+
procedure GenMap;
var x, y, w, c: Longword;
begin
@@ -1272,7 +1297,7 @@
for w:= 0 to 5 do // width of 3 allowed hogs to be knocked through with grenade
begin
for y:= topY to LAND_HEIGHT - 1 do
- begin
+ begin
Land[y, leftX + w]:= lfIndestructible;
Land[y, rightX - w]:= lfIndestructible;
if (y + w) mod 32 < 16 then
@@ -1281,33 +1306,35 @@
c:= AMask or RMask or GMask; // FF00FFFF
if (cReducedQuality and rqBlurryLand) = 0 then
- begin
+ begin
LandPixels[y, leftX + w]:= c;
LandPixels[y, rightX - w]:= c;
- end
+ end
else
- begin
+ begin
LandPixels[y div 2, (leftX + w) div 2]:= c;
LandPixels[y div 2, (rightX - w) div 2]:= c;
+ end;
end;
- end;
for x:= leftX to rightX do
begin
- Land[topY + w, x]:= lfIndestructible;
- if (x + w) mod 32 < 16 then
- c:= AMask
- else
- c:= AMask or RMask or GMask; // FF00FFFF
+ Land[topY + w, x]:= lfIndestructible;
+ if (x + w) mod 32 < 16 then
+ c:= AMask
+ else
+ c:= AMask or RMask or GMask; // FF00FFFF
- if (cReducedQuality and rqBlurryLand) = 0 then
- LandPixels[topY + w, x]:= c
- else
- LandPixels[(topY + w) div 2, x div 2]:= c;
+ if (cReducedQuality and rqBlurryLand) = 0 then
+ LandPixels[topY + w, x]:= c
+ else
+ LandPixels[(topY + w) div 2, x div 2]:= c;
end;
end;
end;
+if (GameFlags and gfBottomBorder) <> 0 then DrawBottomBorder;
+
if (GameFlags and gfDisableGirders) <> 0 then hasGirders:= false;
if ((GameFlags and gfForts) = 0)
--- a/hedgewars/uLandGraphics.pas Wed Sep 14 22:27:22 2011 +0200
+++ b/hedgewars/uLandGraphics.pas Wed Sep 14 22:39:39 2011 +0200
@@ -29,7 +29,7 @@
function addBgColor(OldColor, NewColor: LongWord): LongWord;
function SweepDirty: boolean;
-function Despeckle(X, Y: LongInt; gfxOnly: boolean): LongWord;
+function Despeckle(X, Y: LongInt): Boolean;
procedure Smooth(X, Y: LongInt);
function CheckLandValue(X, Y: LongInt; LandFlag: Word): boolean;
function DrawExplosion(X, Y, Radius: LongInt): Longword;
@@ -528,8 +528,11 @@
(((Land[ty, tx] and lfBasic) <> 0) or
((Land[ty, tx] and lfObject) <> 0)) then
begin
- Land[ty, tx]:= Land[ty, tx] or lfDamaged;
- if despeckle then LandDirty[ty div 32, tx div 32]:= 1;
+ if despeckle then
+ begin
+ Land[ty, tx]:= Land[ty, tx] or lfDamaged;
+ LandDirty[ty div 32, tx div 32]:= 1
+ end;
if (cReducedQuality and rqBlurryLand) = 0 then
LandPixels[ty, tx]:= cExplosionBorderColor
else LandPixels[ty div 2, tx div 2]:= cExplosionBorderColor
@@ -721,8 +724,7 @@
UpdateLandTexture(x, w, y, h)
end;
-// was experimenting with applying as damage occurred.
-function Despeckle(X, Y: LongInt; gfxOnly: boolean): LongWord;
+function Despeckle(X, Y: LongInt): boolean;
var nx, ny, i, j, c, xx, yy: LongInt;
pixelsweep: boolean;
begin
@@ -737,8 +739,7 @@
yy:= Y div 2;
end;
pixelsweep:= ((Land[Y, X] and $FF00) = 0) and (LandPixels[yy, xx] <> 0);
-if not pixelsweep and gfxOnly then exit(0);
-if ((Land[Y, X] > 255) and ((Land[Y, X] and lfIndestructible) = 0)) or pixelsweep then
+if (((Land[Y, X] and lfDamaged) <> 0) and ((Land[Y, X] and lfIndestructible) = 0)) or pixelsweep then
begin
c:= 0;
for i:= -1 to 1 do
@@ -761,8 +762,8 @@
else if Land[ny, nx] > 255 then inc(c);
end
end;
- if (c < 2) or
- ((c < 4) and (((Land[Y, X] and lfDamaged) <> 0) or pixelsweep)) then
+
+ if c < 4 then // 0-3 neighbours
begin
if ((Land[Y, X] and lfBasic) <> 0) and not disableLandBack then
LandPixels[yy, xx]:= LandBackPixel(X, Y)
@@ -770,11 +771,10 @@
LandPixels[yy, xx]:= 0;
Land[Y, X]:= 0;
- if not pixelsweep then exit(1)
- else exit(2)
+ if not pixelsweep then exit(true);
end;
end;
-Despeckle:= 0
+Despeckle:= false
end;
procedure Smooth(X, Y: LongInt);
@@ -827,8 +827,8 @@
end;
function SweepDirty: boolean;
-var x, y, xx, yy, ty, tx, d: LongInt;
- bRes, updateBlock, resweepCol, resweepGfx, gfxOnly, recheck, firstpass: boolean;
+var x, y, xx, yy, ty, tx: LongInt;
+ bRes, updateBlock, resweep, recheck: boolean;
begin
bRes:= false;
reCheck:= true;
@@ -840,65 +840,67 @@
begin
for x:= 0 to LAND_WIDTH div 32 - 1 do
begin
- if LandDirty[y, x] <> 0 then
+ if LandDirty[y, x] = 1 then
begin
updateBlock:= false;
- resweepCol:= true;
- resweepGfx:= true;
- firstpass:= true;
+ resweep:= true;
ty:= y * 32;
tx:= x * 32;
- while(resweepCol or resweepGfx) do
+ while(resweep) do
begin
- gfxOnly:= resweepGfx and not resweepCol;
- resweepCol:= false;
- resweepGfx:= false;
+ resweep:= false;
for yy:= ty to ty + 31 do
for xx:= tx to tx + 31 do
- begin
- d:= Despeckle(xx, yy, gfxOnly);
- if d <> 0 then
+ if Despeckle(xx, yy) then
begin
bRes:= true;
updateBlock:= true;
- if d = 1 then resweepCol:= true
- else resweepGfx:= true;
- if d = 1 then
- if (yy = ty) and (y > 0) then
- begin
- LandDirty[y-1, x]:= 1;
- recheck:= true;
- end
- else if (yy = ty+31) and (y < LAND_HEIGHT div 32 - 1) then
- begin
- LandDirty[y+1, x]:= 1;
- recheck:= true;
- end;
- if (xx = tx) and (x > 0) then
- begin
- LandDirty[y, x-1]:= 1;
- recheck:= true;
- end
- else if (xx = tx+31) and (x < LAND_WIDTH div 32 - 1) then
- begin
- LandDirty[y, x+1]:= 1;
- recheck:= true;
- end
+ resweep:= true;
+ if (yy = ty) and (y > 0) then
+ begin
+ LandDirty[y-1, x]:= 1;
+ recheck:= true;
+ end
+ else if (yy = ty+31) and (y < LAND_HEIGHT div 32 - 1) then
+ begin
+ LandDirty[y+1, x]:= 1;
+ recheck:= true;
+ end;
+ if (xx = tx) and (x > 0) then
+ begin
+ LandDirty[y, x-1]:= 1;
+ recheck:= true;
+ end
+ else if (xx = tx+31) and (x < LAND_WIDTH div 32 - 1) then
+ begin
+ LandDirty[y, x+1]:= 1;
+ recheck:= true;
+ end
end;
- if firstpass then Smooth(xx,yy);
- end;
- firstpass:= false
end;
if updateBlock then UpdateLandTexture(tx, 32, ty, 32);
- LandDirty[y, x]:= 0;
+ LandDirty[y, x]:= 2;
end;
end;
end;
end;
+for y:= 0 to LAND_HEIGHT div 32 - 1 do
+ for x:= 0 to LAND_WIDTH div 32 - 1 do
+ if LandDirty[y, x] <> 0 then
+ begin
+ LandDirty[y, x]:= 0;
+ ty:= y * 32;
+ tx:= x * 32;
+ for yy:= ty to ty + 31 do
+ for xx:= tx to tx + 31 do
+ Smooth(xx,yy)
+ end;
+
SweepDirty:= bRes;
end;
+
// Return true if outside of land or not the value tested, used right now for some X/Y movement that does not use normal hedgehog movement in GSHandlers.inc
function CheckLandValue(X, Y: LongInt; LandFlag: Word): boolean;
begin
--- a/hedgewars/uLandObjects.pas Wed Sep 14 22:27:22 2011 +0200
+++ b/hedgewars/uLandObjects.pas Wed Sep 14 22:39:39 2011 +0200
@@ -373,7 +373,7 @@
f: textfile;
i: LongInt;
ii, t: Longword;
- c1, c2: TSDL_Color;
+ c2: TSDL_Color;
procedure CheckRect(Width, Height, x, y, w, h: LongWord);
begin
--- a/hedgewars/uScript.pas Wed Sep 14 22:27:22 2011 +0200
+++ b/hedgewars/uScript.pas Wed Sep 14 22:39:39 2011 +0200
@@ -36,6 +36,7 @@
procedure ScriptLoad(name : shortstring);
procedure ScriptOnGameInit;
+procedure ScriptOnScreenResize();
procedure ScriptCall(fname : shortstring);
function ScriptCall(fname : shortstring; par1: LongInt) : LongInt;
@@ -1502,6 +1503,29 @@
lua_pushinteger(L, ord(CurrentHedgehog^.CurAmmoType));
lc_getcurammotype := 1;
end;
+
+// boolean TestRectForObstacle(x1, y1, x2, y2, landOnly)
+function lc_testrectforobstacle(L : Plua_State) : LongInt; Cdecl;
+var rtn: Boolean;
+begin
+ if lua_gettop(L) <> 5 then
+ begin
+ LuaError('Lua: Wrong number of parameters passed to TestRectForObstacle!');
+ lua_pushnil(L); // return value on stack (nil)
+ end
+ else
+ begin
+ rtn:= TestRectancleForObstacle(
+ lua_tointeger(L, 1),
+ lua_tointeger(L, 2),
+ lua_tointeger(L, 3),
+ lua_tointeger(L, 4),
+ lua_toboolean(L, 5)
+ );
+ lua_pushboolean(L, rtn);
+ end;
+ lc_testrectforobstacle:= 1
+end;
///////////////////
procedure ScriptPrintStack;
@@ -1624,6 +1648,16 @@
ScriptSetInteger('TeamsCount', TeamsCount)
end;
+
+// Update values of screen dimensions and allow script to react to resolution change
+procedure ScriptOnScreenResize();
+begin
+ScriptSetInteger('ScreenHeight', cScreenHeight);
+ScriptSetInteger('ScreenWidth', cScreenWidth);
+ScriptCall('onScreenResize');
+end;
+
+
procedure ScriptLoad(name : shortstring);
var ret : LongInt;
s : shortstring;
@@ -1798,7 +1832,6 @@
// import some variables
ScriptSetInteger('LAND_WIDTH', LAND_WIDTH);
ScriptSetInteger('LAND_HEIGHT', LAND_HEIGHT);
-
ScriptSetString('L', cLocale);
// import game flags
@@ -1972,6 +2005,7 @@
lua_register(luaState, 'SetHogHat', @lc_sethoghat);
lua_register(luaState, 'PlaceGirder', @lc_placegirder);
lua_register(luaState, 'GetCurAmmoType', @lc_getcurammotype);
+lua_register(luaState, 'TestRectForObstacle', @lc_testrectforobstacle);
ScriptClearStack; // just to be sure stack is empty
--- a/hedgewars/uStore.pas Wed Sep 14 22:27:22 2011 +0200
+++ b/hedgewars/uStore.pas Wed Sep 14 22:39:39 2011 +0200
@@ -259,18 +259,20 @@
tmpsurf: PSDL_Surface;
i: LongInt;
begin
+AddFileLog('StoreLoad()');
-for fi:= Low(THWFont) to High(THWFont) do
- with Fontz[fi] do
- begin
- s:= UserPathz[ptFonts] + '/' + Name;
- if not FileExists(s) then s:= Pathz[ptFonts] + '/' + Name;
- WriteToConsole(msgLoading + s + ' (' + inttostr(Height) + 'pt)... ');
- Handle:= TTF_OpenFont(Str2PChar(s), Height);
- SDLTry(Handle <> nil, true);
- TTF_SetFontStyle(Handle, style);
- WriteLnToConsole(msgOK)
- end;
+if not reload then
+ for fi:= Low(THWFont) to High(THWFont) do
+ with Fontz[fi] do
+ begin
+ s:= UserPathz[ptFonts] + '/' + Name;
+ if not FileExists(s) then s:= Pathz[ptFonts] + '/' + Name;
+ WriteToConsole(msgLoading + s + ' (' + inttostr(Height) + 'pt)... ');
+ Handle:= TTF_OpenFont(Str2PChar(s), Height);
+ SDLTry(Handle <> nil, true);
+ TTF_SetFontStyle(Handle, style);
+ WriteLnToConsole(msgOK)
+ end;
WriteNames(fnt16);
MakeCrossHairs;
@@ -345,10 +347,10 @@
// This should maybe be flagged. It wastes quite a bit of memory.
if not reload then
begin
-{$IFNDEF DARWIN & WIN32}
+{$IF DEFINED(DARWIN) OR DEFINED(WIN32)}
+ Surface:= tmpsurf
+{$ELSE}
if saveSurf then Surface:= tmpsurf else SDL_FreeSurface(tmpsurf)
-{$ELSE}
- Surface:= tmpsurf
{$ENDIF}
end
end
@@ -756,7 +758,6 @@
SDL_GL_SwapBuffers();
{$ENDIF}
inc(Step);
-
end;
procedure FinishProgress;
@@ -764,6 +765,7 @@
WriteLnToConsole('Freeing progress surface... ');
FreeTexture(ProgrTex);
uMobile.GameLoaded();
+ Step:= 0
end;
function RenderHelpWindow(caption, subcaption, description, extra: ansistring; extracolor: LongInt; iconsurf: PSDL_Surface; iconrect: PSDL_Rect): PTexture;
@@ -948,7 +950,6 @@
reinit: boolean;
{$IFDEF SDL13}x, y: LongInt;{$ENDIF}
begin
- s:= s; // avoid compiler hint
if Length(s) = 0 then cFullScreen:= not cFullScreen
else cFullScreen:= s = '1';
@@ -981,7 +982,8 @@
end
else
begin
-{$IFDEF DARWIN | WIN32}
+ SetScale(cDefaultZoomLevel);
+{$IF DEFINED(DARWIN) OR DEFINED(WIN32)}
reinit:= true;
{$ENDIF}
AddFileLog('Freeing old primary surface...');
@@ -990,7 +992,13 @@
end;
// these attributes must be set up before creating the sdl window
+{$IFNDEF WIN32}
+(* On a large number of testers machines, SDL default to software rendering when opengl attributes were set.
+ These attributes were "set" after CreateWindow in .15, which probably did nothing.
+ IMO we should rely on the gl_config defaults from SDL, and use SDL_GL_GetAttribute to possibly post warnings if any
+ bad values are set. *)
SetupOpenGLAttributes();
+{$ENDIF}
{$IFDEF SDL13}
// these values in x and y make the window appear in the center
x:= SDL_WINDOWPOS_CENTERED_MASK;
@@ -1038,7 +1046,9 @@
StoreRelease(true);
StoreLoad(true);
+
ResetLand;
+
UpdateLandTexture(0, LAND_WIDTH, 0, LAND_HEIGHT)
end;
end;
--- a/hedgewars/uTeams.pas Wed Sep 14 22:27:22 2011 +0200
+++ b/hedgewars/uTeams.pas Wed Sep 14 22:39:39 2011 +0200
@@ -234,7 +234,7 @@
ApplyAmmoChanges(CurrentHedgehog^);
-if not CurrentTeam^.ExtDriven then SetBinds(CurrentTeam^.Binds);
+if (not CurrentTeam^.ExtDriven) and (CurrentHedgehog^.BotLevel = 0) then SetBinds(CurrentTeam^.Binds);
bShowFinger:= true;
@@ -427,11 +427,17 @@
with Team do
for i:= 0 to cMaxHHIndex do
with Hedgehogs[i] do
+ begin
+ if Hedgehogs[i].GearHidden <> nil then
+ RestoreHog(@Hedgehogs[i]);
+
if Gear <> nil then
begin
Gear^.Invulnerable:= false;
- Gear^.Damage:= Gear^.Health
+ Gear^.Damage:= Gear^.Health;
+ Gear^.State:= Gear^.State or gstHHGone
end
+ end
end;
procedure chAddHH(var id: shortstring);
--- a/hedgewars/uTypes.pas Wed Sep 14 22:27:22 2011 +0200
+++ b/hedgewars/uTypes.pas Wed Sep 14 22:39:39 2011 +0200
@@ -82,7 +82,7 @@
sprSMineOff, sprSMineOn, sprHandSMine, sprHammer,
sprHandResurrector, sprCross, sprAirDrill, sprNapalmBomb,
sprBulletHit, sprSnowball, sprHandSnowball, sprSnow,
- sprSDFlake, sprSDWater, sprSDCloud, sprSDSplash, sprSDDroplet
+ sprSDFlake, sprSDWater, sprSDCloud, sprSDSplash, sprSDDroplet, sprTardis
);
// Gears that interact with other Gears and/or Land
@@ -136,7 +136,7 @@
sndPoisonCough, sndPoisonMoan, sndBirdyLay, sndWhistle, sndBeeWater,
sndPiano0, sndPiano1, sndPiano2, sndPiano3, sndPiano4, sndPiano5, sndPiano6, sndPiano7, sndPiano8,
sndSkip, sndSineGun, sndOoff1, sndOoff2, sndOoff3, sndWhack,
- sndComeonthen, sndParachute, sndBump, sndResurrector, sndPlane);
+ sndComeonthen, sndParachute, sndBump, sndResurrector, sndPlane, sndTardis);
// Available ammo types to be used by hedgehogs
TAmmoType = (amNothing, amGrenade, amClusterBomb, amBazooka, amBee, amShotgun, amPickHammer, // 6
--- a/hedgewars/uUtils.pas Wed Sep 14 22:27:22 2011 +0200
+++ b/hedgewars/uUtils.pas Wed Sep 14 22:39:39 2011 +0200
@@ -341,20 +341,7 @@
Assign(f,'../Documents/hw-' + cLogfileBase + '.log');
Rewrite(f);
{$ELSE}
- if (ParamStr(1) <> '') and (ParamStr(2) <> '') then
- if (ParamCount <> 3) and (ParamCount <> cDefaultParamNum) then
- begin
- i:= 0;
- while(i < 7) do
- begin
- assign(f, ExtractFileDir(ParamStr(2)) + '/' + cLogfileBase + inttostr(i) + '.log');
- rewrite(f);
- if IOResult = 0 then break;
- inc(i)
- end;
- if i = 7 then f:= stderr; // if everything fails, write to stderr
- end
- else
+ if (UserPathPrefix <> '') then
begin
i:= 0;
while(i < 7) do
--- a/hedgewars/uVariables.pas Wed Sep 14 22:27:22 2011 +0200
+++ b/hedgewars/uVariables.pas Wed Sep 14 22:39:39 2011 +0200
@@ -25,12 +25,15 @@
var
/////// init flags ///////
- cMinScreenWidth : LongInt = 480;
- cMinScreenHeight : LongInt = 320;
- cScreenWidth : LongInt = 1024;
- cScreenHeight : LongInt = 768;
- cOrigScreenWidth : LongInt = 1024;
- cOrigScreenHeight : LongInt = 768;
+ cMinScreenWidth : LongInt = 640;
+ cMinScreenHeight : LongInt = 480;
+ cScreenWidth : LongInt = 1024;
+ cScreenHeight : LongInt = 768;
+ cOrigScreenWidth : LongInt = 1024;
+ cOrigScreenHeight : LongInt = 768;
+ cNewScreenWidth : LongInt = 1024;
+ cNewScreenHeight : LongInt = 768;
+ cScreenResizeDelay : LongWord = 0;
cBits : LongInt = 32;
ipcPort : Word = 0;
cFullScreen : boolean = false;
@@ -487,7 +490,7 @@
(FileName: 'amMolotov'; Path: ptHedgehog; AltPath: ptNone; Texture: nil; Surface: nil;
Width: 32; Height: 32; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),//sprHandMolotov
(FileName: 'Molotov'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Surface: nil;
- Width: 16; Height: 16; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprMolotov
+ Width: 32; Height: 32; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprMolotov
(FileName: 'Smoke'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Surface: nil;
Width: 22; Height: 22; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpHighest; getDimensions: false; getImageDimensions: true),// sprSmoke
(FileName: 'SmokeWhite'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Surface: nil;
@@ -614,7 +617,9 @@
(FileName: 'SDSplash'; Path: ptCurrTheme; AltPath: ptSuddenDeath; Texture: nil; Surface: nil;
Width: 80; Height: 50; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprSDSplash
(FileName: 'SDDroplet'; Path: ptCurrTheme; AltPath: ptSuddenDeath; Texture: nil; Surface: nil;
- Width: 16; Height: 16; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpHighest; getDimensions: false; getImageDimensions: true)// sprSDDroplet
+ Width: 16; Height: 16; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpHighest; getDimensions: false; getImageDimensions: true),// sprSDDroplet
+ (FileName: 'TARDIS'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Surface: nil;
+ Width: 48; Height: 79; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpHighest; getDimensions: false; getImageDimensions: true)// sprTardis
);
@@ -751,7 +756,8 @@
(FileName: 'parachute.ogg'; Path: ptSounds),// sndParachute
(FileName: 'bump.ogg'; Path: ptSounds),// sndBump
(FileName: 'hogchant3.ogg'; Path: ptSounds),// sndResurrector
- (FileName: 'plane.ogg'; Path: ptSounds) // sndPlane
+ (FileName: 'plane.ogg'; Path: ptSounds), // sndPlane
+ (FileName: 'TARDIS.ogg'; Path: ptSounds) // sndTardis
);
Ammoz: array [TAmmoType] of record
--- a/hedgewars/uVisualGears.pas Wed Sep 14 22:27:22 2011 +0200
+++ b/hedgewars/uVisualGears.pas Wed Sep 14 22:39:39 2011 +0200
@@ -29,7 +29,7 @@
* E.g.: background flakes, visual effects: explosion, smoke trails, etc.
*)
interface
-uses uConsts, uFloat, GLunit, uTypes;
+uses uConsts, uFloat, GLunit, uTypes, uWorld;
procedure initModule;
procedure freeModule;
@@ -317,10 +317,11 @@
dy:= 0;
FrameTicks:= 350;
Frame:= 7;
- Angle := 0;
+ Angle:= 0;
end;
vgtSmoothWindBar: Tag:= hwRound(cWindSpeed * 72 / cMaxWindSpeed);
vgtStraightShot: begin
+ Scale:= 1.0;
dx:= 0.001 * random(45);
dy:= 0.001 * (random(20) + 25);
State:= ord(sprHealth);
@@ -494,6 +495,7 @@
var Gear: PVisualGear;
tinted: boolean;
tmp: real;
+ i: LongInt;
begin
case Layer of
// this layer is very distant in the background when stereo
@@ -592,8 +594,10 @@
SetScale(zoom)
end
end;
- //if Ger^.Tex <> nil then DrawCentered(round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy, Gear^.Tex);
- vgtStraightShot: DrawRotatedF(TSprite(Gear^.State), round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy, Gear^.Frame, 1, Gear^.Angle);
+ vgtStraightShot: begin
+ if Gear^.dX < 0 then i:= -1 else i:= 1;
+ DrawTextureF(SpritesData[TSprite(Gear^.State)].Texture, Gear^.Scale, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy, Gear^.Frame, i, SpritesData[TSprite(Gear^.State)].Width, SpritesData[TSprite(Gear^.State)].Height);
+ end;
end;
if (cReducedQuality and rqAntiBoom) = 0 then
case Gear^.Kind of
@@ -645,14 +649,7 @@
end;
DrawRotatedF(sprFeather, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy, Gear^.Frame, 1, Gear^.Angle);
end;
- vgtEgg: begin
- if Gear^.FrameTicks < $FF then
- begin
- Tint($FF, $FF, $FF, Gear^.FrameTicks);
- tinted:= true
- end;
- DrawRotatedF(sprEgg, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy, Gear^.Frame, 1, Gear^.Angle);
- end;
+ vgtEgg: DrawRotatedF(sprEgg, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy, Gear^.Frame, 1, Gear^.Angle);
vgtBeeTrace: begin
if Gear^.FrameTicks < $FF then
Tint($FF, $FF, $FF, Gear^.FrameTicks div 2)
--- a/hedgewars/uWorld.pas Wed Sep 14 22:27:22 2011 +0200
+++ b/hedgewars/uWorld.pas Wed Sep 14 22:39:39 2011 +0200
@@ -1178,16 +1178,16 @@
end;
procedure MoveCamera;
-var EdgesDist, wdy, shs: LongInt;
+var EdgesDist, wdy, shs,z: LongInt;
PrevSentPointTime: LongWord = 0;
begin
{$IFNDEF IPHONEOS}
if (not (CurrentTeam^.ExtDriven and isCursorVisible and not bShowAmmoMenu)) and cHasFocus and (GameState <> gsConfirm) then
uCursor.updatePosition();
{$ENDIF}
-
+z:= round(200/zoom);
if (not PlacingHogs) and (FollowGear <> nil) and (not isCursorVisible) and (not fastUntilLag) then
- if (not autoCameraOn) or (abs(CursorPoint.X - prevPoint.X) + abs(CursorPoint.Y - prevpoint.Y) > 4) then
+ if (not autoCameraOn) or ((abs(CursorPoint.X - prevPoint.X) + abs(CursorPoint.Y - prevpoint.Y)) > 4) then
begin
FollowGear:= nil;
prevPoint:= CursorPoint;
@@ -1195,8 +1195,8 @@
end
else
begin
- CursorPoint.X:= (prevPoint.X * 7 + hwRound(FollowGear^.X) + hwSign(FollowGear^.dX) * 100 + WorldDx) div 8;
- CursorPoint.Y:= (prevPoint.Y * 7 + cScreenHeight - (hwRound(FollowGear^.Y) + WorldDy)) div 8;
+ CursorPoint.X:= (prevPoint.X * 7 + hwRound(FollowGear^.X) + hwSign(FollowGear^.dX) * z + WorldDx) div 8;
+ CursorPoint.Y:= (prevPoint.Y * 7 + cScreenHeight - (hwRound(FollowGear^.Y)+ hwSign(FollowGear^.dY) * z + WorldDy)) div 8;
end;
wdy:= trunc(cScreenHeight / cScaleFactor) + cScreenHeight div 2 - cWaterLine - cVisibleWater;
@@ -1314,9 +1314,12 @@
procedure ShakeCamera(amount: LongWord);
begin
- amount:= Max(1, amount);
- WorldDx:= WorldDx - amount + LongInt(getRandom(1 + amount * 2));
- WorldDy:= WorldDy - amount + LongInt(getRandom(1 + amount * 2));
+ if isCursorVisible then exit;
+ amount:= Max(1, round(amount*zoom/2));
+ WorldDx:= WorldDx - amount + LongInt(random(1 + amount * 2));
+ WorldDy:= WorldDy - amount + LongInt(random(1 + amount * 2));
+ //CursorPoint.X:= CursorPoint.X - amount + LongInt(random(1 + amount * 2));
+ //CursorPoint.Y:= CursorPoint.Y - amount + LongInt(random(1 + amount * 2))
end;
--- a/misc/hats_js_anim.xhtml Wed Sep 14 22:27:22 2011 +0200
+++ b/misc/hats_js_anim.xhtml Wed Sep 14 22:39:39 2011 +0200
@@ -12,7 +12,6 @@
-moz-background-size: 200%;
background-size: 200%;
font-family: sans-serif;
- overflow: hidden;
}
h1 { text-shadow: 0 0 2px white; }
a
@@ -45,36 +44,10 @@
//<![CDATA[
/* javascript version of a sprite sheet - this could be pretty trivially done in pure HTML, but maintenance
would be easier with a server-side portion. list of sprites could be gotten from googlecode, but would require XSS whitelisting */
-var masks = [
-'4gsuif', 'Coonskin3', 'jigglypuff', 'NinjaStraight', 'Ryu', 'sth_Super',
-'AkuAku', 'Cororon', 'judo', 'NinjaTriangle', 'Samurai', 'sth_Tails',
-'android', 'Cowboy', 'junior', 'OldMan', 'Samus', 'stormcloud',
-'angel', 'crown', 'Ken', 'OrangeHair', 'Santa', 'stormtrooper',
-'anzac', 'cyborg', 'KirbyMask', 'orange', 'SauceBoatSilver', 'StrawHatEyes',
-'apple', 'darthvader', 'kiss_criss', 'Pantsu', 'ShaggyYeti', 'StrawHatFacial',
-'ash', 'Deer', 'kiss_frehley', 'Pig', 'sheep', 'StrawHat',
-'Balrog', 'diglett', 'kiss_simmons', 'pikachu', 'ShortHair_Black', 'Sunglasses',
-'banana', 'Disguise', 'kiss_stanley', 'PinkHair', 'ShortHair_Brown', 'SunWukong',
-'Bandit', 'Dragon', 'knight', 'pinksunhat', 'ShortHair_Grey', 'Teacup',
-'beaver', 'dwarf', 'Kululun', 'pirate_jack_bandana', 'ShortHair_Red', 'Teapot',
-'beefeater', 'eastertop', 'Ladle', 'pirate_jack', 'ShortHair_Yellow', 'Terminator_Glasses',
-'Blanka', 'Elvis', 'lambda', 'Plunger', 'Skull', 'test',
-'BlankaToothless', 'Eva_00b', 'Laminaria', 'policecap', 'Sleepwalker', 'thug',
-'BlueCap', 'Eva_00y', 'laurel', 'porkey', 'slowpoke', 'Toad',
-'BlueHair', 'Falcon', 'lemon', 'PrincessDaisy', 'Sniper', 'tophats',
-'Bob', 'Gasmask', 'link', 'PrincessPeach', 'Sonic', 'ushanka',
-'BrainSlugMouth', 'Geordi', 'lugia', 'Pumpkin_Hat', 'SparkleSuperFun', 'Vega',
-'BrainSlug', 'Glasses', 'Luigi', 'PurpleHair', 'spartan', 'venom',
-'Bub', 'GreenCap', 'Mario', 'quotecap', 'spidey', 'Viking',
-'Bunny', 'GreenHair', 'MegaHogX', 'Rain', 'squirtle', 'voltorb',
-'charmander', 'GreyHair', 'mickey_ears', 'Rambo', 'sth_AmyClassic', 'Wario',
-'chef', 'Guile', 'Moose', 'rasta', 'sth_Amy', 'WhySoSerious',
-'chikorita', 'HogInTheHat', 'mp3', 'RedCap', 'sth_Eggman', 'WizardHat',
-'Chunli', 'Honda', 'mudkip', 'RedHair', 'sth_Knux', 'YellowCap',
-'clown-copper', 'IndianChief', 'Mummy', 'RobinHood', 'sth_Metal', 'YellowHair',
-'clown-crossed', 'InfernalHorns', 'naruto', 'royalguard', 'sth_Shadow', 'Zombi',
-'clown', 'Jason', 'NinjaFull', 'RSR', 'sth_Sonic'];
+/*var masks = ['2001suit2', '2001suit', '4gsuif', 'AkuAku', 'android', 'angel', 'anzac', 'apple', 'ash', 'Balrog', 'banana', 'Bandit', 'bat', 'beaver', 'beefeater', 'Blanka', 'BlankaToothless', 'BlueCap', 'BlueHair', 'bobby2v', 'bobby', 'Bob', 'BrainSlugMouth', 'BrainSlug', 'britishpithhelmet', 'britmedic', 'britsapper', 'Bub', 'Bunny', 'bushhider', 'charlesdegaulle', 'charmander', 'chef', 'chikorita', 'Chunli', 'clown-copper', 'clown-crossed', 'clown', 'Coonskin3', 'Cororon', 'Cowboy', 'crown', 'cyborg', 'darthvader', 'Deer', 'desertgrenadier01', 'desertgrenadier02', 'desertgrenadier04', 'desertgrenadier05', 'desertgrenadierofficer', 'desertmedic', 'desertsapper1', 'desertsapper2', 'diglett', 'Disguise', 'Dragon', 'dwarf', 'eastertop', 'Elvis', 'Eva_00b', 'Eva_00y', 'Falcon', 'frenchwwigasmask', 'frenchwwihelmet', 'Gasmask', 'Geordi', 'germanwiimedichelmet', 'germanwwihelmetmustache', 'germanwwiipithhelmetdes', 'germanwwitankhelmet', 'Glasses', 'GreenCap', 'GreenHair', 'grenadier1', 'GreyHair', 'Guile', 'hedgehogk', 'HogInTheHat', 'hogpharoah', 'Honda', 'IndianChief', 'infernalhorns', 'InfernalHorns', 'Jason', 'jigglypuff', 'judo', 'junior', 'Ken', 'KirbyMask', 'kiss_criss', 'kiss_frehley', 'kiss_simmons', 'kiss_stanley', 'knight', 'Kululun', 'Ladle', 'lambda', 'Laminaria', 'laurel', 'lemon', 'link', 'lugia', 'Luigi', 'Mario', 'MegaHogX', 'metalband', 'mexicansunbrero', 'mickey_ears', 'Moose', 'mp3', 'mudkip', 'Mummy', 'naruto', 'NinjaFull', 'NinjaStraight', 'NinjaTriangle', 'OldMan', 'OrangeHair', 'orange', 'Pantsu', 'Pig', 'pikachu', 'PinkHair', 'pinksunhat', 'pirate_jack_bandana', 'pirate_jack', 'plainpith', 'Plunger', 'policecap', 'porkey', 'PrincessDaisy', 'PrincessPeach', 'Pumpkin_Hat', 'PurpleHair', 'quotecap', 'Rain', 'Rambo', 'rasta', 'RedCap', 'RedHair', 'RobinHood', 'royalguard', 'RSR', 'Ryu', 'Samurai', 'Samus', 'Santa', 'SauceBoatSilver', 'ShaggyYeti', 'sheep', 'ShortHair_Black', 'ShortHair_Brown', 'ShortHair_Grey', 'ShortHair_Red', 'ShortHair_Yellow', 'Skull', 'Sleepwalker', 'slowpoke', 'Sniper', 'Sonic', 'sovietcomrade2', 'sovietcomrade', 'SparkleSuperFun', 'SparkssHelmet', 'spartan', 'spcartman', 'spidey', 'spkenny', 'spkyle', 'spstan', 'squirtle', 'sth_AmyClassic', 'sth_Amy', 'sth_Eggman', 'sth_Knux', 'sth_Metal', 'sth_Shadow', 'sth_Sonic', 'sth_Super', 'sth_Tails', 'stormcloud', 'stormtrooper', 'StrawHatEyes', 'StrawHatFacial', 'StrawHat', 'Sunglasses', 'SunWukong', 'Teacup', 'Teapot', 'terminatorc', 'Terminator_Glasses', 'thug', 'Toad', 'tophats', 'touhou_chen', 'touhou_marisa', 'touhou_patchouli', 'touhou_remelia', 'touhou_suwako', 'touhou_yukari', 'trenchgrenadier1', 'trenchgrenadier2', 'trenchgrenadier3', 'ushanka', 'vampirichog', 'Vega', 'venom', 'Viking', 'voltorb', 'Wario', 'WhySoSerious', 'WizardHat', 'YellowCap', 'YellowHair', 'Zombi'];*/
+var masks = [];
var themes = {
+"Golf":1,
"Stage":1,
"Island":0,
"Eyes":0,
@@ -107,6 +80,21 @@
var animationInterval;
window.onload = function()
{
+ var xml=new XMLHttpRequest();
+ xml.open("GET", "/hg/share/hedgewars/Data/Graphics/Hats/", false);
+ xml.send(null);
+ /*var resp = xml.responseXML; unfortunately not served as XHTML
+ var a = resp.getElementsByTagName("a");
+ for(var i=0;i<a.length;i++);
+ if (/\.png/.test(a[0].href)) m.push(a[0].replace(/.png/,''));*/
+
+ var resp = xml.responseText;
+ var r = />([^<]*).png</g;
+ var x;
+ while(x = r.exec(resp))
+ if (!/^Team|NoHat/.test(x[1])) // Exclude team coloured ones as repetitive, NoHat one as uninteresting
+ masks.push(x[1]);
+
var opt = document.createElement("option");
opt.appendChild(document.createTextNode(""));
var sel = document.body.appendChild(document.createElement("select"));
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/misc/quazip/CMakeLists.txt Wed Sep 14 22:39:39 2011 +0200
@@ -0,0 +1,12 @@
+set(QT_USE_QTCORE TRUE)
+
+find_package(Qt4 REQUIRED)
+include(${QT_USE_FILE})
+
+
+file(GLOB SRCS "*.c" "*.cpp")
+file(GLOB PUBLIC_HEADERS "*.h")
+qt4_wrap_cpp(MOC_SRCS "quazipfile.h")
+set(SRCS ${SRCS} ${MOC_SRCS})
+
+add_library(quazip STATIC ${SRCS})
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/misc/quazip/JlCompress.cpp Wed Sep 14 22:39:39 2011 +0200
@@ -0,0 +1,468 @@
+#include "JlCompress.h"
+#include <QDebug>
+/**OK
+ * Comprime il file fileName, nell'oggetto zip, con il nome fileDest.
+ *
+ * La funzione fallisce se:
+ * * zip==NULL;
+ * * l'oggetto zip è stato aperto in una modalità non compatibile con l'aggiunta di file;
+ * * non è possibile aprire il file d'origine;
+ * * non è possibile creare il file all'interno dell'oggetto zip;
+ * * si è rilevato un errore nella copia dei dati;
+ * * non è stato possibile chiudere il file all'interno dell'oggetto zip;
+ */
+bool JlCompress::compressFile(QuaZip* zip, QString fileName, QString fileDest) {
+ // zip: oggetto dove aggiungere il file
+ // fileName: nome del file reale
+ // fileDest: nome del file all'interno del file compresso
+
+ // Controllo l'apertura dello zip
+ if (!zip) return false;
+ if (zip->getMode()!=QuaZip::mdCreate &&
+ zip->getMode()!=QuaZip::mdAppend &&
+ zip->getMode()!=QuaZip::mdAdd) return false;
+
+ // Apro il file originale
+ QFile inFile;
+ inFile.setFileName(fileName);
+ if(!inFile.open(QIODevice::ReadOnly)) return false;
+
+ // Apro il file risulato
+ QuaZipFile outFile(zip);
+ if(!outFile.open(QIODevice::WriteOnly, QuaZipNewInfo(fileDest, inFile.fileName()))) return false;
+
+ // Copio i dati
+ char c;
+ while(inFile.getChar(&c)&&outFile.putChar(c));
+ if(outFile.getZipError()!=UNZ_OK) return false;
+
+ // Chiudo i file
+ outFile.close();
+ if (outFile.getZipError()!=UNZ_OK) return false;
+ inFile.close();
+
+ return true;
+}
+
+/**OK
+ * Comprime la cartella dir nel file fileCompressed, se recursive è true allora
+ * comprime anche le sotto cartelle. I nomi dei file preceduti dal path creato
+ * togliendo il pat della cartella origDir al path della cartella dir.
+ * Se la funzione fallisce restituisce false e cancella il file che si è tentato
+ * di creare.
+ *
+ * La funzione fallisce se:
+ * * zip==NULL;
+ * * l'oggetto zip è stato aperto in una modalità non compatibile con l'aggiunta di file;
+ * * la cartella dir non esiste;
+ * * la compressione di una sotto cartella fallisce (1);
+ * * la compressione di un file fallisce;
+ * (1) La funzione si richiama in maniera ricorsiva per comprimere le sotto cartelle
+ * dunque gli errori di compressione di una sotto cartella sono gli stessi di questa
+ * funzione.
+ */
+bool JlCompress::compressSubDir(QuaZip* zip, QString dir, QString origDir, bool recursive) {
+ // zip: oggetto dove aggiungere il file
+ // dir: cartella reale corrente
+ // origDir: cartella reale originale
+ // (path(dir)-path(origDir)) = path interno all'oggetto zip
+
+ // Controllo l'apertura dello zip
+ if (!zip) return false;
+ if (zip->getMode()!=QuaZip::mdCreate &&
+ zip->getMode()!=QuaZip::mdAppend &&
+ zip->getMode()!=QuaZip::mdAdd) return false;
+
+ // Controllo la cartella
+ QDir directory(dir);
+ if (!directory.exists()) return false;
+
+ // Se comprimo anche le sotto cartelle
+ if (recursive) {
+ // Per ogni sotto cartella
+ QFileInfoList files = directory.entryInfoList(QDir::AllDirs|QDir::NoDotAndDotDot);
+ foreach (QFileInfo file, files) {
+ // Comprimo la sotto cartella
+ if(!compressSubDir(zip,file.absoluteFilePath(),origDir,recursive)) return false;
+ }
+ }
+
+ // Per ogni file nella cartella
+ QFileInfoList files = directory.entryInfoList(QDir::Files);
+ QDir origDirectory(origDir);
+ foreach (QFileInfo file, files) {
+ // Se non è un file o è il file compresso che sto creando
+ if(!file.isFile()||file.absoluteFilePath()==zip->getZipName()) continue;
+
+ // Creo il nome relativo da usare all'interno del file compresso
+ QString filename = origDirectory.relativeFilePath(file.absoluteFilePath());
+
+ // Comprimo il file
+ if (!compressFile(zip,file.absoluteFilePath(),filename)) return false;
+ }
+
+ return true;
+}
+
+/**OK
+ * Estrae il file fileName, contenuto nell'oggetto zip, con il nome fileDest.
+ * Se la funzione fallisce restituisce false e cancella il file che si è tentato di estrarre.
+ *
+ * La funzione fallisce se:
+ * * zip==NULL;
+ * * l'oggetto zip è stato aperto in una modalità non compatibile con l'estrazione di file;
+ * * non è possibile aprire il file all'interno dell'oggetto zip;
+ * * non è possibile creare il file estratto;
+ * * si è rilevato un errore nella copia dei dati (1);
+ * * non è stato possibile chiudere il file all'interno dell'oggetto zip (1);
+ *
+ * (1): prima di uscire dalla funzione cancella il file estratto.
+ */
+bool JlCompress::extractFile(QuaZip* zip, QString fileName, QString fileDest) {
+ // zip: oggetto dove aggiungere il file
+ // filename: nome del file reale
+ // fileincompress: nome del file all'interno del file compresso
+
+ // Controllo l'apertura dello zip
+ if (!zip) return false;
+ if (zip->getMode()!=QuaZip::mdUnzip) return false;
+
+ // Apro il file compresso
+ zip->setCurrentFile(fileName);
+ QuaZipFile inFile(zip);
+ if(!inFile.open(QIODevice::ReadOnly) || inFile.getZipError()!=UNZ_OK) return false;
+
+ // Controllo esistenza cartella file risultato
+ QDir().mkpath(QFileInfo(fileDest).absolutePath());
+
+ // Apro il file risultato
+ QFile outFile;
+ outFile.setFileName(fileDest);
+ if(!outFile.open(QIODevice::WriteOnly)) return false;
+
+ // Copio i dati
+ char c;
+ while(inFile.getChar(&c)) outFile.putChar(c);
+ if (inFile.getZipError()!=UNZ_OK) {
+ removeFile(QStringList(fileDest));
+ return false;
+ }
+
+ // Chiudo i file
+ inFile.close();
+ if (inFile.getZipError()!=UNZ_OK) {
+ removeFile(QStringList(fileDest));
+ return false;
+ }
+ outFile.close();
+
+ return true;
+}
+
+/**
+ * Rimuove i file il cui nome è specificato all'interno di listFile.
+ * Restituisce true se tutti i file sono stati cancellati correttamente, attenzione
+ * perchè può restituire false anche se alcuni file non esistevano e si è tentato
+ * di cancellarli.
+ */
+bool JlCompress::removeFile(QStringList listFile) {
+ bool ret = true;
+ // Per ogni file
+ for (int i=0; i<listFile.count(); i++) {
+ // Lo elimino
+ ret = ret && QFile::remove(listFile.at(i));
+ }
+ return ret;
+}
+
+////////////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////////////
+/**OK
+ * Comprime il file fileName nel file fileCompressed.
+ * Se la funzione fallisce restituisce false e cancella il file che si è tentato
+ * di creare.
+ *
+ * La funzione fallisce se:
+ * * non si riesce ad aprire l'oggetto zip;
+ * * la compressione del file fallisce;
+ * * non si riesce a chiudere l'oggetto zip;
+ */
+bool JlCompress::compressFile(QString fileCompressed, QString file) {
+ // Creo lo zip
+ QuaZip* zip = new QuaZip(QFileInfo(fileCompressed).absoluteFilePath());
+ QDir().mkpath(QFileInfo(fileCompressed).absolutePath());
+ if(!zip->open(QuaZip::mdCreate)) {
+ delete zip;
+ QFile::remove(fileCompressed);
+ return false;
+ }
+
+ // Aggiungo il file
+ if (!compressFile(zip,file,QFileInfo(file).fileName())) {
+ delete zip;
+ QFile::remove(fileCompressed);
+ return false;
+ }
+
+ // Chiudo il file zip
+ zip->close();
+ if(zip->getZipError()!=0) {
+ delete zip;
+ QFile::remove(fileCompressed);
+ return false;
+ }
+ delete zip;
+
+ return true;
+}
+
+/**OK
+ * Comprime i file specificati in files nel file fileCompressed.
+ * Se la funzione fallisce restituisce false e cancella il file che si è tentato
+ * di creare.
+ *
+ * La funzione fallisce se:
+ * * non si riesce ad aprire l'oggetto zip;
+ * * la compressione di un file fallisce;
+ * * non si riesce a chiudere l'oggetto zip;
+ */
+bool JlCompress::compressFiles(QString fileCompressed, QStringList files) {
+ // Creo lo zip
+ QuaZip* zip = new QuaZip(QFileInfo(fileCompressed).absoluteFilePath());
+ QDir().mkpath(QFileInfo(fileCompressed).absolutePath());
+ if(!zip->open(QuaZip::mdCreate)) {
+ delete zip;
+ QFile::remove(fileCompressed);
+ return false;
+ }
+
+ // Comprimo i file
+ QFileInfo info;
+ foreach (QString file, files) {
+ info.setFile(file);
+ if (!info.exists() || !compressFile(zip,file,info.fileName())) {
+ delete zip;
+ QFile::remove(fileCompressed);
+ return false;
+ }
+ }
+
+ // Chiudo il file zip
+ zip->close();
+ if(zip->getZipError()!=0) {
+ delete zip;
+ QFile::remove(fileCompressed);
+ return false;
+ }
+ delete zip;
+
+ return true;
+}
+
+/**OK
+ * Comprime la cartella dir nel file fileCompressed, se recursive è true allora
+ * comprime anche le sotto cartelle.
+ * Se la funzione fallisce restituisce false e cancella il file che si è tentato
+ * di creare.
+ *
+ * La funzione fallisce se:
+ * * non si riesce ad aprire l'oggetto zip;
+ * * la compressione di un file fallisce;
+ * * non si riesce a chiudere l'oggetto zip;
+ */
+bool JlCompress::compressDir(QString fileCompressed, QString dir, bool recursive) {
+ // Creo lo zip
+ QuaZip* zip = new QuaZip(QFileInfo(fileCompressed).absoluteFilePath());
+ QDir().mkpath(QFileInfo(fileCompressed).absolutePath());
+ if(!zip->open(QuaZip::mdCreate)) {
+ delete zip;
+ QFile::remove(fileCompressed);
+ return false;
+ }
+
+ // Aggiungo i file e le sotto cartelle
+ if (!compressSubDir(zip,dir,dir,recursive)<0) {
+ delete zip;
+ QFile::remove(fileCompressed);
+ return false;
+ }
+
+ // Chiudo il file zip
+ zip->close();
+ if(zip->getZipError()!=0) {
+ delete zip;
+ QFile::remove(fileCompressed);
+ return false;
+ }
+ delete zip;
+
+ return true;
+}
+
+////////////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////////////
+/**OK
+ * Estrae il file fileName, contenuto nel file fileCompressed, con il nome fileDest.
+ * Se fileDest = "" allora il file viene estratto con lo stesso nome con cui è
+ * stato compresso.
+ * Se la funzione fallisce cancella il file che si è tentato di estrarre.
+ * Restituisce il nome assoluto del file estratto.
+ *
+ * La funzione fallisce se:
+ * * non si riesce ad aprire l'oggetto zip;
+ * * l'estrazione del file fallisce;
+ * * non si riesce a chiudere l'oggetto zip;
+ */
+QString JlCompress::extractFile(QString fileCompressed, QString fileName, QString fileDest) {
+ // Apro lo zip
+ QuaZip* zip = new QuaZip(QFileInfo(fileCompressed).absoluteFilePath());
+ if(!zip->open(QuaZip::mdUnzip)) {
+ delete zip;
+ return QString();
+ }
+
+ // Estraggo il file
+ if (fileDest.isEmpty()) fileDest = fileName;
+ if (!extractFile(zip,fileName,fileDest)) {
+ delete zip;
+ return QString();
+ }
+
+ // Chiudo il file zip
+ zip->close();
+ if(zip->getZipError()!=0) {
+ removeFile(QStringList(fileDest));
+ return QString();
+ }
+ delete zip;
+
+ return QFileInfo(fileDest).absoluteFilePath();
+}
+
+/**OK
+ * Estrae i file specificati in files, contenuti nel file fileCompressed, nella
+ * cartella dir. La struttura a cartelle del file compresso viene rispettata.
+ * Se dir = "" allora il file viene estratto nella cartella corrente.
+ * Se la funzione fallisce cancella i file che si è tentato di estrarre.
+ * Restituisce i nomi assoluti dei file estratti.
+ *
+ * La funzione fallisce se:
+ * * non si riesce ad aprire l'oggetto zip;
+ * * l'estrazione di un file fallisce;
+ * * non si riesce a chiudere l'oggetto zip;
+ */
+QStringList JlCompress::extractFiles(QString fileCompressed, QStringList files, QString dir) {
+ // Creo lo zip
+ QuaZip* zip = new QuaZip(QFileInfo(fileCompressed).absoluteFilePath());
+ if(!zip->open(QuaZip::mdUnzip)) {
+ delete zip;
+ return QStringList();
+ }
+
+ // Estraggo i file
+ for (int i=0; i<files.count(); i++) {
+ if (!extractFile(zip, files.at(i), QDir(dir).absoluteFilePath(files.at(i)))) {
+ delete zip;
+ removeFile(files);
+ return QStringList();
+ }
+ files[i] = QDir(dir).absoluteFilePath(files.at(i));
+ }
+
+ // Chiudo il file zip
+ zip->close();
+ if(zip->getZipError()!=0) {
+ delete zip;
+ removeFile(files);
+ return QStringList();
+ }
+ delete zip;
+
+ return files;
+}
+
+/**OK
+ * Estrae il file fileCompressed nella cartella dir.
+ * Se dir = "" allora il file viene estratto nella cartella corrente.
+ * Se la funzione fallisce cancella i file che si è tentato di estrarre.
+ * Restituisce i nomi assoluti dei file estratti.
+ *
+ * La funzione fallisce se:
+ * * non si riesce ad aprire l'oggetto zip;
+ * * la compressione di un file fallisce;
+ * * non si riesce a chiudere l'oggetto zip;
+ */
+QStringList JlCompress::extractDir(QString fileCompressed, QString dir) {
+ // Apro lo zip
+ QuaZip* zip = new QuaZip(QFileInfo(fileCompressed).absoluteFilePath());
+ if(!zip->open(QuaZip::mdUnzip)) {
+ delete zip;
+ return QStringList();
+ }
+
+ // Estraggo i file
+ QStringList lst = getFileList(fileCompressed);
+
+ QDir directory(dir);
+ for (int i=0; i<lst.count(); i++) {
+ QString absFilePath = directory.absoluteFilePath(lst.at(i));
+ if (!extractFile(zip, lst.at(i), absFilePath)) {
+ delete zip;
+ removeFile(lst);
+ return QStringList();
+ }
+ lst[i] = absFilePath;
+ }
+
+ // Chiudo il file zip
+ zip->close();
+ if(zip->getZipError()!=0) {
+ delete zip;
+ removeFile(lst);
+ return QStringList();
+ }
+ delete zip;
+
+ return lst;
+}
+
+/**OK
+ * Restituisce la lista dei file resenti nel file compresso fileCompressed.
+ * Se la funzione fallisce, restituisce un elenco vuoto.
+ *
+ * La funzione fallisce se:
+ * * non si riesce ad aprire l'oggetto zip;
+ * * la richiesta di informazioni di un file fallisce;
+ * * non si riesce a chiudere l'oggetto zip;
+ */
+QStringList JlCompress::getFileList(QString fileCompressed) {
+ // Apro lo zip
+ QuaZip* zip = new QuaZip(QFileInfo(fileCompressed).absoluteFilePath());
+ if(!zip->open(QuaZip::mdUnzip)) {
+ delete zip;
+ return QStringList();
+ }
+
+ // Estraggo i nomi dei file
+ QStringList lst;
+ QuaZipFileInfo info;
+ for(bool more=zip->goToFirstFile(); more; more=zip->goToNextFile()) {
+ if(!zip->getCurrentFileInfo(&info)) {
+ delete zip;
+ return QStringList();
+ }
+ lst << info.name;
+ //info.name.toLocal8Bit().constData()
+ }
+
+ // Chiudo il file zip
+ zip->close();
+ if(zip->getZipError()!=0) {
+ delete zip;
+ return QStringList();
+ }
+ delete zip;
+
+ return lst;
+}
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/misc/quazip/JlCompress.h Wed Sep 14 22:39:39 2011 +0200
@@ -0,0 +1,32 @@
+#ifndef JLCOMPRESSFOLDER_H_
+#define JLCOMPRESSFOLDER_H_
+
+#include "quazip.h"
+#include "quazipfile.h"
+#include "quazipfileinfo.h"
+#include <QString>
+#include <QDir>
+#include <QFileInfo>
+#include <QFile>
+
+class QUAZIP_EXPORT JlCompress {
+private:
+ static bool compressFile(QuaZip* zip, QString fileName, QString fileDest);
+ static bool compressSubDir(QuaZip* parentZip, QString dir, QString parentDir, bool recursive = true);
+ static bool extractFile(QuaZip* zip, QString fileName, QString fileDest);
+
+ static bool removeFile(QStringList listFile);
+
+public:
+ static bool compressFile(QString fileCompressed, QString file);
+ static bool compressFiles(QString fileCompressed, QStringList files);
+ static bool compressDir(QString fileCompressed, QString dir = QString(), bool recursive = true);
+
+public:
+ static QString extractFile(QString fileCompressed, QString file, QString fileDest = QString());
+ static QStringList extractFiles(QString fileCompressed, QStringList files, QString dir = QString());
+ static QStringList extractDir(QString fileCompressed, QString dir = QString());
+ static QStringList getFileList(QString fileCompressed);
+};
+
+#endif /* JLCOMPRESSFOLDER_H_ */
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/misc/quazip/crypt.h Wed Sep 14 22:39:39 2011 +0200
@@ -0,0 +1,135 @@
+/* crypt.h -- base code for crypt/uncrypt ZIPfile
+
+
+ Version 1.01e, February 12th, 2005
+
+ Copyright (C) 1998-2005 Gilles Vollant
+
+ This code is a modified version of crypting code in Infozip distribution
+
+ The encryption/decryption parts of this source code (as opposed to the
+ non-echoing password parts) were originally written in Europe. The
+ whole source package can be freely distributed, including from the USA.
+ (Prior to January 2000, re-export from the US was a violation of US law.)
+
+ This encryption code is a direct transcription of the algorithm from
+ Roger Schlafly, described by Phil Katz in the file appnote.txt. This
+ file (appnote.txt) is distributed with the PKZIP program (even in the
+ version without encryption capabilities).
+
+ If you don't need crypting in your application, just define symbols
+ NOCRYPT and NOUNCRYPT.
+
+ This code support the "Traditional PKWARE Encryption".
+
+ The new AES encryption added on Zip format by Winzip (see the page
+ http://www.winzip.com/aes_info.htm ) and PKWare PKZip 5.x Strong
+ Encryption is not supported.
+*/
+
+#include "quazip_global.h"
+
+#define CRC32(c, b) ((*(pcrc_32_tab+(((int)(c) ^ (b)) & 0xff))) ^ ((c) >> 8))
+
+/***********************************************************************
+ * Return the next byte in the pseudo-random sequence
+ */
+static int decrypt_byte(unsigned long* pkeys, const unsigned long* pcrc_32_tab UNUSED)
+{
+ //(void) pcrc_32_tab; /* avoid "unused parameter" warning */
+ unsigned temp; /* POTENTIAL BUG: temp*(temp^1) may overflow in an
+ * unpredictable manner on 16-bit systems; not a problem
+ * with any known compiler so far, though */
+
+ temp = ((unsigned)(*(pkeys+2)) & 0xffff) | 2;
+ return (int)(((temp * (temp ^ 1)) >> 8) & 0xff);
+}
+
+/***********************************************************************
+ * Update the encryption keys with the next byte of plain text
+ */
+static int update_keys(unsigned long* pkeys,const unsigned long* pcrc_32_tab,int c)
+{
+ (*(pkeys+0)) = CRC32((*(pkeys+0)), c);
+ (*(pkeys+1)) += (*(pkeys+0)) & 0xff;
+ (*(pkeys+1)) = (*(pkeys+1)) * 134775813L + 1;
+ {
+ register int keyshift = (int)((*(pkeys+1)) >> 24);
+ (*(pkeys+2)) = CRC32((*(pkeys+2)), keyshift);
+ }
+ return c;
+}
+
+
+/***********************************************************************
+ * Initialize the encryption keys and the random header according to
+ * the given password.
+ */
+static void init_keys(const char* passwd,unsigned long* pkeys,const unsigned long* pcrc_32_tab)
+{
+ *(pkeys+0) = 305419896L;
+ *(pkeys+1) = 591751049L;
+ *(pkeys+2) = 878082192L;
+ while (*passwd != '\0') {
+ update_keys(pkeys,pcrc_32_tab,(int)*passwd);
+ passwd++;
+ }
+}
+
+#define zdecode(pkeys,pcrc_32_tab,c) \
+ (update_keys(pkeys,pcrc_32_tab,c ^= decrypt_byte(pkeys,pcrc_32_tab)))
+
+#define zencode(pkeys,pcrc_32_tab,c,t) \
+ (t=decrypt_byte(pkeys,pcrc_32_tab), update_keys(pkeys,pcrc_32_tab,c), t^(c))
+
+#ifdef INCLUDECRYPTINGCODE_IFCRYPTALLOWED
+
+#define RAND_HEAD_LEN 12
+ /* "last resort" source for second part of crypt seed pattern */
+# ifndef ZCR_SEED2
+# define ZCR_SEED2 3141592654UL /* use PI as default pattern */
+# endif
+
+static int crypthead(passwd, buf, bufSize, pkeys, pcrc_32_tab, crcForCrypting)
+ const char *passwd; /* password string */
+ unsigned char *buf; /* where to write header */
+ int bufSize;
+ unsigned long* pkeys;
+ const unsigned long* pcrc_32_tab;
+ unsigned long crcForCrypting;
+{
+ int n; /* index in random header */
+ int t; /* temporary */
+ int c; /* random byte */
+ unsigned char header[RAND_HEAD_LEN-2]; /* random header */
+ static unsigned calls = 0; /* ensure different random header each time */
+
+ if (bufSize<RAND_HEAD_LEN)
+ return 0;
+
+ /* First generate RAND_HEAD_LEN-2 random bytes. We encrypt the
+ * output of rand() to get less predictability, since rand() is
+ * often poorly implemented.
+ */
+ if (++calls == 1)
+ {
+ srand((unsigned)(time(NULL) ^ ZCR_SEED2));
+ }
+ init_keys(passwd, pkeys, pcrc_32_tab);
+ for (n = 0; n < RAND_HEAD_LEN-2; n++)
+ {
+ c = (rand() >> 7) & 0xff;
+ header[n] = (unsigned char)zencode(pkeys, pcrc_32_tab, c, t);
+ }
+ /* Encrypt random header (last two bytes is high word of crc) */
+ init_keys(passwd, pkeys, pcrc_32_tab);
+ for (n = 0; n < RAND_HEAD_LEN-2; n++)
+ {
+ buf[n] = (unsigned char)zencode(pkeys, pcrc_32_tab, header[n], t);
+ }
+ buf[n++] = zencode(pkeys, pcrc_32_tab, (int)(crcForCrypting >> 16) & 0xff, t);
+ buf[n++] = zencode(pkeys, pcrc_32_tab, (int)(crcForCrypting >> 24) & 0xff, t);
+ return n;
+}
+
+#endif
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/misc/quazip/doc/faq.dox Wed Sep 14 22:39:39 2011 +0200
@@ -0,0 +1,30 @@
+/**
+ * \page faq QuaZip FAQ
+ *
+ * <!--
+ * \ref faq-GPL "Q. Is it possible to release an LGPL version of the QuaZip?"
+ *
+ * \ref faq-non-QIODevice "Q. Is there any way to use QuaZipFile in Qt where you are supposed to use normal (non-zipped) file, but not through QIODevice API?"
+ * -->
+ *
+ * \anchor faq-GPL Q. Is it possible to release an LGPL version of the
+ * QuaZip?
+ *
+ * A. I do not know much about licensing, so I can answer for sure, but
+ * QuaZip was developed using Open Source edition of Qt, so I see no
+ * way it could be released under anything except GPL.
+ *
+ * \anchor faq-non-QIODevice Q. Is there any way to use QuaZipFile in Qt
+ * where you are supposed to use normal (non-zipped) file, but not
+ * through QIODevice API?
+ *
+ * A. Usually not. For example, if you are passing file name to some
+ * database driver (like SQLite), Qt usually just passes this name down
+ * to the 3rd-party library, which is usually does not know anything
+ * about QIODevice and therefore there is no way to pass QuaZipFile as
+ * normal file. However, if we are talking about some place where you
+ * pass file name, and then indirectly use QFile to open it, then it is
+ * a good idea to make overloaded method, which accepts QIODevice
+ * pointer. Then you would be able to pass QuaZipFile as well as many
+ * other nice things such as QBuffer or QProcess.
+ **/
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/misc/quazip/doc/index.dox Wed Sep 14 22:39:39 2011 +0200
@@ -0,0 +1,192 @@
+/**
+ * \mainpage QuaZIP - Qt/C++ wrapper for ZIP/UNZIP package
+ *
+\htmlonly
+<a href="http://sourceforge.net"><img src="http://sourceforge.net/sflogo.php?group_id=142688&type=7" style="width:210; height:62; border:none; float:right;" alt="Powered by SourceForge.net" /></a>
+\endhtmlonly
+ * \section overview Overview
+ *
+ * QuaZIP is a simple C++ wrapper over <a
+ * href="http://www.winimage.com/zLibDll/unzip.html">Gilles Vollant's ZIP/UNZIP
+ * package</a> that can be used to access ZIP archives. It uses <a
+ * href="http://www.trolltech.com/products/qt/index.html">Trolltech's
+ * Qt toolkit</a>.
+ *
+ * If you do not know what Qt is, you have two options:
+ * - Just forget about QuaZIP.
+ * - Learn more about Qt by downloading it and/or reading excellent <a
+ * href="http://doc.trolltech.com/">official Qt documentation</a>
+ *
+ * The choice is yours, but if you are really interested in
+ * cross-platform (Windows/Linux/BSD/UNIX/Mac/Others) software
+ * development, I would definitely recommend you the second choice ^_^
+ *
+ * QuaZIP allows you to access files inside ZIP archives using QIODevice
+ * API, and - yes! - that means that you can also use QTextStream,
+ * QDataStream or whatever you would like to use on your zipped files.
+ *
+ * QuaZIP provides complete abstraction of the ZIP/UNZIP API, for both
+ * reading from and writing to ZIP archives.
+ *
+ * \section platforms Platforms supported
+ *
+ * QuaZIP has been currently tested with Qt 4.0.0 on the following
+ * platforms:
+ * - linux-g++
+ * - freebsd-g++
+ * - hpux-acc
+ * - win32-g++ (MinGW)
+ *
+ * No testing has been done on other systems. Of course, patches to
+ * make it work on any platform that it currently does not work on are
+ * always welcome!
+ *
+ * \section whats-new What is new in this version of QuaZIP?
+ *
+ * See NEWS file supplied with the distribution.
+ *
+ * \section getting Getting latest version of QuaZIP
+ *
+ * Check <a href="http://sourceforge.net/projects/quazip/">QuaZIP
+ * project's page at SourceForge.net</a>. Also, you may wish to read
+ * latest version documentation available at the <a
+ * href="http://quazip.sourceforge.net/">QuaZIP web site</a>.
+ *
+ * \section Requirements
+ *
+ * Just <a href="http://www.zlib.org/">zlib</a> and Qt 4. Well, Qt 4
+ * depends on zlib anyway.
+ *
+ * \section building Building, testing and installing
+ *
+ * \note Instructions given in this section assume that you are
+ * using some UNIX dialect, but the build process should be very similar
+ * on win32-g++ platform too. Sorry, but other platforms are
+ * undocumented. I do not think it is a big deal, though - it is
+ * standard usage of the Qt's qmake, so you most probably already know
+ * everything that is required.
+ *
+ * To build it on some UNIX dialect:
+\verbatim
+$ cd /wherever/quazip/source/is/quazip-x.y.z/quazip
+$ qmake [PREFIX=where-to-install]
+$ make
+\endverbatim
+ *
+ * Make sure that you have Qt 4 installed with all required headers and
+ * utilities (not just library) and that you run qmake utility of the Qt
+ * 4, not some other version you may have already installed (you may
+ * need to type full path to qmake like /usr/local/qt4/bin/qmake).
+ *
+ * To reconfigure (with another PREFIX, for example), just run qmake
+ * with appropriate arguments again.
+ *
+ * If you need to specify additional include path or libraries, use
+ * qmake features (see qmake reference in the Qt documentation). For
+ * example:
+ *
+\verbatim
+$ qmake LIBS+=-L/usr/local/zlib/lib INCLUDEPATH+=/usr/local/zlib/include
+\endverbatim
+ * (note abscence of "-I" before include path)
+ *
+ * To check if QuaZIP's basic features work ok on your platform, you may
+ * wish to compile simple test programs provided in test directory.
+ * Look in the sources of the tests to find out about their
+ * requirements. Typically, the test looks something like this:
+\verbatim
+$ cd /wherever/quazip/source/is/quazip-x.y.z/test/zip
+$ qmake
+$ make
+$ ./zip
+$ cd ../unzip
+$ cp ../zip/test.zip ./test.zip
+$ mkdir out
+$ qmake
+$ make
+$ ./unzip
+\endverbatim
+ *
+ * You should see the zip contents with details as the output of the
+ * "./unzip". Ignore message saying you should check the file name for
+ * testCase() if you do not want to test
+ * \link QuaZip::CaseSensitivity locale-aware case-insensitivity\endlink.
+ * Otherwise, see the sources. In any case, this message appearing means
+ * that everything else was fine. Otherwise, you will get some other error
+ * message instead. Investigate it or send bug report including message,
+ * platform and QuaZIP version used.
+ *
+ * To install compiled library:
+\verbatim
+$ make install
+\endverbatim
+ *
+ * By default, QuaZIP compiles as static library, but you have other
+ * options:
+ * - Just copy appropriate source files to your project and use them;
+ * - Compile QuaZIP as shared library by changing "staticlib" in
+ * quazip/quazip.pro to "dll".
+ *
+ * Latter is not recommended because future versions of QuaZIP most
+ * probably will be binary incompatible.
+ *
+ * \section using Using
+ *
+ * See \ref usage "usage page".
+ *
+ * \section bugs Bugs
+ *
+ * QuaZIP is currently at the initial development stage. Therefore,
+ * there are may be plenty of bugs and other bad things. Bug reports and
+ * patches are always welcome (see "contacts" below).
+ *
+ * \section contacts Authors and contacts
+ *
+ * This wrapper has been written by Sergey A. Tachenov, AKA Alqualos.
+ * This is my first open source project, so it may suck, but I did not
+ * find anything like that, so I just had no other choice but to write
+ * it.
+ *
+ * If you have anything to say to me about QuaZIP library, feel free to
+ * do so (read the \ref faq first, though). I can not promise,
+ * though, that I fix all the bugs you report in, add any features you
+ * want, or respond to your critics, or respond to your feedback at all.
+ * I may be busy, I may be tired of working on QuaZIP, I may be even
+ * dead already (you never know...). But regardless of this remark, any
+ * feedback is always welcome. This may seem like a paradox to you, but
+ * you do not have to understand it to write feedback.
+ *
+ * To report bugs or to post ideas about what should be done, use
+ * SourceForge.net's <a
+ * href="http://sourceforge.net/tracker/?group_id=142688">trackers</a>.
+ * If you want to send me a private message, use my e-mail address
+ * laerel at yandex dot ru (but do not you dare to put it somewhere on
+ * the Web or wherever).
+ *
+ * Do not use e-mail to report bugs, please. Reporting bugs and problems
+ * with the SourceForge.net's bug report system has that advantage that
+ * it is visible to public.
+ *
+ * \section other-projects My other projects
+ *
+ * As of this moment, I did not write any other useful open source
+ * software (well, I am too lazy to do it) except for one little thing:
+ *
+ * <a href="http://brededor.narod.ru/progs/arcanum50patch.htm">Arcanum
+ * universal cap remover</a>. Arcanum is the old but very good game,
+ * which has one stupid limit: your character maximum level is 50, which
+ * is too low for many players including me. So I wrote this simple
+ * patch to increase this stupid limit to something acceptable.
+ *
+ * Also, my first Web project, which can be of any interest to you only
+ * if you can read Russian and you are crazy ^_- This is a web site with
+ * the main topic of it being The Delirium. It is totally meaningless
+ * and it was purposely made to be such. Do not ask me why - I do not
+ * know either. I just did that. If you are interested, then welcome to
+ * <a href="http://brededor.narod.ru/">The Brededor</a>. It does not get
+ * updated lately because I have become even lazier than I ever was. But
+ * I do not plan to destroy The Brededor no matter what, because I think
+ * it is fun.
+ *
+ * Copyright (C) 2005-2007 Sergey A. Tachenov
+ **/
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/misc/quazip/doc/usage.dox Wed Sep 14 22:39:39 2011 +0200
@@ -0,0 +1,69 @@
+/** \page usage Usage
+ *
+ * This page provides general information on QuaZIP usage. See classes
+ * QuaZip and QuaZipFile for the detailed documentation on what can
+ * QuaZIP do and what can not. Also, reading comments in the zip.h and
+ * unzip.h files (taken from the original ZIP/UNZIP package) is always a
+ * good idea too. After all, QuaZIP is just a wrapper with a few
+ * convenience extensions and reimplementations.
+ *
+ * QuaZip is a class representing ZIP archive, QuaZipFile represents a
+ * file inside archive and subclasses QIODevice as well.
+ *
+ * \section terminology Terminology
+ *
+ * "QuaZIP" means whole this library, while "QuaZip" (not case
+ * difference) is just one class in it.
+ *
+ * "ZIP/UNZIP API" means the original API of the Gilles Vollant's
+ * ZIP/UNZIP package. I did not alter it in any way to make it easier to
+ * port to the future ZIP/UNZIP versions.
+ *
+ * "ZIP", "ZIP archive" or "ZIP file" means any ZIP archive. Typically
+ * this is a plain file with ".zip" (or ".ZIP") file name suffix.
+ *
+ * "A file inside archive", "a file inside ZIP" or something like that
+ * means file either being read or written from/to some ZIP archive.
+ *
+ * \section error-handling Error handling
+ *
+ * Almost any call to ZIP/UNZIP API return some error code. Most of the
+ * original API's error checking could be done in this wrapper as well,
+ * but it would cause unnecessary code bloating without any benefit. So,
+ * QuaZIP only checks for situations that ZIP/UNZIP API can not check
+ * for. For example, ZIP/UNZIP API has no "ZIP open mode" concept
+ * because read and write modes are completely separated. On the other
+ * hand, to avoid creating classes like "QuaZipReader", "QuaZipWriter"
+ * or something like that, QuaZIP introduces "ZIP open mode" concept
+ * instead, thus making it possible to use one class (QuaZip) for both
+ * reading and writing. But this leads to additional open mode checks
+ * which are not done in ZIP/UNZIP package.
+ *
+ * Therefore, error checking is two-level (QuaZIP's level and ZIP/UNZIP
+ * API level), which sometimes can be confusing, so here are some
+ * advices on how the error checking should be properly done:
+ *
+ * - Both QuaZip and QuaZipFile have getZipError() function, which return
+ * error code of the last ZIP/UNZIP API call. Most function calls
+ * reset error code to UNZ_OK on success and set error code on
+ * failure. Some functions do not reset error code. Most of them are
+ * \c const and do not access ZIP archive in any way. Some, on the
+ * other hand, \em do access ZIP archive, but do not reset or set
+ * error code. For example, QuaZipFile::pos() function. Such functions
+ * are explicitly marked in the documentation.
+ * - Most functions have its own way to report errors, by returning a
+ * null string, negative value or \c false. If such a function returns
+ * error value, call getZipError() to get more information about
+ * error. See "zip.h" and "unzip.h" of the ZIP/UNZIP package for error
+ * codes.
+ * - If the function returns error-stating value (like \c false), but
+ * getZipError() returns UNZ_OK, it means that you did something
+ * obviously wrong. For example, tried to write in the archive open
+ * for reading or not open at all. You better just do not do that!
+ * Most functions also issue a warning using qWarning() function in
+ * such cases. See documentation for a specific function for details
+ * on when it should not be called.
+ *
+ * I know that this is somewhat messy, but I could not find a better way
+ * to do all the error handling.
+ **/
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/misc/quazip/ioapi.h Wed Sep 14 22:39:39 2011 +0200
@@ -0,0 +1,77 @@
+/* ioapi.h -- IO base function header for compress/uncompress .zip
+ files using zlib + zip or unzip API
+
+ Version 1.01e, February 12th, 2005
+
+ Copyright (C) 1998-2005 Gilles Vollant
+
+ Modified by Sergey A. Tachenov to integrate with Qt.
+*/
+
+#ifndef _ZLIBIOAPI_H
+#define _ZLIBIOAPI_H
+
+
+#define ZLIB_FILEFUNC_SEEK_CUR (1)
+#define ZLIB_FILEFUNC_SEEK_END (2)
+#define ZLIB_FILEFUNC_SEEK_SET (0)
+
+#define ZLIB_FILEFUNC_MODE_READ (1)
+#define ZLIB_FILEFUNC_MODE_WRITE (2)
+#define ZLIB_FILEFUNC_MODE_READWRITEFILTER (3)
+
+#define ZLIB_FILEFUNC_MODE_EXISTING (4)
+#define ZLIB_FILEFUNC_MODE_CREATE (8)
+
+
+#ifndef ZCALLBACK
+
+#if (defined(WIN32) || defined (WINDOWS) || defined (_WINDOWS)) && defined(CALLBACK) && defined (USEWINDOWS_CALLBACK)
+#define ZCALLBACK CALLBACK
+#else
+#define ZCALLBACK
+#endif
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef voidpf (ZCALLBACK *open_file_func) OF((voidpf opaque, voidpf file, int mode));
+typedef uLong (ZCALLBACK *read_file_func) OF((voidpf opaque, voidpf stream, void* buf, uLong size));
+typedef uLong (ZCALLBACK *write_file_func) OF((voidpf opaque, voidpf stream, const void* buf, uLong size));
+typedef uLong (ZCALLBACK *tell_file_func) OF((voidpf opaque, voidpf stream));
+typedef int (ZCALLBACK *seek_file_func) OF((voidpf opaque, voidpf stream, uLong offset, int origin));
+typedef int (ZCALLBACK *close_file_func) OF((voidpf opaque, voidpf stream));
+typedef int (ZCALLBACK *testerror_file_func) OF((voidpf opaque, voidpf stream));
+
+typedef struct zlib_filefunc_def_s
+{
+ open_file_func zopen_file;
+ read_file_func zread_file;
+ write_file_func zwrite_file;
+ tell_file_func ztell_file;
+ seek_file_func zseek_file;
+ close_file_func zclose_file;
+ testerror_file_func zerror_file;
+ voidpf opaque;
+} zlib_filefunc_def;
+
+
+
+void fill_qiodevice_filefunc OF((zlib_filefunc_def* pzlib_filefunc_def));
+
+#define ZREAD(filefunc,filestream,buf,size) ((*((filefunc).zread_file))((filefunc).opaque,filestream,buf,size))
+#define ZWRITE(filefunc,filestream,buf,size) ((*((filefunc).zwrite_file))((filefunc).opaque,filestream,buf,size))
+#define ZTELL(filefunc,filestream) ((*((filefunc).ztell_file))((filefunc).opaque,filestream))
+#define ZSEEK(filefunc,filestream,pos,mode) ((*((filefunc).zseek_file))((filefunc).opaque,filestream,pos,mode))
+#define ZCLOSE(filefunc,filestream) ((*((filefunc).zclose_file))((filefunc).opaque,filestream))
+#define ZERROR(filefunc,filestream) ((*((filefunc).zerror_file))((filefunc).opaque,filestream))
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/misc/quazip/qioapi.cpp Wed Sep 14 22:39:39 2011 +0200
@@ -0,0 +1,142 @@
+/* ioapi.c -- IO base function header for compress/uncompress .zip
+ files using zlib + zip or unzip API
+
+ Version 1.01e, February 12th, 2005
+
+ Copyright (C) 1998-2005 Gilles Vollant
+
+ Modified by Sergey A. Tachenov to integrate with Qt.
+*/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "zlib.h"
+#include "ioapi.h"
+#include "quazip_global.h"
+#include <QIODevice>
+
+
+/* I've found an old Unix (a SunOS 4.1.3_U1) without all SEEK_* defined.... */
+
+#ifndef SEEK_CUR
+#define SEEK_CUR 1
+#endif
+
+#ifndef SEEK_END
+#define SEEK_END 2
+#endif
+
+#ifndef SEEK_SET
+#define SEEK_SET 0
+#endif
+
+voidpf ZCALLBACK qiodevice_open_file_func (
+ voidpf opaque UNUSED,
+ voidpf file,
+ int mode)
+{
+ QIODevice *iodevice = reinterpret_cast<QIODevice*>(file);
+ if(iodevice->isSequential())
+ return NULL;
+ if ((mode & ZLIB_FILEFUNC_MODE_READWRITEFILTER)==ZLIB_FILEFUNC_MODE_READ)
+ iodevice->open(QIODevice::ReadOnly);
+ else
+ if (mode & ZLIB_FILEFUNC_MODE_EXISTING)
+ iodevice->open(QIODevice::ReadWrite);
+ else
+ if (mode & ZLIB_FILEFUNC_MODE_CREATE)
+ iodevice->open(QIODevice::WriteOnly);
+
+ if(iodevice->isOpen())
+ return iodevice;
+ else
+ return NULL;
+}
+
+
+uLong ZCALLBACK qiodevice_read_file_func (
+ voidpf opaque UNUSED,
+ voidpf stream,
+ void* buf,
+ uLong size)
+{
+ uLong ret;
+ ret = (uLong)((QIODevice*)stream)->read((char*)buf,size);
+ return ret;
+}
+
+
+uLong ZCALLBACK qiodevice_write_file_func (
+ voidpf opaque UNUSED,
+ voidpf stream,
+ const void* buf,
+ uLong size)
+{
+ uLong ret;
+ ret = (uLong)((QIODevice*)stream)->write((char*)buf,size);
+ return ret;
+}
+
+uLong ZCALLBACK qiodevice_tell_file_func (
+ voidpf opaque UNUSED,
+ voidpf stream)
+{
+ uLong ret;
+ ret = ((QIODevice*)stream)->pos();
+ return ret;
+}
+
+int ZCALLBACK qiodevice_seek_file_func (
+ voidpf opaque UNUSED,
+ voidpf stream,
+ uLong offset,
+ int origin)
+{
+ uLong qiodevice_seek_result=0;
+ int ret;
+ switch (origin)
+ {
+ case ZLIB_FILEFUNC_SEEK_CUR :
+ qiodevice_seek_result = ((QIODevice*)stream)->pos() + offset;
+ break;
+ case ZLIB_FILEFUNC_SEEK_END :
+ qiodevice_seek_result = ((QIODevice*)stream)->size() - offset;
+ break;
+ case ZLIB_FILEFUNC_SEEK_SET :
+ qiodevice_seek_result = offset;
+ break;
+ default: return -1;
+ }
+ ret = !((QIODevice*)stream)->seek(qiodevice_seek_result);
+ return ret;
+}
+
+int ZCALLBACK qiodevice_close_file_func (
+ voidpf opaque UNUSED,
+ voidpf stream)
+{
+ ((QIODevice*)stream)->close();
+ return 0;
+}
+
+int ZCALLBACK qiodevice_error_file_func (
+ voidpf opaque UNUSED,
+ voidpf stream)
+{
+ return !((QIODevice*)stream)->errorString().isEmpty();
+}
+
+void fill_qiodevice_filefunc (
+ zlib_filefunc_def* pzlib_filefunc_def)
+{
+ pzlib_filefunc_def->zopen_file = qiodevice_open_file_func;
+ pzlib_filefunc_def->zread_file = qiodevice_read_file_func;
+ pzlib_filefunc_def->zwrite_file = qiodevice_write_file_func;
+ pzlib_filefunc_def->ztell_file = qiodevice_tell_file_func;
+ pzlib_filefunc_def->zseek_file = qiodevice_seek_file_func;
+ pzlib_filefunc_def->zclose_file = qiodevice_close_file_func;
+ pzlib_filefunc_def->zerror_file = qiodevice_error_file_func;
+ pzlib_filefunc_def->opaque = NULL;
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/misc/quazip/quaadler32.cpp Wed Sep 14 22:39:39 2011 +0200
@@ -0,0 +1,28 @@
+#include "quaadler32.h"
+
+#include "zlib.h"
+
+QuaAdler32::QuaAdler32()
+{
+ reset();
+}
+
+quint32 QuaAdler32::calculate(const QByteArray &data)
+{
+ return adler32( adler32(0L, Z_NULL, 0), (const Bytef*)data.data(), data.size() );
+}
+
+void QuaAdler32::reset()
+{
+ checksum = adler32(0L, Z_NULL, 0);
+}
+
+void QuaAdler32::update(const QByteArray &buf)
+{
+ checksum = adler32( checksum, (const Bytef*)buf.data(), buf.size() );
+}
+
+quint32 QuaAdler32::value()
+{
+ return checksum;
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/misc/quazip/quaadler32.h Wed Sep 14 22:39:39 2011 +0200
@@ -0,0 +1,29 @@
+#ifndef QUAADLER32_H
+#define QUAADLER32_H
+
+#include <QByteArray>
+
+#include "quachecksum32.h"
+
+/// Adler32 checksum
+/** \class QuaAdler32 quaadler32.h <quazip/quaadler32.h>
+ * This class wrappers the adler32 function with the QuaChecksum32 interface.
+ * See QuaChecksum32 for more info.
+ */
+class QuaAdler32 : public QuaChecksum32
+{
+
+public:
+ QuaAdler32();
+
+ quint32 calculate(const QByteArray &data);
+
+ void reset();
+ void update(const QByteArray &buf);
+ quint32 value();
+
+private:
+ quint32 checksum;
+};
+
+#endif //QUAADLER32_H
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/misc/quazip/quachecksum32.h Wed Sep 14 22:39:39 2011 +0200
@@ -0,0 +1,54 @@
+#ifndef QUACHECKSUM32_H
+#define QUACHECKSUM32_H
+
+#include <QByteArray>
+#include "quazip_global.h"
+
+/// Checksum interface.
+/** \class QuaChecksum32 quachecksum32.h <quazip/quachecksum32.h>
+ * This is an interface for 32 bit checksums.
+ * Classes implementing this interface can calcunate a certin
+ * checksum in a single step:
+ * \code
+ * QChecksum32 *crc32 = new QuaCrc32();
+ * rasoult = crc32->calculate(data);
+ * \endcode
+ * or by streaming the data:
+ * \code
+ * QChecksum32 *crc32 = new QuaCrc32();
+ * while(!fileA.atEnd())
+ * crc32->update(fileA.read(bufSize));
+ * resoultA = crc32->value();
+ * crc32->reset();
+ * while(!fileB.atEnd())
+ * crc32->update(fileB.read(bufSize));
+ * resoultB = crc32->value();
+ * \endcode
+ */
+class QUAZIP_EXPORT QuaChecksum32
+{
+
+public:
+ ///Calculates the checksum for data.
+ /** \a data source data
+ * \return data checksum
+ *
+ * This function has no efect on the value returned by value().
+ */
+ virtual quint32 calculate(const QByteArray &data) = 0;
+
+ ///Resets the calculation on a checksun for a stream.
+ virtual void reset() = 0;
+
+ ///Updates the calculated checksum for the stream
+ /** \a buf next portion of data from the stream
+ */
+ virtual void update(const QByteArray &buf) = 0;
+
+ ///Value of the checksum calculated for the stream passed throw update().
+ /** \return checksum
+ */
+ virtual quint32 value() = 0;
+};
+
+#endif //QUACHECKSUM32_H
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/misc/quazip/quacrc32.cpp Wed Sep 14 22:39:39 2011 +0200
@@ -0,0 +1,28 @@
+#include "quacrc32.h"
+
+#include "zlib.h"
+
+QuaCrc32::QuaCrc32()
+{
+ reset();
+}
+
+quint32 QuaCrc32::calculate(const QByteArray &data)
+{
+ return crc32( crc32(0L, Z_NULL, 0), (const Bytef*)data.data(), data.size() );
+}
+
+void QuaCrc32::reset()
+{
+ checksum = crc32(0L, Z_NULL, 0);
+}
+
+void QuaCrc32::update(const QByteArray &buf)
+{
+ checksum = crc32( checksum, (const Bytef*)buf.data(), buf.size() );
+}
+
+quint32 QuaCrc32::value()
+{
+ return checksum;
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/misc/quazip/quacrc32.h Wed Sep 14 22:39:39 2011 +0200
@@ -0,0 +1,26 @@
+#ifndef QUACRC32_H
+#define QUACRC32_H
+
+#include "quachecksum32.h"
+
+///CRC32 checksum
+/** \class QuaCrc32 quacrc32.h <quazip/quacrc32.h>
+* This class wrappers the crc32 function with the QuaChecksum32 interface.
+* See QuaChecksum32 for more info.
+*/
+class QUAZIP_EXPORT QuaCrc32 : public QuaChecksum32 {
+
+public:
+ QuaCrc32();
+
+ quint32 calculate(const QByteArray &data);
+
+ void reset();
+ void update(const QByteArray &buf);
+ quint32 value();
+
+private:
+ quint32 checksum;
+};
+
+#endif //QUACRC32_H
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/misc/quazip/quazip.cpp Wed Sep 14 22:39:39 2011 +0200
@@ -0,0 +1,427 @@
+/*
+Copyright (C) 2005-2011 Sergey A. Tachenov
+
+This program is free software; you can redistribute it and/or modify it
+under the terms of the GNU Lesser General Public License as published by
+the Free Software Foundation; either version 2 of the License, or (at
+your option) any later version.
+
+This program 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 Lesser
+General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+See COPYING file for the full LGPL text.
+
+Original ZIP package is copyrighted by Gilles Vollant, see
+quazip/(un)zip.h files for details, basically it's zlib license.
+ **/
+
+#include <QFile>
+
+#include "quazip.h"
+
+class QuaZipPrivate {
+ friend class QuaZip;
+ private:
+ QTextCodec *fileNameCodec, *commentCodec;
+ QString zipName;
+ QIODevice *ioDevice;
+ QString comment;
+ QuaZip::Mode mode;
+ union {
+ unzFile unzFile_f;
+ zipFile zipFile_f;
+ };
+ bool hasCurrentFile_f;
+ int zipError;
+ inline QuaZipPrivate():
+ fileNameCodec(QTextCodec::codecForLocale()),
+ commentCodec(QTextCodec::codecForLocale()),
+ ioDevice(NULL),
+ mode(QuaZip::mdNotOpen),
+ hasCurrentFile_f(false),
+ zipError(UNZ_OK) {}
+ inline QuaZipPrivate(const QString &zipName):
+ fileNameCodec(QTextCodec::codecForLocale()),
+ commentCodec(QTextCodec::codecForLocale()),
+ zipName(zipName),
+ ioDevice(NULL),
+ mode(QuaZip::mdNotOpen),
+ hasCurrentFile_f(false),
+ zipError(UNZ_OK) {}
+ inline QuaZipPrivate(QIODevice *ioDevice):
+ fileNameCodec(QTextCodec::codecForLocale()),
+ commentCodec(QTextCodec::codecForLocale()),
+ ioDevice(ioDevice),
+ mode(QuaZip::mdNotOpen),
+ hasCurrentFile_f(false),
+ zipError(UNZ_OK) {}
+};
+
+QuaZip::QuaZip():
+ p(new QuaZipPrivate())
+{
+}
+
+QuaZip::QuaZip(const QString& zipName):
+ p(new QuaZipPrivate(zipName))
+{
+}
+
+QuaZip::QuaZip(QIODevice *ioDevice):
+ p(new QuaZipPrivate(ioDevice))
+{
+}
+
+QuaZip::~QuaZip()
+{
+ if(isOpen())
+ close();
+ delete p;
+}
+
+bool QuaZip::open(Mode mode, zlib_filefunc_def* ioApi)
+{
+ p->zipError=UNZ_OK;
+ if(isOpen()) {
+ qWarning("QuaZip::open(): ZIP already opened");
+ return false;
+ }
+ QIODevice *ioDevice = p->ioDevice;
+ if (ioDevice == NULL) {
+ if (p->zipName.isEmpty()) {
+ qWarning("QuaZip::open(): set either ZIP file name or IO device first");
+ return false;
+ } else {
+ ioDevice = new QFile(p->zipName);
+ }
+ }
+ switch(mode) {
+ case mdUnzip:
+ p->unzFile_f=unzOpen2(ioDevice, ioApi);
+ if(p->unzFile_f!=NULL) {
+ p->mode=mode;
+ p->ioDevice = ioDevice;
+ return true;
+ } else {
+ p->zipError=UNZ_OPENERROR;
+ if (!p->zipName.isEmpty())
+ delete ioDevice;
+ return false;
+ }
+ case mdCreate:
+ case mdAppend:
+ case mdAdd:
+ p->zipFile_f=zipOpen2(ioDevice,
+ mode==mdCreate?APPEND_STATUS_CREATE:
+ mode==mdAppend?APPEND_STATUS_CREATEAFTER:
+ APPEND_STATUS_ADDINZIP,
+ NULL,
+ ioApi);
+ if(p->zipFile_f!=NULL) {
+ p->mode=mode;
+ p->ioDevice = ioDevice;
+ return true;
+ } else {
+ p->zipError=UNZ_OPENERROR;
+ if (!p->zipName.isEmpty())
+ delete ioDevice;
+ return false;
+ }
+ default:
+ qWarning("QuaZip::open(): unknown mode: %d", (int)mode);
+ if (!p->zipName.isEmpty())
+ delete ioDevice;
+ return false;
+ break;
+ }
+}
+
+void QuaZip::close()
+{
+ p->zipError=UNZ_OK;
+ switch(p->mode) {
+ case mdNotOpen:
+ qWarning("QuaZip::close(): ZIP is not open");
+ return;
+ case mdUnzip:
+ p->zipError=unzClose(p->unzFile_f);
+ break;
+ case mdCreate:
+ case mdAppend:
+ case mdAdd:
+ p->zipError=zipClose(p->zipFile_f, p->commentCodec->fromUnicode(p->comment).constData());
+ break;
+ default:
+ qWarning("QuaZip::close(): unknown mode: %d", (int)p->mode);
+ return;
+ }
+ // opened by name, need to delete the internal IO device
+ if (!p->zipName.isEmpty())
+ delete p->ioDevice;
+ if(p->zipError==UNZ_OK)
+ p->mode=mdNotOpen;
+}
+
+void QuaZip::setZipName(const QString& zipName)
+{
+ if(isOpen()) {
+ qWarning("QuaZip::setZipName(): ZIP is already open!");
+ return;
+ }
+ p->zipName=zipName;
+ p->ioDevice = NULL;
+}
+
+void QuaZip::setIoDevice(QIODevice *ioDevice)
+{
+ if(isOpen()) {
+ qWarning("QuaZip::setIoDevice(): ZIP is already open!");
+ return;
+ }
+ p->ioDevice = ioDevice;
+ p->zipName = QString();
+}
+
+int QuaZip::getEntriesCount()const
+{
+ QuaZip *fakeThis=(QuaZip*)this; // non-const
+ fakeThis->p->zipError=UNZ_OK;
+ if(p->mode!=mdUnzip) {
+ qWarning("QuaZip::getEntriesCount(): ZIP is not open in mdUnzip mode");
+ return -1;
+ }
+ unz_global_info globalInfo;
+ if((fakeThis->p->zipError=unzGetGlobalInfo(p->unzFile_f, &globalInfo))!=UNZ_OK)
+ return p->zipError;
+ return (int)globalInfo.number_entry;
+}
+
+QString QuaZip::getComment()const
+{
+ QuaZip *fakeThis=(QuaZip*)this; // non-const
+ fakeThis->p->zipError=UNZ_OK;
+ if(p->mode!=mdUnzip) {
+ qWarning("QuaZip::getComment(): ZIP is not open in mdUnzip mode");
+ return QString();
+ }
+ unz_global_info globalInfo;
+ QByteArray comment;
+ if((fakeThis->p->zipError=unzGetGlobalInfo(p->unzFile_f, &globalInfo))!=UNZ_OK)
+ return QString();
+ comment.resize(globalInfo.size_comment);
+ if((fakeThis->p->zipError=unzGetGlobalComment(p->unzFile_f, comment.data(), comment.size())) < 0)
+ return QString();
+ fakeThis->p->zipError = UNZ_OK;
+ return p->commentCodec->toUnicode(comment);
+}
+
+bool QuaZip::setCurrentFile(const QString& fileName, CaseSensitivity cs)
+{
+ p->zipError=UNZ_OK;
+ if(p->mode!=mdUnzip) {
+ qWarning("QuaZip::setCurrentFile(): ZIP is not open in mdUnzip mode");
+ return false;
+ }
+ if(fileName.isEmpty()) {
+ p->hasCurrentFile_f=false;
+ return true;
+ }
+ // Unicode-aware reimplementation of the unzLocateFile function
+ if(p->unzFile_f==NULL) {
+ p->zipError=UNZ_PARAMERROR;
+ return false;
+ }
+ if(fileName.length()>MAX_FILE_NAME_LENGTH) {
+ p->zipError=UNZ_PARAMERROR;
+ return false;
+ }
+ bool sens;
+ if(cs==csDefault) {
+#ifdef Q_WS_WIN
+ sens=false;
+#else
+ sens=true;
+#endif
+ } else sens=cs==csSensitive;
+ QString lower, current;
+ if(!sens) lower=fileName.toLower();
+ p->hasCurrentFile_f=false;
+ for(bool more=goToFirstFile(); more; more=goToNextFile()) {
+ current=getCurrentFileName();
+ if(current.isEmpty()) return false;
+ if(sens) {
+ if(current==fileName) break;
+ } else {
+ if(current.toLower()==lower) break;
+ }
+ }
+ return p->hasCurrentFile_f;
+}
+
+bool QuaZip::goToFirstFile()
+{
+ p->zipError=UNZ_OK;
+ if(p->mode!=mdUnzip) {
+ qWarning("QuaZip::goToFirstFile(): ZIP is not open in mdUnzip mode");
+ return false;
+ }
+ p->zipError=unzGoToFirstFile(p->unzFile_f);
+ p->hasCurrentFile_f=p->zipError==UNZ_OK;
+ return p->hasCurrentFile_f;
+}
+
+bool QuaZip::goToNextFile()
+{
+ p->zipError=UNZ_OK;
+ if(p->mode!=mdUnzip) {
+ qWarning("QuaZip::goToFirstFile(): ZIP is not open in mdUnzip mode");
+ return false;
+ }
+ p->zipError=unzGoToNextFile(p->unzFile_f);
+ p->hasCurrentFile_f=p->zipError==UNZ_OK;
+ if(p->zipError==UNZ_END_OF_LIST_OF_FILE)
+ p->zipError=UNZ_OK;
+ return p->hasCurrentFile_f;
+}
+
+bool QuaZip::getCurrentFileInfo(QuaZipFileInfo *info)const
+{
+ QuaZip *fakeThis=(QuaZip*)this; // non-const
+ fakeThis->p->zipError=UNZ_OK;
+ if(p->mode!=mdUnzip) {
+ qWarning("QuaZip::getCurrentFileInfo(): ZIP is not open in mdUnzip mode");
+ return false;
+ }
+ unz_file_info info_z;
+ QByteArray fileName;
+ QByteArray extra;
+ QByteArray comment;
+ if(info==NULL) return false;
+ if(!isOpen()||!hasCurrentFile()) return false;
+ if((fakeThis->p->zipError=unzGetCurrentFileInfo(p->unzFile_f, &info_z, NULL, 0, NULL, 0, NULL, 0))!=UNZ_OK)
+ return false;
+ fileName.resize(info_z.size_filename);
+ extra.resize(info_z.size_file_extra);
+ comment.resize(info_z.size_file_comment);
+ if((fakeThis->p->zipError=unzGetCurrentFileInfo(p->unzFile_f, NULL,
+ fileName.data(), fileName.size(),
+ extra.data(), extra.size(),
+ comment.data(), comment.size()))!=UNZ_OK)
+ return false;
+ info->versionCreated=info_z.version;
+ info->versionNeeded=info_z.version_needed;
+ info->flags=info_z.flag;
+ info->method=info_z.compression_method;
+ info->crc=info_z.crc;
+ info->compressedSize=info_z.compressed_size;
+ info->uncompressedSize=info_z.uncompressed_size;
+ info->diskNumberStart=info_z.disk_num_start;
+ info->internalAttr=info_z.internal_fa;
+ info->externalAttr=info_z.external_fa;
+ info->name=p->fileNameCodec->toUnicode(fileName);
+ info->comment=p->commentCodec->toUnicode(comment);
+ info->extra=extra;
+ info->dateTime=QDateTime(
+ QDate(info_z.tmu_date.tm_year, info_z.tmu_date.tm_mon+1, info_z.tmu_date.tm_mday),
+ QTime(info_z.tmu_date.tm_hour, info_z.tmu_date.tm_min, info_z.tmu_date.tm_sec));
+ return true;
+}
+
+QString QuaZip::getCurrentFileName()const
+{
+ QuaZip *fakeThis=(QuaZip*)this; // non-const
+ fakeThis->p->zipError=UNZ_OK;
+ if(p->mode!=mdUnzip) {
+ qWarning("QuaZip::getCurrentFileName(): ZIP is not open in mdUnzip mode");
+ return QString();
+ }
+ if(!isOpen()||!hasCurrentFile()) return QString();
+ QByteArray fileName(MAX_FILE_NAME_LENGTH, 0);
+ if((fakeThis->p->zipError=unzGetCurrentFileInfo(p->unzFile_f, NULL, fileName.data(), fileName.size(),
+ NULL, 0, NULL, 0))!=UNZ_OK)
+ return QString();
+ return p->fileNameCodec->toUnicode(fileName.constData());
+}
+
+void QuaZip::setFileNameCodec(QTextCodec *fileNameCodec)
+{
+ p->fileNameCodec=fileNameCodec;
+}
+
+void QuaZip::setFileNameCodec(const char *fileNameCodecName)
+{
+ p->fileNameCodec=QTextCodec::codecForName(fileNameCodecName);
+}
+
+QTextCodec *QuaZip::getFileNameCodec()const
+{
+ return p->fileNameCodec;
+}
+
+void QuaZip::setCommentCodec(QTextCodec *commentCodec)
+{
+ p->commentCodec=commentCodec;
+}
+
+void QuaZip::setCommentCodec(const char *commentCodecName)
+{
+ p->commentCodec=QTextCodec::codecForName(commentCodecName);
+}
+
+QTextCodec *QuaZip::getCommentCodec()const
+{
+ return p->commentCodec;
+}
+
+QString QuaZip::getZipName() const
+{
+ return p->zipName;
+}
+
+QIODevice *QuaZip::getIoDevice() const
+{
+ if (!p->zipName.isEmpty()) // opened by name, using an internal QIODevice
+ return NULL;
+ return p->ioDevice;
+}
+
+QuaZip::Mode QuaZip::getMode()const
+{
+ return p->mode;
+}
+
+bool QuaZip::isOpen()const
+{
+ return p->mode!=mdNotOpen;
+}
+
+int QuaZip::getZipError() const
+{
+ return p->zipError;
+}
+
+void QuaZip::setComment(const QString& comment)
+{
+ p->comment=comment;
+}
+
+bool QuaZip::hasCurrentFile()const
+{
+ return p->hasCurrentFile_f;
+}
+
+unzFile QuaZip::getUnzFile()
+{
+ return p->unzFile_f;
+}
+
+zipFile QuaZip::getZipFile()
+{
+ return p->zipFile_f;
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/misc/quazip/quazip.h Wed Sep 14 22:39:39 2011 +0200
@@ -0,0 +1,359 @@
+#ifndef QUA_ZIP_H
+#define QUA_ZIP_H
+
+/*
+Copyright (C) 2005-2011 Sergey A. Tachenov
+
+This program is free software; you can redistribute it and/or modify it
+under the terms of the GNU Lesser General Public License as published by
+the Free Software Foundation; either version 2 of the License, or (at
+your option) any later version.
+
+This program 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 Lesser
+General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+See COPYING file for the full LGPL text.
+
+Original ZIP package is copyrighted by Gilles Vollant, see
+quazip/(un)zip.h files for details, basically it's zlib license.
+ **/
+
+#include <QString>
+#include <QTextCodec>
+
+#include "zip.h"
+#include "unzip.h"
+
+#include "quazip_global.h"
+#include "quazipfileinfo.h"
+
+// just in case it will be defined in the later versions of the ZIP/UNZIP
+#ifndef UNZ_OPENERROR
+// define additional error code
+#define UNZ_OPENERROR -1000
+#endif
+
+class QuaZipPrivate;
+
+/// ZIP archive.
+/** \class QuaZip quazip.h <quazip/quazip.h>
+ * This class implements basic interface to the ZIP archive. It can be
+ * used to read table contents of the ZIP archive and retreiving
+ * information about the files inside it.
+ *
+ * You can also use this class to open files inside archive by passing
+ * pointer to the instance of this class to the constructor of the
+ * QuaZipFile class. But see QuaZipFile::QuaZipFile(QuaZip*, QObject*)
+ * for the possible pitfalls.
+ *
+ * This class is indended to provide interface to the ZIP subpackage of
+ * the ZIP/UNZIP package as well as to the UNZIP subpackage. But
+ * currently it supports only UNZIP.
+ *
+ * The use of this class is simple - just create instance using
+ * constructor, then set ZIP archive file name using setFile() function
+ * (if you did not passed the name to the constructor), then open() and
+ * then use different functions to work with it! Well, if you are
+ * paranoid, you may also wish to call close before destructing the
+ * instance, to check for errors on close.
+ *
+ * You may also use getUnzFile() and getZipFile() functions to get the
+ * ZIP archive handle and use it with ZIP/UNZIP package API directly.
+ *
+ * This class supports localized file names inside ZIP archive, but you
+ * have to set up proper codec with setCodec() function. By default,
+ * locale codec will be used, which is probably ok for UNIX systems, but
+ * will almost certainly fail with ZIP archives created in Windows. This
+ * is because Windows ZIP programs have strange habit of using DOS
+ * encoding for file names in ZIP archives. For example, ZIP archive
+ * with cyrillic names created in Windows will have file names in \c
+ * IBM866 encoding instead of \c WINDOWS-1251. I think that calling one
+ * function is not much trouble, but for true platform independency it
+ * would be nice to have some mechanism for file name encoding auto
+ * detection using locale information. Does anyone know a good way to do
+ * it?
+ **/
+class QUAZIP_EXPORT QuaZip {
+ friend class QuaZipPrivate;
+ public:
+ /// Useful constants.
+ enum Constants {
+ MAX_FILE_NAME_LENGTH=256 /**< Maximum file name length. Taken from
+ \c UNZ_MAXFILENAMEINZIP constant in
+ unzip.c. */
+ };
+ /// Open mode of the ZIP file.
+ enum Mode {
+ mdNotOpen, ///< ZIP file is not open. This is the initial mode.
+ mdUnzip, ///< ZIP file is open for reading files inside it.
+ mdCreate, ///< ZIP file was created with open() call.
+ mdAppend, /**< ZIP file was opened in append mode. This refers to
+ * \c APPEND_STATUS_CREATEAFTER mode in ZIP/UNZIP package
+ * and means that zip is appended to some existing file
+ * what is useful when that file contains
+ * self-extractor code. This is obviously \em not what
+ * you whant to use to add files to the existing ZIP
+ * archive.
+ **/
+ mdAdd ///< ZIP file was opened for adding files in the archive.
+ };
+ /// Case sensitivity for the file names.
+ /** This is what you specify when accessing files in the archive.
+ * Works perfectly fine with any characters thanks to Qt's great
+ * unicode support. This is different from ZIP/UNZIP API, where
+ * only US-ASCII characters was supported.
+ **/
+ enum CaseSensitivity {
+ csDefault=0, ///< Default for platform. Case sensitive for UNIX, not for Windows.
+ csSensitive=1, ///< Case sensitive.
+ csInsensitive=2 ///< Case insensitive.
+ };
+ private:
+ QuaZipPrivate *p;
+ // not (and will not be) implemented
+ QuaZip(const QuaZip& that);
+ // not (and will not be) implemented
+ QuaZip& operator=(const QuaZip& that);
+ public:
+ /// Constructs QuaZip object.
+ /** Call setName() before opening constructed object. */
+ QuaZip();
+ /// Constructs QuaZip object associated with ZIP file \a zipName.
+ QuaZip(const QString& zipName);
+ /// Constructs QuaZip object associated with ZIP file represented by \a ioDevice.
+ /** The IO device must be seekable, otherwise an error will occur when opening. */
+ QuaZip(QIODevice *ioDevice);
+ /// Destroys QuaZip object.
+ /** Calls close() if necessary. */
+ ~QuaZip();
+ /// Opens ZIP file.
+ /**
+ * Argument \a mode specifies open mode of the ZIP archive. See Mode
+ * for details. Note that there is zipOpen2() function in the
+ * ZIP/UNZIP API which accepts \a globalcomment argument, but it
+ * does not use it anywhere, so this open() function does not have this
+ * argument. See setComment() if you need to set global comment.
+ *
+ * If the ZIP file is accessed via explicitly set QIODevice, then
+ * this device is opened in the necessary mode. If the device was
+ * already opened by some other means, then the behaviour is defined by
+ * the device implementation, but generally it is not a very good
+ * idea. For example, QFile will at least issue a warning.
+ *
+ * \return \c true if successful, \c false otherwise.
+ *
+ * \note ZIP/UNZIP API open calls do not return error code - they
+ * just return \c NULL indicating an error. But to make things
+ * easier, quazip.h header defines additional error code \c
+ * UNZ_ERROROPEN and getZipError() will return it if the open call
+ * of the ZIP/UNZIP API returns \c NULL.
+ *
+ * Argument \a ioApi specifies IO function set for ZIP/UNZIP
+ * package to use. See unzip.h, zip.h and ioapi.h for details. Note
+ * that IO API for QuaZip is different from the original package.
+ * The file path argument was changed to be of type \c voidpf, and
+ * QuaZip passes a QIODevice pointer there. This QIODevice is either
+ * set explicitly via setIoDevice() or the QuaZip(QIODevice*)
+ * constructor, or it is created internally when opening the archive
+ * by its file name. The default API (qioapi.cpp) just delegates
+ * everything to the QIODevice API. Not only this allows to use a
+ * QIODevice instead of file name, but also has a nice side effect
+ * of raising the file size limit from 2G to 4G.
+ *
+ * In short: just forget about the \a ioApi argument and you'll be
+ * fine.
+ **/
+ bool open(Mode mode, zlib_filefunc_def *ioApi =NULL);
+ /// Closes ZIP file.
+ /** Call getZipError() to determine if the close was successful. The
+ * underlying QIODevice is also closed, regardless of whether it was
+ * set explicitly or not. */
+ void close();
+ /// Sets the codec used to encode/decode file names inside archive.
+ /** This is necessary to access files in the ZIP archive created
+ * under Windows with non-latin characters in file names. For
+ * example, file names with cyrillic letters will be in \c IBM866
+ * encoding.
+ **/
+ void setFileNameCodec(QTextCodec *fileNameCodec);
+ /// Sets the codec used to encode/decode file names inside archive.
+ /** \overload
+ * Equivalent to calling setFileNameCodec(QTextCodec::codecForName(codecName));
+ **/
+ void setFileNameCodec(const char *fileNameCodecName);
+ /// Returns the codec used to encode/decode comments inside archive.
+ QTextCodec* getFileNameCodec() const;
+ /// Sets the codec used to encode/decode comments inside archive.
+ /** This codec defaults to locale codec, which is probably ok.
+ **/
+ void setCommentCodec(QTextCodec *commentCodec);
+ /// Sets the codec used to encode/decode comments inside archive.
+ /** \overload
+ * Equivalent to calling setCommentCodec(QTextCodec::codecForName(codecName));
+ **/
+ void setCommentCodec(const char *commentCodecName);
+ /// Returns the codec used to encode/decode comments inside archive.
+ QTextCodec* getCommentCodec() const;
+ /// Returns the name of the ZIP file.
+ /** Returns null string if no ZIP file name has been set, for
+ * example when the QuaZip instance is set up to use a QIODevice
+ * instead.
+ * \sa setZipName(), setIoDevice(), getIoDevice()
+ **/
+ QString getZipName() const;
+ /// Sets the name of the ZIP file.
+ /** Does nothing if the ZIP file is open.
+ *
+ * Does not reset error code returned by getZipError().
+ * \sa setIoDevice(), getIoDevice(), getZipName()
+ **/
+ void setZipName(const QString& zipName);
+ /// Returns the device representing this ZIP file.
+ /** Returns null string if no device has been set explicitly, for
+ * example when opening a ZIP file by name.
+ * \sa setIoDevice(), getZipName(), setZipName()
+ **/
+ QIODevice *getIoDevice() const;
+ /// Sets the device representing the ZIP file.
+ /** Does nothing if the ZIP file is open.
+ *
+ * Does not reset error code returned by getZipError().
+ * \sa getIoDevice(), getZipName(), setZipName()
+ **/
+ void setIoDevice(QIODevice *ioDevice);
+ /// Returns the mode in which ZIP file was opened.
+ Mode getMode() const;
+ /// Returns \c true if ZIP file is open, \c false otherwise.
+ bool isOpen() const;
+ /// Returns the error code of the last operation.
+ /** Returns \c UNZ_OK if the last operation was successful.
+ *
+ * Error code resets to \c UNZ_OK every time you call any function
+ * that accesses something inside ZIP archive, even if it is \c
+ * const (like getEntriesCount()). open() and close() calls reset
+ * error code too. See documentation for the specific functions for
+ * details on error detection.
+ **/
+ int getZipError() const;
+ /// Returns number of the entries in the ZIP central directory.
+ /** Returns negative error code in the case of error. The same error
+ * code will be returned by subsequent getZipError() call.
+ **/
+ int getEntriesCount() const;
+ /// Returns global comment in the ZIP file.
+ QString getComment() const;
+ /// Sets global comment in the ZIP file.
+ /** Comment will be written to the archive on close operation.
+ *
+ * \sa open()
+ **/
+ void setComment(const QString& comment);
+ /// Sets the current file to the first file in the archive.
+ /** Returns \c true on success, \c false otherwise. Call
+ * getZipError() to get the error code.
+ **/
+ bool goToFirstFile();
+ /// Sets the current file to the next file in the archive.
+ /** Returns \c true on success, \c false otherwise. Call
+ * getZipError() to determine if there was an error.
+ *
+ * Should be used only in QuaZip::mdUnzip mode.
+ *
+ * \note If the end of file was reached, getZipError() will return
+ * \c UNZ_OK instead of \c UNZ_END_OF_LIST_OF_FILE. This is to make
+ * things like this easier:
+ * \code
+ * for(bool more=zip.goToFirstFile(); more; more=zip.goToNextFile()) {
+ * // do something
+ * }
+ * if(zip.getZipError()==UNZ_OK) {
+ * // ok, there was no error
+ * }
+ * \endcode
+ **/
+ bool goToNextFile();
+ /// Sets current file by its name.
+ /** Returns \c true if successful, \c false otherwise. Argument \a
+ * cs specifies case sensitivity of the file name. Call
+ * getZipError() in the case of a failure to get error code.
+ *
+ * This is not a wrapper to unzLocateFile() function. That is
+ * because I had to implement locale-specific case-insensitive
+ * comparison.
+ *
+ * Here are the differences from the original implementation:
+ *
+ * - If the file was not found, error code is \c UNZ_OK, not \c
+ * UNZ_END_OF_LIST_OF_FILE (see also goToNextFile()).
+ * - If this function fails, it unsets the current file rather than
+ * resetting it back to what it was before the call.
+ *
+ * If \a fileName is null string then this function unsets the
+ * current file and return \c true. Note that you should close the
+ * file first if it is open! See
+ * QuaZipFile::QuaZipFile(QuaZip*,QObject*) for the details.
+ *
+ * Should be used only in QuaZip::mdUnzip mode.
+ *
+ * \sa setFileNameCodec(), CaseSensitivity
+ **/
+ bool setCurrentFile(const QString& fileName, CaseSensitivity cs =csDefault);
+ /// Returns \c true if the current file has been set.
+ bool hasCurrentFile() const;
+ /// Retrieves information about the current file.
+ /** Fills the structure pointed by \a info. Returns \c true on
+ * success, \c false otherwise. In the latter case structure pointed
+ * by \a info remains untouched. If there was an error,
+ * getZipError() returns error code.
+ *
+ * Should be used only in QuaZip::mdUnzip mode.
+ *
+ * Does nothing and returns \c false in any of the following cases.
+ * - ZIP is not open;
+ * - ZIP does not have current file;
+ * - \a info is \c NULL;
+ *
+ * In all these cases getZipError() returns \c UNZ_OK since there
+ * is no ZIP/UNZIP API call.
+ **/
+ bool getCurrentFileInfo(QuaZipFileInfo* info)const;
+ /// Returns the current file name.
+ /** Equivalent to calling getCurrentFileInfo() and then getting \c
+ * name field of the QuaZipFileInfo structure, but faster and more
+ * convenient.
+ *
+ * Should be used only in QuaZip::mdUnzip mode.
+ **/
+ QString getCurrentFileName()const;
+ /// Returns \c unzFile handle.
+ /** You can use this handle to directly call UNZIP part of the
+ * ZIP/UNZIP package functions (see unzip.h).
+ *
+ * \warning When using the handle returned by this function, please
+ * keep in mind that QuaZip class is unable to detect any changes
+ * you make in the ZIP file state (e. g. changing current file, or
+ * closing the handle). So please do not do anything with this
+ * handle that is possible to do with the functions of this class.
+ * Or at least return the handle in the original state before
+ * calling some another function of this class (including implicit
+ * destructor calls and calls from the QuaZipFile objects that refer
+ * to this QuaZip instance!). So if you have changed the current
+ * file in the ZIP archive - then change it back or you may
+ * experience some strange behavior or even crashes.
+ **/
+ unzFile getUnzFile();
+ /// Returns \c zipFile handle.
+ /** You can use this handle to directly call ZIP part of the
+ * ZIP/UNZIP package functions (see zip.h). Warnings about the
+ * getUnzFile() function also apply to this function.
+ **/
+ zipFile getZipFile();
+};
+
+#endif
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/misc/quazip/quazip.pri Wed Sep 14 22:39:39 2011 +0200
@@ -0,0 +1,23 @@
+INCLUDEPATH += $$PWD
+DEPENDPATH += $$PWD
+HEADERS += $$PWD/crypt.h \
+ $$PWD/ioapi.h \
+ $$PWD/JlCompress.h \
+ $$PWD/quaadler32.h \
+ $$PWD/quachecksum32.h \
+ $$PWD/quacrc32.h \
+ $$PWD/quazip.h \
+ $$PWD/quazipfile.h \
+ $$PWD/quazipfileinfo.h \
+ $$PWD/quazipnewinfo.h \
+ $$PWD/unzip.h \
+ $$PWD/zip.h
+SOURCES += $$PWD/qioapi.cpp \
+ $$PWD/JlCompress.cpp \
+ $$PWD/quaadler32.cpp \
+ $$PWD/quacrc32.cpp \
+ $$PWD/quazip.cpp \
+ $$PWD/quazipfile.cpp \
+ $$PWD/quazipnewinfo.cpp \
+ $$PWD/unzip.c \
+ $$PWD/zip.c
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/misc/quazip/quazip.pro Wed Sep 14 22:39:39 2011 +0200
@@ -0,0 +1,77 @@
+TEMPLATE = lib
+CONFIG += qt warn_on
+QT -= gui
+DEPENDPATH += .
+INCLUDEPATH += .
+
+# Input
+HEADERS += \
+ crypt.h\
+ ioapi.h\
+ JlCompress.h\
+ quaadler32.h\
+ quachecksum32.h\
+ quacrc32.h\
+ quazip.h\
+ quazipfile.h\
+ quazipfileinfo.h\
+ quazipnewinfo.h\
+ quazip_global.h\
+ unzip.h\
+ zip.h\
+
+SOURCES += *.c *.cpp
+
+unix:!symbian {
+ headers.path=$$PREFIX/include/quazip
+ headers.files=$$HEADERS
+ target.path=$$PREFIX/lib
+ INSTALLS += headers target
+
+ OBJECTS_DIR=.obj
+ MOC_DIR=.moc
+
+ LIBS += -lz
+}
+
+win32 {
+ headers.path=$$PREFIX/include/quazip
+ headers.files=$$HEADERS
+ target.path=$$PREFIX/lib
+ INSTALLS += headers target
+
+ *-g++*: LIBS += -lz.dll
+ *-msvc*: LIBS += -lzlib
+ *-msvc*: QMAKE_LFLAGS += /IMPLIB:$$DESTDIR\\quazip.lib
+}
+
+
+symbian {
+
+ # Note, on Symbian you may run into troubles with LGPL.
+ # The point is, if your application uses some version of QuaZip,
+ # and a newer binary compatible version of QuaZip is released, then
+ # the users of your application must be able to relink it with the
+ # new QuaZip version. For example, to take advantage of some QuaZip
+ # bug fixes.
+
+ # This is probably best achieved by building QuaZip as a static
+ # library and providing linkable object files of your application,
+ # so users can relink it.
+
+ CONFIG += staticlib
+ CONFIG += debug_and_release
+
+ LIBS += -lezip
+
+ #Export headers to SDK Epoc32/include directory
+ exportheaders.sources = $$HEADERS
+ exportheaders.path = quazip
+ for(header, exportheaders.sources) {
+ BLD_INF_RULES.prj_exports += "$$header $$exportheaders.path/$$basename(header)"
+ }
+}
+
+
+
+DEFINES += QUAZIP_BUILD
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/misc/quazip/quazip_global.h Wed Sep 14 22:39:39 2011 +0200
@@ -0,0 +1,41 @@
+/**
+Copyright (C) 2005-2011 Sergey A. Tachenov
+
+This program is free software; you can redistribute it and/or modify it
+under the terms of the GNU Lesser General Public License as published by
+the Free Software Foundation; either version 2 of the License, or (at
+your option) any later version.
+
+This program 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 Lesser
+General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+See COPYING file for the full LGPL text.
+
+Original ZIP package is copyrighted by Gilles Vollant, see
+quazip/(un)zip.h files for details, basically it's zlib license.
+ */
+
+#ifndef QUAZIP_GLOBAL_H
+#define QUAZIP_GLOBAL_H
+
+#include <QtCore/qglobal.h>
+/**
+ * When building the library with MSVC, QUAZIP_BUILD must be defined.
+ * qglobal.h takes care of defining Q_DECL_* correctly for msvc/gcc.
+ */
+
+#define QUAZIP_EXPORT
+
+#ifdef __GNUC__
+#define UNUSED __attribute__((__unused__))
+#else
+#define UNUSED
+#endif
+
+#endif // QUAZIP_GLOBAL_H
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/misc/quazip/quazipfile.cpp Wed Sep 14 22:39:39 2011 +0200
@@ -0,0 +1,428 @@
+/*
+Copyright (C) 2005-2011 Sergey A. Tachenov
+
+This program is free software; you can redistribute it and/or modify it
+under the terms of the GNU Lesser General Public License as published by
+the Free Software Foundation; either version 2 of the License, or (at
+your option) any later version.
+
+This program 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 Lesser
+General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+See COPYING file for the full LGPL text.
+
+Original ZIP package is copyrighted by Gilles Vollant, see
+quazip/(un)zip.h files for details, basically it's zlib license.
+ **/
+
+#include "quazipfile.h"
+
+using namespace std;
+
+class QuaZipFilePrivate {
+ friend class QuaZipFile;
+ private:
+ QuaZipFile *q;
+ QuaZip *zip;
+ QString fileName;
+ QuaZip::CaseSensitivity caseSensitivity;
+ bool raw;
+ qint64 writePos;
+ // these two are for writing raw files
+ ulong uncompressedSize;
+ quint32 crc;
+ bool internal;
+ int zipError;
+ inline void resetZipError() const {setZipError(UNZ_OK);}
+ // const, but sets zipError!
+ void setZipError(int zipError) const;
+ inline QuaZipFilePrivate(QuaZipFile *q):
+ q(q), zip(NULL), internal(true), zipError(UNZ_OK) {}
+ inline QuaZipFilePrivate(QuaZipFile *q, const QString &zipName):
+ q(q), internal(true), zipError(UNZ_OK)
+ {
+ zip=new QuaZip(zipName);
+ }
+ inline QuaZipFilePrivate(QuaZipFile *q, const QString &zipName, const QString &fileName,
+ QuaZip::CaseSensitivity cs):
+ q(q), internal(true), zipError(UNZ_OK)
+ {
+ zip=new QuaZip(zipName);
+ this->fileName=fileName;
+ this->caseSensitivity=cs;
+ }
+ inline QuaZipFilePrivate(QuaZipFile *q, QuaZip *zip):
+ q(q), zip(zip), internal(false), zipError(UNZ_OK) {}
+ inline ~QuaZipFilePrivate()
+ {
+ if (internal)
+ delete zip;
+ }
+};
+
+QuaZipFile::QuaZipFile():
+ p(new QuaZipFilePrivate(this))
+{
+}
+
+QuaZipFile::QuaZipFile(QObject *parent):
+ QIODevice(parent),
+ p(new QuaZipFilePrivate(this))
+{
+}
+
+QuaZipFile::QuaZipFile(const QString& zipName, QObject *parent):
+ QIODevice(parent),
+ p(new QuaZipFilePrivate(this, zipName))
+{
+}
+
+QuaZipFile::QuaZipFile(const QString& zipName, const QString& fileName,
+ QuaZip::CaseSensitivity cs, QObject *parent):
+ QIODevice(parent),
+ p(new QuaZipFilePrivate(this, zipName, fileName, cs))
+{
+}
+
+QuaZipFile::QuaZipFile(QuaZip *zip, QObject *parent):
+ QIODevice(parent),
+ p(new QuaZipFilePrivate(this, zip))
+{
+}
+
+QuaZipFile::~QuaZipFile()
+{
+ if (isOpen())
+ close();
+ delete p;
+}
+
+QString QuaZipFile::getZipName() const
+{
+ return p->zip==NULL ? QString() : p->zip->getZipName();
+}
+
+QString QuaZipFile::getActualFileName()const
+{
+ p->setZipError(UNZ_OK);
+ if (p->zip == NULL || (openMode() & WriteOnly))
+ return QString();
+ QString name=p->zip->getCurrentFileName();
+ if(name.isNull())
+ p->setZipError(p->zip->getZipError());
+ return name;
+}
+
+void QuaZipFile::setZipName(const QString& zipName)
+{
+ if(isOpen()) {
+ qWarning("QuaZipFile::setZipName(): file is already open - can not set ZIP name");
+ return;
+ }
+ if(p->zip!=NULL && p->internal)
+ delete p->zip;
+ p->zip=new QuaZip(zipName);
+ p->internal=true;
+}
+
+void QuaZipFile::setZip(QuaZip *zip)
+{
+ if(isOpen()) {
+ qWarning("QuaZipFile::setZip(): file is already open - can not set ZIP");
+ return;
+ }
+ if(p->zip!=NULL && p->internal)
+ delete p->zip;
+ p->zip=zip;
+ p->fileName=QString();
+ p->internal=false;
+}
+
+void QuaZipFile::setFileName(const QString& fileName, QuaZip::CaseSensitivity cs)
+{
+ if(p->zip==NULL) {
+ qWarning("QuaZipFile::setFileName(): call setZipName() first");
+ return;
+ }
+ if(!p->internal) {
+ qWarning("QuaZipFile::setFileName(): should not be used when not using internal QuaZip");
+ return;
+ }
+ if(isOpen()) {
+ qWarning("QuaZipFile::setFileName(): can not set file name for already opened file");
+ return;
+ }
+ p->fileName=fileName;
+ p->caseSensitivity=cs;
+}
+
+void QuaZipFilePrivate::setZipError(int zipError) const
+{
+ QuaZipFilePrivate *fakeThis = const_cast<QuaZipFilePrivate*>(this); // non-const
+ fakeThis->zipError=zipError;
+ if(zipError==UNZ_OK)
+ q->setErrorString(QString());
+ else
+ q->setErrorString(q->tr("ZIP/UNZIP API error %1").arg(zipError));
+}
+
+bool QuaZipFile::open(OpenMode mode)
+{
+ return open(mode, NULL);
+}
+
+bool QuaZipFile::open(OpenMode mode, int *method, int *level, bool raw, const char *password)
+{
+ p->resetZipError();
+ if(isOpen()) {
+ qWarning("QuaZipFile::open(): already opened");
+ return false;
+ }
+ if(mode&Unbuffered) {
+ qWarning("QuaZipFile::open(): Unbuffered mode is not supported");
+ return false;
+ }
+ if((mode&ReadOnly)&&!(mode&WriteOnly)) {
+ if(p->internal) {
+ if(!p->zip->open(QuaZip::mdUnzip)) {
+ p->setZipError(p->zip->getZipError());
+ return false;
+ }
+ if(!p->zip->setCurrentFile(p->fileName, p->caseSensitivity)) {
+ p->setZipError(p->zip->getZipError());
+ p->zip->close();
+ return false;
+ }
+ } else {
+ if(p->zip==NULL) {
+ qWarning("QuaZipFile::open(): zip is NULL");
+ return false;
+ }
+ if(p->zip->getMode()!=QuaZip::mdUnzip) {
+ qWarning("QuaZipFile::open(): file open mode %d incompatible with ZIP open mode %d",
+ (int)mode, (int)p->zip->getMode());
+ return false;
+ }
+ if(!p->zip->hasCurrentFile()) {
+ qWarning("QuaZipFile::open(): zip does not have current file");
+ return false;
+ }
+ }
+ p->setZipError(unzOpenCurrentFile3(p->zip->getUnzFile(), method, level, (int)raw, password));
+ if(p->zipError==UNZ_OK) {
+ setOpenMode(mode);
+ p->raw=raw;
+ return true;
+ } else
+ return false;
+ }
+ qWarning("QuaZipFile::open(): open mode %d not supported by this function", (int)mode);
+ return false;
+}
+
+bool QuaZipFile::open(OpenMode mode, const QuaZipNewInfo& info,
+ const char *password, quint32 crc,
+ int method, int level, bool raw,
+ int windowBits, int memLevel, int strategy)
+{
+ zip_fileinfo info_z;
+ p->resetZipError();
+ if(isOpen()) {
+ qWarning("QuaZipFile::open(): already opened");
+ return false;
+ }
+ if((mode&WriteOnly)&&!(mode&ReadOnly)) {
+ if(p->internal) {
+ qWarning("QuaZipFile::open(): write mode is incompatible with internal QuaZip approach");
+ return false;
+ }
+ if(p->zip==NULL) {
+ qWarning("QuaZipFile::open(): zip is NULL");
+ return false;
+ }
+ if(p->zip->getMode()!=QuaZip::mdCreate&&p->zip->getMode()!=QuaZip::mdAppend&&p->zip->getMode()!=QuaZip::mdAdd) {
+ qWarning("QuaZipFile::open(): file open mode %d incompatible with ZIP open mode %d",
+ (int)mode, (int)p->zip->getMode());
+ return false;
+ }
+ info_z.tmz_date.tm_year=info.dateTime.date().year();
+ info_z.tmz_date.tm_mon=info.dateTime.date().month() - 1;
+ info_z.tmz_date.tm_mday=info.dateTime.date().day();
+ info_z.tmz_date.tm_hour=info.dateTime.time().hour();
+ info_z.tmz_date.tm_min=info.dateTime.time().minute();
+ info_z.tmz_date.tm_sec=info.dateTime.time().second();
+ info_z.dosDate = 0;
+ info_z.internal_fa=(uLong)info.internalAttr;
+ info_z.external_fa=(uLong)info.externalAttr;
+ p->setZipError(zipOpenNewFileInZip3(p->zip->getZipFile(),
+ p->zip->getFileNameCodec()->fromUnicode(info.name).constData(), &info_z,
+ info.extraLocal.constData(), info.extraLocal.length(),
+ info.extraGlobal.constData(), info.extraGlobal.length(),
+ p->zip->getCommentCodec()->fromUnicode(info.comment).constData(),
+ method, level, (int)raw,
+ windowBits, memLevel, strategy,
+ password, (uLong)crc));
+ if(p->zipError==UNZ_OK) {
+ p->writePos=0;
+ setOpenMode(mode);
+ p->raw=raw;
+ if(raw) {
+ p->crc=crc;
+ p->uncompressedSize=info.uncompressedSize;
+ }
+ return true;
+ } else
+ return false;
+ }
+ qWarning("QuaZipFile::open(): open mode %d not supported by this function", (int)mode);
+ return false;
+}
+
+bool QuaZipFile::isSequential()const
+{
+ return true;
+}
+
+qint64 QuaZipFile::pos()const
+{
+ if(p->zip==NULL) {
+ qWarning("QuaZipFile::pos(): call setZipName() or setZip() first");
+ return -1;
+ }
+ if(!isOpen()) {
+ qWarning("QuaZipFile::pos(): file is not open");
+ return -1;
+ }
+ if(openMode()&ReadOnly)
+ return unztell(p->zip->getUnzFile());
+ else
+ return p->writePos;
+}
+
+bool QuaZipFile::atEnd()const
+{
+ if(p->zip==NULL) {
+ qWarning("QuaZipFile::atEnd(): call setZipName() or setZip() first");
+ return false;
+ }
+ if(!isOpen()) {
+ qWarning("QuaZipFile::atEnd(): file is not open");
+ return false;
+ }
+ if(openMode()&ReadOnly)
+ return unzeof(p->zip->getUnzFile())==1;
+ else
+ return true;
+}
+
+qint64 QuaZipFile::size()const
+{
+ if(!isOpen()) {
+ qWarning("QuaZipFile::atEnd(): file is not open");
+ return -1;
+ }
+ if(openMode()&ReadOnly)
+ return p->raw?csize():usize();
+ else
+ return p->writePos;
+}
+
+qint64 QuaZipFile::csize()const
+{
+ unz_file_info info_z;
+ p->setZipError(UNZ_OK);
+ if(p->zip==NULL||p->zip->getMode()!=QuaZip::mdUnzip) return -1;
+ p->setZipError(unzGetCurrentFileInfo(p->zip->getUnzFile(), &info_z, NULL, 0, NULL, 0, NULL, 0));
+ if(p->zipError!=UNZ_OK)
+ return -1;
+ return info_z.compressed_size;
+}
+
+qint64 QuaZipFile::usize()const
+{
+ unz_file_info info_z;
+ p->setZipError(UNZ_OK);
+ if(p->zip==NULL||p->zip->getMode()!=QuaZip::mdUnzip) return -1;
+ p->setZipError(unzGetCurrentFileInfo(p->zip->getUnzFile(), &info_z, NULL, 0, NULL, 0, NULL, 0));
+ if(p->zipError!=UNZ_OK)
+ return -1;
+ return info_z.uncompressed_size;
+}
+
+bool QuaZipFile::getFileInfo(QuaZipFileInfo *info)
+{
+ if(p->zip==NULL||p->zip->getMode()!=QuaZip::mdUnzip) return false;
+ p->zip->getCurrentFileInfo(info);
+ p->setZipError(p->zip->getZipError());
+ return p->zipError==UNZ_OK;
+}
+
+void QuaZipFile::close()
+{
+ p->resetZipError();
+ if(p->zip==NULL||!p->zip->isOpen()) return;
+ if(!isOpen()) {
+ qWarning("QuaZipFile::close(): file isn't open");
+ return;
+ }
+ if(openMode()&ReadOnly)
+ p->setZipError(unzCloseCurrentFile(p->zip->getUnzFile()));
+ else if(openMode()&WriteOnly)
+ if(isRaw()) p->setZipError(zipCloseFileInZipRaw(p->zip->getZipFile(), p->uncompressedSize, p->crc));
+ else p->setZipError(zipCloseFileInZip(p->zip->getZipFile()));
+ else {
+ qWarning("Wrong open mode: %d", (int)openMode());
+ return;
+ }
+ if(p->zipError==UNZ_OK) setOpenMode(QIODevice::NotOpen);
+ else return;
+ if(p->internal) {
+ p->zip->close();
+ p->setZipError(p->zip->getZipError());
+ }
+}
+
+qint64 QuaZipFile::readData(char *data, qint64 maxSize)
+{
+ p->setZipError(UNZ_OK);
+ qint64 bytesRead=unzReadCurrentFile(p->zip->getUnzFile(), data, (unsigned)maxSize);
+ if(bytesRead<0) p->setZipError((int)bytesRead);
+ return bytesRead;
+}
+
+qint64 QuaZipFile::writeData(const char* data, qint64 maxSize)
+{
+ p->setZipError(ZIP_OK);
+ p->setZipError(zipWriteInFileInZip(p->zip->getZipFile(), data, (uint)maxSize));
+ if(p->zipError!=ZIP_OK) return -1;
+ else {
+ p->writePos+=maxSize;
+ return maxSize;
+ }
+}
+
+QString QuaZipFile::getFileName() const
+{
+ return p->fileName;
+}
+
+QuaZip::CaseSensitivity QuaZipFile::getCaseSensitivity() const
+{
+ return p->caseSensitivity;
+}
+
+bool QuaZipFile::isRaw() const
+{
+ return p->raw;
+}
+
+int QuaZipFile::getZipError() const
+{
+ return p->zipError;
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/misc/quazip/quazipfile.h Wed Sep 14 22:39:39 2011 +0200
@@ -0,0 +1,433 @@
+#ifndef QUA_ZIPFILE_H
+#define QUA_ZIPFILE_H
+
+/*
+Copyright (C) 2005-2011 Sergey A. Tachenov
+
+This program is free software; you can redistribute it and/or modify it
+under the terms of the GNU Lesser General Public License as published by
+the Free Software Foundation; either version 2 of the License, or (at
+your option) any later version.
+
+This program 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 Lesser
+General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+See COPYING file for the full LGPL text.
+
+Original ZIP package is copyrighted by Gilles Vollant, see
+quazip/(un)zip.h files for details, basically it's zlib license.
+ **/
+
+#include <QIODevice>
+
+#include "quazip_global.h"
+#include "quazip.h"
+#include "quazipnewinfo.h"
+
+class QuaZipFilePrivate;
+
+/// A file inside ZIP archive.
+/** \class QuaZipFile quazipfile.h <quazip/quazipfile.h>
+ * This is the most interesting class. Not only it provides C++
+ * interface to the ZIP/UNZIP package, but also integrates it with Qt by
+ * subclassing QIODevice. This makes possible to access files inside ZIP
+ * archive using QTextStream or QDataStream, for example. Actually, this
+ * is the main purpose of the whole QuaZIP library.
+ *
+ * You can either use existing QuaZip instance to create instance of
+ * this class or pass ZIP archive file name to this class, in which case
+ * it will create internal QuaZip object. See constructors' descriptions
+ * for details. Writing is only possible with the existing instance.
+ *
+ * Note that due to the underlying library's limitation it is not
+ * possible to use multiple QuaZipFile instances to open several files
+ * in the same archive at the same time. If you need to write to
+ * multiple files in parallel, then you should write to temporary files
+ * first, then pack them all at once when you have finished writing. If
+ * you need to read multiple files inside the same archive in parallel,
+ * you should extract them all into a temporary directory first.
+ *
+ * \section quazipfile-sequential Sequential or random-access?
+ *
+ * At the first thought, QuaZipFile has fixed size, the start and the
+ * end and should be therefore considered random-access device. But
+ * there is one major obstacle to making it random-access: ZIP/UNZIP API
+ * does not support seek() operation and the only way to implement it is
+ * through reopening the file and re-reading to the required position,
+ * but this is prohibitively slow.
+ *
+ * Therefore, QuaZipFile is considered to be a sequential device. This
+ * has advantage of availability of the ungetChar() operation (QIODevice
+ * does not implement it properly for non-sequential devices unless they
+ * support seek()). Disadvantage is a somewhat strange behaviour of the
+ * size() and pos() functions. This should be kept in mind while using
+ * this class.
+ *
+ **/
+class QUAZIP_EXPORT QuaZipFile: public QIODevice {
+ friend class QuaZipFilePrivate;
+ Q_OBJECT
+ private:
+ QuaZipFilePrivate *p;
+ // these are not supported nor implemented
+ QuaZipFile(const QuaZipFile& that);
+ QuaZipFile& operator=(const QuaZipFile& that);
+ protected:
+ /// Implementation of the QIODevice::readData().
+ qint64 readData(char *data, qint64 maxSize);
+ /// Implementation of the QIODevice::writeData().
+ qint64 writeData(const char *data, qint64 maxSize);
+ public:
+ /// Constructs a QuaZipFile instance.
+ /** You should use setZipName() and setFileName() or setZip() before
+ * trying to call open() on the constructed object.
+ **/
+ QuaZipFile();
+ /// Constructs a QuaZipFile instance.
+ /** \a parent argument specifies this object's parent object.
+ *
+ * You should use setZipName() and setFileName() or setZip() before
+ * trying to call open() on the constructed object.
+ **/
+ QuaZipFile(QObject *parent);
+ /// Constructs a QuaZipFile instance.
+ /** \a parent argument specifies this object's parent object and \a
+ * zipName specifies ZIP archive file name.
+ *
+ * You should use setFileName() before trying to call open() on the
+ * constructed object.
+ *
+ * QuaZipFile constructed by this constructor can be used for read
+ * only access. Use QuaZipFile(QuaZip*,QObject*) for writing.
+ **/
+ QuaZipFile(const QString& zipName, QObject *parent =NULL);
+ /// Constructs a QuaZipFile instance.
+ /** \a parent argument specifies this object's parent object, \a
+ * zipName specifies ZIP archive file name and \a fileName and \a cs
+ * specify a name of the file to open inside archive.
+ *
+ * QuaZipFile constructed by this constructor can be used for read
+ * only access. Use QuaZipFile(QuaZip*,QObject*) for writing.
+ *
+ * \sa QuaZip::setCurrentFile()
+ **/
+ QuaZipFile(const QString& zipName, const QString& fileName,
+ QuaZip::CaseSensitivity cs =QuaZip::csDefault, QObject *parent =NULL);
+ /// Constructs a QuaZipFile instance.
+ /** \a parent argument specifies this object's parent object.
+ *
+ * \a zip is the pointer to the existing QuaZip object. This
+ * QuaZipFile object then can be used to read current file in the
+ * \a zip or to write to the file inside it.
+ *
+ * \warning Using this constructor for reading current file can be
+ * tricky. Let's take the following example:
+ * \code
+ * QuaZip zip("archive.zip");
+ * zip.open(QuaZip::mdUnzip);
+ * zip.setCurrentFile("file-in-archive");
+ * QuaZipFile file(&zip);
+ * file.open(QIODevice::ReadOnly);
+ * // ok, now we can read from the file
+ * file.read(somewhere, some);
+ * zip.setCurrentFile("another-file-in-archive"); // oops...
+ * QuaZipFile anotherFile(&zip);
+ * anotherFile.open(QIODevice::ReadOnly);
+ * anotherFile.read(somewhere, some); // this is still ok...
+ * file.read(somewhere, some); // and this is NOT
+ * \endcode
+ * So, what exactly happens here? When we change current file in the
+ * \c zip archive, \c file that references it becomes invalid
+ * (actually, as far as I understand ZIP/UNZIP sources, it becomes
+ * closed, but QuaZipFile has no means to detect it).
+ *
+ * Summary: do not close \c zip object or change its current file as
+ * long as QuaZipFile is open. Even better - use another constructors
+ * which create internal QuaZip instances, one per object, and
+ * therefore do not cause unnecessary trouble. This constructor may
+ * be useful, though, if you already have a QuaZip instance and do
+ * not want to access several files at once. Good example:
+ * \code
+ * QuaZip zip("archive.zip");
+ * zip.open(QuaZip::mdUnzip);
+ * // first, we need some information about archive itself
+ * QByteArray comment=zip.getComment();
+ * // and now we are going to access files inside it
+ * QuaZipFile file(&zip);
+ * for(bool more=zip.goToFirstFile(); more; more=zip.goToNextFile()) {
+ * file.open(QIODevice::ReadOnly);
+ * // do something cool with file here
+ * file.close(); // do not forget to close!
+ * }
+ * zip.close();
+ * \endcode
+ **/
+ QuaZipFile(QuaZip *zip, QObject *parent =NULL);
+ /// Destroys a QuaZipFile instance.
+ /** Closes file if open, destructs internal QuaZip object (if it
+ * exists and \em is internal, of course).
+ **/
+ virtual ~QuaZipFile();
+ /// Returns the ZIP archive file name.
+ /** If this object was created by passing QuaZip pointer to the
+ * constructor, this function will return that QuaZip's file name
+ * (or null string if that object does not have file name yet).
+ *
+ * Otherwise, returns associated ZIP archive file name or null
+ * string if there are no name set yet.
+ *
+ * \sa setZipName() getFileName()
+ **/
+ QString getZipName()const;
+ /// Returns a pointer to the associated QuaZip object.
+ /** Returns \c NULL if there is no associated QuaZip or it is
+ * internal (so you will not mess with it).
+ **/
+ QuaZip* getZip()const;
+ /// Returns file name.
+ /** This function returns file name you passed to this object either
+ * by using
+ * QuaZipFile(const QString&,const QString&,QuaZip::CaseSensitivity,QObject*)
+ * or by calling setFileName(). Real name of the file may differ in
+ * case if you used case-insensitivity.
+ *
+ * Returns null string if there is no file name set yet. This is the
+ * case when this QuaZipFile operates on the existing QuaZip object
+ * (constructor QuaZipFile(QuaZip*,QObject*) or setZip() was used).
+ *
+ * \sa getActualFileName
+ **/
+ QString getFileName() const;
+ /// Returns case sensitivity of the file name.
+ /** This function returns case sensitivity argument you passed to
+ * this object either by using
+ * QuaZipFile(const QString&,const QString&,QuaZip::CaseSensitivity,QObject*)
+ * or by calling setFileName().
+ *
+ * Returns unpredictable value if getFileName() returns null string
+ * (this is the case when you did not used setFileName() or
+ * constructor above).
+ *
+ * \sa getFileName
+ **/
+ QuaZip::CaseSensitivity getCaseSensitivity() const;
+ /// Returns the actual file name in the archive.
+ /** This is \em not a ZIP archive file name, but a name of file inside
+ * archive. It is not necessary the same name that you have passed
+ * to the
+ * QuaZipFile(const QString&,const QString&,QuaZip::CaseSensitivity,QObject*),
+ * setFileName() or QuaZip::setCurrentFile() - this is the real file
+ * name inside archive, so it may differ in case if the file name
+ * search was case-insensitive.
+ *
+ * Equivalent to calling getCurrentFileName() on the associated
+ * QuaZip object. Returns null string if there is no associated
+ * QuaZip object or if it does not have a current file yet. And this
+ * is the case if you called setFileName() but did not open the
+ * file yet. So this is perfectly fine:
+ * \code
+ * QuaZipFile file("somezip.zip");
+ * file.setFileName("somefile");
+ * QString name=file.getName(); // name=="somefile"
+ * QString actual=file.getActualFileName(); // actual is null string
+ * file.open(QIODevice::ReadOnly);
+ * QString actual=file.getActualFileName(); // actual can be "SoMeFiLe" on Windows
+ * \endcode
+ *
+ * \sa getZipName(), getFileName(), QuaZip::CaseSensitivity
+ **/
+ QString getActualFileName()const;
+ /// Sets the ZIP archive file name.
+ /** Automatically creates internal QuaZip object and destroys
+ * previously created internal QuaZip object, if any.
+ *
+ * Will do nothing if this file is already open. You must close() it
+ * first.
+ **/
+ void setZipName(const QString& zipName);
+ /// Returns \c true if the file was opened in raw mode.
+ /** If the file is not open, the returned value is undefined.
+ *
+ * \sa open(OpenMode,int*,int*,bool,const char*)
+ **/
+ bool isRaw() const;
+ /// Binds to the existing QuaZip instance.
+ /** This function destroys internal QuaZip object, if any, and makes
+ * this QuaZipFile to use current file in the \a zip object for any
+ * further operations. See QuaZipFile(QuaZip*,QObject*) for the
+ * possible pitfalls.
+ *
+ * Will do nothing if the file is currently open. You must close()
+ * it first.
+ **/
+ void setZip(QuaZip *zip);
+ /// Sets the file name.
+ /** Will do nothing if at least one of the following conditions is
+ * met:
+ * - ZIP name has not been set yet (getZipName() returns null
+ * string).
+ * - This QuaZipFile is associated with external QuaZip. In this
+ * case you should call that QuaZip's setCurrentFile() function
+ * instead!
+ * - File is already open so setting the name is meaningless.
+ *
+ * \sa QuaZip::setCurrentFile
+ **/
+ void setFileName(const QString& fileName, QuaZip::CaseSensitivity cs =QuaZip::csDefault);
+ /// Opens a file for reading.
+ /** Returns \c true on success, \c false otherwise.
+ * Call getZipError() to get error code.
+ *
+ * \note Since ZIP/UNZIP API provides buffered reading only,
+ * QuaZipFile does not support unbuffered reading. So do not pass
+ * QIODevice::Unbuffered flag in \a mode, or open will fail.
+ **/
+ virtual bool open(OpenMode mode);
+ /// Opens a file for reading.
+ /** \overload
+ * Argument \a password specifies a password to decrypt the file. If
+ * it is NULL then this function behaves just like open(OpenMode).
+ **/
+ inline bool open(OpenMode mode, const char *password)
+ {return open(mode, NULL, NULL, false, password);}
+ /// Opens a file for reading.
+ /** \overload
+ * Argument \a password specifies a password to decrypt the file.
+ *
+ * An integers pointed by \a method and \a level will receive codes
+ * of the compression method and level used. See unzip.h.
+ *
+ * If raw is \c true then no decompression is performed.
+ *
+ * \a method should not be \c NULL. \a level can be \c NULL if you
+ * don't want to know the compression level.
+ **/
+ bool open(OpenMode mode, int *method, int *level, bool raw, const char *password =NULL);
+ /// Opens a file for writing.
+ /** \a info argument specifies information about file. It should at
+ * least specify a correct file name. Also, it is a good idea to
+ * specify correct timestamp (by default, current time will be
+ * used). See QuaZipNewInfo.
+ *
+ * Arguments \a password and \a crc provide necessary information
+ * for crypting. Note that you should specify both of them if you
+ * need crypting. If you do not, pass \c NULL as password, but you
+ * still need to specify \a crc if you are going to use raw mode
+ * (see below).
+ *
+ * Arguments \a method and \a level specify compression method and
+ * level.
+ *
+ * If \a raw is \c true, no compression is performed. In this case,
+ * \a crc and uncompressedSize field of the \a info are required.
+ *
+ * Arguments \a windowBits, \a memLevel, \a strategy provide zlib
+ * algorithms tuning. See deflateInit2() in zlib.
+ **/
+ bool open(OpenMode mode, const QuaZipNewInfo& info,
+ const char *password =NULL, quint32 crc =0,
+ int method =Z_DEFLATED, int level =Z_DEFAULT_COMPRESSION, bool raw =false,
+ int windowBits =-MAX_WBITS, int memLevel =DEF_MEM_LEVEL, int strategy =Z_DEFAULT_STRATEGY);
+ /// Returns \c true, but \ref quazipfile-sequential "beware"!
+ virtual bool isSequential()const;
+ /// Returns current position in the file.
+ /** Implementation of the QIODevice::pos(). When reading, this
+ * function is a wrapper to the ZIP/UNZIP unztell(), therefore it is
+ * unable to keep track of the ungetChar() calls (which is
+ * non-virtual and therefore is dangerous to reimplement). So if you
+ * are using ungetChar() feature of the QIODevice, this function
+ * reports incorrect value until you get back characters which you
+ * ungot.
+ *
+ * When writing, pos() returns number of bytes already written
+ * (uncompressed unless you use raw mode).
+ *
+ * \note Although
+ * \ref quazipfile-sequential "QuaZipFile is a sequential device"
+ * and therefore pos() should always return zero, it does not,
+ * because it would be misguiding. Keep this in mind.
+ *
+ * This function returns -1 if the file or archive is not open.
+ *
+ * Error code returned by getZipError() is not affected by this
+ * function call.
+ **/
+ virtual qint64 pos()const;
+ /// Returns \c true if the end of file was reached.
+ /** This function returns \c false in the case of error. This means
+ * that you called this function on either not open file, or a file
+ * in the not open archive or even on a QuaZipFile instance that
+ * does not even have QuaZip instance associated. Do not do that
+ * because there is no means to determine whether \c false is
+ * returned because of error or because end of file was reached.
+ * Well, on the other side you may interpret \c false return value
+ * as "there is no file open to check for end of file and there is
+ * no end of file therefore".
+ *
+ * When writing, this function always returns \c true (because you
+ * are always writing to the end of file).
+ *
+ * Error code returned by getZipError() is not affected by this
+ * function call.
+ **/
+ virtual bool atEnd()const;
+ /// Returns file size.
+ /** This function returns csize() if the file is open for reading in
+ * raw mode, usize() if it is open for reading in normal mode and
+ * pos() if it is open for writing.
+ *
+ * Returns -1 on error, call getZipError() to get error code.
+ *
+ * \note This function returns file size despite that
+ * \ref quazipfile-sequential "QuaZipFile is considered to be sequential device",
+ * for which size() should return bytesAvailable() instead. But its
+ * name would be very misguiding otherwise, so just keep in mind
+ * this inconsistence.
+ **/
+ virtual qint64 size()const;
+ /// Returns compressed file size.
+ /** Equivalent to calling getFileInfo() and then getting
+ * compressedSize field, but more convenient and faster.
+ *
+ * File must be open for reading before calling this function.
+ *
+ * Returns -1 on error, call getZipError() to get error code.
+ **/
+ qint64 csize()const;
+ /// Returns uncompressed file size.
+ /** Equivalent to calling getFileInfo() and then getting
+ * uncompressedSize field, but more convenient and faster. See
+ * getFileInfo() for a warning.
+ *
+ * File must be open for reading before calling this function.
+ *
+ * Returns -1 on error, call getZipError() to get error code.
+ **/
+ qint64 usize()const;
+ /// Gets information about current file.
+ /** This function does the same thing as calling
+ * QuaZip::getCurrentFileInfo() on the associated QuaZip object,
+ * but you can not call getCurrentFileInfo() if the associated
+ * QuaZip is internal (because you do not have access to it), while
+ * you still can call this function in that case.
+ *
+ * File must be open for reading before calling this function.
+ *
+ * Returns \c false in the case of an error.
+ **/
+ bool getFileInfo(QuaZipFileInfo *info);
+ /// Closes the file.
+ /** Call getZipError() to determine if the close was successful.
+ **/
+ virtual void close();
+ /// Returns the error code returned by the last ZIP/UNZIP API call.
+ int getZipError() const;
+};
+
+#endif
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/misc/quazip/quazipfileinfo.h Wed Sep 14 22:39:39 2011 +0200
@@ -0,0 +1,66 @@
+#ifndef QUA_ZIPFILEINFO_H
+#define QUA_ZIPFILEINFO_H
+
+/*
+Copyright (C) 2005-2011 Sergey A. Tachenov
+
+This program is free software; you can redistribute it and/or modify it
+under the terms of the GNU Lesser General Public License as published by
+the Free Software Foundation; either version 2 of the License, or (at
+your option) any later version.
+
+This program 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 Lesser
+General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+See COPYING file for the full LGPL text.
+
+Original ZIP package is copyrighted by Gilles Vollant, see
+quazip/(un)zip.h files for details, basically it's zlib license.
+ **/
+
+#include <QByteArray>
+#include <QDateTime>
+
+#include "quazip_global.h"
+
+/// Information about a file inside archive.
+/** Call QuaZip::getCurrentFileInfo() or QuaZipFile::getFileInfo() to
+ * fill this structure. */
+struct QUAZIP_EXPORT QuaZipFileInfo {
+ /// File name.
+ QString name;
+ /// Version created by.
+ quint16 versionCreated;
+ /// Version needed to extract.
+ quint16 versionNeeded;
+ /// General purpose flags.
+ quint16 flags;
+ /// Compression method.
+ quint16 method;
+ /// Last modification date and time.
+ QDateTime dateTime;
+ /// CRC.
+ quint32 crc;
+ /// Compressed file size.
+ quint32 compressedSize;
+ /// Uncompressed file size.
+ quint32 uncompressedSize;
+ /// Disk number start.
+ quint16 diskNumberStart;
+ /// Internal file attributes.
+ quint16 internalAttr;
+ /// External file attributes.
+ quint32 externalAttr;
+ /// Comment.
+ QString comment;
+ /// Extra field.
+ QByteArray extra;
+};
+
+#endif
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/misc/quazip/quazipnewinfo.cpp Wed Sep 14 22:39:39 2011 +0200
@@ -0,0 +1,51 @@
+/*
+Copyright (C) 2005-2011 Sergey A. Tachenov
+
+This program is free software; you can redistribute it and/or modify it
+under the terms of the GNU Lesser General Public License as published by
+the Free Software Foundation; either version 2 of the License, or (at
+your option) any later version.
+
+This program 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 Lesser
+General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+See COPYING file for the full LGPL text.
+
+Original ZIP package is copyrighted by Gilles Vollant, see
+quazip/(un)zip.h files for details, basically it's zlib license.
+*/
+
+#include <QFileInfo>
+
+#include "quazipnewinfo.h"
+
+
+QuaZipNewInfo::QuaZipNewInfo(const QString& name):
+ name(name), dateTime(QDateTime::currentDateTime()), internalAttr(0), externalAttr(0)
+{
+}
+
+QuaZipNewInfo::QuaZipNewInfo(const QString& name, const QString& file):
+ name(name), internalAttr(0), externalAttr(0)
+{
+ QFileInfo info(file);
+ QDateTime lm = info.lastModified();
+ if (!info.exists())
+ dateTime = QDateTime::currentDateTime();
+ else
+ dateTime = lm;
+}
+
+void QuaZipNewInfo::setFileDateTime(const QString& file)
+{
+ QFileInfo info(file);
+ QDateTime lm = info.lastModified();
+ if (info.exists())
+ dateTime = lm;
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/misc/quazip/quazipnewinfo.h Wed Sep 14 22:39:39 2011 +0200
@@ -0,0 +1,102 @@
+#ifndef QUA_ZIPNEWINFO_H
+#define QUA_ZIPNEWINFO_H
+
+/*
+Copyright (C) 2005-2011 Sergey A. Tachenov
+
+This program is free software; you can redistribute it and/or modify it
+under the terms of the GNU Lesser General Public License as published by
+the Free Software Foundation; either version 2 of the License, or (at
+your option) any later version.
+
+This program 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 Lesser
+General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+See COPYING file for the full LGPL text.
+
+Original ZIP package is copyrighted by Gilles Vollant, see
+quazip/(un)zip.h files for details, basically it's zlib license.
+ **/
+
+#include <QDateTime>
+#include <QString>
+
+#include "quazip_global.h"
+
+/// Information about a file to be created.
+/** This structure holds information about a file to be created inside
+ * ZIP archive. At least name should be set to something correct before
+ * passing this structure to
+ * QuaZipFile::open(OpenMode,const QuaZipNewInfo&,int,int,bool).
+ **/
+struct QUAZIP_EXPORT QuaZipNewInfo {
+ /// File name.
+ /** This field holds file name inside archive, including path relative
+ * to archive root.
+ **/
+ QString name;
+ /// File timestamp.
+ /** This is the last file modification date and time. Will be stored
+ * in the archive central directory. It is a good practice to set it
+ * to the source file timestamp instead of archive creating time. Use
+ * setFileDateTime() or QuaZipNewInfo(const QString&, const QString&).
+ **/
+ QDateTime dateTime;
+ /// File internal attributes.
+ quint16 internalAttr;
+ /// File external attributes.
+ quint32 externalAttr;
+ /// File comment.
+ /** Will be encoded using QuaZip::getCommentCodec().
+ **/
+ QString comment;
+ /// File local extra field.
+ QByteArray extraLocal;
+ /// File global extra field.
+ QByteArray extraGlobal;
+ /// Uncompressed file size.
+ /** This is only needed if you are using raw file zipping mode, i. e.
+ * adding precompressed file in the zip archive.
+ **/
+ ulong uncompressedSize;
+ /// Constructs QuaZipNewInfo instance.
+ /** Initializes name with \a name, dateTime with current date and
+ * time. Attributes are initialized with zeros, comment and extra
+ * field with null values.
+ **/
+ QuaZipNewInfo(const QString& name);
+ /// Constructs QuaZipNewInfo instance.
+ /** Initializes name with \a name and dateTime with timestamp of the
+ * file named \a file. If the \a file does not exists or its timestamp
+ * is inaccessible (e. g. you do not have read permission for the
+ * directory file in), uses current date and time. Attributes are
+ * initialized with zeros, comment and extra field with null values.
+ *
+ * \sa setFileDateTime()
+ **/
+ QuaZipNewInfo(const QString& name, const QString& file);
+ /// Sets the file timestamp from the existing file.
+ /** Use this function to set the file timestamp from the existing
+ * file. Use it like this:
+ * \code
+ * QuaZipFile zipFile(&zip);
+ * QFile file("file-to-add");
+ * file.open(QIODevice::ReadOnly);
+ * QuaZipNewInfo info("file-name-in-archive");
+ * info.setFileDateTime("file-to-add"); // take the timestamp from file
+ * zipFile.open(QIODevice::WriteOnly, info);
+ * \endcode
+ *
+ * This function does not change dateTime if some error occured (e. g.
+ * file is inaccessible).
+ **/
+ void setFileDateTime(const QString& file);
+};
+
+#endif
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/misc/quazip/unzip.c Wed Sep 14 22:39:39 2011 +0200
@@ -0,0 +1,1603 @@
+/* unzip.c -- IO for uncompress .zip files using zlib
+ Version 1.01e, February 12th, 2005
+
+ Copyright (C) 1998-2005 Gilles Vollant
+
+ Read unzip.h for more info
+
+ Modified by Sergey A. Tachenov to integrate with Qt.
+*/
+
+/* Decryption code comes from crypt.c by Info-ZIP but has been greatly reduced in terms of
+compatibility with older software. The following is from the original crypt.c. Code
+woven in by Terry Thorsen 1/2003.
+*/
+/*
+ Copyright (c) 1990-2000 Info-ZIP. All rights reserved.
+
+ See the accompanying file LICENSE, version 2000-Apr-09 or later
+ (the contents of which are also included in zip.h) for terms of use.
+ If, for some reason, all these files are missing, the Info-ZIP license
+ also may be found at: ftp://ftp.info-zip.org/pub/infozip/license.html
+*/
+/*
+ crypt.c (full version) by Info-ZIP. Last revised: [see crypt.h]
+
+ The encryption/decryption parts of this source code (as opposed to the
+ non-echoing password parts) were originally written in Europe. The
+ whole source package can be freely distributed, including from the USA.
+ (Prior to January 2000, re-export from the US was a violation of US law.)
+ */
+
+/*
+ This encryption code is a direct transcription of the algorithm from
+ Roger Schlafly, described by Phil Katz in the file appnote.txt. This
+ file (appnote.txt) is distributed with the PKZIP program (even in the
+ version without encryption capabilities).
+ */
+
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include "zlib.h"
+#include "unzip.h"
+
+#ifdef STDC
+# include <stddef.h>
+# include <string.h>
+# include <stdlib.h>
+#endif
+#ifdef NO_ERRNO_H
+ extern int errno;
+#else
+# include <errno.h>
+#endif
+
+
+#ifndef local
+# define local static
+#endif
+/* compile with -Dlocal if your debugger can't find static symbols */
+
+
+#ifndef CASESENSITIVITYDEFAULT_NO
+# if !defined(unix) && !defined(CASESENSITIVITYDEFAULT_YES)
+# define CASESENSITIVITYDEFAULT_NO
+# endif
+#endif
+
+
+#ifndef UNZ_BUFSIZE
+#define UNZ_BUFSIZE (16384)
+#endif
+
+#ifndef UNZ_MAXFILENAMEINZIP
+#define UNZ_MAXFILENAMEINZIP (256)
+#endif
+
+#ifndef ALLOC
+# define ALLOC(size) (malloc(size))
+#endif
+#ifndef TRYFREE
+# define TRYFREE(p) {if (p) free(p);}
+#endif
+
+#define SIZECENTRALDIRITEM (0x2e)
+#define SIZEZIPLOCALHEADER (0x1e)
+
+
+
+
+const char unz_copyright[] =
+ " unzip 1.01 Copyright 1998-2004 Gilles Vollant - http://www.winimage.com/zLibDll";
+
+/* unz_file_info_interntal contain internal info about a file in zipfile*/
+typedef struct unz_file_info_internal_s
+{
+ uLong offset_curfile;/* relative offset of local header 4 bytes */
+} unz_file_info_internal;
+
+
+/* file_in_zip_read_info_s contain internal information about a file in zipfile,
+ when reading and decompress it */
+typedef struct
+{
+ char *read_buffer; /* internal buffer for compressed data */
+ z_stream stream; /* zLib stream structure for inflate */
+
+ uLong pos_in_zipfile; /* position in byte on the zipfile, for fseek*/
+ uLong stream_initialised; /* flag set if stream structure is initialised*/
+
+ uLong offset_local_extrafield;/* offset of the local extra field */
+ uInt size_local_extrafield;/* size of the local extra field */
+ uLong pos_local_extrafield; /* position in the local extra field in read*/
+
+ uLong crc32; /* crc32 of all data uncompressed */
+ uLong crc32_wait; /* crc32 we must obtain after decompress all */
+ uLong rest_read_compressed; /* number of byte to be decompressed */
+ uLong rest_read_uncompressed;/*number of byte to be obtained after decomp*/
+ zlib_filefunc_def z_filefunc;
+ voidpf filestream; /* io structore of the zipfile */
+ uLong compression_method; /* compression method (0==store) */
+ uLong byte_before_the_zipfile;/* byte before the zipfile, (>0 for sfx)*/
+ int raw;
+} file_in_zip_read_info_s;
+
+
+/* unz_s contain internal information about the zipfile
+*/
+typedef struct
+{
+ zlib_filefunc_def z_filefunc;
+ voidpf filestream; /* io structore of the zipfile */
+ unz_global_info gi; /* public global information */
+ uLong byte_before_the_zipfile;/* byte before the zipfile, (>0 for sfx)*/
+ uLong num_file; /* number of the current file in the zipfile*/
+ uLong pos_in_central_dir; /* pos of the current file in the central dir*/
+ uLong current_file_ok; /* flag about the usability of the current file*/
+ uLong central_pos; /* position of the beginning of the central dir*/
+
+ uLong size_central_dir; /* size of the central directory */
+ uLong offset_central_dir; /* offset of start of central directory with
+ respect to the starting disk number */
+
+ unz_file_info cur_file_info; /* public info about the current file in zip*/
+ unz_file_info_internal cur_file_info_internal; /* private info about it*/
+ file_in_zip_read_info_s* pfile_in_zip_read; /* structure about the current
+ file if we are decompressing it */
+ int encrypted;
+# ifndef NOUNCRYPT
+ unsigned long keys[3]; /* keys defining the pseudo-random sequence */
+ const unsigned long* pcrc_32_tab;
+# endif
+} unz_s;
+
+
+#ifndef NOUNCRYPT
+#include "crypt.h"
+#endif
+
+/* ===========================================================================
+ Read a byte from a gz_stream; update next_in and avail_in. Return EOF
+ for end of file.
+ IN assertion: the stream s has been sucessfully opened for reading.
+*/
+
+
+local int unzlocal_getByte OF((
+ const zlib_filefunc_def* pzlib_filefunc_def,
+ voidpf filestream,
+ int *pi));
+
+local int unzlocal_getByte(pzlib_filefunc_def,filestream,pi)
+ const zlib_filefunc_def* pzlib_filefunc_def;
+ voidpf filestream;
+ int *pi;
+{
+ unsigned char c;
+ int err = (int)ZREAD(*pzlib_filefunc_def,filestream,&c,1);
+ if (err==1)
+ {
+ *pi = (int)c;
+ return UNZ_OK;
+ }
+ else
+ {
+ if (ZERROR(*pzlib_filefunc_def,filestream))
+ return UNZ_ERRNO;
+ else
+ return UNZ_EOF;
+ }
+}
+
+
+/* ===========================================================================
+ Reads a long in LSB order from the given gz_stream. Sets
+*/
+local int unzlocal_getShort OF((
+ const zlib_filefunc_def* pzlib_filefunc_def,
+ voidpf filestream,
+ uLong *pX));
+
+local int unzlocal_getShort (pzlib_filefunc_def,filestream,pX)
+ const zlib_filefunc_def* pzlib_filefunc_def;
+ voidpf filestream;
+ uLong *pX;
+{
+ uLong x ;
+ int i;
+ int err;
+
+ err = unzlocal_getByte(pzlib_filefunc_def,filestream,&i);
+ x = (uLong)i;
+
+ if (err==UNZ_OK)
+ err = unzlocal_getByte(pzlib_filefunc_def,filestream,&i);
+ x += ((uLong)i)<<8;
+
+ if (err==UNZ_OK)
+ *pX = x;
+ else
+ *pX = 0;
+ return err;
+}
+
+local int unzlocal_getLong OF((
+ const zlib_filefunc_def* pzlib_filefunc_def,
+ voidpf filestream,
+ uLong *pX));
+
+local int unzlocal_getLong (pzlib_filefunc_def,filestream,pX)
+ const zlib_filefunc_def* pzlib_filefunc_def;
+ voidpf filestream;
+ uLong *pX;
+{
+ uLong x ;
+ int i;
+ int err;
+
+ err = unzlocal_getByte(pzlib_filefunc_def,filestream,&i);
+ x = (uLong)i;
+
+ if (err==UNZ_OK)
+ err = unzlocal_getByte(pzlib_filefunc_def,filestream,&i);
+ x += ((uLong)i)<<8;
+
+ if (err==UNZ_OK)
+ err = unzlocal_getByte(pzlib_filefunc_def,filestream,&i);
+ x += ((uLong)i)<<16;
+
+ if (err==UNZ_OK)
+ err = unzlocal_getByte(pzlib_filefunc_def,filestream,&i);
+ x += ((uLong)i)<<24;
+
+ if (err==UNZ_OK)
+ *pX = x;
+ else
+ *pX = 0;
+ return err;
+}
+
+
+/* My own strcmpi / strcasecmp */
+local int strcmpcasenosensitive_internal (fileName1,fileName2)
+ const char* fileName1;
+ const char* fileName2;
+{
+ for (;;)
+ {
+ char c1=*(fileName1++);
+ char c2=*(fileName2++);
+ if ((c1>='a') && (c1<='z'))
+ c1 -= 0x20;
+ if ((c2>='a') && (c2<='z'))
+ c2 -= 0x20;
+ if (c1=='\0')
+ return ((c2=='\0') ? 0 : -1);
+ if (c2=='\0')
+ return 1;
+ if (c1<c2)
+ return -1;
+ if (c1>c2)
+ return 1;
+ }
+}
+
+
+#ifdef CASESENSITIVITYDEFAULT_NO
+#define CASESENSITIVITYDEFAULTVALUE 2
+#else
+#define CASESENSITIVITYDEFAULTVALUE 1
+#endif
+
+#ifndef STRCMPCASENOSENTIVEFUNCTION
+#define STRCMPCASENOSENTIVEFUNCTION strcmpcasenosensitive_internal
+#endif
+
+/*
+ Compare two filename (fileName1,fileName2).
+ If iCaseSenisivity = 1, comparision is case sensitivity (like strcmp)
+ If iCaseSenisivity = 2, comparision is not case sensitivity (like strcmpi
+ or strcasecmp)
+ If iCaseSenisivity = 0, case sensitivity is defaut of your operating system
+ (like 1 on Unix, 2 on Windows)
+
+*/
+extern int ZEXPORT unzStringFileNameCompare (fileName1,fileName2,iCaseSensitivity)
+ const char* fileName1;
+ const char* fileName2;
+ int iCaseSensitivity;
+{
+ if (iCaseSensitivity==0)
+ iCaseSensitivity=CASESENSITIVITYDEFAULTVALUE;
+
+ if (iCaseSensitivity==1)
+ return strcmp(fileName1,fileName2);
+
+ return STRCMPCASENOSENTIVEFUNCTION(fileName1,fileName2);
+}
+
+#ifndef BUFREADCOMMENT
+#define BUFREADCOMMENT (0x400)
+#endif
+
+/*
+ Locate the Central directory of a zipfile (at the end, just before
+ the global comment)
+*/
+local uLong unzlocal_SearchCentralDir OF((
+ const zlib_filefunc_def* pzlib_filefunc_def,
+ voidpf filestream));
+
+local uLong unzlocal_SearchCentralDir(pzlib_filefunc_def,filestream)
+ const zlib_filefunc_def* pzlib_filefunc_def;
+ voidpf filestream;
+{
+ unsigned char* buf;
+ uLong uSizeFile;
+ uLong uBackRead;
+ uLong uMaxBack=0xffff; /* maximum size of global comment */
+ uLong uPosFound=0;
+
+ if (ZSEEK(*pzlib_filefunc_def,filestream,0,ZLIB_FILEFUNC_SEEK_END) != 0)
+ return 0;
+
+
+ uSizeFile = ZTELL(*pzlib_filefunc_def,filestream);
+
+ if (uMaxBack>uSizeFile)
+ uMaxBack = uSizeFile;
+
+ buf = (unsigned char*)ALLOC(BUFREADCOMMENT+4);
+ if (buf==NULL)
+ return 0;
+
+ uBackRead = 4;
+ while (uBackRead<uMaxBack)
+ {
+ uLong uReadSize,uReadPos ;
+ int i;
+ if (uBackRead+BUFREADCOMMENT>uMaxBack)
+ uBackRead = uMaxBack;
+ else
+ uBackRead+=BUFREADCOMMENT;
+ uReadPos = uSizeFile-uBackRead ;
+
+ uReadSize = ((BUFREADCOMMENT+4) < (uSizeFile-uReadPos)) ?
+ (BUFREADCOMMENT+4) : (uSizeFile-uReadPos);
+ if (ZSEEK(*pzlib_filefunc_def,filestream,uReadPos,ZLIB_FILEFUNC_SEEK_SET)!=0)
+ break;
+
+ if (ZREAD(*pzlib_filefunc_def,filestream,buf,uReadSize)!=uReadSize)
+ break;
+
+ for (i=(int)uReadSize-3; (i--)>0;)
+ if (((*(buf+i))==0x50) && ((*(buf+i+1))==0x4b) &&
+ ((*(buf+i+2))==0x05) && ((*(buf+i+3))==0x06))
+ {
+ uPosFound = uReadPos+i;
+ break;
+ }
+
+ if (uPosFound!=0)
+ break;
+ }
+ TRYFREE(buf);
+ return uPosFound;
+}
+
+/*
+ Open a Zip file. path contain the full pathname (by example,
+ on a Windows NT computer "c:\\test\\zlib114.zip" or on an Unix computer
+ "zlib/zlib114.zip".
+ If the zipfile cannot be opened (file doesn't exist or in not valid), the
+ return value is NULL.
+ Else, the return value is a unzFile Handle, usable with other function
+ of this unzip package.
+*/
+extern unzFile ZEXPORT unzOpen2 (file, pzlib_filefunc_def)
+ voidpf file;
+ zlib_filefunc_def* pzlib_filefunc_def;
+{
+ unz_s us;
+ unz_s *s;
+ uLong central_pos,uL;
+
+ uLong number_disk; /* number of the current dist, used for
+ spaning ZIP, unsupported, always 0*/
+ uLong number_disk_with_CD; /* number the the disk with central dir, used
+ for spaning ZIP, unsupported, always 0*/
+ uLong number_entry_CD; /* total number of entries in
+ the central dir
+ (same than number_entry on nospan) */
+
+ int err=UNZ_OK;
+
+ if (unz_copyright[0]!=' ')
+ return NULL;
+
+ if (pzlib_filefunc_def==NULL)
+ fill_qiodevice_filefunc(&us.z_filefunc);
+ else
+ us.z_filefunc = *pzlib_filefunc_def;
+
+ us.filestream= (*(us.z_filefunc.zopen_file))(us.z_filefunc.opaque,
+ file,
+ ZLIB_FILEFUNC_MODE_READ |
+ ZLIB_FILEFUNC_MODE_EXISTING);
+ if (us.filestream==NULL)
+ return NULL;
+
+ central_pos = unzlocal_SearchCentralDir(&us.z_filefunc,us.filestream);
+ if (central_pos==0)
+ err=UNZ_ERRNO;
+
+ if (ZSEEK(us.z_filefunc, us.filestream,
+ central_pos,ZLIB_FILEFUNC_SEEK_SET)!=0)
+ err=UNZ_ERRNO;
+
+ /* the signature, already checked */
+ if (unzlocal_getLong(&us.z_filefunc, us.filestream,&uL)!=UNZ_OK)
+ err=UNZ_ERRNO;
+
+ /* number of this disk */
+ if (unzlocal_getShort(&us.z_filefunc, us.filestream,&number_disk)!=UNZ_OK)
+ err=UNZ_ERRNO;
+
+ /* number of the disk with the start of the central directory */
+ if (unzlocal_getShort(&us.z_filefunc, us.filestream,&number_disk_with_CD)!=UNZ_OK)
+ err=UNZ_ERRNO;
+
+ /* total number of entries in the central dir on this disk */
+ if (unzlocal_getShort(&us.z_filefunc, us.filestream,&us.gi.number_entry)!=UNZ_OK)
+ err=UNZ_ERRNO;
+
+ /* total number of entries in the central dir */
+ if (unzlocal_getShort(&us.z_filefunc, us.filestream,&number_entry_CD)!=UNZ_OK)
+ err=UNZ_ERRNO;
+
+ if ((number_entry_CD!=us.gi.number_entry) ||
+ (number_disk_with_CD!=0) ||
+ (number_disk!=0))
+ err=UNZ_BADZIPFILE;
+
+ /* size of the central directory */
+ if (unzlocal_getLong(&us.z_filefunc, us.filestream,&us.size_central_dir)!=UNZ_OK)
+ err=UNZ_ERRNO;
+
+ /* offset of start of central directory with respect to the
+ starting disk number */
+ if (unzlocal_getLong(&us.z_filefunc, us.filestream,&us.offset_central_dir)!=UNZ_OK)
+ err=UNZ_ERRNO;
+
+ /* zipfile comment length */
+ if (unzlocal_getShort(&us.z_filefunc, us.filestream,&us.gi.size_comment)!=UNZ_OK)
+ err=UNZ_ERRNO;
+
+ if ((central_pos<us.offset_central_dir+us.size_central_dir) &&
+ (err==UNZ_OK))
+ err=UNZ_BADZIPFILE;
+
+ if (err!=UNZ_OK)
+ {
+ ZCLOSE(us.z_filefunc, us.filestream);
+ return NULL;
+ }
+
+ us.byte_before_the_zipfile = central_pos -
+ (us.offset_central_dir+us.size_central_dir);
+ us.central_pos = central_pos;
+ us.pfile_in_zip_read = NULL;
+ us.encrypted = 0;
+
+
+ s=(unz_s*)ALLOC(sizeof(unz_s));
+ *s=us;
+ unzGoToFirstFile((unzFile)s);
+ return (unzFile)s;
+}
+
+
+extern unzFile ZEXPORT unzOpen (file)
+ voidpf file;
+{
+ return unzOpen2(file, NULL);
+}
+
+/*
+ Close a ZipFile opened with unzipOpen.
+ If there is files inside the .Zip opened with unzipOpenCurrentFile (see later),
+ these files MUST be closed with unzipCloseCurrentFile before call unzipClose.
+ return UNZ_OK if there is no problem. */
+extern int ZEXPORT unzClose (file)
+ unzFile file;
+{
+ unz_s* s;
+ if (file==NULL)
+ return UNZ_PARAMERROR;
+ s=(unz_s*)file;
+
+ if (s->pfile_in_zip_read!=NULL)
+ unzCloseCurrentFile(file);
+
+ ZCLOSE(s->z_filefunc, s->filestream);
+ TRYFREE(s);
+ return UNZ_OK;
+}
+
+
+/*
+ Write info about the ZipFile in the *pglobal_info structure.
+ No preparation of the structure is needed
+ return UNZ_OK if there is no problem. */
+extern int ZEXPORT unzGetGlobalInfo (file,pglobal_info)
+ unzFile file;
+ unz_global_info *pglobal_info;
+{
+ unz_s* s;
+ if (file==NULL)
+ return UNZ_PARAMERROR;
+ s=(unz_s*)file;
+ *pglobal_info=s->gi;
+ return UNZ_OK;
+}
+
+
+/*
+ Translate date/time from Dos format to tm_unz (readable more easilty)
+*/
+local void unzlocal_DosDateToTmuDate (ulDosDate, ptm)
+ uLong ulDosDate;
+ tm_unz* ptm;
+{
+ uLong uDate;
+ uDate = (uLong)(ulDosDate>>16);
+ ptm->tm_mday = (uInt)(uDate&0x1f) ;
+ ptm->tm_mon = (uInt)((((uDate)&0x1E0)/0x20)-1) ;
+ ptm->tm_year = (uInt)(((uDate&0x0FE00)/0x0200)+1980) ;
+
+ ptm->tm_hour = (uInt) ((ulDosDate &0xF800)/0x800);
+ ptm->tm_min = (uInt) ((ulDosDate&0x7E0)/0x20) ;
+ ptm->tm_sec = (uInt) (2*(ulDosDate&0x1f)) ;
+}
+
+/*
+ Get Info about the current file in the zipfile, with internal only info
+*/
+local int unzlocal_GetCurrentFileInfoInternal OF((unzFile file,
+ unz_file_info *pfile_info,
+ unz_file_info_internal
+ *pfile_info_internal,
+ char *szFileName,
+ uLong fileNameBufferSize,
+ void *extraField,
+ uLong extraFieldBufferSize,
+ char *szComment,
+ uLong commentBufferSize));
+
+local int unzlocal_GetCurrentFileInfoInternal (file,
+ pfile_info,
+ pfile_info_internal,
+ szFileName, fileNameBufferSize,
+ extraField, extraFieldBufferSize,
+ szComment, commentBufferSize)
+ unzFile file;
+ unz_file_info *pfile_info;
+ unz_file_info_internal *pfile_info_internal;
+ char *szFileName;
+ uLong fileNameBufferSize;
+ void *extraField;
+ uLong extraFieldBufferSize;
+ char *szComment;
+ uLong commentBufferSize;
+{
+ unz_s* s;
+ unz_file_info file_info;
+ unz_file_info_internal file_info_internal;
+ int err=UNZ_OK;
+ uLong uMagic;
+ uLong uSeek=0;
+
+ if (file==NULL)
+ return UNZ_PARAMERROR;
+ s=(unz_s*)file;
+ if (ZSEEK(s->z_filefunc, s->filestream,
+ s->pos_in_central_dir+s->byte_before_the_zipfile,
+ ZLIB_FILEFUNC_SEEK_SET)!=0)
+ err=UNZ_ERRNO;
+
+
+ /* we check the magic */
+ if (err==UNZ_OK) {
+ if (unzlocal_getLong(&s->z_filefunc, s->filestream,&uMagic) != UNZ_OK)
+ err=UNZ_ERRNO;
+ else if (uMagic!=0x02014b50)
+ err=UNZ_BADZIPFILE;
+ }
+
+ if (unzlocal_getShort(&s->z_filefunc, s->filestream,&file_info.version) != UNZ_OK)
+ err=UNZ_ERRNO;
+
+ if (unzlocal_getShort(&s->z_filefunc, s->filestream,&file_info.version_needed) != UNZ_OK)
+ err=UNZ_ERRNO;
+
+ if (unzlocal_getShort(&s->z_filefunc, s->filestream,&file_info.flag) != UNZ_OK)
+ err=UNZ_ERRNO;
+
+ if (unzlocal_getShort(&s->z_filefunc, s->filestream,&file_info.compression_method) != UNZ_OK)
+ err=UNZ_ERRNO;
+
+ if (unzlocal_getLong(&s->z_filefunc, s->filestream,&file_info.dosDate) != UNZ_OK)
+ err=UNZ_ERRNO;
+
+ unzlocal_DosDateToTmuDate(file_info.dosDate,&file_info.tmu_date);
+
+ if (unzlocal_getLong(&s->z_filefunc, s->filestream,&file_info.crc) != UNZ_OK)
+ err=UNZ_ERRNO;
+
+ if (unzlocal_getLong(&s->z_filefunc, s->filestream,&file_info.compressed_size) != UNZ_OK)
+ err=UNZ_ERRNO;
+
+ if (unzlocal_getLong(&s->z_filefunc, s->filestream,&file_info.uncompressed_size) != UNZ_OK)
+ err=UNZ_ERRNO;
+
+ if (unzlocal_getShort(&s->z_filefunc, s->filestream,&file_info.size_filename) != UNZ_OK)
+ err=UNZ_ERRNO;
+
+ if (unzlocal_getShort(&s->z_filefunc, s->filestream,&file_info.size_file_extra) != UNZ_OK)
+ err=UNZ_ERRNO;
+
+ if (unzlocal_getShort(&s->z_filefunc, s->filestream,&file_info.size_file_comment) != UNZ_OK)
+ err=UNZ_ERRNO;
+
+ if (unzlocal_getShort(&s->z_filefunc, s->filestream,&file_info.disk_num_start) != UNZ_OK)
+ err=UNZ_ERRNO;
+
+ if (unzlocal_getShort(&s->z_filefunc, s->filestream,&file_info.internal_fa) != UNZ_OK)
+ err=UNZ_ERRNO;
+
+ if (unzlocal_getLong(&s->z_filefunc, s->filestream,&file_info.external_fa) != UNZ_OK)
+ err=UNZ_ERRNO;
+
+ if (unzlocal_getLong(&s->z_filefunc, s->filestream,&file_info_internal.offset_curfile) != UNZ_OK)
+ err=UNZ_ERRNO;
+
+ uSeek+=file_info.size_filename;
+ if ((err==UNZ_OK) && (szFileName!=NULL))
+ {
+ uLong uSizeRead ;
+ if (file_info.size_filename<fileNameBufferSize)
+ {
+ *(szFileName+file_info.size_filename)='\0';
+ uSizeRead = file_info.size_filename;
+ }
+ else
+ uSizeRead = fileNameBufferSize;
+
+ if ((file_info.size_filename>0) && (fileNameBufferSize>0))
+ if (ZREAD(s->z_filefunc, s->filestream,szFileName,uSizeRead)!=uSizeRead)
+ err=UNZ_ERRNO;
+ uSeek -= uSizeRead;
+ }
+
+
+ if ((err==UNZ_OK) && (extraField!=NULL))
+ {
+ uLong uSizeRead ;
+ if (file_info.size_file_extra<extraFieldBufferSize)
+ uSizeRead = file_info.size_file_extra;
+ else
+ uSizeRead = extraFieldBufferSize;
+
+ if (uSeek!=0) {
+ if (ZSEEK(s->z_filefunc, s->filestream,uSeek,ZLIB_FILEFUNC_SEEK_CUR)==0)
+ uSeek=0;
+ else
+ err=UNZ_ERRNO;
+ }
+ if ((file_info.size_file_extra>0) && (extraFieldBufferSize>0))
+ if (ZREAD(s->z_filefunc, s->filestream,extraField,uSizeRead)!=uSizeRead)
+ err=UNZ_ERRNO;
+ uSeek += file_info.size_file_extra - uSizeRead;
+ }
+ else
+ uSeek+=file_info.size_file_extra;
+
+
+ if ((err==UNZ_OK) && (szComment!=NULL))
+ {
+ uLong uSizeRead ;
+ if (file_info.size_file_comment<commentBufferSize)
+ {
+ *(szComment+file_info.size_file_comment)='\0';
+ uSizeRead = file_info.size_file_comment;
+ }
+ else
+ uSizeRead = commentBufferSize;
+
+ if (uSeek!=0) {
+ if (ZSEEK(s->z_filefunc, s->filestream,uSeek,ZLIB_FILEFUNC_SEEK_CUR)==0)
+ uSeek=0;
+ else
+ err=UNZ_ERRNO;
+ }
+ if ((file_info.size_file_comment>0) && (commentBufferSize>0))
+ if (ZREAD(s->z_filefunc, s->filestream,szComment,uSizeRead)!=uSizeRead)
+ err=UNZ_ERRNO;
+ uSeek+=file_info.size_file_comment - uSizeRead;
+ }
+ else
+ uSeek+=file_info.size_file_comment;
+
+ if ((err==UNZ_OK) && (pfile_info!=NULL))
+ *pfile_info=file_info;
+
+ if ((err==UNZ_OK) && (pfile_info_internal!=NULL))
+ *pfile_info_internal=file_info_internal;
+
+ return err;
+}
+
+
+
+/*
+ Write info about the ZipFile in the *pglobal_info structure.
+ No preparation of the structure is needed
+ return UNZ_OK if there is no problem.
+*/
+extern int ZEXPORT unzGetCurrentFileInfo (file,
+ pfile_info,
+ szFileName, fileNameBufferSize,
+ extraField, extraFieldBufferSize,
+ szComment, commentBufferSize)
+ unzFile file;
+ unz_file_info *pfile_info;
+ char *szFileName;
+ uLong fileNameBufferSize;
+ void *extraField;
+ uLong extraFieldBufferSize;
+ char *szComment;
+ uLong commentBufferSize;
+{
+ return unzlocal_GetCurrentFileInfoInternal(file,pfile_info,NULL,
+ szFileName,fileNameBufferSize,
+ extraField,extraFieldBufferSize,
+ szComment,commentBufferSize);
+}
+
+/*
+ Set the current file of the zipfile to the first file.
+ return UNZ_OK if there is no problem
+*/
+extern int ZEXPORT unzGoToFirstFile (file)
+ unzFile file;
+{
+ int err=UNZ_OK;
+ unz_s* s;
+ if (file==NULL)
+ return UNZ_PARAMERROR;
+ s=(unz_s*)file;
+ s->pos_in_central_dir=s->offset_central_dir;
+ s->num_file=0;
+ err=unzlocal_GetCurrentFileInfoInternal(file,&s->cur_file_info,
+ &s->cur_file_info_internal,
+ NULL,0,NULL,0,NULL,0);
+ s->current_file_ok = (err == UNZ_OK);
+ return err;
+}
+
+/*
+ Set the current file of the zipfile to the next file.
+ return UNZ_OK if there is no problem
+ return UNZ_END_OF_LIST_OF_FILE if the actual file was the latest.
+*/
+extern int ZEXPORT unzGoToNextFile (file)
+ unzFile file;
+{
+ unz_s* s;
+ int err;
+
+ if (file==NULL)
+ return UNZ_PARAMERROR;
+ s=(unz_s*)file;
+ if (!s->current_file_ok)
+ return UNZ_END_OF_LIST_OF_FILE;
+ if (s->gi.number_entry != 0xffff) /* 2^16 files overflow hack */
+ if (s->num_file+1==s->gi.number_entry)
+ return UNZ_END_OF_LIST_OF_FILE;
+
+ s->pos_in_central_dir += SIZECENTRALDIRITEM + s->cur_file_info.size_filename +
+ s->cur_file_info.size_file_extra + s->cur_file_info.size_file_comment ;
+ s->num_file++;
+ err = unzlocal_GetCurrentFileInfoInternal(file,&s->cur_file_info,
+ &s->cur_file_info_internal,
+ NULL,0,NULL,0,NULL,0);
+ s->current_file_ok = (err == UNZ_OK);
+ return err;
+}
+
+
+/*
+ Try locate the file szFileName in the zipfile.
+ For the iCaseSensitivity signification, see unzipStringFileNameCompare
+
+ return value :
+ UNZ_OK if the file is found. It becomes the current file.
+ UNZ_END_OF_LIST_OF_FILE if the file is not found
+*/
+extern int ZEXPORT unzLocateFile (file, szFileName, iCaseSensitivity)
+ unzFile file;
+ const char *szFileName;
+ int iCaseSensitivity;
+{
+ unz_s* s;
+ int err;
+
+ /* We remember the 'current' position in the file so that we can jump
+ * back there if we fail.
+ */
+ unz_file_info cur_file_infoSaved;
+ unz_file_info_internal cur_file_info_internalSaved;
+ uLong num_fileSaved;
+ uLong pos_in_central_dirSaved;
+
+
+ if (file==NULL)
+ return UNZ_PARAMERROR;
+
+ if (strlen(szFileName)>=UNZ_MAXFILENAMEINZIP)
+ return UNZ_PARAMERROR;
+
+ s=(unz_s*)file;
+ if (!s->current_file_ok)
+ return UNZ_END_OF_LIST_OF_FILE;
+
+ /* Save the current state */
+ num_fileSaved = s->num_file;
+ pos_in_central_dirSaved = s->pos_in_central_dir;
+ cur_file_infoSaved = s->cur_file_info;
+ cur_file_info_internalSaved = s->cur_file_info_internal;
+
+ err = unzGoToFirstFile(file);
+
+ while (err == UNZ_OK)
+ {
+ char szCurrentFileName[UNZ_MAXFILENAMEINZIP+1];
+ err = unzGetCurrentFileInfo(file,NULL,
+ szCurrentFileName,sizeof(szCurrentFileName)-1,
+ NULL,0,NULL,0);
+ if (err == UNZ_OK)
+ {
+ if (unzStringFileNameCompare(szCurrentFileName,
+ szFileName,iCaseSensitivity)==0)
+ return UNZ_OK;
+ err = unzGoToNextFile(file);
+ }
+ }
+
+ /* We failed, so restore the state of the 'current file' to where we
+ * were.
+ */
+ s->num_file = num_fileSaved ;
+ s->pos_in_central_dir = pos_in_central_dirSaved ;
+ s->cur_file_info = cur_file_infoSaved;
+ s->cur_file_info_internal = cur_file_info_internalSaved;
+ return err;
+}
+
+
+/*
+///////////////////////////////////////////
+// Contributed by Ryan Haksi (mailto://cryogen@infoserve.net)
+// I need random access
+//
+// Further optimization could be realized by adding an ability
+// to cache the directory in memory. The goal being a single
+// comprehensive file read to put the file I need in a memory.
+*/
+
+/*
+typedef struct unz_file_pos_s
+{
+ uLong pos_in_zip_directory; // offset in file
+ uLong num_of_file; // # of file
+} unz_file_pos;
+*/
+
+extern int ZEXPORT unzGetFilePos(file, file_pos)
+ unzFile file;
+ unz_file_pos* file_pos;
+{
+ unz_s* s;
+
+ if (file==NULL || file_pos==NULL)
+ return UNZ_PARAMERROR;
+ s=(unz_s*)file;
+ if (!s->current_file_ok)
+ return UNZ_END_OF_LIST_OF_FILE;
+
+ file_pos->pos_in_zip_directory = s->pos_in_central_dir;
+ file_pos->num_of_file = s->num_file;
+
+ return UNZ_OK;
+}
+
+extern int ZEXPORT unzGoToFilePos(file, file_pos)
+ unzFile file;
+ unz_file_pos* file_pos;
+{
+ unz_s* s;
+ int err;
+
+ if (file==NULL || file_pos==NULL)
+ return UNZ_PARAMERROR;
+ s=(unz_s*)file;
+
+ /* jump to the right spot */
+ s->pos_in_central_dir = file_pos->pos_in_zip_directory;
+ s->num_file = file_pos->num_of_file;
+
+ /* set the current file */
+ err = unzlocal_GetCurrentFileInfoInternal(file,&s->cur_file_info,
+ &s->cur_file_info_internal,
+ NULL,0,NULL,0,NULL,0);
+ /* return results */
+ s->current_file_ok = (err == UNZ_OK);
+ return err;
+}
+
+/*
+// Unzip Helper Functions - should be here?
+///////////////////////////////////////////
+*/
+
+/*
+ Read the local header of the current zipfile
+ Check the coherency of the local header and info in the end of central
+ directory about this file
+ store in *piSizeVar the size of extra info in local header
+ (filename and size of extra field data)
+*/
+local int unzlocal_CheckCurrentFileCoherencyHeader (s,piSizeVar,
+ poffset_local_extrafield,
+ psize_local_extrafield)
+ unz_s* s;
+ uInt* piSizeVar;
+ uLong *poffset_local_extrafield;
+ uInt *psize_local_extrafield;
+{
+ uLong uMagic,uData,uFlags;
+ uLong size_filename;
+ uLong size_extra_field;
+ int err=UNZ_OK;
+
+ *piSizeVar = 0;
+ *poffset_local_extrafield = 0;
+ *psize_local_extrafield = 0;
+
+ if (ZSEEK(s->z_filefunc, s->filestream,s->cur_file_info_internal.offset_curfile +
+ s->byte_before_the_zipfile,ZLIB_FILEFUNC_SEEK_SET)!=0)
+ return UNZ_ERRNO;
+
+
+ if (err==UNZ_OK) {
+ if (unzlocal_getLong(&s->z_filefunc, s->filestream,&uMagic) != UNZ_OK)
+ err=UNZ_ERRNO;
+ else if (uMagic!=0x04034b50)
+ err=UNZ_BADZIPFILE;
+ }
+
+ if (unzlocal_getShort(&s->z_filefunc, s->filestream,&uData) != UNZ_OK)
+ err=UNZ_ERRNO;
+/*
+ else if ((err==UNZ_OK) && (uData!=s->cur_file_info.wVersion))
+ err=UNZ_BADZIPFILE;
+*/
+ if (unzlocal_getShort(&s->z_filefunc, s->filestream,&uFlags) != UNZ_OK)
+ err=UNZ_ERRNO;
+
+ if (unzlocal_getShort(&s->z_filefunc, s->filestream,&uData) != UNZ_OK)
+ err=UNZ_ERRNO;
+ else if ((err==UNZ_OK) && (uData!=s->cur_file_info.compression_method))
+ err=UNZ_BADZIPFILE;
+
+ if ((err==UNZ_OK) && (s->cur_file_info.compression_method!=0) &&
+ (s->cur_file_info.compression_method!=Z_DEFLATED))
+ err=UNZ_BADZIPFILE;
+
+ if (unzlocal_getLong(&s->z_filefunc, s->filestream,&uData) != UNZ_OK) /* date/time */
+ err=UNZ_ERRNO;
+
+ if (unzlocal_getLong(&s->z_filefunc, s->filestream,&uData) != UNZ_OK) /* crc */
+ err=UNZ_ERRNO;
+ else if ((err==UNZ_OK) && (uData!=s->cur_file_info.crc) &&
+ ((uFlags & 8)==0))
+ err=UNZ_BADZIPFILE;
+
+ if (unzlocal_getLong(&s->z_filefunc, s->filestream,&uData) != UNZ_OK) /* size compr */
+ err=UNZ_ERRNO;
+ else if ((err==UNZ_OK) && (uData!=s->cur_file_info.compressed_size) &&
+ ((uFlags & 8)==0))
+ err=UNZ_BADZIPFILE;
+
+ if (unzlocal_getLong(&s->z_filefunc, s->filestream,&uData) != UNZ_OK) /* size uncompr */
+ err=UNZ_ERRNO;
+ else if ((err==UNZ_OK) && (uData!=s->cur_file_info.uncompressed_size) &&
+ ((uFlags & 8)==0))
+ err=UNZ_BADZIPFILE;
+
+
+ if (unzlocal_getShort(&s->z_filefunc, s->filestream,&size_filename) != UNZ_OK)
+ err=UNZ_ERRNO;
+ else if ((err==UNZ_OK) && (size_filename!=s->cur_file_info.size_filename))
+ err=UNZ_BADZIPFILE;
+
+ *piSizeVar += (uInt)size_filename;
+
+ if (unzlocal_getShort(&s->z_filefunc, s->filestream,&size_extra_field) != UNZ_OK)
+ err=UNZ_ERRNO;
+ *poffset_local_extrafield= s->cur_file_info_internal.offset_curfile +
+ SIZEZIPLOCALHEADER + size_filename;
+ *psize_local_extrafield = (uInt)size_extra_field;
+
+ *piSizeVar += (uInt)size_extra_field;
+
+ return err;
+}
+
+/*
+ Open for reading data the current file in the zipfile.
+ If there is no error and the file is opened, the return value is UNZ_OK.
+*/
+extern int ZEXPORT unzOpenCurrentFile3 (file, method, level, raw, password)
+ unzFile file;
+ int* method;
+ int* level;
+ int raw;
+ const char* password;
+{
+ int err=UNZ_OK;
+ uInt iSizeVar;
+ unz_s* s;
+ file_in_zip_read_info_s* pfile_in_zip_read_info;
+ uLong offset_local_extrafield; /* offset of the local extra field */
+ uInt size_local_extrafield; /* size of the local extra field */
+# ifndef NOUNCRYPT
+ char source[12];
+# else
+ if (password != NULL)
+ return UNZ_PARAMERROR;
+# endif
+
+ if (file==NULL)
+ return UNZ_PARAMERROR;
+ s=(unz_s*)file;
+ if (!s->current_file_ok)
+ return UNZ_PARAMERROR;
+
+ if (s->pfile_in_zip_read != NULL)
+ unzCloseCurrentFile(file);
+
+ if (unzlocal_CheckCurrentFileCoherencyHeader(s,&iSizeVar,
+ &offset_local_extrafield,&size_local_extrafield)!=UNZ_OK)
+ return UNZ_BADZIPFILE;
+
+ pfile_in_zip_read_info = (file_in_zip_read_info_s*)
+ ALLOC(sizeof(file_in_zip_read_info_s));
+ if (pfile_in_zip_read_info==NULL)
+ return UNZ_INTERNALERROR;
+
+ pfile_in_zip_read_info->read_buffer=(char*)ALLOC(UNZ_BUFSIZE);
+ pfile_in_zip_read_info->offset_local_extrafield = offset_local_extrafield;
+ pfile_in_zip_read_info->size_local_extrafield = size_local_extrafield;
+ pfile_in_zip_read_info->pos_local_extrafield=0;
+ pfile_in_zip_read_info->raw=raw;
+
+ if (pfile_in_zip_read_info->read_buffer==NULL)
+ {
+ TRYFREE(pfile_in_zip_read_info);
+ return UNZ_INTERNALERROR;
+ }
+
+ pfile_in_zip_read_info->stream_initialised=0;
+
+ if (method!=NULL)
+ *method = (int)s->cur_file_info.compression_method;
+
+ if (level!=NULL)
+ {
+ *level = 6;
+ switch (s->cur_file_info.flag & 0x06)
+ {
+ case 6 : *level = 1; break;
+ case 4 : *level = 2; break;
+ case 2 : *level = 9; break;
+ }
+ }
+
+ if ((s->cur_file_info.compression_method!=0) &&
+ (s->cur_file_info.compression_method!=Z_DEFLATED))
+ err=UNZ_BADZIPFILE;
+
+ pfile_in_zip_read_info->crc32_wait=s->cur_file_info.crc;
+ pfile_in_zip_read_info->crc32=0;
+ pfile_in_zip_read_info->compression_method =
+ s->cur_file_info.compression_method;
+ pfile_in_zip_read_info->filestream=s->filestream;
+ pfile_in_zip_read_info->z_filefunc=s->z_filefunc;
+ pfile_in_zip_read_info->byte_before_the_zipfile=s->byte_before_the_zipfile;
+
+ pfile_in_zip_read_info->stream.total_out = 0;
+
+ if ((s->cur_file_info.compression_method==Z_DEFLATED) &&
+ (!raw))
+ {
+ pfile_in_zip_read_info->stream.zalloc = (alloc_func)0;
+ pfile_in_zip_read_info->stream.zfree = (free_func)0;
+ pfile_in_zip_read_info->stream.opaque = (voidpf)0;
+ pfile_in_zip_read_info->stream.next_in = (voidpf)0;
+ pfile_in_zip_read_info->stream.avail_in = 0;
+
+ err=inflateInit2(&pfile_in_zip_read_info->stream, -MAX_WBITS);
+ if (err == Z_OK)
+ pfile_in_zip_read_info->stream_initialised=1;
+ else
+ {
+ TRYFREE(pfile_in_zip_read_info);
+ return err;
+ }
+ /* windowBits is passed < 0 to tell that there is no zlib header.
+ * Note that in this case inflate *requires* an extra "dummy" byte
+ * after the compressed stream in order to complete decompression and
+ * return Z_STREAM_END.
+ * In unzip, i don't wait absolutely Z_STREAM_END because I known the
+ * size of both compressed and uncompressed data
+ */
+ }
+ pfile_in_zip_read_info->rest_read_compressed =
+ s->cur_file_info.compressed_size ;
+ pfile_in_zip_read_info->rest_read_uncompressed =
+ s->cur_file_info.uncompressed_size ;
+
+
+ pfile_in_zip_read_info->pos_in_zipfile =
+ s->cur_file_info_internal.offset_curfile + SIZEZIPLOCALHEADER +
+ iSizeVar;
+
+ pfile_in_zip_read_info->stream.avail_in = (uInt)0;
+
+ s->pfile_in_zip_read = pfile_in_zip_read_info;
+
+# ifndef NOUNCRYPT
+ if (password != NULL)
+ {
+ int i;
+ s->pcrc_32_tab = get_crc_table();
+ init_keys(password,s->keys,s->pcrc_32_tab);
+ if (ZSEEK(s->z_filefunc, s->filestream,
+ s->pfile_in_zip_read->pos_in_zipfile +
+ s->pfile_in_zip_read->byte_before_the_zipfile,
+ SEEK_SET)!=0)
+ return UNZ_INTERNALERROR;
+ if(ZREAD(s->z_filefunc, s->filestream,source, 12)<12)
+ return UNZ_INTERNALERROR;
+
+ for (i = 0; i<12; i++)
+ zdecode(s->keys,s->pcrc_32_tab,source[i]);
+
+ s->pfile_in_zip_read->pos_in_zipfile+=12;
+ s->encrypted=1;
+ }
+# endif
+
+
+ return UNZ_OK;
+}
+
+extern int ZEXPORT unzOpenCurrentFile (file)
+ unzFile file;
+{
+ return unzOpenCurrentFile3(file, NULL, NULL, 0, NULL);
+}
+
+extern int ZEXPORT unzOpenCurrentFilePassword (file, password)
+ unzFile file;
+ const char* password;
+{
+ return unzOpenCurrentFile3(file, NULL, NULL, 0, password);
+}
+
+extern int ZEXPORT unzOpenCurrentFile2 (file,method,level,raw)
+ unzFile file;
+ int* method;
+ int* level;
+ int raw;
+{
+ return unzOpenCurrentFile3(file, method, level, raw, NULL);
+}
+
+/*
+ Read bytes from the current file.
+ buf contain buffer where data must be copied
+ len the size of buf.
+
+ return the number of byte copied if somes bytes are copied
+ return 0 if the end of file was reached
+ return <0 with error code if there is an error
+ (UNZ_ERRNO for IO error, or zLib error for uncompress error)
+*/
+extern int ZEXPORT unzReadCurrentFile (file, buf, len)
+ unzFile file;
+ voidp buf;
+ unsigned len;
+{
+ int err=UNZ_OK;
+ uInt iRead = 0;
+ unz_s* s;
+ file_in_zip_read_info_s* pfile_in_zip_read_info;
+ if (file==NULL)
+ return UNZ_PARAMERROR;
+ s=(unz_s*)file;
+ pfile_in_zip_read_info=s->pfile_in_zip_read;
+
+ if (pfile_in_zip_read_info==NULL)
+ return UNZ_PARAMERROR;
+
+
+ if ((pfile_in_zip_read_info->read_buffer == NULL))
+ return UNZ_END_OF_LIST_OF_FILE;
+ if (len==0)
+ return 0;
+
+ pfile_in_zip_read_info->stream.next_out = (Bytef*)buf;
+
+ pfile_in_zip_read_info->stream.avail_out = (uInt)len;
+
+ if ((len>pfile_in_zip_read_info->rest_read_uncompressed) &&
+ (!(pfile_in_zip_read_info->raw)))
+ pfile_in_zip_read_info->stream.avail_out =
+ (uInt)pfile_in_zip_read_info->rest_read_uncompressed;
+
+ if ((len>pfile_in_zip_read_info->rest_read_compressed+
+ pfile_in_zip_read_info->stream.avail_in) &&
+ (pfile_in_zip_read_info->raw))
+ pfile_in_zip_read_info->stream.avail_out =
+ (uInt)pfile_in_zip_read_info->rest_read_compressed+
+ pfile_in_zip_read_info->stream.avail_in;
+
+ while (pfile_in_zip_read_info->stream.avail_out>0)
+ {
+ if ((pfile_in_zip_read_info->stream.avail_in==0) &&
+ (pfile_in_zip_read_info->rest_read_compressed>0))
+ {
+ uInt uReadThis = UNZ_BUFSIZE;
+ if (pfile_in_zip_read_info->rest_read_compressed<uReadThis)
+ uReadThis = (uInt)pfile_in_zip_read_info->rest_read_compressed;
+ if (uReadThis == 0)
+ return UNZ_EOF;
+ if (ZSEEK(pfile_in_zip_read_info->z_filefunc,
+ pfile_in_zip_read_info->filestream,
+ pfile_in_zip_read_info->pos_in_zipfile +
+ pfile_in_zip_read_info->byte_before_the_zipfile,
+ ZLIB_FILEFUNC_SEEK_SET)!=0)
+ return UNZ_ERRNO;
+ if (ZREAD(pfile_in_zip_read_info->z_filefunc,
+ pfile_in_zip_read_info->filestream,
+ pfile_in_zip_read_info->read_buffer,
+ uReadThis)!=uReadThis)
+ return UNZ_ERRNO;
+
+
+# ifndef NOUNCRYPT
+ if(s->encrypted)
+ {
+ uInt i;
+ for(i=0;i<uReadThis;i++)
+ pfile_in_zip_read_info->read_buffer[i] =
+ zdecode(s->keys,s->pcrc_32_tab,
+ pfile_in_zip_read_info->read_buffer[i]);
+ }
+# endif
+
+
+ pfile_in_zip_read_info->pos_in_zipfile += uReadThis;
+
+ pfile_in_zip_read_info->rest_read_compressed-=uReadThis;
+
+ pfile_in_zip_read_info->stream.next_in =
+ (Bytef*)pfile_in_zip_read_info->read_buffer;
+ pfile_in_zip_read_info->stream.avail_in = (uInt)uReadThis;
+ }
+
+ if ((pfile_in_zip_read_info->compression_method==0) || (pfile_in_zip_read_info->raw))
+ {
+ uInt uDoCopy,i ;
+
+ if ((pfile_in_zip_read_info->stream.avail_in == 0) &&
+ (pfile_in_zip_read_info->rest_read_compressed == 0))
+ return (iRead==0) ? UNZ_EOF : iRead;
+
+ if (pfile_in_zip_read_info->stream.avail_out <
+ pfile_in_zip_read_info->stream.avail_in)
+ uDoCopy = pfile_in_zip_read_info->stream.avail_out ;
+ else
+ uDoCopy = pfile_in_zip_read_info->stream.avail_in ;
+
+ for (i=0;i<uDoCopy;i++)
+ *(pfile_in_zip_read_info->stream.next_out+i) =
+ *(pfile_in_zip_read_info->stream.next_in+i);
+
+ pfile_in_zip_read_info->crc32 = crc32(pfile_in_zip_read_info->crc32,
+ pfile_in_zip_read_info->stream.next_out,
+ uDoCopy);
+ pfile_in_zip_read_info->rest_read_uncompressed-=uDoCopy;
+ pfile_in_zip_read_info->stream.avail_in -= uDoCopy;
+ pfile_in_zip_read_info->stream.avail_out -= uDoCopy;
+ pfile_in_zip_read_info->stream.next_out += uDoCopy;
+ pfile_in_zip_read_info->stream.next_in += uDoCopy;
+ pfile_in_zip_read_info->stream.total_out += uDoCopy;
+ iRead += uDoCopy;
+ }
+ else
+ {
+ uLong uTotalOutBefore,uTotalOutAfter;
+ const Bytef *bufBefore;
+ uLong uOutThis;
+ int flush=Z_SYNC_FLUSH;
+
+ uTotalOutBefore = pfile_in_zip_read_info->stream.total_out;
+ bufBefore = pfile_in_zip_read_info->stream.next_out;
+
+ /*
+ if ((pfile_in_zip_read_info->rest_read_uncompressed ==
+ pfile_in_zip_read_info->stream.avail_out) &&
+ (pfile_in_zip_read_info->rest_read_compressed == 0))
+ flush = Z_FINISH;
+ */
+ err=inflate(&pfile_in_zip_read_info->stream,flush);
+
+ if ((err>=0) && (pfile_in_zip_read_info->stream.msg!=NULL))
+ err = Z_DATA_ERROR;
+
+ uTotalOutAfter = pfile_in_zip_read_info->stream.total_out;
+ uOutThis = uTotalOutAfter-uTotalOutBefore;
+
+ pfile_in_zip_read_info->crc32 =
+ crc32(pfile_in_zip_read_info->crc32,bufBefore,
+ (uInt)(uOutThis));
+
+ pfile_in_zip_read_info->rest_read_uncompressed -=
+ uOutThis;
+
+ iRead += (uInt)(uTotalOutAfter - uTotalOutBefore);
+
+ if (err==Z_STREAM_END)
+ return (iRead==0) ? UNZ_EOF : iRead;
+ if (err!=Z_OK)
+ break;
+ }
+ }
+
+ if (err==Z_OK)
+ return iRead;
+ return err;
+}
+
+
+/*
+ Give the current position in uncompressed data
+*/
+extern z_off_t ZEXPORT unztell (file)
+ unzFile file;
+{
+ unz_s* s;
+ file_in_zip_read_info_s* pfile_in_zip_read_info;
+ if (file==NULL)
+ return UNZ_PARAMERROR;
+ s=(unz_s*)file;
+ pfile_in_zip_read_info=s->pfile_in_zip_read;
+
+ if (pfile_in_zip_read_info==NULL)
+ return UNZ_PARAMERROR;
+
+ return (z_off_t)pfile_in_zip_read_info->stream.total_out;
+}
+
+
+/*
+ return 1 if the end of file was reached, 0 elsewhere
+*/
+extern int ZEXPORT unzeof (file)
+ unzFile file;
+{
+ unz_s* s;
+ file_in_zip_read_info_s* pfile_in_zip_read_info;
+ if (file==NULL)
+ return UNZ_PARAMERROR;
+ s=(unz_s*)file;
+ pfile_in_zip_read_info=s->pfile_in_zip_read;
+
+ if (pfile_in_zip_read_info==NULL)
+ return UNZ_PARAMERROR;
+
+ if (pfile_in_zip_read_info->rest_read_uncompressed == 0)
+ return 1;
+ else
+ return 0;
+}
+
+
+
+/*
+ Read extra field from the current file (opened by unzOpenCurrentFile)
+ This is the local-header version of the extra field (sometimes, there is
+ more info in the local-header version than in the central-header)
+
+ if buf==NULL, it return the size of the local extra field that can be read
+
+ if buf!=NULL, len is the size of the buffer, the extra header is copied in
+ buf.
+ the return value is the number of bytes copied in buf, or (if <0)
+ the error code
+*/
+extern int ZEXPORT unzGetLocalExtrafield (file,buf,len)
+ unzFile file;
+ voidp buf;
+ unsigned len;
+{
+ unz_s* s;
+ file_in_zip_read_info_s* pfile_in_zip_read_info;
+ uInt read_now;
+ uLong size_to_read;
+
+ if (file==NULL)
+ return UNZ_PARAMERROR;
+ s=(unz_s*)file;
+ pfile_in_zip_read_info=s->pfile_in_zip_read;
+
+ if (pfile_in_zip_read_info==NULL)
+ return UNZ_PARAMERROR;
+
+ size_to_read = (pfile_in_zip_read_info->size_local_extrafield -
+ pfile_in_zip_read_info->pos_local_extrafield);
+
+ if (buf==NULL)
+ return (int)size_to_read;
+
+ if (len>size_to_read)
+ read_now = (uInt)size_to_read;
+ else
+ read_now = (uInt)len ;
+
+ if (read_now==0)
+ return 0;
+
+ if (ZSEEK(pfile_in_zip_read_info->z_filefunc,
+ pfile_in_zip_read_info->filestream,
+ pfile_in_zip_read_info->offset_local_extrafield +
+ pfile_in_zip_read_info->pos_local_extrafield,
+ ZLIB_FILEFUNC_SEEK_SET)!=0)
+ return UNZ_ERRNO;
+
+ if (ZREAD(pfile_in_zip_read_info->z_filefunc,
+ pfile_in_zip_read_info->filestream,
+ buf,read_now)!=read_now)
+ return UNZ_ERRNO;
+
+ return (int)read_now;
+}
+
+/*
+ Close the file in zip opened with unzipOpenCurrentFile
+ Return UNZ_CRCERROR if all the file was read but the CRC is not good
+*/
+extern int ZEXPORT unzCloseCurrentFile (file)
+ unzFile file;
+{
+ int err=UNZ_OK;
+
+ unz_s* s;
+ file_in_zip_read_info_s* pfile_in_zip_read_info;
+ if (file==NULL)
+ return UNZ_PARAMERROR;
+ s=(unz_s*)file;
+ pfile_in_zip_read_info=s->pfile_in_zip_read;
+
+ if (pfile_in_zip_read_info==NULL)
+ return UNZ_PARAMERROR;
+
+
+ if ((pfile_in_zip_read_info->rest_read_uncompressed == 0) &&
+ (!pfile_in_zip_read_info->raw))
+ {
+ if (pfile_in_zip_read_info->crc32 != pfile_in_zip_read_info->crc32_wait)
+ err=UNZ_CRCERROR;
+ }
+
+
+ TRYFREE(pfile_in_zip_read_info->read_buffer);
+ pfile_in_zip_read_info->read_buffer = NULL;
+ if (pfile_in_zip_read_info->stream_initialised)
+ inflateEnd(&pfile_in_zip_read_info->stream);
+
+ pfile_in_zip_read_info->stream_initialised = 0;
+ TRYFREE(pfile_in_zip_read_info);
+
+ s->pfile_in_zip_read=NULL;
+
+ return err;
+}
+
+
+/*
+ Get the global comment string of the ZipFile, in the szComment buffer.
+ uSizeBuf is the size of the szComment buffer.
+ return the number of byte copied or an error code <0
+*/
+extern int ZEXPORT unzGetGlobalComment (file, szComment, uSizeBuf)
+ unzFile file;
+ char *szComment;
+ uLong uSizeBuf;
+{
+ unz_s* s;
+ uLong uReadThis ;
+ if (file==NULL)
+ return UNZ_PARAMERROR;
+ s=(unz_s*)file;
+
+ uReadThis = uSizeBuf;
+ if (uReadThis>s->gi.size_comment)
+ uReadThis = s->gi.size_comment;
+
+ if (ZSEEK(s->z_filefunc,s->filestream,s->central_pos+22,ZLIB_FILEFUNC_SEEK_SET)!=0)
+ return UNZ_ERRNO;
+
+ if (uReadThis>0)
+ {
+ *szComment='\0';
+ if (ZREAD(s->z_filefunc,s->filestream,szComment,uReadThis)!=uReadThis)
+ return UNZ_ERRNO;
+ }
+
+ if ((szComment != NULL) && (uSizeBuf > s->gi.size_comment))
+ *(szComment+s->gi.size_comment)='\0';
+ return (int)uReadThis;
+}
+
+/* Additions by RX '2004 */
+extern uLong ZEXPORT unzGetOffset (file)
+ unzFile file;
+{
+ unz_s* s;
+
+ if (file==NULL)
+ return UNZ_PARAMERROR;
+ s=(unz_s*)file;
+ if (!s->current_file_ok)
+ return 0;
+ if (s->gi.number_entry != 0 && s->gi.number_entry != 0xffff)
+ if (s->num_file==s->gi.number_entry)
+ return 0;
+ return s->pos_in_central_dir;
+}
+
+extern int ZEXPORT unzSetOffset (file, pos)
+ unzFile file;
+ uLong pos;
+{
+ unz_s* s;
+ int err;
+
+ if (file==NULL)
+ return UNZ_PARAMERROR;
+ s=(unz_s*)file;
+
+ s->pos_in_central_dir = pos;
+ s->num_file = s->gi.number_entry; /* hack */
+ err = unzlocal_GetCurrentFileInfoInternal(file,&s->cur_file_info,
+ &s->cur_file_info_internal,
+ NULL,0,NULL,0,NULL,0);
+ s->current_file_ok = (err == UNZ_OK);
+ return err;
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/misc/quazip/unzip.h Wed Sep 14 22:39:39 2011 +0200
@@ -0,0 +1,356 @@
+/* unzip.h -- IO for uncompress .zip files using zlib
+ Version 1.01e, February 12th, 2005
+
+ Copyright (C) 1998-2005 Gilles Vollant
+
+ This unzip package allow extract file from .ZIP file, compatible with PKZip 2.04g
+ WinZip, InfoZip tools and compatible.
+
+ Multi volume ZipFile (span) are not supported.
+ Encryption compatible with pkzip 2.04g only supported
+ Old compressions used by old PKZip 1.x are not supported
+
+
+ I WAIT FEEDBACK at mail info@winimage.com
+ Visit also http://www.winimage.com/zLibDll/unzip.htm for evolution
+
+ Condition of use and distribution are the same than zlib :
+
+ This software is provided 'as-is', without any express or implied
+ warranty. In no event will the authors be held liable for any damages
+ arising from the use of this software.
+
+ Permission is granted to anyone to use this software for any purpose,
+ including commercial applications, and to alter it and redistribute it
+ freely, subject to the following restrictions:
+
+ 1. The origin of this software must not be misrepresented; you must not
+ claim that you wrote the original software. If you use this software
+ in a product, an acknowledgment in the product documentation would be
+ appreciated but is not required.
+ 2. Altered source versions must be plainly marked as such, and must not be
+ misrepresented as being the original software.
+ 3. This notice may not be removed or altered from any source distribution.
+
+ Modified by Sergey A. Tachenov to integrate with Qt.
+
+
+*/
+
+/* for more info about .ZIP format, see
+ http://www.info-zip.org/pub/infozip/doc/appnote-981119-iz.zip
+ http://www.info-zip.org/pub/infozip/doc/
+ PkWare has also a specification at :
+ ftp://ftp.pkware.com/probdesc.zip
+*/
+
+#ifndef _unz_H
+#define _unz_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifndef _ZLIB_H
+#include "zlib.h"
+#endif
+
+#ifndef _ZLIBIOAPI_H
+#include "ioapi.h"
+#endif
+
+#if defined(STRICTUNZIP) || defined(STRICTZIPUNZIP)
+/* like the STRICT of WIN32, we define a pointer that cannot be converted
+ from (void*) without cast */
+typedef struct TagunzFile__ { int unused; } unzFile__;
+typedef unzFile__ *unzFile;
+#else
+typedef voidp unzFile;
+#endif
+
+
+#define UNZ_OK (0)
+#define UNZ_END_OF_LIST_OF_FILE (-100)
+#define UNZ_ERRNO (Z_ERRNO)
+#define UNZ_EOF (0)
+#define UNZ_PARAMERROR (-102)
+#define UNZ_BADZIPFILE (-103)
+#define UNZ_INTERNALERROR (-104)
+#define UNZ_CRCERROR (-105)
+
+/* tm_unz contain date/time info */
+typedef struct tm_unz_s
+{
+ uInt tm_sec; /* seconds after the minute - [0,59] */
+ uInt tm_min; /* minutes after the hour - [0,59] */
+ uInt tm_hour; /* hours since midnight - [0,23] */
+ uInt tm_mday; /* day of the month - [1,31] */
+ uInt tm_mon; /* months since January - [0,11] */
+ uInt tm_year; /* years - [1980..2044] */
+} tm_unz;
+
+/* unz_global_info structure contain global data about the ZIPfile
+ These data comes from the end of central dir */
+typedef struct unz_global_info_s
+{
+ uLong number_entry; /* total number of entries in
+ the central dir on this disk */
+ uLong size_comment; /* size of the global comment of the zipfile */
+} unz_global_info;
+
+
+/* unz_file_info contain information about a file in the zipfile */
+typedef struct unz_file_info_s
+{
+ uLong version; /* version made by 2 bytes */
+ uLong version_needed; /* version needed to extract 2 bytes */
+ uLong flag; /* general purpose bit flag 2 bytes */
+ uLong compression_method; /* compression method 2 bytes */
+ uLong dosDate; /* last mod file date in Dos fmt 4 bytes */
+ uLong crc; /* crc-32 4 bytes */
+ uLong compressed_size; /* compressed size 4 bytes */
+ uLong uncompressed_size; /* uncompressed size 4 bytes */
+ uLong size_filename; /* filename length 2 bytes */
+ uLong size_file_extra; /* extra field length 2 bytes */
+ uLong size_file_comment; /* file comment length 2 bytes */
+
+ uLong disk_num_start; /* disk number start 2 bytes */
+ uLong internal_fa; /* internal file attributes 2 bytes */
+ uLong external_fa; /* external file attributes 4 bytes */
+
+ tm_unz tmu_date;
+} unz_file_info;
+
+extern int ZEXPORT unzStringFileNameCompare OF ((const char* fileName1,
+ const char* fileName2,
+ int iCaseSensitivity));
+/*
+ Compare two filename (fileName1,fileName2).
+ If iCaseSenisivity = 1, comparision is case sensitivity (like strcmp)
+ If iCaseSenisivity = 2, comparision is not case sensitivity (like strcmpi
+ or strcasecmp)
+ If iCaseSenisivity = 0, case sensitivity is defaut of your operating system
+ (like 1 on Unix, 2 on Windows)
+*/
+
+
+extern unzFile ZEXPORT unzOpen OF((voidpf file));
+/*
+ Open a Zip file. path contain whatever zopen_file from the IO API
+ accepts. For Qt implementation it is a pointer to QIODevice, for
+ fopen() implementation it's a file name.
+ If the zipfile cannot be opened (file don't exist or in not valid), the
+ return value is NULL.
+ Else, the return value is a unzFile Handle, usable with other function
+ of this unzip package.
+*/
+
+extern unzFile ZEXPORT unzOpen2 OF((voidpf file,
+ zlib_filefunc_def* pzlib_filefunc_def));
+/*
+ Open a Zip file, like unzOpen, but provide a set of file low level API
+ for read/write the zip file (see ioapi.h)
+*/
+
+extern int ZEXPORT unzClose OF((unzFile file));
+/*
+ Close a ZipFile opened with unzipOpen.
+ If there is files inside the .Zip opened with unzOpenCurrentFile (see later),
+ these files MUST be closed with unzipCloseCurrentFile before call unzipClose.
+ return UNZ_OK if there is no problem. */
+
+extern int ZEXPORT unzGetGlobalInfo OF((unzFile file,
+ unz_global_info *pglobal_info));
+/*
+ Write info about the ZipFile in the *pglobal_info structure.
+ No preparation of the structure is needed
+ return UNZ_OK if there is no problem. */
+
+
+extern int ZEXPORT unzGetGlobalComment OF((unzFile file,
+ char *szComment,
+ uLong uSizeBuf));
+/*
+ Get the global comment string of the ZipFile, in the szComment buffer.
+ uSizeBuf is the size of the szComment buffer.
+ return the number of byte copied or an error code <0
+*/
+
+
+/***************************************************************************/
+/* Unzip package allow you browse the directory of the zipfile */
+
+extern int ZEXPORT unzGoToFirstFile OF((unzFile file));
+/*
+ Set the current file of the zipfile to the first file.
+ return UNZ_OK if there is no problem
+*/
+
+extern int ZEXPORT unzGoToNextFile OF((unzFile file));
+/*
+ Set the current file of the zipfile to the next file.
+ return UNZ_OK if there is no problem
+ return UNZ_END_OF_LIST_OF_FILE if the actual file was the latest.
+*/
+
+extern int ZEXPORT unzLocateFile OF((unzFile file,
+ const char *szFileName,
+ int iCaseSensitivity));
+/*
+ Try locate the file szFileName in the zipfile.
+ For the iCaseSensitivity signification, see unzStringFileNameCompare
+
+ return value :
+ UNZ_OK if the file is found. It becomes the current file.
+ UNZ_END_OF_LIST_OF_FILE if the file is not found
+*/
+
+
+/* ****************************************** */
+/* Ryan supplied functions */
+/* unz_file_info contain information about a file in the zipfile */
+typedef struct unz_file_pos_s
+{
+ uLong pos_in_zip_directory; /* offset in zip file directory */
+ uLong num_of_file; /* # of file */
+} unz_file_pos;
+
+extern int ZEXPORT unzGetFilePos(
+ unzFile file,
+ unz_file_pos* file_pos);
+
+extern int ZEXPORT unzGoToFilePos(
+ unzFile file,
+ unz_file_pos* file_pos);
+
+/* ****************************************** */
+
+extern int ZEXPORT unzGetCurrentFileInfo OF((unzFile file,
+ unz_file_info *pfile_info,
+ char *szFileName,
+ uLong fileNameBufferSize,
+ void *extraField,
+ uLong extraFieldBufferSize,
+ char *szComment,
+ uLong commentBufferSize));
+/*
+ Get Info about the current file
+ if pfile_info!=NULL, the *pfile_info structure will contain somes info about
+ the current file
+ if szFileName!=NULL, the filemane string will be copied in szFileName
+ (fileNameBufferSize is the size of the buffer)
+ if extraField!=NULL, the extra field information will be copied in extraField
+ (extraFieldBufferSize is the size of the buffer).
+ This is the Central-header version of the extra field
+ if szComment!=NULL, the comment string of the file will be copied in szComment
+ (commentBufferSize is the size of the buffer)
+*/
+
+/***************************************************************************/
+/* for reading the content of the current zipfile, you can open it, read data
+ from it, and close it (you can close it before reading all the file)
+ */
+
+extern int ZEXPORT unzOpenCurrentFile OF((unzFile file));
+/*
+ Open for reading data the current file in the zipfile.
+ If there is no error, the return value is UNZ_OK.
+*/
+
+extern int ZEXPORT unzOpenCurrentFilePassword OF((unzFile file,
+ const char* password));
+/*
+ Open for reading data the current file in the zipfile.
+ password is a crypting password
+ If there is no error, the return value is UNZ_OK.
+*/
+
+extern int ZEXPORT unzOpenCurrentFile2 OF((unzFile file,
+ int* method,
+ int* level,
+ int raw));
+/*
+ Same than unzOpenCurrentFile, but open for read raw the file (not uncompress)
+ if raw==1
+ *method will receive method of compression, *level will receive level of
+ compression
+ note : you can set level parameter as NULL (if you did not want known level,
+ but you CANNOT set method parameter as NULL
+*/
+
+extern int ZEXPORT unzOpenCurrentFile3 OF((unzFile file,
+ int* method,
+ int* level,
+ int raw,
+ const char* password));
+/*
+ Same than unzOpenCurrentFile, but open for read raw the file (not uncompress)
+ if raw==1
+ *method will receive method of compression, *level will receive level of
+ compression
+ note : you can set level parameter as NULL (if you did not want known level,
+ but you CANNOT set method parameter as NULL
+*/
+
+
+extern int ZEXPORT unzCloseCurrentFile OF((unzFile file));
+/*
+ Close the file in zip opened with unzOpenCurrentFile
+ Return UNZ_CRCERROR if all the file was read but the CRC is not good
+*/
+
+extern int ZEXPORT unzReadCurrentFile OF((unzFile file,
+ voidp buf,
+ unsigned len));
+/*
+ Read bytes from the current file (opened by unzOpenCurrentFile)
+ buf contain buffer where data must be copied
+ len the size of buf.
+
+ return the number of byte copied if somes bytes are copied
+ return 0 if the end of file was reached
+ return <0 with error code if there is an error
+ (UNZ_ERRNO for IO error, or zLib error for uncompress error)
+*/
+
+extern z_off_t ZEXPORT unztell OF((unzFile file));
+/*
+ Give the current position in uncompressed data
+*/
+
+extern int ZEXPORT unzeof OF((unzFile file));
+/*
+ return 1 if the end of file was reached, 0 elsewhere
+*/
+
+extern int ZEXPORT unzGetLocalExtrafield OF((unzFile file,
+ voidp buf,
+ unsigned len));
+/*
+ Read extra field from the current file (opened by unzOpenCurrentFile)
+ This is the local-header version of the extra field (sometimes, there is
+ more info in the local-header version than in the central-header)
+
+ if buf==NULL, it return the size of the local extra field
+
+ if buf!=NULL, len is the size of the buffer, the extra header is copied in
+ buf.
+ the return value is the number of bytes copied in buf, or (if <0)
+ the error code
+*/
+
+/***************************************************************************/
+
+/* Get the current file offset */
+extern uLong ZEXPORT unzGetOffset (unzFile file);
+
+/* Set the current file offset */
+extern int ZEXPORT unzSetOffset (unzFile file, uLong pos);
+
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _unz_H */
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/misc/quazip/zconf.h Wed Sep 14 22:39:39 2011 +0200
@@ -0,0 +1,332 @@
+/* zconf.h -- configuration of the zlib compression library
+ * Copyright (C) 1995-2005 Jean-loup Gailly.
+ * For conditions of distribution and use, see copyright notice in zlib.h
+ */
+
+/* @(#) $Id$ */
+
+#ifndef ZCONF_H
+#define ZCONF_H
+
+/*
+ * If you *really* need a unique prefix for all types and library functions,
+ * compile with -DZ_PREFIX. The "standard" zlib should be compiled without it.
+ */
+#ifdef Z_PREFIX
+# define deflateInit_ z_deflateInit_
+# define deflate z_deflate
+# define deflateEnd z_deflateEnd
+# define inflateInit_ z_inflateInit_
+# define inflate z_inflate
+# define inflateEnd z_inflateEnd
+# define deflateInit2_ z_deflateInit2_
+# define deflateSetDictionary z_deflateSetDictionary
+# define deflateCopy z_deflateCopy
+# define deflateReset z_deflateReset
+# define deflateParams z_deflateParams
+# define deflateBound z_deflateBound
+# define deflatePrime z_deflatePrime
+# define inflateInit2_ z_inflateInit2_
+# define inflateSetDictionary z_inflateSetDictionary
+# define inflateSync z_inflateSync
+# define inflateSyncPoint z_inflateSyncPoint
+# define inflateCopy z_inflateCopy
+# define inflateReset z_inflateReset
+# define inflateBack z_inflateBack
+# define inflateBackEnd z_inflateBackEnd
+# define compress z_compress
+# define compress2 z_compress2
+# define compressBound z_compressBound
+# define uncompress z_uncompress
+# define adler32 z_adler32
+# define crc32 z_crc32
+# define get_crc_table z_get_crc_table
+# define zError z_zError
+
+# define alloc_func z_alloc_func
+# define free_func z_free_func
+# define in_func z_in_func
+# define out_func z_out_func
+# define Byte z_Byte
+# define uInt z_uInt
+# define uLong z_uLong
+# define Bytef z_Bytef
+# define charf z_charf
+# define intf z_intf
+# define uIntf z_uIntf
+# define uLongf z_uLongf
+# define voidpf z_voidpf
+# define voidp z_voidp
+#endif
+
+#if defined(__MSDOS__) && !defined(MSDOS)
+# define MSDOS
+#endif
+#if (defined(OS_2) || defined(__OS2__)) && !defined(OS2)
+# define OS2
+#endif
+#if defined(_WINDOWS) && !defined(WINDOWS)
+# define WINDOWS
+#endif
+#if defined(_WIN32) || defined(_WIN32_WCE) || defined(__WIN32__)
+# ifndef WIN32
+# define WIN32
+# endif
+#endif
+#if (defined(MSDOS) || defined(OS2) || defined(WINDOWS)) && !defined(WIN32)
+# if !defined(__GNUC__) && !defined(__FLAT__) && !defined(__386__)
+# ifndef SYS16BIT
+# define SYS16BIT
+# endif
+# endif
+#endif
+
+/*
+ * Compile with -DMAXSEG_64K if the alloc function cannot allocate more
+ * than 64k bytes at a time (needed on systems with 16-bit int).
+ */
+#ifdef SYS16BIT
+# define MAXSEG_64K
+#endif
+#ifdef MSDOS
+# define UNALIGNED_OK
+#endif
+
+#ifdef __STDC_VERSION__
+# ifndef STDC
+# define STDC
+# endif
+# if __STDC_VERSION__ >= 199901L
+# ifndef STDC99
+# define STDC99
+# endif
+# endif
+#endif
+#if !defined(STDC) && (defined(__STDC__) || defined(__cplusplus))
+# define STDC
+#endif
+#if !defined(STDC) && (defined(__GNUC__) || defined(__BORLANDC__))
+# define STDC
+#endif
+#if !defined(STDC) && (defined(MSDOS) || defined(WINDOWS) || defined(WIN32))
+# define STDC
+#endif
+#if !defined(STDC) && (defined(OS2) || defined(__HOS_AIX__))
+# define STDC
+#endif
+
+#if defined(__OS400__) && !defined(STDC) /* iSeries (formerly AS/400). */
+# define STDC
+#endif
+
+#ifndef STDC
+# ifndef const /* cannot use !defined(STDC) && !defined(const) on Mac */
+# define const /* note: need a more gentle solution here */
+# endif
+#endif
+
+/* Some Mac compilers merge all .h files incorrectly: */
+#if defined(__MWERKS__)||defined(applec)||defined(THINK_C)||defined(__SC__)
+# define NO_DUMMY_DECL
+#endif
+
+/* Maximum value for memLevel in deflateInit2 */
+#ifndef MAX_MEM_LEVEL
+# ifdef MAXSEG_64K
+# define MAX_MEM_LEVEL 8
+# else
+# define MAX_MEM_LEVEL 9
+# endif
+#endif
+
+/* Maximum value for windowBits in deflateInit2 and inflateInit2.
+ * WARNING: reducing MAX_WBITS makes minigzip unable to extract .gz files
+ * created by gzip. (Files created by minigzip can still be extracted by
+ * gzip.)
+ */
+#ifndef MAX_WBITS
+# define MAX_WBITS 15 /* 32K LZ77 window */
+#endif
+
+/* The memory requirements for deflate are (in bytes):
+ (1 << (windowBits+2)) + (1 << (memLevel+9))
+ that is: 128K for windowBits=15 + 128K for memLevel = 8 (default values)
+ plus a few kilobytes for small objects. For example, if you want to reduce
+ the default memory requirements from 256K to 128K, compile with
+ make CFLAGS="-O -DMAX_WBITS=14 -DMAX_MEM_LEVEL=7"
+ Of course this will generally degrade compression (there's no free lunch).
+
+ The memory requirements for inflate are (in bytes) 1 << windowBits
+ that is, 32K for windowBits=15 (default value) plus a few kilobytes
+ for small objects.
+*/
+
+ /* Type declarations */
+
+#ifndef OF /* function prototypes */
+# ifdef STDC
+# define OF(args) args
+# else
+# define OF(args) ()
+# endif
+#endif
+
+/* The following definitions for FAR are needed only for MSDOS mixed
+ * model programming (small or medium model with some far allocations).
+ * This was tested only with MSC; for other MSDOS compilers you may have
+ * to define NO_MEMCPY in zutil.h. If you don't need the mixed model,
+ * just define FAR to be empty.
+ */
+#ifdef SYS16BIT
+# if defined(M_I86SM) || defined(M_I86MM)
+ /* MSC small or medium model */
+# define SMALL_MEDIUM
+# ifdef _MSC_VER
+# define FAR _far
+# else
+# define FAR far
+# endif
+# endif
+# if (defined(__SMALL__) || defined(__MEDIUM__))
+ /* Turbo C small or medium model */
+# define SMALL_MEDIUM
+# ifdef __BORLANDC__
+# define FAR _far
+# else
+# define FAR far
+# endif
+# endif
+#endif
+
+#if defined(WINDOWS) || defined(WIN32)
+ /* If building or using zlib as a DLL, define ZLIB_DLL.
+ * This is not mandatory, but it offers a little performance increase.
+ */
+# ifdef ZLIB_DLL
+# if defined(WIN32) && (!defined(__BORLANDC__) || (__BORLANDC__ >= 0x500))
+# ifdef ZLIB_INTERNAL
+# define ZEXTERN extern __declspec(dllexport)
+# else
+# define ZEXTERN extern __declspec(dllimport)
+# endif
+# endif
+# endif /* ZLIB_DLL */
+ /* If building or using zlib with the WINAPI/WINAPIV calling convention,
+ * define ZLIB_WINAPI.
+ * Caution: the standard ZLIB1.DLL is NOT compiled using ZLIB_WINAPI.
+ */
+# ifdef ZLIB_WINAPI
+# ifdef FAR
+# undef FAR
+# endif
+# include <windows.h>
+ /* No need for _export, use ZLIB.DEF instead. */
+ /* For complete Windows compatibility, use WINAPI, not __stdcall. */
+# define ZEXPORT WINAPI
+# ifdef WIN32
+# define ZEXPORTVA WINAPIV
+# else
+# define ZEXPORTVA FAR CDECL
+# endif
+# endif
+#endif
+
+#if defined (__BEOS__)
+# ifdef ZLIB_DLL
+# ifdef ZLIB_INTERNAL
+# define ZEXPORT __declspec(dllexport)
+# define ZEXPORTVA __declspec(dllexport)
+# else
+# define ZEXPORT __declspec(dllimport)
+# define ZEXPORTVA __declspec(dllimport)
+# endif
+# endif
+#endif
+
+#ifndef ZEXTERN
+# define ZEXTERN extern
+#endif
+#ifndef ZEXPORT
+# define ZEXPORT
+#endif
+#ifndef ZEXPORTVA
+# define ZEXPORTVA
+#endif
+
+#ifndef FAR
+# define FAR
+#endif
+
+#if !defined(__MACTYPES__)
+typedef unsigned char Byte; /* 8 bits */
+#endif
+typedef unsigned int uInt; /* 16 bits or more */
+typedef unsigned long uLong; /* 32 bits or more */
+
+#ifdef SMALL_MEDIUM
+ /* Borland C/C++ and some old MSC versions ignore FAR inside typedef */
+# define Bytef Byte FAR
+#else
+ typedef Byte FAR Bytef;
+#endif
+typedef char FAR charf;
+typedef int FAR intf;
+typedef uInt FAR uIntf;
+typedef uLong FAR uLongf;
+
+#ifdef STDC
+ typedef void const *voidpc;
+ typedef void FAR *voidpf;
+ typedef void *voidp;
+#else
+ typedef Byte const *voidpc;
+ typedef Byte FAR *voidpf;
+ typedef Byte *voidp;
+#endif
+
+#if 0 /* HAVE_UNISTD_H -- this line is updated by ./configure */
+# include <sys/types.h> /* for off_t */
+# include <unistd.h> /* for SEEK_* and off_t */
+# ifdef VMS
+# include <unixio.h> /* for off_t */
+# endif
+# define z_off_t off_t
+#endif
+#ifndef SEEK_SET
+# define SEEK_SET 0 /* Seek from beginning of file. */
+# define SEEK_CUR 1 /* Seek from current position. */
+# define SEEK_END 2 /* Set file pointer to EOF plus "offset" */
+#endif
+#ifndef z_off_t
+# define z_off_t long
+#endif
+
+#if defined(__OS400__)
+# define NO_vsnprintf
+#endif
+
+#if defined(__MVS__)
+# define NO_vsnprintf
+# ifdef FAR
+# undef FAR
+# endif
+#endif
+
+/* MVS linker does not support external names larger than 8 bytes */
+#if defined(__MVS__)
+# pragma map(deflateInit_,"DEIN")
+# pragma map(deflateInit2_,"DEIN2")
+# pragma map(deflateEnd,"DEEND")
+# pragma map(deflateBound,"DEBND")
+# pragma map(inflateInit_,"ININ")
+# pragma map(inflateInit2_,"ININ2")
+# pragma map(inflateEnd,"INEND")
+# pragma map(inflateSync,"INSY")
+# pragma map(inflateSetDictionary,"INSEDI")
+# pragma map(compressBound,"CMBND")
+# pragma map(inflate_table,"INTABL")
+# pragma map(inflate_fast,"INFA")
+# pragma map(inflate_copyright,"INCOPY")
+#endif
+
+#endif /* ZCONF_H */
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/misc/quazip/zip.c Wed Sep 14 22:39:39 2011 +0200
@@ -0,0 +1,1243 @@
+/* zip.c -- IO on .zip files using zlib
+ Version 1.01e, February 12th, 2005
+
+ 27 Dec 2004 Rolf Kalbermatter
+ Modification to zipOpen2 to support globalComment retrieval.
+
+ Copyright (C) 1998-2005 Gilles Vollant
+
+ Read zip.h for more info
+
+ Modified by Sergey A. Tachenov to integrate with Qt.
+*/
+
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <time.h>
+#include "zlib.h"
+#include "zip.h"
+#include "quazip_global.h"
+
+#ifdef STDC
+# include <stddef.h>
+# include <string.h>
+# include <stdlib.h>
+#endif
+#ifdef NO_ERRNO_H
+ extern int errno;
+#else
+# include <errno.h>
+#endif
+
+
+#ifndef local
+# define local static
+#endif
+/* compile with -Dlocal if your debugger can't find static symbols */
+
+#ifndef VERSIONMADEBY
+# define VERSIONMADEBY (0x031e) /* best for standard pkware crypt */
+#endif
+
+#ifndef Z_BUFSIZE
+#define Z_BUFSIZE (16384)
+#endif
+
+#ifndef Z_MAXFILENAMEINZIP
+#define Z_MAXFILENAMEINZIP (256)
+#endif
+
+#ifndef ALLOC
+# define ALLOC(size) (malloc(size))
+#endif
+#ifndef TRYFREE
+# define TRYFREE(p) {if (p) free(p);}
+#endif
+
+/*
+#define SIZECENTRALDIRITEM (0x2e)
+#define SIZEZIPLOCALHEADER (0x1e)
+*/
+
+/* I've found an old Unix (a SunOS 4.1.3_U1) without all SEEK_* defined.... */
+
+#ifndef SEEK_CUR
+#define SEEK_CUR 1
+#endif
+
+#ifndef SEEK_END
+#define SEEK_END 2
+#endif
+
+#ifndef SEEK_SET
+#define SEEK_SET 0
+#endif
+
+#ifndef DEF_MEM_LEVEL
+#if MAX_MEM_LEVEL >= 8
+# define DEF_MEM_LEVEL 8
+#else
+# define DEF_MEM_LEVEL MAX_MEM_LEVEL
+#endif
+#endif
+const char zip_copyright[] =
+ " zip 1.01 Copyright 1998-2004 Gilles Vollant - http://www.winimage.com/zLibDll";
+
+
+#define SIZEDATA_INDATABLOCK (4096-(4*4))
+
+#define LOCALHEADERMAGIC (0x04034b50)
+#define DESCRIPTORHEADERMAGIC (0x08074b50)
+#define CENTRALHEADERMAGIC (0x02014b50)
+#define ENDHEADERMAGIC (0x06054b50)
+
+#define FLAG_LOCALHEADER_OFFSET (0x06)
+#define CRC_LOCALHEADER_OFFSET (0x0e)
+
+#define SIZECENTRALHEADER (0x2e) /* 46 */
+
+typedef struct linkedlist_datablock_internal_s
+{
+ struct linkedlist_datablock_internal_s* next_datablock;
+ uLong avail_in_this_block;
+ uLong filled_in_this_block;
+ uLong unused; /* for future use and alignement */
+ unsigned char data[SIZEDATA_INDATABLOCK];
+} linkedlist_datablock_internal;
+
+typedef struct linkedlist_data_s
+{
+ linkedlist_datablock_internal* first_block;
+ linkedlist_datablock_internal* last_block;
+} linkedlist_data;
+
+
+typedef struct
+{
+ z_stream stream; /* zLib stream structure for inflate */
+ int stream_initialised; /* 1 is stream is initialised */
+ uInt pos_in_buffered_data; /* last written byte in buffered_data */
+
+ uLong pos_local_header; /* offset of the local header of the file
+ currenty writing */
+ char* central_header; /* central header data for the current file */
+ uLong size_centralheader; /* size of the central header for cur file */
+ uLong flag; /* flag of the file currently writing */
+
+ int method; /* compression method of file currenty wr.*/
+ int raw; /* 1 for directly writing raw data */
+ Byte buffered_data[Z_BUFSIZE];/* buffer contain compressed data to be writ*/
+ uLong dosDate;
+ uLong crc32;
+ int encrypt;
+#ifndef NOCRYPT
+ unsigned long keys[3]; /* keys defining the pseudo-random sequence */
+ const unsigned long* pcrc_32_tab;
+ int crypt_header_size;
+#endif
+} curfile_info;
+
+typedef struct
+{
+ zlib_filefunc_def z_filefunc;
+ voidpf filestream; /* io structore of the zipfile */
+ linkedlist_data central_dir;/* datablock with central dir in construction*/
+ int in_opened_file_inzip; /* 1 if a file in the zip is currently writ.*/
+ curfile_info ci; /* info on the file curretly writing */
+
+ uLong begin_pos; /* position of the beginning of the zipfile */
+ uLong add_position_when_writting_offset;
+ uLong number_entry;
+#ifndef NO_ADDFILEINEXISTINGZIP
+ char *globalcomment;
+#endif
+} zip_internal;
+
+
+
+#ifndef NOCRYPT
+#define INCLUDECRYPTINGCODE_IFCRYPTALLOWED
+#include "crypt.h"
+#endif
+
+local linkedlist_datablock_internal* allocate_new_datablock()
+{
+ linkedlist_datablock_internal* ldi;
+ ldi = (linkedlist_datablock_internal*)
+ ALLOC(sizeof(linkedlist_datablock_internal));
+ if (ldi!=NULL)
+ {
+ ldi->next_datablock = NULL ;
+ ldi->filled_in_this_block = 0 ;
+ ldi->avail_in_this_block = SIZEDATA_INDATABLOCK ;
+ }
+ return ldi;
+}
+
+local void free_datablock(ldi)
+ linkedlist_datablock_internal* ldi;
+{
+ while (ldi!=NULL)
+ {
+ linkedlist_datablock_internal* ldinext = ldi->next_datablock;
+ TRYFREE(ldi);
+ ldi = ldinext;
+ }
+}
+
+local void init_linkedlist(ll)
+ linkedlist_data* ll;
+{
+ ll->first_block = ll->last_block = NULL;
+}
+
+#if 0 // unused
+local void free_linkedlist(ll)
+ linkedlist_data* ll;
+{
+ free_datablock(ll->first_block);
+ ll->first_block = ll->last_block = NULL;
+}
+#endif
+
+local int add_data_in_datablock(ll,buf,len)
+ linkedlist_data* ll;
+ const void* buf;
+ uLong len;
+{
+ linkedlist_datablock_internal* ldi;
+ const unsigned char* from_copy;
+
+ if (ll==NULL)
+ return ZIP_INTERNALERROR;
+
+ if (ll->last_block == NULL)
+ {
+ ll->first_block = ll->last_block = allocate_new_datablock();
+ if (ll->first_block == NULL)
+ return ZIP_INTERNALERROR;
+ }
+
+ ldi = ll->last_block;
+ from_copy = (unsigned char*)buf;
+
+ while (len>0)
+ {
+ uInt copy_this;
+ uInt i;
+ unsigned char* to_copy;
+
+ if (ldi->avail_in_this_block==0)
+ {
+ ldi->next_datablock = allocate_new_datablock();
+ if (ldi->next_datablock == NULL)
+ return ZIP_INTERNALERROR;
+ ldi = ldi->next_datablock ;
+ ll->last_block = ldi;
+ }
+
+ if (ldi->avail_in_this_block < len)
+ copy_this = (uInt)ldi->avail_in_this_block;
+ else
+ copy_this = (uInt)len;
+
+ to_copy = &(ldi->data[ldi->filled_in_this_block]);
+
+ for (i=0;i<copy_this;i++)
+ *(to_copy+i)=*(from_copy+i);
+
+ ldi->filled_in_this_block += copy_this;
+ ldi->avail_in_this_block -= copy_this;
+ from_copy += copy_this ;
+ len -= copy_this;
+ }
+ return ZIP_OK;
+}
+
+
+
+/****************************************************************************/
+
+#ifndef NO_ADDFILEINEXISTINGZIP
+/* ===========================================================================
+ Inputs a long in LSB order to the given file
+ nbByte == 1, 2 or 4 (byte, short or long)
+*/
+
+local int ziplocal_putValue OF((const zlib_filefunc_def* pzlib_filefunc_def,
+ voidpf filestream, uLong x, int nbByte));
+local int ziplocal_putValue (pzlib_filefunc_def, filestream, x, nbByte)
+ const zlib_filefunc_def* pzlib_filefunc_def;
+ voidpf filestream;
+ uLong x;
+ int nbByte;
+{
+ unsigned char buf[4];
+ int n;
+ for (n = 0; n < nbByte; n++)
+ {
+ buf[n] = (unsigned char)(x & 0xff);
+ x >>= 8;
+ }
+ if (x != 0)
+ { /* data overflow - hack for ZIP64 (X Roche) */
+ for (n = 0; n < nbByte; n++)
+ {
+ buf[n] = 0xff;
+ }
+ }
+
+ if (ZWRITE(*pzlib_filefunc_def,filestream,buf,nbByte)!=(uLong)nbByte)
+ return ZIP_ERRNO;
+ else
+ return ZIP_OK;
+}
+
+local void ziplocal_putValue_inmemory OF((void* dest, uLong x, int nbByte));
+local void ziplocal_putValue_inmemory (dest, x, nbByte)
+ void* dest;
+ uLong x;
+ int nbByte;
+{
+ unsigned char* buf=(unsigned char*)dest;
+ int n;
+ for (n = 0; n < nbByte; n++) {
+ buf[n] = (unsigned char)(x & 0xff);
+ x >>= 8;
+ }
+
+ if (x != 0)
+ { /* data overflow - hack for ZIP64 */
+ for (n = 0; n < nbByte; n++)
+ {
+ buf[n] = 0xff;
+ }
+ }
+}
+
+/****************************************************************************/
+
+
+local uLong ziplocal_TmzDateToDosDate(ptm,dosDate)
+ const tm_zip* ptm;
+ uLong dosDate UNUSED;
+{
+ uLong year = (uLong)ptm->tm_year;
+ if (year>1980)
+ year-=1980;
+ else if (year>80)
+ year-=80;
+ return
+ (uLong) (((ptm->tm_mday) + (32 * (ptm->tm_mon+1)) + (512 * year)) << 16) |
+ ((ptm->tm_sec/2) + (32* ptm->tm_min) + (2048 * (uLong)ptm->tm_hour));
+}
+
+
+/****************************************************************************/
+
+local int ziplocal_getByte OF((
+ const zlib_filefunc_def* pzlib_filefunc_def,
+ voidpf filestream,
+ int *pi));
+
+local int ziplocal_getByte(pzlib_filefunc_def,filestream,pi)
+ const zlib_filefunc_def* pzlib_filefunc_def;
+ voidpf filestream;
+ int *pi;
+{
+ unsigned char c;
+ int err = (int)ZREAD(*pzlib_filefunc_def,filestream,&c,1);
+ if (err==1)
+ {
+ *pi = (int)c;
+ return ZIP_OK;
+ }
+ else
+ {
+ if (ZERROR(*pzlib_filefunc_def,filestream))
+ return ZIP_ERRNO;
+ else
+ return ZIP_EOF;
+ }
+}
+
+
+/* ===========================================================================
+ Reads a long in LSB order from the given gz_stream. Sets
+*/
+local int ziplocal_getShort OF((
+ const zlib_filefunc_def* pzlib_filefunc_def,
+ voidpf filestream,
+ uLong *pX));
+
+local int ziplocal_getShort (pzlib_filefunc_def,filestream,pX)
+ const zlib_filefunc_def* pzlib_filefunc_def;
+ voidpf filestream;
+ uLong *pX;
+{
+ uLong x ;
+ int i;
+ int err;
+
+ err = ziplocal_getByte(pzlib_filefunc_def,filestream,&i);
+ x = (uLong)i;
+
+ if (err==ZIP_OK)
+ err = ziplocal_getByte(pzlib_filefunc_def,filestream,&i);
+ x += ((uLong)i)<<8;
+
+ if (err==ZIP_OK)
+ *pX = x;
+ else
+ *pX = 0;
+ return err;
+}
+
+local int ziplocal_getLong OF((
+ const zlib_filefunc_def* pzlib_filefunc_def,
+ voidpf filestream,
+ uLong *pX));
+
+local int ziplocal_getLong (pzlib_filefunc_def,filestream,pX)
+ const zlib_filefunc_def* pzlib_filefunc_def;
+ voidpf filestream;
+ uLong *pX;
+{
+ uLong x ;
+ int i;
+ int err;
+
+ err = ziplocal_getByte(pzlib_filefunc_def,filestream,&i);
+ x = (uLong)i;
+
+ if (err==ZIP_OK)
+ err = ziplocal_getByte(pzlib_filefunc_def,filestream,&i);
+ x += ((uLong)i)<<8;
+
+ if (err==ZIP_OK)
+ err = ziplocal_getByte(pzlib_filefunc_def,filestream,&i);
+ x += ((uLong)i)<<16;
+
+ if (err==ZIP_OK)
+ err = ziplocal_getByte(pzlib_filefunc_def,filestream,&i);
+ x += ((uLong)i)<<24;
+
+ if (err==ZIP_OK)
+ *pX = x;
+ else
+ *pX = 0;
+ return err;
+}
+
+#ifndef BUFREADCOMMENT
+#define BUFREADCOMMENT (0x400)
+#endif
+/*
+ Locate the Central directory of a zipfile (at the end, just before
+ the global comment)
+*/
+local uLong ziplocal_SearchCentralDir OF((
+ const zlib_filefunc_def* pzlib_filefunc_def,
+ voidpf filestream));
+
+local uLong ziplocal_SearchCentralDir(pzlib_filefunc_def,filestream)
+ const zlib_filefunc_def* pzlib_filefunc_def;
+ voidpf filestream;
+{
+ unsigned char* buf;
+ uLong uSizeFile;
+ uLong uBackRead;
+ uLong uMaxBack=0xffff; /* maximum size of global comment */
+ uLong uPosFound=0;
+
+ if (ZSEEK(*pzlib_filefunc_def,filestream,0,ZLIB_FILEFUNC_SEEK_END) != 0)
+ return 0;
+
+
+ uSizeFile = ZTELL(*pzlib_filefunc_def,filestream);
+
+ if (uMaxBack>uSizeFile)
+ uMaxBack = uSizeFile;
+
+ buf = (unsigned char*)ALLOC(BUFREADCOMMENT+4);
+ if (buf==NULL)
+ return 0;
+
+ uBackRead = 4;
+ while (uBackRead<uMaxBack)
+ {
+ uLong uReadSize,uReadPos ;
+ int i;
+ if (uBackRead+BUFREADCOMMENT>uMaxBack)
+ uBackRead = uMaxBack;
+ else
+ uBackRead+=BUFREADCOMMENT;
+ uReadPos = uSizeFile-uBackRead ;
+
+ uReadSize = ((BUFREADCOMMENT+4) < (uSizeFile-uReadPos)) ?
+ (BUFREADCOMMENT+4) : (uSizeFile-uReadPos);
+ if (ZSEEK(*pzlib_filefunc_def,filestream,uReadPos,ZLIB_FILEFUNC_SEEK_SET)!=0)
+ break;
+
+ if (ZREAD(*pzlib_filefunc_def,filestream,buf,uReadSize)!=uReadSize)
+ break;
+
+ for (i=(int)uReadSize-3; (i--)>0;)
+ if (((*(buf+i))==0x50) && ((*(buf+i+1))==0x4b) &&
+ ((*(buf+i+2))==0x05) && ((*(buf+i+3))==0x06))
+ {
+ uPosFound = uReadPos+i;
+ break;
+ }
+
+ if (uPosFound!=0)
+ break;
+ }
+ TRYFREE(buf);
+ return uPosFound;
+}
+#endif /* !NO_ADDFILEINEXISTINGZIP*/
+
+/************************************************************/
+extern zipFile ZEXPORT zipOpen2 (file, append, globalcomment, pzlib_filefunc_def)
+ voidpf file;
+ int append;
+ zipcharpc* globalcomment;
+ zlib_filefunc_def* pzlib_filefunc_def;
+{
+ zip_internal ziinit;
+ zip_internal* zi;
+ int err=ZIP_OK;
+
+
+ if (pzlib_filefunc_def==NULL)
+ fill_qiodevice_filefunc(&ziinit.z_filefunc);
+ else
+ ziinit.z_filefunc = *pzlib_filefunc_def;
+
+ ziinit.filestream = (*(ziinit.z_filefunc.zopen_file))
+ (ziinit.z_filefunc.opaque,
+ file,
+ (append == APPEND_STATUS_CREATE) ?
+ (ZLIB_FILEFUNC_MODE_READ | ZLIB_FILEFUNC_MODE_WRITE | ZLIB_FILEFUNC_MODE_CREATE) :
+ (ZLIB_FILEFUNC_MODE_READ | ZLIB_FILEFUNC_MODE_WRITE | ZLIB_FILEFUNC_MODE_EXISTING));
+
+ if (ziinit.filestream == NULL)
+ return NULL;
+ ziinit.begin_pos = ZTELL(ziinit.z_filefunc,ziinit.filestream);
+ ziinit.in_opened_file_inzip = 0;
+ ziinit.ci.stream_initialised = 0;
+ ziinit.number_entry = 0;
+ ziinit.add_position_when_writting_offset = 0;
+ init_linkedlist(&(ziinit.central_dir));
+
+
+ zi = (zip_internal*)ALLOC(sizeof(zip_internal));
+ if (zi==NULL)
+ {
+ ZCLOSE(ziinit.z_filefunc,ziinit.filestream);
+ return NULL;
+ }
+
+ /* now we add file in a zipfile */
+# ifndef NO_ADDFILEINEXISTINGZIP
+ ziinit.globalcomment = NULL;
+ if (append == APPEND_STATUS_ADDINZIP)
+ {
+ uLong byte_before_the_zipfile;/* byte before the zipfile, (>0 for sfx)*/
+
+ uLong size_central_dir; /* size of the central directory */
+ uLong offset_central_dir; /* offset of start of central directory */
+ uLong central_pos,uL;
+
+ uLong number_disk; /* number of the current dist, used for
+ spaning ZIP, unsupported, always 0*/
+ uLong number_disk_with_CD; /* number the the disk with central dir, used
+ for spaning ZIP, unsupported, always 0*/
+ uLong number_entry;
+ uLong number_entry_CD; /* total number of entries in
+ the central dir
+ (same than number_entry on nospan) */
+ uLong size_comment;
+
+ central_pos = ziplocal_SearchCentralDir(&ziinit.z_filefunc,ziinit.filestream);
+ if (central_pos==0)
+ err=ZIP_ERRNO;
+
+ if (ZSEEK(ziinit.z_filefunc, ziinit.filestream,
+ central_pos,ZLIB_FILEFUNC_SEEK_SET)!=0)
+ err=ZIP_ERRNO;
+
+ /* the signature, already checked */
+ if (ziplocal_getLong(&ziinit.z_filefunc, ziinit.filestream,&uL)!=ZIP_OK)
+ err=ZIP_ERRNO;
+
+ /* number of this disk */
+ if (ziplocal_getShort(&ziinit.z_filefunc, ziinit.filestream,&number_disk)!=ZIP_OK)
+ err=ZIP_ERRNO;
+
+ /* number of the disk with the start of the central directory */
+ if (ziplocal_getShort(&ziinit.z_filefunc, ziinit.filestream,&number_disk_with_CD)!=ZIP_OK)
+ err=ZIP_ERRNO;
+
+ /* total number of entries in the central dir on this disk */
+ if (ziplocal_getShort(&ziinit.z_filefunc, ziinit.filestream,&number_entry)!=ZIP_OK)
+ err=ZIP_ERRNO;
+
+ /* total number of entries in the central dir */
+ if (ziplocal_getShort(&ziinit.z_filefunc, ziinit.filestream,&number_entry_CD)!=ZIP_OK)
+ err=ZIP_ERRNO;
+
+ if ((number_entry_CD!=number_entry) ||
+ (number_disk_with_CD!=0) ||
+ (number_disk!=0))
+ err=ZIP_BADZIPFILE;
+
+ /* size of the central directory */
+ if (ziplocal_getLong(&ziinit.z_filefunc, ziinit.filestream,&size_central_dir)!=ZIP_OK)
+ err=ZIP_ERRNO;
+
+ /* offset of start of central directory with respect to the
+ starting disk number */
+ if (ziplocal_getLong(&ziinit.z_filefunc, ziinit.filestream,&offset_central_dir)!=ZIP_OK)
+ err=ZIP_ERRNO;
+
+ /* zipfile global comment length */
+ if (ziplocal_getShort(&ziinit.z_filefunc, ziinit.filestream,&size_comment)!=ZIP_OK)
+ err=ZIP_ERRNO;
+
+ if ((central_pos<offset_central_dir+size_central_dir) &&
+ (err==ZIP_OK))
+ err=ZIP_BADZIPFILE;
+
+ if (err!=ZIP_OK)
+ {
+ ZCLOSE(ziinit.z_filefunc, ziinit.filestream);
+ return NULL;
+ }
+
+ if (size_comment>0)
+ {
+ ziinit.globalcomment = ALLOC(size_comment+1);
+ if (ziinit.globalcomment)
+ {
+ size_comment = ZREAD(ziinit.z_filefunc, ziinit.filestream,ziinit.globalcomment,size_comment);
+ ziinit.globalcomment[size_comment]=0;
+ }
+ }
+
+ byte_before_the_zipfile = central_pos -
+ (offset_central_dir+size_central_dir);
+ ziinit.add_position_when_writting_offset = byte_before_the_zipfile;
+
+ {
+ uLong size_central_dir_to_read = size_central_dir;
+ size_t buf_size = SIZEDATA_INDATABLOCK;
+ void* buf_read = (void*)ALLOC(buf_size);
+ if (ZSEEK(ziinit.z_filefunc, ziinit.filestream,
+ offset_central_dir + byte_before_the_zipfile,
+ ZLIB_FILEFUNC_SEEK_SET) != 0)
+ err=ZIP_ERRNO;
+
+ while ((size_central_dir_to_read>0) && (err==ZIP_OK))
+ {
+ uLong read_this = SIZEDATA_INDATABLOCK;
+ if (read_this > size_central_dir_to_read)
+ read_this = size_central_dir_to_read;
+ if (ZREAD(ziinit.z_filefunc, ziinit.filestream,buf_read,read_this) != read_this)
+ err=ZIP_ERRNO;
+
+ if (err==ZIP_OK)
+ err = add_data_in_datablock(&ziinit.central_dir,buf_read,
+ (uLong)read_this);
+ size_central_dir_to_read-=read_this;
+ }
+ TRYFREE(buf_read);
+ }
+ ziinit.begin_pos = byte_before_the_zipfile;
+ ziinit.number_entry = number_entry_CD;
+
+ if (ZSEEK(ziinit.z_filefunc, ziinit.filestream,
+ offset_central_dir+byte_before_the_zipfile,ZLIB_FILEFUNC_SEEK_SET)!=0)
+ err=ZIP_ERRNO;
+ }
+
+ if (globalcomment)
+ {
+ *globalcomment = ziinit.globalcomment;
+ }
+# endif /* !NO_ADDFILEINEXISTINGZIP*/
+
+ if (err != ZIP_OK)
+ {
+# ifndef NO_ADDFILEINEXISTINGZIP
+ TRYFREE(ziinit.globalcomment);
+# endif /* !NO_ADDFILEINEXISTINGZIP*/
+ TRYFREE(zi);
+ return NULL;
+ }
+ else
+ {
+ *zi = ziinit;
+ return (zipFile)zi;
+ }
+}
+
+extern zipFile ZEXPORT zipOpen (file, append)
+ voidpf file;
+ int append;
+{
+ return zipOpen2(file,append,NULL,NULL);
+}
+
+extern int ZEXPORT zipOpenNewFileInZip3 (file, filename, zipfi,
+ extrafield_local, size_extrafield_local,
+ extrafield_global, size_extrafield_global,
+ comment, method, level, raw,
+ windowBits, memLevel, strategy,
+ password, crcForCrypting)
+ zipFile file;
+ const char* filename;
+ const zip_fileinfo* zipfi;
+ const void* extrafield_local;
+ uInt size_extrafield_local;
+ const void* extrafield_global;
+ uInt size_extrafield_global;
+ const char* comment;
+ int method;
+ int level;
+ int raw;
+ int windowBits;
+ int memLevel;
+ int strategy;
+ const char* password;
+ uLong crcForCrypting;
+{
+ zip_internal* zi;
+ uInt size_filename;
+ uInt size_comment;
+ uInt i;
+ int err = ZIP_OK;
+
+# ifdef NOCRYPT
+ if (password != NULL)
+ return ZIP_PARAMERROR;
+# endif
+
+ if (file == NULL)
+ return ZIP_PARAMERROR;
+ if ((method!=0) && (method!=Z_DEFLATED))
+ return ZIP_PARAMERROR;
+
+ zi = (zip_internal*)file;
+
+ if (zi->in_opened_file_inzip == 1)
+ {
+ err = zipCloseFileInZip (file);
+ if (err != ZIP_OK)
+ return err;
+ }
+
+
+ if (filename==NULL)
+ filename="-";
+
+ if (comment==NULL)
+ size_comment = 0;
+ else
+ size_comment = (uInt)strlen(comment);
+
+ size_filename = (uInt)strlen(filename);
+
+ if (zipfi == NULL)
+ zi->ci.dosDate = 0;
+ else
+ {
+ if (zipfi->dosDate != 0)
+ zi->ci.dosDate = zipfi->dosDate;
+ else zi->ci.dosDate = ziplocal_TmzDateToDosDate(&zipfi->tmz_date,zipfi->dosDate);
+ }
+
+ zi->ci.flag = 0;
+ if ((level==8) || (level==9))
+ zi->ci.flag |= 2;
+ if ((level==2))
+ zi->ci.flag |= 4;
+ if ((level==1))
+ zi->ci.flag |= 6;
+ if (password != NULL)
+ {
+ zi->ci.flag |= 1;
+ }
+ zi->ci.flag |= 8;
+ zi->ci.crc32 = 0;
+ zi->ci.method = method;
+ zi->ci.encrypt = 0;
+ zi->ci.stream_initialised = 0;
+ zi->ci.pos_in_buffered_data = 0;
+ zi->ci.raw = raw;
+ zi->ci.pos_local_header = ZTELL(zi->z_filefunc,zi->filestream) ;
+ zi->ci.size_centralheader = SIZECENTRALHEADER + size_filename +
+ size_extrafield_global + size_comment;
+ zi->ci.central_header = (char*)ALLOC((uInt)zi->ci.size_centralheader);
+
+ ziplocal_putValue_inmemory(zi->ci.central_header,(uLong)CENTRALHEADERMAGIC,4);
+ /* version info */
+ ziplocal_putValue_inmemory(zi->ci.central_header+4,(uLong)VERSIONMADEBY,2);
+ ziplocal_putValue_inmemory(zi->ci.central_header+6,(uLong)20,2);
+ ziplocal_putValue_inmemory(zi->ci.central_header+8,(uLong)zi->ci.flag,2);
+ ziplocal_putValue_inmemory(zi->ci.central_header+10,(uLong)zi->ci.method,2);
+ ziplocal_putValue_inmemory(zi->ci.central_header+12,(uLong)zi->ci.dosDate,4);
+ ziplocal_putValue_inmemory(zi->ci.central_header+16,(uLong)0,4); /*crc*/
+ ziplocal_putValue_inmemory(zi->ci.central_header+20,(uLong)0,4); /*compr size*/
+ ziplocal_putValue_inmemory(zi->ci.central_header+24,(uLong)0,4); /*uncompr size*/
+ ziplocal_putValue_inmemory(zi->ci.central_header+28,(uLong)size_filename,2);
+ ziplocal_putValue_inmemory(zi->ci.central_header+30,(uLong)size_extrafield_global,2);
+ ziplocal_putValue_inmemory(zi->ci.central_header+32,(uLong)size_comment,2);
+ ziplocal_putValue_inmemory(zi->ci.central_header+34,(uLong)0,2); /*disk nm start*/
+
+ if (zipfi==NULL)
+ ziplocal_putValue_inmemory(zi->ci.central_header+36,(uLong)0,2);
+ else
+ ziplocal_putValue_inmemory(zi->ci.central_header+36,(uLong)zipfi->internal_fa,2);
+
+ if (zipfi==NULL)
+ ziplocal_putValue_inmemory(zi->ci.central_header+38,(uLong)0,4);
+ else
+ ziplocal_putValue_inmemory(zi->ci.central_header+38,(uLong)zipfi->external_fa,4);
+
+ ziplocal_putValue_inmemory(zi->ci.central_header+42,(uLong)zi->ci.pos_local_header- zi->add_position_when_writting_offset,4);
+
+ for (i=0;i<size_filename;i++)
+ *(zi->ci.central_header+SIZECENTRALHEADER+i) = *(filename+i);
+
+ for (i=0;i<size_extrafield_global;i++)
+ *(zi->ci.central_header+SIZECENTRALHEADER+size_filename+i) =
+ *(((const char*)extrafield_global)+i);
+
+ for (i=0;i<size_comment;i++)
+ *(zi->ci.central_header+SIZECENTRALHEADER+size_filename+
+ size_extrafield_global+i) = *(comment+i);
+ if (zi->ci.central_header == NULL)
+ return ZIP_INTERNALERROR;
+
+ /* write the local header */
+ err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)LOCALHEADERMAGIC,4);
+
+ if (err==ZIP_OK)
+ err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)20,2);/* version needed to extract */
+ if (err==ZIP_OK)
+ err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)zi->ci.flag,2);
+
+ if (err==ZIP_OK)
+ err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)zi->ci.method,2);
+
+ if (err==ZIP_OK)
+ err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)zi->ci.dosDate,4);
+
+ if (err==ZIP_OK)
+ err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)0,4); /* crc 32, unknown */
+ if (err==ZIP_OK)
+ err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)0,4); /* compressed size, unknown */
+ if (err==ZIP_OK)
+ err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)0,4); /* uncompressed size, unknown */
+
+ if (err==ZIP_OK)
+ err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)size_filename,2);
+
+ if (err==ZIP_OK)
+ err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)size_extrafield_local,2);
+
+ if ((err==ZIP_OK) && (size_filename>0))
+ if (ZWRITE(zi->z_filefunc,zi->filestream,filename,size_filename)!=size_filename)
+ err = ZIP_ERRNO;
+
+ if ((err==ZIP_OK) && (size_extrafield_local>0))
+ if (ZWRITE(zi->z_filefunc,zi->filestream,extrafield_local,size_extrafield_local)
+ !=size_extrafield_local)
+ err = ZIP_ERRNO;
+
+ zi->ci.stream.avail_in = (uInt)0;
+ zi->ci.stream.avail_out = (uInt)Z_BUFSIZE;
+ zi->ci.stream.next_out = zi->ci.buffered_data;
+ zi->ci.stream.total_in = 0;
+ zi->ci.stream.total_out = 0;
+
+ if ((err==ZIP_OK) && (zi->ci.method == Z_DEFLATED) && (!zi->ci.raw))
+ {
+ zi->ci.stream.zalloc = (alloc_func)0;
+ zi->ci.stream.zfree = (free_func)0;
+ zi->ci.stream.opaque = (voidpf)0;
+
+ if (windowBits>0)
+ windowBits = -windowBits;
+
+ err = deflateInit2(&zi->ci.stream, level,
+ Z_DEFLATED, windowBits, memLevel, strategy);
+
+ if (err==Z_OK)
+ zi->ci.stream_initialised = 1;
+ }
+# ifndef NOCRYPT
+ zi->ci.crypt_header_size = 0;
+ if ((err==Z_OK) && (password != NULL))
+ {
+ unsigned char bufHead[RAND_HEAD_LEN];
+ unsigned int sizeHead;
+ zi->ci.encrypt = 1;
+ zi->ci.pcrc_32_tab = get_crc_table();
+ /*init_keys(password,zi->ci.keys,zi->ci.pcrc_32_tab);*/
+
+ crcForCrypting = (uLong)zi->ci.dosDate << 16; // ATTANTION! Without this row, you don't unpack your password protected archive in other app.
+
+ sizeHead=crypthead(password,bufHead,RAND_HEAD_LEN,zi->ci.keys,zi->ci.pcrc_32_tab,crcForCrypting);
+ zi->ci.crypt_header_size = sizeHead;
+
+ if (ZWRITE(zi->z_filefunc,zi->filestream,bufHead,sizeHead) != sizeHead)
+ err = ZIP_ERRNO;
+ }
+# endif
+
+ if (err==Z_OK)
+ zi->in_opened_file_inzip = 1;
+ return err;
+}
+
+extern int ZEXPORT zipOpenNewFileInZip2(file, filename, zipfi,
+ extrafield_local, size_extrafield_local,
+ extrafield_global, size_extrafield_global,
+ comment, method, level, raw)
+ zipFile file;
+ const char* filename;
+ const zip_fileinfo* zipfi;
+ const void* extrafield_local;
+ uInt size_extrafield_local;
+ const void* extrafield_global;
+ uInt size_extrafield_global;
+ const char* comment;
+ int method;
+ int level;
+ int raw;
+{
+ return zipOpenNewFileInZip3 (file, filename, zipfi,
+ extrafield_local, size_extrafield_local,
+ extrafield_global, size_extrafield_global,
+ comment, method, level, raw,
+ -MAX_WBITS, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY,
+ NULL, 0);
+}
+
+extern int ZEXPORT zipOpenNewFileInZip (file, filename, zipfi,
+ extrafield_local, size_extrafield_local,
+ extrafield_global, size_extrafield_global,
+ comment, method, level)
+ zipFile file;
+ const char* filename;
+ const zip_fileinfo* zipfi;
+ const void* extrafield_local;
+ uInt size_extrafield_local;
+ const void* extrafield_global;
+ uInt size_extrafield_global;
+ const char* comment;
+ int method;
+ int level;
+{
+ return zipOpenNewFileInZip2 (file, filename, zipfi,
+ extrafield_local, size_extrafield_local,
+ extrafield_global, size_extrafield_global,
+ comment, method, level, 0);
+}
+
+local int zipFlushWriteBuffer(zi)
+ zip_internal* zi;
+{
+ int err=ZIP_OK;
+
+ if (zi->ci.encrypt != 0)
+ {
+#ifndef NOCRYPT
+ uInt i;
+ int t;
+ for (i=0;i<zi->ci.pos_in_buffered_data;i++)
+ zi->ci.buffered_data[i] = zencode(zi->ci.keys, zi->ci.pcrc_32_tab,
+ zi->ci.buffered_data[i],t);
+#endif
+ }
+ if (ZWRITE(zi->z_filefunc,zi->filestream,zi->ci.buffered_data,zi->ci.pos_in_buffered_data)
+ !=zi->ci.pos_in_buffered_data)
+ err = ZIP_ERRNO;
+ zi->ci.pos_in_buffered_data = 0;
+ return err;
+}
+
+extern int ZEXPORT zipWriteInFileInZip (file, buf, len)
+ zipFile file;
+ const void* buf;
+ unsigned len;
+{
+ zip_internal* zi;
+ int err=ZIP_OK;
+
+ if (file == NULL)
+ return ZIP_PARAMERROR;
+ zi = (zip_internal*)file;
+
+ if (zi->in_opened_file_inzip == 0)
+ return ZIP_PARAMERROR;
+
+ zi->ci.stream.next_in = (void*)buf;
+ zi->ci.stream.avail_in = len;
+ zi->ci.crc32 = crc32(zi->ci.crc32,buf,len);
+
+ while ((err==ZIP_OK) && (zi->ci.stream.avail_in>0))
+ {
+ if (zi->ci.stream.avail_out == 0)
+ {
+ if (zipFlushWriteBuffer(zi) == ZIP_ERRNO)
+ err = ZIP_ERRNO;
+ zi->ci.stream.avail_out = (uInt)Z_BUFSIZE;
+ zi->ci.stream.next_out = zi->ci.buffered_data;
+ }
+
+
+ if(err != ZIP_OK)
+ break;
+
+ if ((zi->ci.method == Z_DEFLATED) && (!zi->ci.raw))
+ {
+ uLong uTotalOutBefore = zi->ci.stream.total_out;
+ err=deflate(&zi->ci.stream, Z_NO_FLUSH);
+ zi->ci.pos_in_buffered_data += (uInt)(zi->ci.stream.total_out - uTotalOutBefore) ;
+
+ }
+ else
+ {
+ uInt copy_this,i;
+ if (zi->ci.stream.avail_in < zi->ci.stream.avail_out)
+ copy_this = zi->ci.stream.avail_in;
+ else
+ copy_this = zi->ci.stream.avail_out;
+ for (i=0;i<copy_this;i++)
+ *(((char*)zi->ci.stream.next_out)+i) =
+ *(((const char*)zi->ci.stream.next_in)+i);
+ {
+ zi->ci.stream.avail_in -= copy_this;
+ zi->ci.stream.avail_out-= copy_this;
+ zi->ci.stream.next_in+= copy_this;
+ zi->ci.stream.next_out+= copy_this;
+ zi->ci.stream.total_in+= copy_this;
+ zi->ci.stream.total_out+= copy_this;
+ zi->ci.pos_in_buffered_data += copy_this;
+ }
+ }
+ }
+
+ return err;
+}
+
+extern int ZEXPORT zipCloseFileInZipRaw (file, uncompressed_size, crc32)
+ zipFile file;
+ uLong uncompressed_size;
+ uLong crc32;
+{
+ zip_internal* zi;
+ uLong compressed_size;
+ int err=ZIP_OK;
+
+ if (file == NULL)
+ return ZIP_PARAMERROR;
+ zi = (zip_internal*)file;
+
+ if (zi->in_opened_file_inzip == 0)
+ return ZIP_PARAMERROR;
+ zi->ci.stream.avail_in = 0;
+
+ if ((zi->ci.method == Z_DEFLATED) && (!zi->ci.raw))
+ while (err==ZIP_OK)
+ {
+ uLong uTotalOutBefore;
+ if (zi->ci.stream.avail_out == 0)
+ {
+ if (zipFlushWriteBuffer(zi) == ZIP_ERRNO)
+ err = ZIP_ERRNO;
+ zi->ci.stream.avail_out = (uInt)Z_BUFSIZE;
+ zi->ci.stream.next_out = zi->ci.buffered_data;
+ }
+ uTotalOutBefore = zi->ci.stream.total_out;
+ err=deflate(&zi->ci.stream, Z_FINISH);
+ zi->ci.pos_in_buffered_data += (uInt)(zi->ci.stream.total_out - uTotalOutBefore) ;
+ }
+
+ if (err==Z_STREAM_END)
+ err=ZIP_OK; /* this is normal */
+
+ if ((zi->ci.pos_in_buffered_data>0) && (err==ZIP_OK))
+ if (zipFlushWriteBuffer(zi)==ZIP_ERRNO)
+ err = ZIP_ERRNO;
+
+ if ((zi->ci.method == Z_DEFLATED) && (!zi->ci.raw))
+ {
+ err=deflateEnd(&zi->ci.stream);
+ zi->ci.stream_initialised = 0;
+ }
+
+ if (!zi->ci.raw)
+ {
+ crc32 = (uLong)zi->ci.crc32;
+ uncompressed_size = (uLong)zi->ci.stream.total_in;
+ }
+ compressed_size = (uLong)zi->ci.stream.total_out;
+# ifndef NOCRYPT
+ compressed_size += zi->ci.crypt_header_size;
+# endif
+
+ ziplocal_putValue_inmemory(zi->ci.central_header+16,crc32,4); /*crc*/
+ ziplocal_putValue_inmemory(zi->ci.central_header+20,
+ compressed_size,4); /*compr size*/
+ if (zi->ci.stream.data_type == Z_ASCII)
+ ziplocal_putValue_inmemory(zi->ci.central_header+36,(uLong)Z_ASCII,2);
+ ziplocal_putValue_inmemory(zi->ci.central_header+24,
+ uncompressed_size,4); /*uncompr size*/
+
+ if (err==ZIP_OK)
+ err = add_data_in_datablock(&zi->central_dir,zi->ci.central_header,
+ (uLong)zi->ci.size_centralheader);
+ free(zi->ci.central_header);
+
+ if (err==ZIP_OK)
+ {
+ uLong cur_pos_inzip = ZTELL(zi->z_filefunc,zi->filestream);
+ if (ZSEEK(zi->z_filefunc,zi->filestream,
+ zi->ci.pos_local_header + 14,ZLIB_FILEFUNC_SEEK_SET)!=0)
+ err = ZIP_ERRNO;
+
+ if (err==ZIP_OK)
+ err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,crc32,4); /* crc 32, unknown */
+
+ if (err==ZIP_OK) /* compressed size, unknown */
+ err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,compressed_size,4);
+
+ if (err==ZIP_OK) /* uncompressed size, unknown */
+ err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,uncompressed_size,4);
+
+ if (ZSEEK(zi->z_filefunc,zi->filestream,
+ cur_pos_inzip,ZLIB_FILEFUNC_SEEK_SET)!=0)
+ err = ZIP_ERRNO;
+
+ /* Write local Descriptor after file data */
+ if (err==ZIP_OK)
+ err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)DESCRIPTORHEADERMAGIC,4);
+
+ if (err==ZIP_OK)
+ err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,crc32,4); /* crc 32, unknown */
+
+ if (err==ZIP_OK) /* compressed size, unknown */
+ err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,compressed_size,4);
+
+ if (err==ZIP_OK) /* uncompressed size, unknown */
+ err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,uncompressed_size,4);
+
+
+ }
+
+ zi->number_entry ++;
+ zi->in_opened_file_inzip = 0;
+
+ return err;
+}
+
+extern int ZEXPORT zipCloseFileInZip (file)
+ zipFile file;
+{
+ return zipCloseFileInZipRaw (file,0,0);
+}
+
+extern int ZEXPORT zipClose (file, global_comment)
+ zipFile file;
+ const char* global_comment;
+{
+ zip_internal* zi;
+ int err = 0;
+ uLong size_centraldir = 0;
+ uLong centraldir_pos_inzip;
+ uInt size_global_comment;
+ if (file == NULL)
+ return ZIP_PARAMERROR;
+ zi = (zip_internal*)file;
+
+ if (zi->in_opened_file_inzip == 1)
+ {
+ err = zipCloseFileInZip (file);
+ }
+
+#ifndef NO_ADDFILEINEXISTINGZIP
+ if (global_comment==NULL)
+ global_comment = zi->globalcomment;
+#endif
+ if (global_comment==NULL)
+ size_global_comment = 0;
+ else
+ size_global_comment = (uInt)strlen(global_comment);
+
+ centraldir_pos_inzip = ZTELL(zi->z_filefunc,zi->filestream);
+ if (err==ZIP_OK)
+ {
+ linkedlist_datablock_internal* ldi = zi->central_dir.first_block ;
+ while (ldi!=NULL)
+ {
+ if ((err==ZIP_OK) && (ldi->filled_in_this_block>0))
+ if (ZWRITE(zi->z_filefunc,zi->filestream,
+ ldi->data,ldi->filled_in_this_block)
+ !=ldi->filled_in_this_block )
+ err = ZIP_ERRNO;
+
+ size_centraldir += ldi->filled_in_this_block;
+ ldi = ldi->next_datablock;
+ }
+ }
+ free_datablock(zi->central_dir.first_block);
+
+ if (err==ZIP_OK) /* Magic End */
+ err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)ENDHEADERMAGIC,4);
+
+ if (err==ZIP_OK) /* number of this disk */
+ err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)0,2);
+
+ if (err==ZIP_OK) /* number of the disk with the start of the central directory */
+ err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)0,2);
+
+ if (err==ZIP_OK) /* total number of entries in the central dir on this disk */
+ err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)zi->number_entry,2);
+
+ if (err==ZIP_OK) /* total number of entries in the central dir */
+ err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)zi->number_entry,2);
+
+ if (err==ZIP_OK) /* size of the central directory */
+ err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)size_centraldir,4);
+
+ if (err==ZIP_OK) /* offset of start of central directory with respect to the
+ starting disk number */
+ err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,
+ (uLong)(centraldir_pos_inzip - zi->add_position_when_writting_offset),4);
+
+ if (err==ZIP_OK) /* zipfile comment length */
+ err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)size_global_comment,2);
+
+ if ((err==ZIP_OK) && (size_global_comment>0))
+ if (ZWRITE(zi->z_filefunc,zi->filestream,
+ global_comment,size_global_comment) != size_global_comment)
+ err = ZIP_ERRNO;
+
+ if (ZCLOSE(zi->z_filefunc,zi->filestream) != 0)
+ if (err == ZIP_OK)
+ err = ZIP_ERRNO;
+
+#ifndef NO_ADDFILEINEXISTINGZIP
+ TRYFREE(zi->globalcomment);
+#endif
+ TRYFREE(zi);
+
+ return err;
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/misc/quazip/zip.h Wed Sep 14 22:39:39 2011 +0200
@@ -0,0 +1,237 @@
+/* zip.h -- IO for compress .zip files using zlib
+ Version 1.01e, February 12th, 2005
+
+ Copyright (C) 1998-2005 Gilles Vollant
+
+ This unzip package allow creates .ZIP file, compatible with PKZip 2.04g
+ WinZip, InfoZip tools and compatible.
+ Multi volume ZipFile (span) are not supported.
+ Encryption compatible with pkzip 2.04g only supported
+ Old compressions used by old PKZip 1.x are not supported
+
+ For uncompress .zip file, look at unzip.h
+
+
+ I WAIT FEEDBACK at mail info@winimage.com
+ Visit also http://www.winimage.com/zLibDll/unzip.html for evolution
+
+ Condition of use and distribution are the same than zlib :
+
+ This software is provided 'as-is', without any express or implied
+ warranty. In no event will the authors be held liable for any damages
+ arising from the use of this software.
+
+ Permission is granted to anyone to use this software for any purpose,
+ including commercial applications, and to alter it and redistribute it
+ freely, subject to the following restrictions:
+
+ 1. The origin of this software must not be misrepresented; you must not
+ claim that you wrote the original software. If you use this software
+ in a product, an acknowledgment in the product documentation would be
+ appreciated but is not required.
+ 2. Altered source versions must be plainly marked as such, and must not be
+ misrepresented as being the original software.
+ 3. This notice may not be removed or altered from any source distribution.
+
+ Modified by Sergey A. Tachenov to integrate with Qt.
+
+
+*/
+
+/* for more info about .ZIP format, see
+ http://www.info-zip.org/pub/infozip/doc/appnote-981119-iz.zip
+ http://www.info-zip.org/pub/infozip/doc/
+ PkWare has also a specification at :
+ ftp://ftp.pkware.com/probdesc.zip
+*/
+
+#ifndef _zip_H
+#define _zip_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifndef _ZLIB_H
+#include "zlib.h"
+#endif
+
+#ifndef _ZLIBIOAPI_H
+#include "ioapi.h"
+#endif
+
+#if defined(STRICTZIP) || defined(STRICTZIPUNZIP)
+/* like the STRICT of WIN32, we define a pointer that cannot be converted
+ from (void*) without cast */
+typedef struct TagzipFile__ { int unused; } zipFile__;
+typedef zipFile__ *zipFile;
+#else
+typedef voidp zipFile;
+#endif
+
+#define ZIP_OK (0)
+#define ZIP_EOF (0)
+#define ZIP_ERRNO (Z_ERRNO)
+#define ZIP_PARAMERROR (-102)
+#define ZIP_BADZIPFILE (-103)
+#define ZIP_INTERNALERROR (-104)
+
+#ifndef DEF_MEM_LEVEL
+# if MAX_MEM_LEVEL >= 8
+# define DEF_MEM_LEVEL 8
+# else
+# define DEF_MEM_LEVEL MAX_MEM_LEVEL
+# endif
+#endif
+/* default memLevel */
+
+/* tm_zip contain date/time info */
+typedef struct tm_zip_s
+{
+ uInt tm_sec; /* seconds after the minute - [0,59] */
+ uInt tm_min; /* minutes after the hour - [0,59] */
+ uInt tm_hour; /* hours since midnight - [0,23] */
+ uInt tm_mday; /* day of the month - [1,31] */
+ uInt tm_mon; /* months since January - [0,11] */
+ uInt tm_year; /* years - [1980..2044] */
+} tm_zip;
+
+typedef struct
+{
+ tm_zip tmz_date; /* date in understandable format */
+ uLong dosDate; /* if dos_date == 0, tmu_date is used */
+/* uLong flag; */ /* general purpose bit flag 2 bytes */
+
+ uLong internal_fa; /* internal file attributes 2 bytes */
+ uLong external_fa; /* external file attributes 4 bytes */
+} zip_fileinfo;
+
+typedef const char* zipcharpc;
+
+
+#define APPEND_STATUS_CREATE (0)
+#define APPEND_STATUS_CREATEAFTER (1)
+#define APPEND_STATUS_ADDINZIP (2)
+
+extern zipFile ZEXPORT zipOpen OF((voidpf file, int append));
+/*
+ Create a zipfile.
+ file is whatever the IO API accepts. For Qt IO API it's a pointer to
+ QIODevice. For fopen() IO API it's a file name (const char*).
+ if the file pathname exist and append==APPEND_STATUS_CREATEAFTER, the zip
+ will be created at the end of the file.
+ (useful if the file contain a self extractor code)
+ if the file pathname exist and append==APPEND_STATUS_ADDINZIP, we will
+ add files in existing zip (be sure you don't add file that doesn't exist)
+ If the zipfile cannot be opened, the return value is NULL.
+ Else, the return value is a zipFile Handle, usable with other function
+ of this zip package.
+*/
+
+/* Note : there is no delete function into a zipfile.
+ If you want delete file into a zipfile, you must open a zipfile, and create another
+ Of couse, you can use RAW reading and writing to copy the file you did not want delte
+*/
+
+extern zipFile ZEXPORT zipOpen2 OF((voidpf file,
+ int append,
+ zipcharpc* globalcomment,
+ zlib_filefunc_def* pzlib_filefunc_def));
+
+extern int ZEXPORT zipOpenNewFileInZip OF((zipFile file,
+ const char* filename,
+ const zip_fileinfo* zipfi,
+ const void* extrafield_local,
+ uInt size_extrafield_local,
+ const void* extrafield_global,
+ uInt size_extrafield_global,
+ const char* comment,
+ int method,
+ int level));
+/*
+ Open a file in the ZIP for writing.
+ filename : the filename in zip (if NULL, '-' without quote will be used
+ *zipfi contain supplemental information
+ if extrafield_local!=NULL and size_extrafield_local>0, extrafield_local
+ contains the extrafield data the the local header
+ if extrafield_global!=NULL and size_extrafield_global>0, extrafield_global
+ contains the extrafield data the the local header
+ if comment != NULL, comment contain the comment string
+ method contain the compression method (0 for store, Z_DEFLATED for deflate)
+ level contain the level of compression (can be Z_DEFAULT_COMPRESSION)
+*/
+
+
+extern int ZEXPORT zipOpenNewFileInZip2 OF((zipFile file,
+ const char* filename,
+ const zip_fileinfo* zipfi,
+ const void* extrafield_local,
+ uInt size_extrafield_local,
+ const void* extrafield_global,
+ uInt size_extrafield_global,
+ const char* comment,
+ int method,
+ int level,
+ int raw));
+
+/*
+ Same than zipOpenNewFileInZip, except if raw=1, we write raw file
+ */
+
+extern int ZEXPORT zipOpenNewFileInZip3 OF((zipFile file,
+ const char* filename,
+ const zip_fileinfo* zipfi,
+ const void* extrafield_local,
+ uInt size_extrafield_local,
+ const void* extrafield_global,
+ uInt size_extrafield_global,
+ const char* comment,
+ int method,
+ int level,
+ int raw,
+ int windowBits,
+ int memLevel,
+ int strategy,
+ const char* password,
+ uLong crcForCtypting));
+
+/*
+ Same than zipOpenNewFileInZip2, except
+ windowBits,memLevel,,strategy : see parameter strategy in deflateInit2
+ password : crypting password (NULL for no crypting)
+ crcForCtypting : crc of file to compress (needed for crypting)
+ */
+
+
+extern int ZEXPORT zipWriteInFileInZip OF((zipFile file,
+ const void* buf,
+ unsigned len));
+/*
+ Write data in the zipfile
+*/
+
+extern int ZEXPORT zipCloseFileInZip OF((zipFile file));
+/*
+ Close the current file in the zipfile
+*/
+
+extern int ZEXPORT zipCloseFileInZipRaw OF((zipFile file,
+ uLong uncompressed_size,
+ uLong crc32));
+/*
+ Close the current file in the zipfile, for fiel opened with
+ parameter raw=1 in zipOpenNewFileInZip2
+ uncompressed_size and crc32 are value for the uncompressed size
+*/
+
+extern int ZEXPORT zipClose OF((zipFile file,
+ const char* global_comment));
+/*
+ Close the zipfile
+*/
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _zip_H */
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/misc/quazip/zlib.h Wed Sep 14 22:39:39 2011 +0200
@@ -0,0 +1,1368 @@
+/* zlib.h -- interface of the 'zlib' general purpose compression library
+ version 1.2.3, July 18th, 2005
+
+ Copyright (C) 1995-2005 Jean-loup Gailly and Mark Adler
+
+ This software is provided 'as-is', without any express or implied
+ warranty. In no event will the authors be held liable for any damages
+ arising from the use of this software.
+
+ Permission is granted to anyone to use this software for any purpose,
+ including commercial applications, and to alter it and redistribute it
+ freely, subject to the following restrictions:
+
+ 1. The origin of this software must not be misrepresented; you must not
+ claim that you wrote the original software. If you use this software
+ in a product, an acknowledgment in the product documentation would be
+ appreciated but is not required.
+ 2. Altered source versions must be plainly marked as such, and must not be
+ misrepresented as being the original software.
+ 3. This notice may not be removed or altered from any source distribution.
+
+ Jean-loup Gailly Mark Adler
+ jloup@gzip.org madler@alumni.caltech.edu
+
+
+ The data format used by the zlib library is described by RFCs (Request for
+ Comments) 1950 to 1952 in the files http://www.ietf.org/rfc/rfc1950.txt
+ (zlib format), rfc1951.txt (deflate format) and rfc1952.txt (gzip format).
+*/
+
+#ifndef ZLIB_H
+#define ZLIB_H
+
+#include "zconf.h"
+#include "qconfig.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define ZLIB_VERSION "1.2.3"
+#define ZLIB_VERNUM 0x1230
+
+#if defined(QT_VISIBILITY_AVAILABLE)
+# define Q_ZEXPORT __attribute__((visibility("default")))
+#else
+# ifdef QT_MAKEDLL
+# define Q_ZEXPORT __declspec(dllexport)
+# else
+# define Q_ZEXPORT ZEXPORT
+# endif
+#endif
+
+/*
+ The 'zlib' compression library provides in-memory compression and
+ decompression functions, including integrity checks of the uncompressed
+ data. This version of the library supports only one compression method
+ (deflation) but other algorithms will be added later and will have the same
+ stream interface.
+
+ Compression can be done in a single step if the buffers are large
+ enough (for example if an input file is mmap'ed), or can be done by
+ repeated calls of the compression function. In the latter case, the
+ application must provide more input and/or consume the output
+ (providing more output space) before each call.
+
+ The compressed data format used by default by the in-memory functions is
+ the zlib format, which is a zlib wrapper documented in RFC 1950, wrapped
+ around a deflate stream, which is itself documented in RFC 1951.
+
+ The library also supports reading and writing files in gzip (.gz) format
+ with an interface similar to that of stdio using the functions that start
+ with "gz". The gzip format is different from the zlib format. gzip is a
+ gzip wrapper, documented in RFC 1952, wrapped around a deflate stream.
+
+ This library can optionally read and write gzip streams in memory as well.
+
+ The zlib format was designed to be compact and fast for use in memory
+ and on communications channels. The gzip format was designed for single-
+ file compression on file systems, has a larger header than zlib to maintain
+ directory information, and uses a different, slower check method than zlib.
+
+ The library does not install any signal handler. The decoder checks
+ the consistency of the compressed data, so the library should never
+ crash even in case of corrupted input.
+*/
+
+typedef voidpf (*alloc_func) OF((voidpf opaque, uInt items, uInt size));
+typedef void (*free_func) OF((voidpf opaque, voidpf address));
+
+struct internal_state;
+
+typedef struct z_stream_s {
+ Bytef *next_in; /* next input byte */
+ uInt avail_in; /* number of bytes available at next_in */
+ uLong total_in; /* total nb of input bytes read so far */
+
+ Bytef *next_out; /* next output byte should be put there */
+ uInt avail_out; /* remaining free space at next_out */
+ uLong total_out; /* total nb of bytes output so far */
+
+ char *msg; /* last error message, NULL if no error */
+ struct internal_state FAR *state; /* not visible by applications */
+
+ alloc_func zalloc; /* used to allocate the internal state */
+ free_func zfree; /* used to free the internal state */
+ voidpf opaque; /* private data object passed to zalloc and zfree */
+
+ int data_type; /* best guess about the data type: binary or text */
+ uLong adler; /* adler32 value of the uncompressed data */
+ uLong reserved; /* reserved for future use */
+} z_stream;
+
+typedef z_stream FAR *z_streamp;
+
+/*
+ gzip header information passed to and from zlib routines. See RFC 1952
+ for more details on the meanings of these fields.
+*/
+typedef struct gz_header_s {
+ int text; /* true if compressed data believed to be text */
+ uLong time; /* modification time */
+ int xflags; /* extra flags (not used when writing a gzip file) */
+ int os; /* operating system */
+ Bytef *extra; /* pointer to extra field or Z_NULL if none */
+ uInt extra_len; /* extra field length (valid if extra != Z_NULL) */
+ uInt extra_max; /* space at extra (only when reading header) */
+ Bytef *name; /* pointer to zero-terminated file name or Z_NULL */
+ uInt name_max; /* space at name (only when reading header) */
+ Bytef *comment; /* pointer to zero-terminated comment or Z_NULL */
+ uInt comm_max; /* space at comment (only when reading header) */
+ int hcrc; /* true if there was or will be a header crc */
+ int done; /* true when done reading gzip header (not used
+ when writing a gzip file) */
+} gz_header;
+
+typedef gz_header FAR *gz_headerp;
+
+/*
+ The application must update next_in and avail_in when avail_in has
+ dropped to zero. It must update next_out and avail_out when avail_out
+ has dropped to zero. The application must initialize zalloc, zfree and
+ opaque before calling the init function. All other fields are set by the
+ compression library and must not be updated by the application.
+
+ The opaque value provided by the application will be passed as the first
+ parameter for calls of zalloc and zfree. This can be useful for custom
+ memory management. The compression library attaches no meaning to the
+ opaque value.
+
+ zalloc must return Z_NULL if there is not enough memory for the object.
+ If zlib is used in a multi-threaded application, zalloc and zfree must be
+ thread safe.
+
+ On 16-bit systems, the functions zalloc and zfree must be able to allocate
+ exactly 65536 bytes, but will not be required to allocate more than this
+ if the symbol MAXSEG_64K is defined (see zconf.h). WARNING: On MSDOS,
+ pointers returned by zalloc for objects of exactly 65536 bytes *must*
+ have their offset normalized to zero. The default allocation function
+ provided by this library ensures this (see zutil.c). To reduce memory
+ requirements and avoid any allocation of 64K objects, at the expense of
+ compression ratio, compile the library with -DMAX_WBITS=14 (see zconf.h).
+
+ The fields total_in and total_out can be used for statistics or
+ progress reports. After compression, total_in holds the total size of
+ the uncompressed data and may be saved for use in the decompressor
+ (particularly if the decompressor wants to decompress everything in
+ a single step).
+*/
+
+ /* constants */
+
+#define Z_NO_FLUSH 0
+#define Z_PARTIAL_FLUSH 1 /* will be removed, use Z_SYNC_FLUSH instead */
+#define Z_SYNC_FLUSH 2
+#define Z_FULL_FLUSH 3
+#define Z_FINISH 4
+#define Z_BLOCK 5
+/* Allowed flush values; see deflate() and inflate() below for details */
+
+#define Z_OK 0
+#define Z_STREAM_END 1
+#define Z_NEED_DICT 2
+#define Z_ERRNO (-1)
+#define Z_STREAM_ERROR (-2)
+#define Z_DATA_ERROR (-3)
+#define Z_MEM_ERROR (-4)
+#define Z_BUF_ERROR (-5)
+#define Z_VERSION_ERROR (-6)
+/* Return codes for the compression/decompression functions. Negative
+ * values are errors, positive values are used for special but normal events.
+ */
+
+#define Z_NO_COMPRESSION 0
+#define Z_BEST_SPEED 1
+#define Z_BEST_COMPRESSION 9
+#define Z_DEFAULT_COMPRESSION (-1)
+/* compression levels */
+
+#define Z_FILTERED 1
+#define Z_HUFFMAN_ONLY 2
+#define Z_RLE 3
+#define Z_FIXED 4
+#define Z_DEFAULT_STRATEGY 0
+/* compression strategy; see deflateInit2() below for details */
+
+#define Z_BINARY 0
+#define Z_TEXT 1
+#define Z_ASCII Z_TEXT /* for compatibility with 1.2.2 and earlier */
+#define Z_UNKNOWN 2
+/* Possible values of the data_type field (though see inflate()) */
+
+#define Z_DEFLATED 8
+/* The deflate compression method (the only one supported in this version) */
+
+#define Z_NULL 0 /* for initializing zalloc, zfree, opaque */
+
+#define zlib_version zlibVersion()
+/* for compatibility with versions < 1.0.2 */
+
+ /* basic functions */
+
+ZEXTERN Q_ZEXPORT const char * zlibVersion OF((void));
+/* The application can compare zlibVersion and ZLIB_VERSION for consistency.
+ If the first character differs, the library code actually used is
+ not compatible with the zlib.h header file used by the application.
+ This check is automatically made by deflateInit and inflateInit.
+ */
+
+/*
+ZEXTERN int ZEXPORT deflateInit OF((z_streamp strm, int level));
+
+ Initializes the internal stream state for compression. The fields
+ zalloc, zfree and opaque must be initialized before by the caller.
+ If zalloc and zfree are set to Z_NULL, deflateInit updates them to
+ use default allocation functions.
+
+ The compression level must be Z_DEFAULT_COMPRESSION, or between 0 and 9:
+ 1 gives best speed, 9 gives best compression, 0 gives no compression at
+ all (the input data is simply copied a block at a time).
+ Z_DEFAULT_COMPRESSION requests a default compromise between speed and
+ compression (currently equivalent to level 6).
+
+ deflateInit returns Z_OK if success, Z_MEM_ERROR if there was not
+ enough memory, Z_STREAM_ERROR if level is not a valid compression level,
+ Z_VERSION_ERROR if the zlib library version (zlib_version) is incompatible
+ with the version assumed by the caller (ZLIB_VERSION).
+ msg is set to null if there is no error message. deflateInit does not
+ perform any compression: this will be done by deflate().
+*/
+
+
+ZEXTERN int Q_ZEXPORT deflate OF((z_streamp strm, int flush));
+/*
+ deflate compresses as much data as possible, and stops when the input
+ buffer becomes empty or the output buffer becomes full. It may introduce some
+ output latency (reading input without producing any output) except when
+ forced to flush.
+
+ The detailed semantics are as follows. deflate performs one or both of the
+ following actions:
+
+ - Compress more input starting at next_in and update next_in and avail_in
+ accordingly. If not all input can be processed (because there is not
+ enough room in the output buffer), next_in and avail_in are updated and
+ processing will resume at this point for the next call of deflate().
+
+ - Provide more output starting at next_out and update next_out and avail_out
+ accordingly. This action is forced if the parameter flush is non zero.
+ Forcing flush frequently degrades the compression ratio, so this parameter
+ should be set only when necessary (in interactive applications).
+ Some output may be provided even if flush is not set.
+
+ Before the call of deflate(), the application should ensure that at least
+ one of the actions is possible, by providing more input and/or consuming
+ more output, and updating avail_in or avail_out accordingly; avail_out
+ should never be zero before the call. The application can consume the
+ compressed output when it wants, for example when the output buffer is full
+ (avail_out == 0), or after each call of deflate(). If deflate returns Z_OK
+ and with zero avail_out, it must be called again after making room in the
+ output buffer because there might be more output pending.
+
+ Normally the parameter flush is set to Z_NO_FLUSH, which allows deflate to
+ decide how much data to accumualte before producing output, in order to
+ maximize compression.
+
+ If the parameter flush is set to Z_SYNC_FLUSH, all pending output is
+ flushed to the output buffer and the output is aligned on a byte boundary, so
+ that the decompressor can get all input data available so far. (In particular
+ avail_in is zero after the call if enough output space has been provided
+ before the call.) Flushing may degrade compression for some compression
+ algorithms and so it should be used only when necessary.
+
+ If flush is set to Z_FULL_FLUSH, all output is flushed as with
+ Z_SYNC_FLUSH, and the compression state is reset so that decompression can
+ restart from this point if previous compressed data has been damaged or if
+ random access is desired. Using Z_FULL_FLUSH too often can seriously degrade
+ compression.
+
+ If deflate returns with avail_out == 0, this function must be called again
+ with the same value of the flush parameter and more output space (updated
+ avail_out), until the flush is complete (deflate returns with non-zero
+ avail_out). In the case of a Z_FULL_FLUSH or Z_SYNC_FLUSH, make sure that
+ avail_out is greater than six to avoid repeated flush markers due to
+ avail_out == 0 on return.
+
+ If the parameter flush is set to Z_FINISH, pending input is processed,
+ pending output is flushed and deflate returns with Z_STREAM_END if there
+ was enough output space; if deflate returns with Z_OK, this function must be
+ called again with Z_FINISH and more output space (updated avail_out) but no
+ more input data, until it returns with Z_STREAM_END or an error. After
+ deflate has returned Z_STREAM_END, the only possible operations on the
+ stream are deflateReset or deflateEnd.
+
+ Z_FINISH can be used immediately after deflateInit if all the compression
+ is to be done in a single step. In this case, avail_out must be at least
+ the value returned by deflateBound (see below). If deflate does not return
+ Z_STREAM_END, then it must be called again as described above.
+
+ deflate() sets strm->adler to the adler32 checksum of all input read
+ so far (that is, total_in bytes).
+
+ deflate() may update strm->data_type if it can make a good guess about
+ the input data type (Z_BINARY or Z_TEXT). In doubt, the data is considered
+ binary. This field is only for information purposes and does not affect
+ the compression algorithm in any manner.
+
+ deflate() returns Z_OK if some progress has been made (more input
+ processed or more output produced), Z_STREAM_END if all input has been
+ consumed and all output has been produced (only when flush is set to
+ Z_FINISH), Z_STREAM_ERROR if the stream state was inconsistent (for example
+ if next_in or next_out was NULL), Z_BUF_ERROR if no progress is possible
+ (for example avail_in or avail_out was zero). Note that Z_BUF_ERROR is not
+ fatal, and deflate() can be called again with more input and more output
+ space to continue compressing.
+*/
+
+
+ZEXTERN int Q_ZEXPORT deflateEnd OF((z_streamp strm));
+/*
+ All dynamically allocated data structures for this stream are freed.
+ This function discards any unprocessed input and does not flush any
+ pending output.
+
+ deflateEnd returns Z_OK if success, Z_STREAM_ERROR if the
+ stream state was inconsistent, Z_DATA_ERROR if the stream was freed
+ prematurely (some input or output was discarded). In the error case,
+ msg may be set but then points to a static string (which must not be
+ deallocated).
+*/
+
+
+/*
+ZEXTERN int ZEXPORT inflateInit OF((z_streamp strm));
+
+ Initializes the internal stream state for decompression. The fields
+ next_in, avail_in, zalloc, zfree and opaque must be initialized before by
+ the caller. If next_in is not Z_NULL and avail_in is large enough (the exact
+ value depends on the compression method), inflateInit determines the
+ compression method from the zlib header and allocates all data structures
+ accordingly; otherwise the allocation will be deferred to the first call of
+ inflate. If zalloc and zfree are set to Z_NULL, inflateInit updates them to
+ use default allocation functions.
+
+ inflateInit returns Z_OK if success, Z_MEM_ERROR if there was not enough
+ memory, Z_VERSION_ERROR if the zlib library version is incompatible with the
+ version assumed by the caller. msg is set to null if there is no error
+ message. inflateInit does not perform any decompression apart from reading
+ the zlib header if present: this will be done by inflate(). (So next_in and
+ avail_in may be modified, but next_out and avail_out are unchanged.)
+*/
+
+
+ZEXTERN int Q_ZEXPORT inflate OF((z_streamp strm, int flush));
+/*
+ inflate decompresses as much data as possible, and stops when the input
+ buffer becomes empty or the output buffer becomes full. It may introduce
+ some output latency (reading input without producing any output) except when
+ forced to flush.
+
+ The detailed semantics are as follows. inflate performs one or both of the
+ following actions:
+
+ - Decompress more input starting at next_in and update next_in and avail_in
+ accordingly. If not all input can be processed (because there is not
+ enough room in the output buffer), next_in is updated and processing
+ will resume at this point for the next call of inflate().
+
+ - Provide more output starting at next_out and update next_out and avail_out
+ accordingly. inflate() provides as much output as possible, until there
+ is no more input data or no more space in the output buffer (see below
+ about the flush parameter).
+
+ Before the call of inflate(), the application should ensure that at least
+ one of the actions is possible, by providing more input and/or consuming
+ more output, and updating the next_* and avail_* values accordingly.
+ The application can consume the uncompressed output when it wants, for
+ example when the output buffer is full (avail_out == 0), or after each
+ call of inflate(). If inflate returns Z_OK and with zero avail_out, it
+ must be called again after making room in the output buffer because there
+ might be more output pending.
+
+ The flush parameter of inflate() can be Z_NO_FLUSH, Z_SYNC_FLUSH,
+ Z_FINISH, or Z_BLOCK. Z_SYNC_FLUSH requests that inflate() flush as much
+ output as possible to the output buffer. Z_BLOCK requests that inflate() stop
+ if and when it gets to the next deflate block boundary. When decoding the
+ zlib or gzip format, this will cause inflate() to return immediately after
+ the header and before the first block. When doing a raw inflate, inflate()
+ will go ahead and process the first block, and will return when it gets to
+ the end of that block, or when it runs out of data.
+
+ The Z_BLOCK option assists in appending to or combining deflate streams.
+ Also to assist in this, on return inflate() will set strm->data_type to the
+ number of unused bits in the last byte taken from strm->next_in, plus 64
+ if inflate() is currently decoding the last block in the deflate stream,
+ plus 128 if inflate() returned immediately after decoding an end-of-block
+ code or decoding the complete header up to just before the first byte of the
+ deflate stream. The end-of-block will not be indicated until all of the
+ uncompressed data from that block has been written to strm->next_out. The
+ number of unused bits may in general be greater than seven, except when
+ bit 7 of data_type is set, in which case the number of unused bits will be
+ less than eight.
+
+ inflate() should normally be called until it returns Z_STREAM_END or an
+ error. However if all decompression is to be performed in a single step
+ (a single call of inflate), the parameter flush should be set to
+ Z_FINISH. In this case all pending input is processed and all pending
+ output is flushed; avail_out must be large enough to hold all the
+ uncompressed data. (The size of the uncompressed data may have been saved
+ by the compressor for this purpose.) The next operation on this stream must
+ be inflateEnd to deallocate the decompression state. The use of Z_FINISH
+ is never required, but can be used to inform inflate that a faster approach
+ may be used for the single inflate() call.
+
+ In this implementation, inflate() always flushes as much output as
+ possible to the output buffer, and always uses the faster approach on the
+ first call. So the only effect of the flush parameter in this implementation
+ is on the return value of inflate(), as noted below, or when it returns early
+ because Z_BLOCK is used.
+
+ If a preset dictionary is needed after this call (see inflateSetDictionary
+ below), inflate sets strm->adler to the adler32 checksum of the dictionary
+ chosen by the compressor and returns Z_NEED_DICT; otherwise it sets
+ strm->adler to the adler32 checksum of all output produced so far (that is,
+ total_out bytes) and returns Z_OK, Z_STREAM_END or an error code as described
+ below. At the end of the stream, inflate() checks that its computed adler32
+ checksum is equal to that saved by the compressor and returns Z_STREAM_END
+ only if the checksum is correct.
+
+ inflate() will decompress and check either zlib-wrapped or gzip-wrapped
+ deflate data. The header type is detected automatically. Any information
+ contained in the gzip header is not retained, so applications that need that
+ information should instead use raw inflate, see inflateInit2() below, or
+ inflateBack() and perform their own processing of the gzip header and
+ trailer.
+
+ inflate() returns Z_OK if some progress has been made (more input processed
+ or more output produced), Z_STREAM_END if the end of the compressed data has
+ been reached and all uncompressed output has been produced, Z_NEED_DICT if a
+ preset dictionary is needed at this point, Z_DATA_ERROR if the input data was
+ corrupted (input stream not conforming to the zlib format or incorrect check
+ value), Z_STREAM_ERROR if the stream structure was inconsistent (for example
+ if next_in or next_out was NULL), Z_MEM_ERROR if there was not enough memory,
+ Z_BUF_ERROR if no progress is possible or if there was not enough room in the
+ output buffer when Z_FINISH is used. Note that Z_BUF_ERROR is not fatal, and
+ inflate() can be called again with more input and more output space to
+ continue decompressing. If Z_DATA_ERROR is returned, the application may then
+ call inflateSync() to look for a good compression block if a partial recovery
+ of the data is desired.
+*/
+
+
+ZEXTERN int Q_ZEXPORT inflateEnd OF((z_streamp strm));
+/*
+ All dynamically allocated data structures for this stream are freed.
+ This function discards any unprocessed input and does not flush any
+ pending output.
+
+ inflateEnd returns Z_OK if success, Z_STREAM_ERROR if the stream state
+ was inconsistent. In the error case, msg may be set but then points to a
+ static string (which must not be deallocated).
+*/
+
+ /* Advanced functions */
+
+/*
+ The following functions are needed only in some special applications.
+*/
+
+/*
+ZEXTERN int ZEXPORT deflateInit2 OF((z_streamp strm,
+ int level,
+ int method,
+ int windowBits,
+ int memLevel,
+ int strategy));
+
+ This is another version of deflateInit with more compression options. The
+ fields next_in, zalloc, zfree and opaque must be initialized before by
+ the caller.
+
+ The method parameter is the compression method. It must be Z_DEFLATED in
+ this version of the library.
+
+ The windowBits parameter is the base two logarithm of the window size
+ (the size of the history buffer). It should be in the range 8..15 for this
+ version of the library. Larger values of this parameter result in better
+ compression at the expense of memory usage. The default value is 15 if
+ deflateInit is used instead.
+
+ windowBits can also be -8..-15 for raw deflate. In this case, -windowBits
+ determines the window size. deflate() will then generate raw deflate data
+ with no zlib header or trailer, and will not compute an adler32 check value.
+
+ windowBits can also be greater than 15 for optional gzip encoding. Add
+ 16 to windowBits to write a simple gzip header and trailer around the
+ compressed data instead of a zlib wrapper. The gzip header will have no
+ file name, no extra data, no comment, no modification time (set to zero),
+ no header crc, and the operating system will be set to 255 (unknown). If a
+ gzip stream is being written, strm->adler is a crc32 instead of an adler32.
+
+ The memLevel parameter specifies how much memory should be allocated
+ for the internal compression state. memLevel=1 uses minimum memory but
+ is slow and reduces compression ratio; memLevel=9 uses maximum memory
+ for optimal speed. The default value is 8. See zconf.h for total memory
+ usage as a function of windowBits and memLevel.
+
+ The strategy parameter is used to tune the compression algorithm. Use the
+ value Z_DEFAULT_STRATEGY for normal data, Z_FILTERED for data produced by a
+ filter (or predictor), Z_HUFFMAN_ONLY to force Huffman encoding only (no
+ string match), or Z_RLE to limit match distances to one (run-length
+ encoding). Filtered data consists mostly of small values with a somewhat
+ random distribution. In this case, the compression algorithm is tuned to
+ compress them better. The effect of Z_FILTERED is to force more Huffman
+ coding and less string matching; it is somewhat intermediate between
+ Z_DEFAULT and Z_HUFFMAN_ONLY. Z_RLE is designed to be almost as fast as
+ Z_HUFFMAN_ONLY, but give better compression for PNG image data. The strategy
+ parameter only affects the compression ratio but not the correctness of the
+ compressed output even if it is not set appropriately. Z_FIXED prevents the
+ use of dynamic Huffman codes, allowing for a simpler decoder for special
+ applications.
+
+ deflateInit2 returns Z_OK if success, Z_MEM_ERROR if there was not enough
+ memory, Z_STREAM_ERROR if a parameter is invalid (such as an invalid
+ method). msg is set to null if there is no error message. deflateInit2 does
+ not perform any compression: this will be done by deflate().
+*/
+
+ZEXTERN int Q_ZEXPORT deflateSetDictionary OF((z_streamp strm,
+ const Bytef *dictionary,
+ uInt dictLength));
+/*
+ Initializes the compression dictionary from the given byte sequence
+ without producing any compressed output. This function must be called
+ immediately after deflateInit, deflateInit2 or deflateReset, before any
+ call of deflate. The compressor and decompressor must use exactly the same
+ dictionary (see inflateSetDictionary).
+
+ The dictionary should consist of strings (byte sequences) that are likely
+ to be encountered later in the data to be compressed, with the most commonly
+ used strings preferably put towards the end of the dictionary. Using a
+ dictionary is most useful when the data to be compressed is short and can be
+ predicted with good accuracy; the data can then be compressed better than
+ with the default empty dictionary.
+
+ Depending on the size of the compression data structures selected by
+ deflateInit or deflateInit2, a part of the dictionary may in effect be
+ discarded, for example if the dictionary is larger than the window size in
+ deflate or deflate2. Thus the strings most likely to be useful should be
+ put at the end of the dictionary, not at the front. In addition, the
+ current implementation of deflate will use at most the window size minus
+ 262 bytes of the provided dictionary.
+
+ Upon return of this function, strm->adler is set to the adler32 value
+ of the dictionary; the decompressor may later use this value to determine
+ which dictionary has been used by the compressor. (The adler32 value
+ applies to the whole dictionary even if only a subset of the dictionary is
+ actually used by the compressor.) If a raw deflate was requested, then the
+ adler32 value is not computed and strm->adler is not set.
+
+ deflateSetDictionary returns Z_OK if success, or Z_STREAM_ERROR if a
+ parameter is invalid (such as NULL dictionary) or the stream state is
+ inconsistent (for example if deflate has already been called for this stream
+ or if the compression method is bsort). deflateSetDictionary does not
+ perform any compression: this will be done by deflate().
+*/
+
+ZEXTERN int Q_ZEXPORT deflateCopy OF((z_streamp dest,
+ z_streamp source));
+/*
+ Sets the destination stream as a complete copy of the source stream.
+
+ This function can be useful when several compression strategies will be
+ tried, for example when there are several ways of pre-processing the input
+ data with a filter. The streams that will be discarded should then be freed
+ by calling deflateEnd. Note that deflateCopy duplicates the internal
+ compression state which can be quite large, so this strategy is slow and
+ can consume lots of memory.
+
+ deflateCopy returns Z_OK if success, Z_MEM_ERROR if there was not
+ enough memory, Z_STREAM_ERROR if the source stream state was inconsistent
+ (such as zalloc being NULL). msg is left unchanged in both source and
+ destination.
+*/
+
+ZEXTERN int Q_ZEXPORT deflateReset OF((z_streamp strm));
+/*
+ This function is equivalent to deflateEnd followed by deflateInit,
+ but does not free and reallocate all the internal compression state.
+ The stream will keep the same compression level and any other attributes
+ that may have been set by deflateInit2.
+
+ deflateReset returns Z_OK if success, or Z_STREAM_ERROR if the source
+ stream state was inconsistent (such as zalloc or state being NULL).
+*/
+
+ZEXTERN int Q_ZEXPORT deflateParams OF((z_streamp strm,
+ int level,
+ int strategy));
+/*
+ Dynamically update the compression level and compression strategy. The
+ interpretation of level and strategy is as in deflateInit2. This can be
+ used to switch between compression and straight copy of the input data, or
+ to switch to a different kind of input data requiring a different
+ strategy. If the compression level is changed, the input available so far
+ is compressed with the old level (and may be flushed); the new level will
+ take effect only at the next call of deflate().
+
+ Before the call of deflateParams, the stream state must be set as for
+ a call of deflate(), since the currently available input may have to
+ be compressed and flushed. In particular, strm->avail_out must be non-zero.
+
+ deflateParams returns Z_OK if success, Z_STREAM_ERROR if the source
+ stream state was inconsistent or if a parameter was invalid, Z_BUF_ERROR
+ if strm->avail_out was zero.
+*/
+
+ZEXTERN int ZEXPORT deflateTune OF((z_streamp strm,
+ int good_length,
+ int max_lazy,
+ int nice_length,
+ int max_chain));
+/*
+ Fine tune deflate's internal compression parameters. This should only be
+ used by someone who understands the algorithm used by zlib's deflate for
+ searching for the best matching string, and even then only by the most
+ fanatic optimizer trying to squeeze out the last compressed bit for their
+ specific input data. Read the deflate.c source code for the meaning of the
+ max_lazy, good_length, nice_length, and max_chain parameters.
+
+ deflateTune() can be called after deflateInit() or deflateInit2(), and
+ returns Z_OK on success, or Z_STREAM_ERROR for an invalid deflate stream.
+ */
+
+ZEXTERN uLong ZEXPORT deflateBound OF((z_streamp strm,
+ uLong sourceLen));
+/*
+ deflateBound() returns an upper bound on the compressed size after
+ deflation of sourceLen bytes. It must be called after deflateInit()
+ or deflateInit2(). This would be used to allocate an output buffer
+ for deflation in a single pass, and so would be called before deflate().
+*/
+
+ZEXTERN int ZEXPORT deflatePrime OF((z_streamp strm,
+ int bits,
+ int value));
+/*
+ deflatePrime() inserts bits in the deflate output stream. The intent
+ is that this function is used to start off the deflate output with the
+ bits leftover from a previous deflate stream when appending to it. As such,
+ this function can only be used for raw deflate, and must be used before the
+ first deflate() call after a deflateInit2() or deflateReset(). bits must be
+ less than or equal to 16, and that many of the least significant bits of
+ value will be inserted in the output.
+
+ deflatePrime returns Z_OK if success, or Z_STREAM_ERROR if the source
+ stream state was inconsistent.
+*/
+
+ZEXTERN int ZEXPORT deflateSetHeader OF((z_streamp strm,
+ gz_headerp head));
+/*
+ deflateSetHeader() provides gzip header information for when a gzip
+ stream is requested by deflateInit2(). deflateSetHeader() may be called
+ after deflateInit2() or deflateReset() and before the first call of
+ deflate(). The text, time, os, extra field, name, and comment information
+ in the provided gz_header structure are written to the gzip header (xflag is
+ ignored -- the extra flags are set according to the compression level). The
+ caller must assure that, if not Z_NULL, name and comment are terminated with
+ a zero byte, and that if extra is not Z_NULL, that extra_len bytes are
+ available there. If hcrc is true, a gzip header crc is included. Note that
+ the current versions of the command-line version of gzip (up through version
+ 1.3.x) do not support header crc's, and will report that it is a "multi-part
+ gzip file" and give up.
+
+ If deflateSetHeader is not used, the default gzip header has text false,
+ the time set to zero, and os set to 255, with no extra, name, or comment
+ fields. The gzip header is returned to the default state by deflateReset().
+
+ deflateSetHeader returns Z_OK if success, or Z_STREAM_ERROR if the source
+ stream state was inconsistent.
+*/
+
+/*
+ZEXTERN int ZEXPORT inflateInit2 OF((z_streamp strm,
+ int windowBits));
+
+ This is another version of inflateInit with an extra parameter. The
+ fields next_in, avail_in, zalloc, zfree and opaque must be initialized
+ before by the caller.
+
+ The windowBits parameter is the base two logarithm of the maximum window
+ size (the size of the history buffer). It should be in the range 8..15 for
+ this version of the library. The default value is 15 if inflateInit is used
+ instead. windowBits must be greater than or equal to the windowBits value
+ provided to deflateInit2() while compressing, or it must be equal to 15 if
+ deflateInit2() was not used. If a compressed stream with a larger window
+ size is given as input, inflate() will return with the error code
+ Z_DATA_ERROR instead of trying to allocate a larger window.
+
+ windowBits can also be -8..-15 for raw inflate. In this case, -windowBits
+ determines the window size. inflate() will then process raw deflate data,
+ not looking for a zlib or gzip header, not generating a check value, and not
+ looking for any check values for comparison at the end of the stream. This
+ is for use with other formats that use the deflate compressed data format
+ such as zip. Those formats provide their own check values. If a custom
+ format is developed using the raw deflate format for compressed data, it is
+ recommended that a check value such as an adler32 or a crc32 be applied to
+ the uncompressed data as is done in the zlib, gzip, and zip formats. For
+ most applications, the zlib format should be used as is. Note that comments
+ above on the use in deflateInit2() applies to the magnitude of windowBits.
+
+ windowBits can also be greater than 15 for optional gzip decoding. Add
+ 32 to windowBits to enable zlib and gzip decoding with automatic header
+ detection, or add 16 to decode only the gzip format (the zlib format will
+ return a Z_DATA_ERROR). If a gzip stream is being decoded, strm->adler is
+ a crc32 instead of an adler32.
+
+ inflateInit2 returns Z_OK if success, Z_MEM_ERROR if there was not enough
+ memory, Z_STREAM_ERROR if a parameter is invalid (such as a null strm). msg
+ is set to null if there is no error message. inflateInit2 does not perform
+ any decompression apart from reading the zlib header if present: this will
+ be done by inflate(). (So next_in and avail_in may be modified, but next_out
+ and avail_out are unchanged.)
+*/
+
+ZEXTERN int Q_ZEXPORT inflateSetDictionary OF((z_streamp strm,
+ const Bytef *dictionary,
+ uInt dictLength));
+/*
+ Initializes the decompression dictionary from the given uncompressed byte
+ sequence. This function must be called immediately after a call of inflate,
+ if that call returned Z_NEED_DICT. The dictionary chosen by the compressor
+ can be determined from the adler32 value returned by that call of inflate.
+ The compressor and decompressor must use exactly the same dictionary (see
+ deflateSetDictionary). For raw inflate, this function can be called
+ immediately after inflateInit2() or inflateReset() and before any call of
+ inflate() to set the dictionary. The application must insure that the
+ dictionary that was used for compression is provided.
+
+ inflateSetDictionary returns Z_OK if success, Z_STREAM_ERROR if a
+ parameter is invalid (such as NULL dictionary) or the stream state is
+ inconsistent, Z_DATA_ERROR if the given dictionary doesn't match the
+ expected one (incorrect adler32 value). inflateSetDictionary does not
+ perform any decompression: this will be done by subsequent calls of
+ inflate().
+*/
+
+ZEXTERN int Q_ZEXPORT inflateSync OF((z_streamp strm));
+/*
+ Skips invalid compressed data until a full flush point (see above the
+ description of deflate with Z_FULL_FLUSH) can be found, or until all
+ available input is skipped. No output is provided.
+
+ inflateSync returns Z_OK if a full flush point has been found, Z_BUF_ERROR
+ if no more input was provided, Z_DATA_ERROR if no flush point has been found,
+ or Z_STREAM_ERROR if the stream structure was inconsistent. In the success
+ case, the application may save the current current value of total_in which
+ indicates where valid compressed data was found. In the error case, the
+ application may repeatedly call inflateSync, providing more input each time,
+ until success or end of the input data.
+*/
+
+ZEXTERN int ZEXPORT inflateCopy OF((z_streamp dest,
+ z_streamp source));
+/*
+ Sets the destination stream as a complete copy of the source stream.
+
+ This function can be useful when randomly accessing a large stream. The
+ first pass through the stream can periodically record the inflate state,
+ allowing restarting inflate at those points when randomly accessing the
+ stream.
+
+ inflateCopy returns Z_OK if success, Z_MEM_ERROR if there was not
+ enough memory, Z_STREAM_ERROR if the source stream state was inconsistent
+ (such as zalloc being NULL). msg is left unchanged in both source and
+ destination.
+*/
+
+ZEXTERN int Q_ZEXPORT inflateReset OF((z_streamp strm));
+/*
+ This function is equivalent to inflateEnd followed by inflateInit,
+ but does not free and reallocate all the internal decompression state.
+ The stream will keep attributes that may have been set by inflateInit2.
+
+ inflateReset returns Z_OK if success, or Z_STREAM_ERROR if the source
+ stream state was inconsistent (such as zalloc or state being NULL).
+*/
+
+ZEXTERN int ZEXPORT inflatePrime OF((z_streamp strm,
+ int bits,
+ int value));
+/*
+ This function inserts bits in the inflate input stream. The intent is
+ that this function is used to start inflating at a bit position in the
+ middle of a byte. The provided bits will be used before any bytes are used
+ from next_in. This function should only be used with raw inflate, and
+ should be used before the first inflate() call after inflateInit2() or
+ inflateReset(). bits must be less than or equal to 16, and that many of the
+ least significant bits of value will be inserted in the input.
+
+ inflatePrime returns Z_OK if success, or Z_STREAM_ERROR if the source
+ stream state was inconsistent.
+*/
+
+ZEXTERN int ZEXPORT inflateGetHeader OF((z_streamp strm,
+ gz_headerp head));
+/*
+ inflateGetHeader() requests that gzip header information be stored in the
+ provided gz_header structure. inflateGetHeader() may be called after
+ inflateInit2() or inflateReset(), and before the first call of inflate().
+ As inflate() processes the gzip stream, head->done is zero until the header
+ is completed, at which time head->done is set to one. If a zlib stream is
+ being decoded, then head->done is set to -1 to indicate that there will be
+ no gzip header information forthcoming. Note that Z_BLOCK can be used to
+ force inflate() to return immediately after header processing is complete
+ and before any actual data is decompressed.
+
+ The text, time, xflags, and os fields are filled in with the gzip header
+ contents. hcrc is set to true if there is a header CRC. (The header CRC
+ was valid if done is set to one.) If extra is not Z_NULL, then extra_max
+ contains the maximum number of bytes to write to extra. Once done is true,
+ extra_len contains the actual extra field length, and extra contains the
+ extra field, or that field truncated if extra_max is less than extra_len.
+ If name is not Z_NULL, then up to name_max characters are written there,
+ terminated with a zero unless the length is greater than name_max. If
+ comment is not Z_NULL, then up to comm_max characters are written there,
+ terminated with a zero unless the length is greater than comm_max. When
+ any of extra, name, or comment are not Z_NULL and the respective field is
+ not present in the header, then that field is set to Z_NULL to signal its
+ absence. This allows the use of deflateSetHeader() with the returned
+ structure to duplicate the header. However if those fields are set to
+ allocated memory, then the application will need to save those pointers
+ elsewhere so that they can be eventually freed.
+
+ If inflateGetHeader is not used, then the header information is simply
+ discarded. The header is always checked for validity, including the header
+ CRC if present. inflateReset() will reset the process to discard the header
+ information. The application would need to call inflateGetHeader() again to
+ retrieve the header from the next gzip stream.
+
+ inflateGetHeader returns Z_OK if success, or Z_STREAM_ERROR if the source
+ stream state was inconsistent.
+*/
+
+/*
+ZEXTERN int ZEXPORT inflateBackInit OF((z_streamp strm, int windowBits,
+ unsigned char FAR *window));
+
+ Initialize the internal stream state for decompression using inflateBack()
+ calls. The fields zalloc, zfree and opaque in strm must be initialized
+ before the call. If zalloc and zfree are Z_NULL, then the default library-
+ derived memory allocation routines are used. windowBits is the base two
+ logarithm of the window size, in the range 8..15. window is a caller
+ supplied buffer of that size. Except for special applications where it is
+ assured that deflate was used with small window sizes, windowBits must be 15
+ and a 32K byte window must be supplied to be able to decompress general
+ deflate streams.
+
+ See inflateBack() for the usage of these routines.
+
+ inflateBackInit will return Z_OK on success, Z_STREAM_ERROR if any of
+ the paramaters are invalid, Z_MEM_ERROR if the internal state could not
+ be allocated, or Z_VERSION_ERROR if the version of the library does not
+ match the version of the header file.
+*/
+
+typedef unsigned (*in_func) OF((void FAR *, unsigned char FAR * FAR *));
+typedef int (*out_func) OF((void FAR *, unsigned char FAR *, unsigned));
+
+ZEXTERN int ZEXPORT inflateBack OF((z_streamp strm,
+ in_func in, void FAR *in_desc,
+ out_func out, void FAR *out_desc));
+/*
+ inflateBack() does a raw inflate with a single call using a call-back
+ interface for input and output. This is more efficient than inflate() for
+ file i/o applications in that it avoids copying between the output and the
+ sliding window by simply making the window itself the output buffer. This
+ function trusts the application to not change the output buffer passed by
+ the output function, at least until inflateBack() returns.
+
+ inflateBackInit() must be called first to allocate the internal state
+ and to initialize the state with the user-provided window buffer.
+ inflateBack() may then be used multiple times to inflate a complete, raw
+ deflate stream with each call. inflateBackEnd() is then called to free
+ the allocated state.
+
+ A raw deflate stream is one with no zlib or gzip header or trailer.
+ This routine would normally be used in a utility that reads zip or gzip
+ files and writes out uncompressed files. The utility would decode the
+ header and process the trailer on its own, hence this routine expects
+ only the raw deflate stream to decompress. This is different from the
+ normal behavior of inflate(), which expects either a zlib or gzip header and
+ trailer around the deflate stream.
+
+ inflateBack() uses two subroutines supplied by the caller that are then
+ called by inflateBack() for input and output. inflateBack() calls those
+ routines until it reads a complete deflate stream and writes out all of the
+ uncompressed data, or until it encounters an error. The function's
+ parameters and return types are defined above in the in_func and out_func
+ typedefs. inflateBack() will call in(in_desc, &buf) which should return the
+ number of bytes of provided input, and a pointer to that input in buf. If
+ there is no input available, in() must return zero--buf is ignored in that
+ case--and inflateBack() will return a buffer error. inflateBack() will call
+ out(out_desc, buf, len) to write the uncompressed data buf[0..len-1]. out()
+ should return zero on success, or non-zero on failure. If out() returns
+ non-zero, inflateBack() will return with an error. Neither in() nor out()
+ are permitted to change the contents of the window provided to
+ inflateBackInit(), which is also the buffer that out() uses to write from.
+ The length written by out() will be at most the window size. Any non-zero
+ amount of input may be provided by in().
+
+ For convenience, inflateBack() can be provided input on the first call by
+ setting strm->next_in and strm->avail_in. If that input is exhausted, then
+ in() will be called. Therefore strm->next_in must be initialized before
+ calling inflateBack(). If strm->next_in is Z_NULL, then in() will be called
+ immediately for input. If strm->next_in is not Z_NULL, then strm->avail_in
+ must also be initialized, and then if strm->avail_in is not zero, input will
+ initially be taken from strm->next_in[0 .. strm->avail_in - 1].
+
+ The in_desc and out_desc parameters of inflateBack() is passed as the
+ first parameter of in() and out() respectively when they are called. These
+ descriptors can be optionally used to pass any information that the caller-
+ supplied in() and out() functions need to do their job.
+
+ On return, inflateBack() will set strm->next_in and strm->avail_in to
+ pass back any unused input that was provided by the last in() call. The
+ return values of inflateBack() can be Z_STREAM_END on success, Z_BUF_ERROR
+ if in() or out() returned an error, Z_DATA_ERROR if there was a format
+ error in the deflate stream (in which case strm->msg is set to indicate the
+ nature of the error), or Z_STREAM_ERROR if the stream was not properly
+ initialized. In the case of Z_BUF_ERROR, an input or output error can be
+ distinguished using strm->next_in which will be Z_NULL only if in() returned
+ an error. If strm->next is not Z_NULL, then the Z_BUF_ERROR was due to
+ out() returning non-zero. (in() will always be called before out(), so
+ strm->next_in is assured to be defined if out() returns non-zero.) Note
+ that inflateBack() cannot return Z_OK.
+*/
+
+ZEXTERN int ZEXPORT inflateBackEnd OF((z_streamp strm));
+/*
+ All memory allocated by inflateBackInit() is freed.
+
+ inflateBackEnd() returns Z_OK on success, or Z_STREAM_ERROR if the stream
+ state was inconsistent.
+*/
+
+ZEXTERN uLong ZEXPORT zlibCompileFlags OF((void));
+/* Return flags indicating compile-time options.
+
+ Type sizes, two bits each, 00 = 16 bits, 01 = 32, 10 = 64, 11 = other:
+ 1.0: size of uInt
+ 3.2: size of uLong
+ 5.4: size of voidpf (pointer)
+ 7.6: size of z_off_t
+
+ Compiler, assembler, and debug options:
+ 8: DEBUG
+ 9: ASMV or ASMINF -- use ASM code
+ 10: ZLIB_WINAPI -- exported functions use the WINAPI calling convention
+ 11: 0 (reserved)
+
+ One-time table building (smaller code, but not thread-safe if true):
+ 12: BUILDFIXED -- build static block decoding tables when needed
+ 13: DYNAMIC_CRC_TABLE -- build CRC calculation tables when needed
+ 14,15: 0 (reserved)
+
+ Library content (indicates missing functionality):
+ 16: NO_GZCOMPRESS -- gz* functions cannot compress (to avoid linking
+ deflate code when not needed)
+ 17: NO_GZIP -- deflate can't write gzip streams, and inflate can't detect
+ and decode gzip streams (to avoid linking crc code)
+ 18-19: 0 (reserved)
+
+ Operation variations (changes in library functionality):
+ 20: PKZIP_BUG_WORKAROUND -- slightly more permissive inflate
+ 21: FASTEST -- deflate algorithm with only one, lowest compression level
+ 22,23: 0 (reserved)
+
+ The sprintf variant used by gzprintf (zero is best):
+ 24: 0 = vs*, 1 = s* -- 1 means limited to 20 arguments after the format
+ 25: 0 = *nprintf, 1 = *printf -- 1 means gzprintf() not secure!
+ 26: 0 = returns value, 1 = void -- 1 means inferred string length returned
+
+ Remainder:
+ 27-31: 0 (reserved)
+ */
+
+
+ /* utility functions */
+
+/*
+ The following utility functions are implemented on top of the
+ basic stream-oriented functions. To simplify the interface, some
+ default options are assumed (compression level and memory usage,
+ standard memory allocation functions). The source code of these
+ utility functions can easily be modified if you need special options.
+*/
+
+ZEXTERN int Q_ZEXPORT compress OF((Bytef *dest, uLongf *destLen,
+ const Bytef *source, uLong sourceLen));
+/*
+ Compresses the source buffer into the destination buffer. sourceLen is
+ the byte length of the source buffer. Upon entry, destLen is the total
+ size of the destination buffer, which must be at least the value returned
+ by compressBound(sourceLen). Upon exit, destLen is the actual size of the
+ compressed buffer.
+ This function can be used to compress a whole file at once if the
+ input file is mmap'ed.
+ compress returns Z_OK if success, Z_MEM_ERROR if there was not
+ enough memory, Z_BUF_ERROR if there was not enough room in the output
+ buffer.
+*/
+
+ZEXTERN int Q_ZEXPORT compress2 OF((Bytef *dest, uLongf *destLen,
+ const Bytef *source, uLong sourceLen,
+ int level));
+/*
+ Compresses the source buffer into the destination buffer. The level
+ parameter has the same meaning as in deflateInit. sourceLen is the byte
+ length of the source buffer. Upon entry, destLen is the total size of the
+ destination buffer, which must be at least the value returned by
+ compressBound(sourceLen). Upon exit, destLen is the actual size of the
+ compressed buffer.
+
+ compress2 returns Z_OK if success, Z_MEM_ERROR if there was not enough
+ memory, Z_BUF_ERROR if there was not enough room in the output buffer,
+ Z_STREAM_ERROR if the level parameter is invalid.
+*/
+
+ZEXTERN uLong ZEXPORT compressBound OF((uLong sourceLen));
+/*
+ compressBound() returns an upper bound on the compressed size after
+ compress() or compress2() on sourceLen bytes. It would be used before
+ a compress() or compress2() call to allocate the destination buffer.
+*/
+
+ZEXTERN int Q_ZEXPORT uncompress OF((Bytef *dest, uLongf *destLen,
+ const Bytef *source, uLong sourceLen));
+/*
+ Decompresses the source buffer into the destination buffer. sourceLen is
+ the byte length of the source buffer. Upon entry, destLen is the total
+ size of the destination buffer, which must be large enough to hold the
+ entire uncompressed data. (The size of the uncompressed data must have
+ been saved previously by the compressor and transmitted to the decompressor
+ by some mechanism outside the scope of this compression library.)
+ Upon exit, destLen is the actual size of the compressed buffer.
+ This function can be used to decompress a whole file at once if the
+ input file is mmap'ed.
+
+ uncompress returns Z_OK if success, Z_MEM_ERROR if there was not
+ enough memory, Z_BUF_ERROR if there was not enough room in the output
+ buffer, or Z_DATA_ERROR if the input data was corrupted or incomplete.
+*/
+
+
+typedef voidp gzFile;
+
+ZEXTERN gzFile Q_ZEXPORT gzopen OF((const char *path, const char *mode));
+/*
+ Opens a gzip (.gz) file for reading or writing. The mode parameter
+ is as in fopen ("rb" or "wb") but can also include a compression level
+ ("wb9") or a strategy: 'f' for filtered data as in "wb6f", 'h' for
+ Huffman only compression as in "wb1h", or 'R' for run-length encoding
+ as in "wb1R". (See the description of deflateInit2 for more information
+ about the strategy parameter.)
+
+ gzopen can be used to read a file which is not in gzip format; in this
+ case gzread will directly read from the file without decompression.
+
+ gzopen returns NULL if the file could not be opened or if there was
+ insufficient memory to allocate the (de)compression state; errno
+ can be checked to distinguish the two cases (if errno is zero, the
+ zlib error is Z_MEM_ERROR). */
+
+ZEXTERN gzFile Q_ZEXPORT gzdopen OF((int fd, const char *mode));
+/*
+ gzdopen() associates a gzFile with the file descriptor fd. File
+ descriptors are obtained from calls like open, dup, creat, pipe or
+ fileno (in the file has been previously opened with fopen).
+ The mode parameter is as in gzopen.
+ The next call of gzclose on the returned gzFile will also close the
+ file descriptor fd, just like fclose(fdopen(fd), mode) closes the file
+ descriptor fd. If you want to keep fd open, use gzdopen(dup(fd), mode).
+ gzdopen returns NULL if there was insufficient memory to allocate
+ the (de)compression state.
+*/
+
+ZEXTERN int Q_ZEXPORT gzsetparams OF((gzFile file, int level, int strategy));
+/*
+ Dynamically update the compression level or strategy. See the description
+ of deflateInit2 for the meaning of these parameters.
+ gzsetparams returns Z_OK if success, or Z_STREAM_ERROR if the file was not
+ opened for writing.
+*/
+
+ZEXTERN int Q_ZEXPORT gzread OF((gzFile file, voidp buf, unsigned len));
+/*
+ Reads the given number of uncompressed bytes from the compressed file.
+ If the input file was not in gzip format, gzread copies the given number
+ of bytes into the buffer.
+ gzread returns the number of uncompressed bytes actually read (0 for
+ end of file, -1 for error). */
+
+ZEXTERN int Q_ZEXPORT gzwrite OF((gzFile file,
+ voidpc buf, unsigned len));
+/*
+ Writes the given number of uncompressed bytes into the compressed file.
+ gzwrite returns the number of uncompressed bytes actually written
+ (0 in case of error).
+*/
+
+ZEXTERN int Q_ZEXPORT gzprintf OF((gzFile file, const char *format, ...));
+/*
+ Converts, formats, and writes the args to the compressed file under
+ control of the format string, as in fprintf. gzprintf returns the number of
+ uncompressed bytes actually written (0 in case of error). The number of
+ uncompressed bytes written is limited to 4095. The caller should assure that
+ this limit is not exceeded. If it is exceeded, then gzprintf() will return
+ return an error (0) with nothing written. In this case, there may also be a
+ buffer overflow with unpredictable consequences, which is possible only if
+ zlib was compiled with the insecure functions sprintf() or vsprintf()
+ because the secure snprintf() or vsnprintf() functions were not available.
+*/
+
+ZEXTERN int Q_ZEXPORT gzputs OF((gzFile file, const char *s));
+/*
+ Writes the given null-terminated string to the compressed file, excluding
+ the terminating null character.
+ gzputs returns the number of characters written, or -1 in case of error.
+*/
+
+ZEXTERN Q_ZEXPORT char * gzgets OF((gzFile file, char *buf, int len));
+/*
+ Reads bytes from the compressed file until len-1 characters are read, or
+ a newline character is read and transferred to buf, or an end-of-file
+ condition is encountered. The string is then terminated with a null
+ character.
+ gzgets returns buf, or Z_NULL in case of error.
+*/
+
+ZEXTERN int Q_ZEXPORT gzputc OF((gzFile file, int c));
+/*
+ Writes c, converted to an unsigned char, into the compressed file.
+ gzputc returns the value that was written, or -1 in case of error.
+*/
+
+ZEXTERN int Q_ZEXPORT gzgetc OF((gzFile file));
+/*
+ Reads one byte from the compressed file. gzgetc returns this byte
+ or -1 in case of end of file or error.
+*/
+
+ZEXTERN int ZEXPORT gzungetc OF((int c, gzFile file));
+/*
+ Push one character back onto the stream to be read again later.
+ Only one character of push-back is allowed. gzungetc() returns the
+ character pushed, or -1 on failure. gzungetc() will fail if a
+ character has been pushed but not read yet, or if c is -1. The pushed
+ character will be discarded if the stream is repositioned with gzseek()
+ or gzrewind().
+*/
+
+ZEXTERN int Q_ZEXPORT gzflush OF((gzFile file, int flush));
+/*
+ Flushes all pending output into the compressed file. The parameter
+ flush is as in the deflate() function. The return value is the zlib
+ error number (see function gzerror below). gzflush returns Z_OK if
+ the flush parameter is Z_FINISH and all output could be flushed.
+ gzflush should be called only when strictly necessary because it can
+ degrade compression.
+*/
+
+ZEXTERN z_off_t Q_ZEXPORT gzseek OF((gzFile file,
+ z_off_t offset, int whence));
+/*
+ Sets the starting position for the next gzread or gzwrite on the
+ given compressed file. The offset represents a number of bytes in the
+ uncompressed data stream. The whence parameter is defined as in lseek(2);
+ the value SEEK_END is not supported.
+ If the file is opened for reading, this function is emulated but can be
+ extremely slow. If the file is opened for writing, only forward seeks are
+ supported; gzseek then compresses a sequence of zeroes up to the new
+ starting position.
+
+ gzseek returns the resulting offset location as measured in bytes from
+ the beginning of the uncompressed stream, or -1 in case of error, in
+ particular if the file is opened for writing and the new starting position
+ would be before the current position.
+*/
+
+ZEXTERN int Q_ZEXPORT gzrewind OF((gzFile file));
+/*
+ Rewinds the given file. This function is supported only for reading.
+
+ gzrewind(file) is equivalent to (int)gzseek(file, 0L, SEEK_SET)
+*/
+
+ZEXTERN z_off_t Q_ZEXPORT gztell OF((gzFile file));
+/*
+ Returns the starting position for the next gzread or gzwrite on the
+ given compressed file. This position represents a number of bytes in the
+ uncompressed data stream.
+
+ gztell(file) is equivalent to gzseek(file, 0L, SEEK_CUR)
+*/
+
+ZEXTERN int Q_ZEXPORT gzeof OF((gzFile file));
+/*
+ Returns 1 when EOF has previously been detected reading the given
+ input stream, otherwise zero.
+*/
+
+ZEXTERN int ZEXPORT gzdirect OF((gzFile file));
+/*
+ Returns 1 if file is being read directly without decompression, otherwise
+ zero.
+*/
+
+ZEXTERN int Q_ZEXPORT gzclose OF((gzFile file));
+/*
+ Flushes all pending output if necessary, closes the compressed file
+ and deallocates all the (de)compression state. The return value is the zlib
+ error number (see function gzerror below).
+*/
+
+ZEXTERN Q_ZEXPORT const char * gzerror OF((gzFile file, int *errnum));
+/*
+ Returns the error message for the last error which occurred on the
+ given compressed file. errnum is set to zlib error number. If an
+ error occurred in the file system and not in the compression library,
+ errnum is set to Z_ERRNO and the application may consult errno
+ to get the exact error code.
+*/
+
+ZEXTERN void ZEXPORT gzclearerr OF((gzFile file));
+/*
+ Clears the error and end-of-file flags for file. This is analogous to the
+ clearerr() function in stdio. This is useful for continuing to read a gzip
+ file that is being written concurrently.
+*/
+
+ /* checksum functions */
+
+/*
+ These functions are not related to compression but are exported
+ anyway because they might be useful in applications using the
+ compression library.
+*/
+
+ZEXTERN uLong Q_ZEXPORT adler32 OF((uLong adler, const Bytef *buf, uInt len));
+/*
+ Update a running Adler-32 checksum with the bytes buf[0..len-1] and
+ return the updated checksum. If buf is NULL, this function returns
+ the required initial value for the checksum.
+ An Adler-32 checksum is almost as reliable as a CRC32 but can be computed
+ much faster. Usage example:
+
+ uLong adler = adler32(0L, Z_NULL, 0);
+
+ while (read_buffer(buffer, length) != EOF) {
+ adler = adler32(adler, buffer, length);
+ }
+ if (adler != original_adler) error();
+*/
+
+ZEXTERN uLong ZEXPORT adler32_combine OF((uLong adler1, uLong adler2,
+ z_off_t len2));
+/*
+ Combine two Adler-32 checksums into one. For two sequences of bytes, seq1
+ and seq2 with lengths len1 and len2, Adler-32 checksums were calculated for
+ each, adler1 and adler2. adler32_combine() returns the Adler-32 checksum of
+ seq1 and seq2 concatenated, requiring only adler1, adler2, and len2.
+*/
+
+ZEXTERN uLong Q_ZEXPORT crc32 OF((uLong crc, const Bytef *buf, uInt len));
+/*
+ Update a running CRC-32 with the bytes buf[0..len-1] and return the
+ updated CRC-32. If buf is NULL, this function returns the required initial
+ value for the for the crc. Pre- and post-conditioning (one's complement) is
+ performed within this function so it shouldn't be done by the application.
+ Usage example:
+
+ uLong crc = crc32(0L, Z_NULL, 0);
+
+ while (read_buffer(buffer, length) != EOF) {
+ crc = crc32(crc, buffer, length);
+ }
+ if (crc != original_crc) error();
+*/
+
+ZEXTERN uLong ZEXPORT crc32_combine OF((uLong crc1, uLong crc2, z_off_t len2));
+
+/*
+ Combine two CRC-32 check values into one. For two sequences of bytes,
+ seq1 and seq2 with lengths len1 and len2, CRC-32 check values were
+ calculated for each, crc1 and crc2. crc32_combine() returns the CRC-32
+ check value of seq1 and seq2 concatenated, requiring only crc1, crc2, and
+ len2.
+*/
+
+
+ /* various hacks, don't look :) */
+
+/* deflateInit and inflateInit are macros to allow checking the zlib version
+ * and the compiler's view of z_stream:
+ */
+ZEXTERN int Q_ZEXPORT deflateInit_ OF((z_streamp strm, int level,
+ const char *version, int stream_size));
+ZEXTERN int Q_ZEXPORT inflateInit_ OF((z_streamp strm,
+ const char *version, int stream_size));
+ZEXTERN int Q_ZEXPORT deflateInit2_ OF((z_streamp strm, int level, int method,
+ int windowBits, int memLevel,
+ int strategy, const char *version,
+ int stream_size));
+ZEXTERN int Q_ZEXPORT inflateInit2_ OF((z_streamp strm, int windowBits,
+ const char *version, int stream_size));
+ZEXTERN int ZEXPORT inflateBackInit_ OF((z_streamp strm, int windowBits,
+ unsigned char FAR *window,
+ const char *version,
+ int stream_size));
+#define deflateInit(strm, level) \
+ deflateInit_((strm), (level), ZLIB_VERSION, sizeof(z_stream))
+#define inflateInit(strm) \
+ inflateInit_((strm), ZLIB_VERSION, sizeof(z_stream))
+#define deflateInit2(strm, level, method, windowBits, memLevel, strategy) \
+ deflateInit2_((strm),(level),(method),(windowBits),(memLevel),\
+ (strategy), ZLIB_VERSION, sizeof(z_stream))
+#define inflateInit2(strm, windowBits) \
+ inflateInit2_((strm), (windowBits), ZLIB_VERSION, sizeof(z_stream))
+#define inflateBackInit(strm, windowBits, window) \
+ inflateBackInit_((strm), (windowBits), (window), \
+ ZLIB_VERSION, sizeof(z_stream))
+
+
+#if !defined(ZUTIL_H) && !defined(NO_DUMMY_DECL)
+ struct internal_state {int dummy;}; /* hack for buggy compilers */
+#endif
+
+ZEXTERN Q_ZEXPORT const char * zError OF((int));
+ZEXTERN int Q_ZEXPORT inflateSyncPoint OF((z_streamp z));
+ZEXTERN Q_ZEXPORT const uLongf * get_crc_table OF((void));
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* ZLIB_H */
--- a/project_files/hedgewars.pro Wed Sep 14 22:27:22 2011 +0200
+++ b/project_files/hedgewars.pro Wed Sep 14 22:39:39 2011 +0200
@@ -4,6 +4,7 @@
INCLUDEPATH += ../QTfrontend/
INCLUDEPATH += /usr/local/include/SDL
INCLUDEPATH += /usr/include/SDL
+INCLUDEPATH += ../misc/quazip/
DESTDIR = .
@@ -64,7 +65,8 @@
../QTfrontend/pagegamestats.h \
../QTfrontend/HWApplication.h \
../QTfrontend/AbstractPage.h \
- ../QTfrontend/themesmodel.h
+ ../QTfrontend/themesmodel.h \
+ ../QTfrontend/databrowser.h
SOURCES += ../QTfrontend/SDLs.cpp ../QTfrontend/SquareLabel.cpp \
../QTfrontend/about.cpp ../QTfrontend/ammoSchemeModel.cpp \
@@ -115,7 +117,8 @@
../QTfrontend/pagegamestats.cpp \
../QTfrontend/pageplayrecord.cpp \
../QTfrontend/HWApplication.cpp \
- ../QTfrontend/themesmodel.cpp
+ ../QTfrontend/themesmodel.cpp \
+ ../QTfrontend/databrowser.cpp
win32 {
SOURCES += ../QTfrontend/xfire.cpp
@@ -148,6 +151,8 @@
RESOURCES += ../QTfrontend/hedgewars.qrc
+LIBS += -L../misc/quazip -lquazip
+
!macx {
LIBS += -lSDL -lSDL_mixer
} else {
Binary file share/hedgewars/Data/Graphics/AmmoMenu/Ammos.png has changed
Binary file share/hedgewars/Data/Graphics/AmmoMenu/Ammos_bw.png has changed
Binary file share/hedgewars/Data/Graphics/Flags/libya.png has changed
Binary file share/hedgewars/Data/Graphics/Flags/south_sudan.png has changed
Binary file share/hedgewars/Data/Graphics/Graves/Ghost.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/Balrog.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/Blanka.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/BlankaToothless.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/BlueCap.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/BlueHair.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/Bob.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/BrainSlug.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/BrainSlugMouth.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/Bub.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/Bunny.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/Chunli.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/Cororon.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/Deer.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/Falcon.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/Gasmask.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/Geordi.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/GreenCap.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/GreenHair.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/GreyHair.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/Guile.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/Honda.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/Ken.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/KirbyMask.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/Kululun.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/Ladle.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/Luigi.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/Mario.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/Moose.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/OrangeHair.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/Pig.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/PinkHair.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/PrincessDaisy.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/PrincessPeach.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/Pumpkin_Hat.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/PurpleHair.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/RedCap.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/RedHair.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/Ryu.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/Samus.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/SauceBoatSilver.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/Sonic.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/Teacup.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/TeamCap.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/TeamHair.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/TeamHeadband.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/Teapot.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/Toad.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/Vega.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/Wario.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/YellowCap.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/YellowHair.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/apple.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/ash.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/banana.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/bb_bob.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/bb_bub.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/bb_cororon.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/bb_kululun.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/beaver.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/bobby.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/bobby2v.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/bushhider.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/cap_blue.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/cap_green.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/cap_junior.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/cap_red.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/cap_team.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/cap_yellow.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/charmander.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/chikorita.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/chuckl.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/cyborg.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/cyborg1.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/cyborg2.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/cyclops.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/darthvader.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/diglett.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/dish_Ladle.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/dish_SauceBoatSilver.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/dish_Teacup.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/dish_Teapot.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/fr_apple.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/fr_banana.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/fr_lemon.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/fr_orange.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/fr_pumpkin.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/hair_blue.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/hair_green.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/hair_grey.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/hair_orange.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/hair_pink.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/hair_purple.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/hair_red.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/hair_team.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/hair_yellow.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/hogpharoah.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/jigglypuff.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/junior.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/knight.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/lemon.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/link.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/lugia.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/metalband.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/mexicansunbrero.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/mudkip.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/mv_Spidey.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/mv_Venom.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/ntd_Falcon.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/ntd_Kirby.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/ntd_Link.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/ntd_Samus.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/orange.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/pikachu.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/poke_ash.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/poke_charmander.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/poke_chikorita.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/poke_diglett.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/poke_jigglypuff.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/poke_lugia.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/poke_mudkip.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/poke_pikachu.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/poke_slowpoke.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/poke_squirtle.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/poke_voltorb.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/porkey.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/scif_2001O.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/scif_2001Y.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/scif_BrainSlug.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/scif_BrainSlug2.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/scif_Geordi.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/scif_SparkssHelmet.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/scif_swDarthvader.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/scif_swStormtrooper.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/sf_balrog.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/sf_blanka.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/sf_blankatoothless.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/sf_chunli.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/sf_guile.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/sf_honda.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/sf_ken.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/sf_ryu.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/sf_vega.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/sheep.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/slowpoke.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/sm_daisy.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/sm_luigi.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/sm_mario.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/sm_peach.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/sm_toad.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/sm_wario.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/snowhog.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/spcartman.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/spidey.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/spkenny.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/spkyle.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/spstan.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/squirtle.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/sth_SonicClassic.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/stormtrooper.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/swordsmensquire.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/touhou_chen.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/touhou_marisa.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/touhou_patchouli.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/touhou_remelia.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/touhou_suwako.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/touhou_yukari.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/vampirichog.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/venom.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/voltorb.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/war_britmedic.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/war_britpthhelmet.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/war_britsapper.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/war_desertgrenadier1.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/war_desertgrenadier2.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/war_desertgrenadier4.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/war_desertgrenadier5.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/war_desertmedic.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/war_desertofficer.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/war_desertsapper1.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/war_desertsapper2.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/war_frenchww1gasmask.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/war_frenchww1helmet.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/war_germanww1helmet2.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/war_germanww1tankhelm.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/war_germanww2medic.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/war_germanww2pith.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/war_grenadier1.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/war_plainpith.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/war_sovietcomrade1.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/war_sovietcomrade2.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/war_trenchgrenadier1.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/war_trenchgrenadier2.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/war_trenchgrenadier3.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/zoo_Bat.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/zoo_Beaver.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/zoo_Bunny.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/zoo_Deer.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/zoo_Hedgehog.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/zoo_Moose.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/zoo_Pig.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/zoo_Porkey.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/zoo_Sheep.png has changed
Binary file share/hedgewars/Data/Graphics/Molotov.png has changed
Binary file share/hedgewars/Data/Graphics/TARDIS.png has changed
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/share/hedgewars/Data/Graphics/TARDIS.svg Wed Sep 14 22:39:39 2011 +0200
@@ -0,0 +1,190 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ version="1.1"
+ width="602.30084"
+ height="985.60046"
+ id="svg2993"
+ inkscape:version="0.48.0 r9654"
+ sodipodi:docname="TARDIS.svg"
+ inkscape:export-filename="/home/nemo/hg/hedgewars/trunk/share/hedgewars/Data/Graphics/TARDIS.png"
+ inkscape:export-xdpi="7.1700001"
+ inkscape:export-ydpi="7.1700001">
+ <sodipodi:namedview
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1"
+ objecttolerance="10"
+ gridtolerance="10"
+ guidetolerance="10"
+ inkscape:pageopacity="0"
+ inkscape:pageshadow="2"
+ inkscape:window-width="1224"
+ inkscape:window-height="819"
+ id="namedview26"
+ showgrid="false"
+ inkscape:zoom="0.37737215"
+ inkscape:cx="376.41146"
+ inkscape:cy="253.45483"
+ inkscape:window-x="0"
+ inkscape:window-y="25"
+ inkscape:window-maximized="0"
+ inkscape:current-layer="svg2993" />
+ <defs
+ id="defs2995">
+ <linearGradient
+ id="linearGradient3989">
+ <stop
+ id="stop3991"
+ style="stop-color:#fafafa;stop-opacity:1"
+ offset="0" />
+ <stop
+ id="stop3993"
+ style="stop-color:#8b8b8b;stop-opacity:1"
+ offset="1" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient3828">
+ <stop
+ id="stop3830"
+ style="stop-color:#8b8b8b;stop-opacity:1"
+ offset="0" />
+ <stop
+ id="stop3832"
+ style="stop-color:#fafafa;stop-opacity:1"
+ offset="1" />
+ </linearGradient>
+ <linearGradient
+ x1="-1057.5507"
+ y1="191.91734"
+ x2="-1059.9078"
+ y2="-113.3521"
+ id="linearGradient3844"
+ xlink:href="#linearGradient3828"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ x1="113.2114"
+ y1="152.75597"
+ x2="199.6232"
+ y2="-33.112103"
+ id="linearGradient3854"
+ xlink:href="#linearGradient3828"
+ gradientUnits="userSpaceOnUse" />
+ <radialGradient
+ cx="309.39694"
+ cy="13.796296"
+ r="3.9589372"
+ fx="309.39694"
+ fy="13.796296"
+ id="radialGradient8731"
+ xlink:href="#linearGradient3419-4"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ id="linearGradient3419-4">
+ <stop
+ id="stop3421-3"
+ style="stop-color:#0affff;stop-opacity:0.75083059"
+ offset="0" />
+ <stop
+ id="stop3423-8"
+ style="stop-color:#0affff;stop-opacity:0"
+ offset="1" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3828"
+ id="linearGradient3008"
+ gradientUnits="userSpaceOnUse"
+ x1="-1057.5507"
+ y1="191.91734"
+ x2="-1059.9078"
+ y2="-113.3521"
+ gradientTransform="matrix(0.93114557,0,0,0.89934391,1339.0116,154.19356)" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3828"
+ id="linearGradient3011"
+ gradientUnits="userSpaceOnUse"
+ x1="113.2114"
+ y1="152.75597"
+ x2="199.6232"
+ y2="-33.112103"
+ gradientTransform="translate(-57.858835,37.069206)" />
+ </defs>
+ <metadata
+ id="metadata2998">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <path
+ inkscape:connector-curvature="0"
+ style="fill:#969696;fill-opacity:1;stroke:#000000;stroke-width:10;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3775"
+ d="M 138.16503,984.23482 30.672801,927.20212 C 18.551737,922.91392 -0.596054,905.80425 0.554147,893.93247 l 1.916685,-741.22655 99.670338,62.43976 0.74684,724.2708 z"
+ sodipodi:nodetypes="ccccccc" />
+ <rect
+ style="fill:#e6e6e6;fill-opacity:1;stroke:#000000;stroke-width:10;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="rect3001-8"
+ y="522.15204"
+ x="102.26261"
+ ry="49.543434"
+ height="463.24161"
+ width="499.75171" />
+ <path
+ inkscape:connector-curvature="0"
+ style="fill:url(#linearGradient3011);fill-opacity:1;stroke:#000000;stroke-width:10;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3846"
+ d="M 3.292803,152.15982 103.15132,214.97236 336.42687,0.85996 C 225.47858,-4.261508 82.644107,44.055874 3.292803,152.15982 z"
+ sodipodi:nodetypes="cccc" />
+ <path
+ inkscape:connector-curvature="0"
+ style="fill:url(#linearGradient3008);fill-opacity:1;stroke:#000000;stroke-width:10;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3836"
+ d="m 602.0764,242.39804 a 250.07911,241.53809 0 1 1 -500.15817,0 250.07911,241.53809 0 1 1 500.15817,0 z" />
+ <rect
+ style="fill:#e6e6e6;fill-opacity:1;stroke:#000000;stroke-width:10;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="rect3001"
+ y="215.64488"
+ x="102.63232"
+ height="687.14258"
+ width="499.00977" />
+ <rect
+ style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:10;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="rect3856"
+ y="283.32965"
+ x="159.90025"
+ ry="64.465645"
+ height="197.26489"
+ width="140.26874" />
+ <rect
+ style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:10;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="rect3856-5"
+ y="283.32965"
+ x="397.28613"
+ ry="64.465645"
+ height="197.26489"
+ width="140.26874" />
+ <rect
+ style="fill:#e6e6e6;fill-opacity:1;stroke:#ff0000;stroke-width:0;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="rect3997"
+ y="894.97705"
+ x="106.97141"
+ height="19.192898"
+ width="489.60989" />
+</svg>
Binary file share/hedgewars/Data/Graphics/TARDIS.xcf has changed
--- a/share/hedgewars/Data/Locale/cs.lua Wed Sep 14 22:27:22 2011 +0200
+++ b/share/hedgewars/Data/Locale/cs.lua Wed Sep 14 22:39:39 2011 +0200
@@ -3,12 +3,19 @@
["!!!"] = "!!!",
["..."] = "...",
["Accuracy Bonus!"] = "Bonus za přesnost!",
+-- ["Achievement Unlocked"] = "", -- User_Mission_-_Bamboo_Thicket, User_Mission_-_That_Sinking_Feeling, Tumbler
["a Hedgewars mini-game"] = "Hedgewars mini-hra", -- Space_Invasion, The_Specialists
["Aiming Practice"] = "Trénink přesnosti", --Bazooka, Shotgun, SniperRifle
+ ["Ammo Depleted!"] = "Munice vyčerpána!",
+-- ["ammo extended!"] = "",
+-- ["Ammo is reset at the end of your turn."] = "",
+ ["Ammo Maniac!"] = "Muniční maniak!",
["Ammo"] = "Munice",
- ["Ammo Depleted!"] = "Munice vyčerpána!",
- ["Ammo Maniac!"] = "Muniční maniak!",
["Available points remaining: "] = "Zbývá bodů:",
+-- ["[Backspace]"] = "",
+-- ["Bamboo Thicket"] = "",
+-- ["Barrel Eater!"] = "",
+-- ["Barrel Launcher"] = "",
["Bat balls at your enemies and|push them into the sea!"] = "Odpal míčky na své nepřátele|a odstrč je do vody!",
["Bat your opponents through the|baskets and out of the map!"] = "Odpal protivníky skrz|koše a pryč z mapy!",
["Bazooka Training"] = "Trénink s bazukou",
@@ -19,8 +26,10 @@
["BOOM!"] = "BUM!",
["Boss defeated!"] = "Velitel poražen!",
["Boss Slayer!"] = "Velitel zabit!",
+-- ["Build a track and race."] = "",
["CAPTURE THE FLAG"] = "ZAJMI VLAJKU",
["Careless"] = "Neopatrný",
+-- ["Change Weapon"] = "",
["Clumsy"] = "Nešikovný",
["Codename: Teamwork"] = "Krycí jméno: Týmová práce",
["Complete the track as fast as you can!"] = "Dokonči trasu tak rychle, jak můžeš!",
@@ -28,12 +37,14 @@
["Congratulations! You've eliminated all targets|within the allowed time frame."] = "Gratuluji! Eliminoval jsi všechny cíle|během stanoveného limitu", --Bazooka, Shotgun, SniperRifle
["Control pillars to score points."] = "Obsaď všechny sloupy, abys dostal body.",
["Cybernetic Empire"] = "Kybernetická říše",
+ ["DAMMIT, ROOKIE! GET OFF MY HEAD!"] = "ZATRACENĚ, ZELENÁČI! VYPADNI Z MOJI HLAVY!",
["DAMMIT, ROOKIE!"] = "ZATRACENĚ, ZELENÁČI!",
- ["DAMMIT, ROOKIE! GET OFF MY HEAD!"] = "ZATRACENĚ, ZELENÁČI! VYPADNI Z MOJI HLAVY!",
["Dangerous Ducklings"] = "Nebezpečná káčátka",
["Deadweight"] = "Mrtvá váha",
+-- ["Demolition is fun!"] = "",
["Depleted Kamikaze!"] = "Vyčerpaný sebevrah!",
["Destroy invaders to score points."] = "Znič nájezdníky k získání bodů.",
+-- ["Double Kill!"] = "",
["Drone Hunter!"] = "Lovec trubců!",
["Drowner"] = "Utopenec",
["Each turn you get 1-3 random weapons"] = "Každý tah dostaneš 1-3 náhodné zbraně",
@@ -42,8 +53,11 @@
["Eliminate all targets before your time runs out.|You have unlimited ammo for this mission."] = "Znič všechny cíle, než ti vyprší čas.|Na tuto misi máš neomezeně munice.", --Bazooka, Shotgun, SniperRifle
["Eliminate Poison before the time runs out"] = "Odstraň Otravu, než vyprší čas.",
["Eliminate the Blue Team"] = "Znič modrý tým",
+-- ["Eliminate the enemy before the time runs out"] = "", -- User_Mission_-_Bamboo_Thicket, User_Mission_-_Newton_and_the_Hammock
+-- ["Eliminate the enemy hogs to win."] = "",
["Eliminate the enemy specialists."] = "Zabij nepřátelské specialisty",
["- Eliminate Unit 3378 |- Feeble Resistance must survive"] = "- Znič Jednotku 3378 |- Slabý odpor musí přežít",
+-- ["Energetic Engineer"] = "",
["Enjoy the swim..."] = "Užij si plavání...",
["[Enter]"] = "[Enter]",
["Fastest lap: "] = "Nejrychlejší kolo: ",
@@ -53,6 +67,9 @@
["Flag respawned!"] = "Vlajka obnovena!",
["Flag returned!"] = "Vlajka navrácena!",
["Flags, and their home base will be placed where each team ends their first turn."] = "Vlajky a domovské základny budou umístěny tam, kde každý tým skončí svůj první tah.",
+-- ["Flamer"] = "",
+-- ["Friendly Fire!"] = "",
+-- ["fuel extended!"] = "",
["GAME BEGUN!!!"] = "HRA ZAČALA!!!",
["Game Modifiers: "] = "Herní modifikátory: ",
["GAME OVER!"] = "KONEC HRY!",
@@ -62,11 +79,15 @@
["GO! GO! GO!"] = "Běž! Běž! Běž!",
["Good birdy......"] = "Hodný ptáček......",
["Good luck out there!"] = "Hodně štěstí tam venku!",
+-- ["Good so far!"] = "",
+-- ["Good to go!"] = "",
["GOTCHA!"] = "Mám tě!",
+-- ["Grab Mines/Explosives"] = "",
["Hahahaha!"] = "Hahahaha!",
["Haha, now THAT would be something!"] = "Haha, tak TOHLE bude něco!",
+ [" Hapless Hogs left!"] = "Nešťastný ježek odešel!",
["Hapless Hogs"] = "Nešťastný ježek",
- [" Hapless Hogs left!"] = "Nešťastný ježek odešel!",
+-- ["Health crates extend your time."] = "",
["Heavy"] = "Těžký",
["Hedgewars-Basketball"] = "Hedgewars-Basketbal",
["Hedgewars-Knockball"] = "Hedgewars=Vybíjená",
@@ -80,19 +101,28 @@
["It's a good thing SUDDEN DEATH is 99 turns away..."] = "To je dobře, že NÁHLÁ SMRT je 99 tahů vzdálená...",
["Jumping is disabled"] = "Skákání je vypnuto",
["Kamikaze Expert!"] = "Expert na sebevraždy!",
+-- ["Keep it up!"] = "",
+-- ["Killing spree!"] = "",
["KILLS"] = "ÚLOVKY",
+-- ["Last Target!"] = "",
["[Left Shift]"] = "[Levý shift]",
["Listen up, maggot!!"] = "Poslouchej, bídný červe!!",
+-- ["Lively Lifeguard"] = "",
+-- ["Mine Deployer"] = "",
+-- ["Mine Eater!"] = "",
["|- Mines Time:"] = "|- Časovač min:", -- User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork
["MISSION FAILED"] = "MISE NEÚSPĚŠNÁ", -- User_Mission_-_Dangerous_Ducklings, User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork
+ ["MISSION SUCCESSFUL"] = "MISE ÚSPĚŠNÁ", -- User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork
["MISSION SUCCESS"] = "MISE ÚSPĚŠNÁ",
- ["MISSION SUCCESSFUL"] = "MISE ÚSPĚŠNÁ", -- User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork
["Movement: [Up], [Down], [Left], [Right]"] = "Pohyb: [nahoru], [dolu], [vlevo], [vpravo]",
["Multi-shot!"] = "Vícenásobná rána!",
["Nameless Heroes"] = "Bezejmenní hrdinové",
+-- ["New Barrels Per Turn"] = "",
["NEW CLAN RECORD: "] = "NOVÝ KLANOVÝ REKORD: ",
["NEW fastest lap: "] = "NOVÉ nejrychlejší kolo: ",
+-- ["New Mines Per Turn"] = "",
["NEW RACE RECORD: "] = "NOVÝ TRAŤOVÝ REKORD: ",
+-- ["Newton's Hammock"] = "",
["NOT ENOUGH WAYPOINTS"] = "NEDOSTATEK NAVIGAČNÍCH BODŮ",
["Not So Friendly Match"] = "Ne moc přátelský zápas", -- Basketball, Knockball
["Oh no! Just try again!"] = "Ale ne! Prostě to zkus znovu!", -- User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork
@@ -100,23 +130,28 @@
["Operation Diver"] = "Operace potápěč",
["Opposing Team: "] = "Protivníkův tým: ",
["Pathetic Hog #%d"] = "Žalostný ježek #%d",
+-- ["Pathetic Resistance"] = "", -- User_Mission_-_Bamboo_Thicket, User_Mission_-_Newton_and_the_Hammock
["Per-Hog Ammo"] = "Individuální munice",
["Place more waypoints using [ENTER]"] = "Umísti více navigačních bodů pomocí klávesy [enter]",
+-- ["Place more waypoints using the 'Air Attack' weapon."] = "",
["points"] = "body", -- Control, CTF_Blizzard, Basic_Training_-_Bazooka, Basic_Training_-_Shotgun, Basic_Training_-_Sniper_Rifle
["Poison"] = "Otrava",
["Power Remaining"] = "Zbývající energie",
+-- ["Prepare yourself"] = "",
["Press [Precise] to skip intro"] = "Stiskni [přesnost] pro přeskočení",
["Race complexity limit reached."] = "Dosažen limit složitosti závodu.",
+-- ["RACER"] = "",
[" - Return the enemy flag to your base to score | - First team to 3 captures wins | - You may only score when your flag is in your base | - Hogs will drop the flag if killed, or drowned | - Dropped flags may be returned or recaptured | - Hogs respawn when killed"] = " - Dones nepřátelskou vlajku do své základny k získání bodů | - První tým se třemi ukořistěními vítězí | - Můžeš bodovat, pokud je tvá vlajka v základně | - Ježci pustí vlajku, pokud jsou zabiti, nebo utopeni | - Upuštěná vlajka může být navrácena, nebo opět zajmuta | - Ježci jsou po smrti oživeni",
+-- ["Round Limit:"] = "",
["Round Limit"] = "Limit kol",
+-- ["Rounds Complete: "] = "",
["Rounds Complete"] = "Dokončených kol",
["RULES OF THE GAME [Press ESC to view]"] = "PRAVIDLA HRY [Stiskni ESC pro prohlédnutí]",
- ["s|"] = "s|",
["Save as many hapless hogs as possible!"] = "Zachraň tolik nešťastných ježků, kolik jen můžeš!",
["SCORE"] = "SKÓRE",
["sec"] = "vt.", -- CTF_Blizzard, TrophyRace, Basic_Training_-_Bazooka, Basic_Training_-_Shotgun, Basic_Training_-_Sniper_Rifle, User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork, Capture_the_Flag
["See ya!"] = "Uvidíme se!",
- ["s"] = "s", -- GaudyRacer, Space_Invasion
+-- ["selected!"] = "",
["Shield boosted! +30 power"] = "Štít posílen! +30 energie",
["Shield Depleted"] = "Štít vyčerpán",
["Shield is fully recharged!"] = "Štít je plně dobit",
@@ -127,7 +162,7 @@
["Shield Seeker!"] = "Hledač štítů!",
["Shotgun Team"] = "Brokovnicový tým",
["Shotgun Training"] = "Trénink s brokovnicí",
- ["Shots Left: "] = "Zbývá střel: ", -- GaudyRacer, Tumbler
+-- ["shots remaining."] = "",
["Silly"] = "Hloupý",
["Sinky"] = "Propadlý",
["%s is out and Team %d|scored a penalty!| |Score:"] = "%s je venku a tým %d|má penaltu!| |Skóre:", -- Basketball, Knockball
@@ -136,6 +171,8 @@
["Sniperz"] = "Snajpři",
["Sponge"] = "Mycí houba",
["Spooky Tree"] = "Strašidelný strom",
+ ["s|"] = "s|",
+ ["s"] = "s", -- GaudyRacer, Space_Invasion
["STATUS UPDATE"] = "AKTUALIZACE STAVU", -- GaudyRacer, Space_Invasion
["Switched to "] = "Přepnut na ",
["Team %d: "] = "Tým %d: ",
@@ -146,26 +183,33 @@
["The flag will respawn next round."] = "Vlajka se obnoví příští kolo.",
["The Nameless One"] = "Bezejmenný",
["THE SPECIALISTS"] = "SPECIALISTÉ",
+-- ["This one's tricky."] = "",
["This rain is really something..."] = "Tenhle déšť je opravdu něco...",
["TIME: "] = "ČAS: ",
["Timed Kamikaze!"] = "Časovaná sebevražda!",
["Time Extended!"] = "Čas prodloužen!",
- ["Time Left: "] = "Zbývá času: ",
+-- ["Time Extension"] = "",
["Toggle Shield"] = "Přepnout štít",
["Toxic Team"] = "Jedovatý tým", -- User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork
["TRACK COMPLETED"] = "TRASA KOMPLETNÍ",
- ["Track Time: "] = "Čas na trati: ",
+-- ["TRACK FAILED!"] = "",
["TrophyRace"] = "Závod o trofej",
["T_T"] = "T_T",
+-- ["Tumbling Time Extended!"] = "",
["Turn Time"] = "Čas kola",
+-- ["Unit"] = "",
["Unit 3378"] = "Jednotka 3378",
+-- ["Unit 835"] = "",
["Unlimited Attacks"] = "Neomezeně útoků",
+-- ["Unstoppable!"] = "",
["User Challenge"] = "Výzva",
["Use your rope to get from start to finish as fast as you can!"] = "Použij lano a dostaň se ze startu do cíle, jak nejrychleji umíš!",
- ["v.06"] = "v.06",
["Victory for the "] = "Vítězství pro ", -- CTF_Blizzard, Capture_the_Flag
["Waypoint placed."] = "Navigační bod umístěn.",
+-- ["Way-Points Remaining"] = "",
["Weapons Reset"] = "Zbraně obnoveny",
+-- ["Well done."] = "",
+-- ["Will this ever end?"] = "",
["WINNING TIME: "] = "VÍTĚZNÝ ČAS: ",
["You'd almost swear the water was rising!"] = "Přísahal bys, že voda stoupá!",
["You have SCORED!!"] = "SKÓROVAL jsi!!",
--- a/share/hedgewars/Data/Locale/de.lua Wed Sep 14 22:27:22 2011 +0200
+++ b/share/hedgewars/Data/Locale/de.lua Wed Sep 14 22:39:39 2011 +0200
@@ -2,132 +2,170 @@
-- [":("] = "",
-- ["!!!"] = "",
-- ["..."] = "",
--- ["Accuracy Bonus!"] = "",
--- ["a Hedgewars mini-game"] = "", -- Space_Invasion, The_Specialists
+ ["Accuracy Bonus!"] = "Präzisions-Bonus!",
+-- ["Achievement Unlocked"] = "", -- User_Mission_-_Bamboo_Thicket, User_Mission_-_That_Sinking_Feeling, Tumbler
+ ["a Hedgewars mini-game"] = "ein Hedgewars Mini-Spiel", -- Space_Invasion, The_Specialists
["Aiming Practice"] = "Zielübung", --Bazooka, Shotgun, SniperRifle
--- ["Ammo"] = "",
--- ["Ammo Depleted!"] = "",
--- ["Ammo Maniac!"] = "",
--- ["Available points remaining: "] = "",
+ ["Ammo Depleted!"] = "Munition erschöpft!",
+-- ["ammo extended!"] = "",
+ ["Ammo is reset at the end of your turn."] = "Munition wird am Ende des Spielzuges zurückgesetzt.",
+ ["Ammo Maniac!"] = "Munitionsverrückter!",
+ ["Ammo"] = "Munition",
+ ["Available points remaining: "] = "Verfügbare Punkte verbleibend:",
+-- ["[Backspace]"] = "",
+-- ["Bamboo Thicket"] = "",
+ ["Barrel Eater!"] = "Fassfresser!",
+ ["Barrel Launcher"] = "Fasswerfer",
["Bat balls at your enemies and|push them into the sea!"] = "Schlage Bälle auf deine Widersacher|und lass sie ins Meer fallen!",
["Bat your opponents through the|baskets and out of the map!"] = "Schlage deine Widersacher durch|die Körbe und aus der Karte hinaus!",
["Bazooka Training"] = "Bazooka-Training",
--- ["Best laps per team: "] = "",
--- ["Best Team Times: "] = "",
--- ["Bloody Rookies"] = "", -- 01#Boot_Camp, User_Mission_-_Dangerous_Ducklings, User_Mission_-_Diver, User_Mission_-_Spooky_Tree
--- ["Boom!"] = "",
--- ["BOOM!"] = "",
--- ["Boss defeated!"] = "",
--- ["Boss Slayer!"] = "",
--- ["CAPTURE THE FLAG"] = "",
--- ["Careless"] = "",
--- ["Clumsy"] = "",
--- ["Codename: Teamwork"] = "",
--- ["Complete the track as fast as you can!"] = "",
--- ["Congratulations!"] = "",
+ ["Best laps per team: "] = "Beste Rundenzeiten pro Team: ",
+ ["Best Team Times: "] = "Besten Team-Zeiten: ",
+ ["Bloody Rookies"] = "Blutige Anfänger", -- 01#Boot_Camp, User_Mission_-_Dangerous_Ducklings, User_Mission_-_Diver, User_Mission_-_Spooky_Tree
+ ["Boom!"] = "Bumm!",
+ ["BOOM!"] = "KABUMM!",
+ ["Boss defeated!"] = "Boss wurde besiegt!",
+ ["Boss Slayer!"] = "Boss-Töter!",
+-- ["Build a track and race."] = "",
+ ["CAPTURE THE FLAG"] = "EROBERE DIE FAHNE",
+ ["Careless"] = "Achtlos",
+ ["Change Weapon"] = "Waffenwechsel",
+ ["Clumsy"] = "Ungeschickt",
+ ["Codename: Teamwork"] = "Code-Name: Teamwork",
+ ["Complete the track as fast as you can!"] = "Durchlaufe die Strecke so schnell du kannst!",
+ ["Congratulations!"] = "Gratulation!",
["Congratulations! You've eliminated all targets|within the allowed time frame."] = "Gratulation! Du hast alle Ziele innerhalb der|verfügbaren Zeit ausgeschaltet.", --Bazooka, Shotgun, SniperRifle
--- ["Control pillars to score points."] = "",
--- ["Cybernetic Empire"] = "",
--- ["DAMMIT, ROOKIE!"] = "",
--- ["DAMMIT, ROOKIE! GET OFF MY HEAD!"] = "",
+ ["Control pillars to score points."] = "Kontrolliere die Säulen um Punkte zu erhalten.",
+ ["Cybernetic Empire"] = "Kybernetisches Imperium",
+ ["DAMMIT, ROOKIE! GET OFF MY HEAD!"] = "VERDAMMT, REKRUT! RUNTER VON MEINEM KOPF!",
+ ["DAMMIT, ROOKIE!"] = "VERDAMMT, REKRUT!",
-- ["Dangerous Ducklings"] = "",
--- ["Deadweight"] = "",
--- ["Depleted Kamikaze!"] = "",
--- ["Destroy invaders to score points."] = "",
+ ["Deadweight"] = "Leergewicht",
+ ["Demolition is fun!"] = "Zerstörung macht Spaß!",
+ ["Depleted Kamikaze!"] = "Munitionsloses Kamikaze!",
+ ["Destroy invaders to score points."] = "Zerstöre die Angreifer um Punkte zu erhalten.",
+-- ["Double Kill!"] = "",
-- ["Drone Hunter!"] = "",
-- ["Drowner"] = "",
--- ["Each turn you get 1-3 random weapons"] = "",
--- ["Each turn you get one random weapon"] = "",
--- ["Eliminate all enemies"] = "",
+ ["Each turn you get 1-3 random weapons"] = "Du bekommst jede Runde 1-3 zufällig gewählte Waffen",
+ ["Each turn you get one random weapon"] = "Du bekommst jede Runde eine zufällig gewählte Waffe.",
+ ["Eliminate all enemies"] = "Vernichte alle Gegner",
["Eliminate all targets before your time runs out.|You have unlimited ammo for this mission."] = "Eliminiere alle Ziele bevor die Zeit ausläuft.|Du hast in dieser Mission unbegrenzte Munition.", --Bazooka, Shotgun, SniperRifle
-- ["Eliminate Poison before the time runs out"] = "",
--- ["Eliminate the Blue Team"] = "",
+ ["Eliminate the Blue Team"] = "Lösche das Blaue Team aus",
+-- ["Eliminate the enemy before the time runs out"] = "", -- User_Mission_-_Bamboo_Thicket, User_Mission_-_Newton_and_the_Hammock
+-- ["Eliminate the enemy hogs to win."] = "",
-- ["Eliminate the enemy specialists."] = "",
--- ["- Eliminate Unit 3378 |- Feeble Resistance must survive"] = "",
--- ["Enjoy the swim..."] = "",
+ ["- Eliminate Unit 3378 |- Feeble Resistance must survive"] = "- Vernichte Einheit 3378 | Kraftloser Widerstand muss überleben",
+-- ["Energetic Engineer"] = "",
+ ["Enjoy the swim..."] = "Viel Spaß beim Schwimmen...",
-- ["[Enter]"] = "",
--- ["Fastest lap: "] = "",
--- ["Feeble Resistance"] = "",
--- ["Fire"] = "",
--- ["Flag captured!"] = "",
--- ["Flag respawned!"] = "",
--- ["Flag returned!"] = "",
--- ["Flags, and their home base will be placed where each team ends their first turn."] = "",
--- ["GAME BEGUN!!!"] = "",
+ ["Fastest lap: "] = "Schnellste Runde: ",
+ ["Feeble Resistance"] = "Kraftloser Widerstand",
+ ["Fire"] = "Feuer",
+ ["Flag captured!"] = "Fahne erobert!",
+ ["Flag respawned!"] = "Fahne wieder erschienen!",
+ ["Flag returned!"] = "Fahne zurückgebracht!",
+ ["Flags, and their home base will be placed where each team ends their first turn."] = "Fahnen und deren Heimatstandort werden dort plaziert wo jedes Team deren ersten Zug beendet.",
+-- ["Flamer"] = "",
+-- ["Friendly Fire!"] = "",
+ ["fuel extended!"] = "Treibstoff aus!",
+ ["GAME BEGUN!!!"] = "SPIEL GESTARTET!!!",
-- ["Game Modifiers: "] = "",
--- ["GAME OVER!"] = "",
--- ["Game Started!"] = "",
--- ["Get on over there and take him out!"] = "",
--- ["Goal"] = "",
--- ["GO! GO! GO!"] = "",
--- ["Good birdy......"] = "",
--- ["Good luck out there!"] = "",
--- ["GOTCHA!"] = "",
+ ["GAME OVER!"] = "SPIEL ZU ENDE!",
+ ["Game Started!"] = "Spiel Gestartet!]",
+ ["Get on over there and take him out!"] = "Mach, dass du hinüber kommst und schalte ihn aus!",
+ ["Goal"] = "Ziel",
+ ["GO! GO! GO!"] = "Bewegung, Bewegung, Bewegung!",
+ ["Good birdy......"] = "Braver Vogel......",
+ ["Good luck out there!"] = "Viel Glück da draußen!",
+ ["Good so far!"] = "Gut soweit!",
+ ["Good to go!"] = "Startklar!",
+ ["GOTCHA!"] = "ERWISCHT!",
+ ["Grab Mines/Explosives"] = "Sammle Minen/Fässer",
-- ["Hahahaha!"] = "",
--- ["Haha, now THAT would be something!"] = "",
--- ["Hapless Hogs"] = "",
--- [" Hapless Hogs left!"] = "",
+ ["Haha, now THAT would be something!"] = "Haha, na DAS wär ja was!",
+ ["Hapless Hogs"] = "Glücklose Igel",
+ [" Hapless Hogs left!"] = " Glücklose Igel verbleibend!",
+ ["Health crates extend your time."] = "Medipacks verlängern deine Zeit.",
-- ["Heavy"] = "",
["Hedgewars-Basketball"] = "Hedgewars-Basketball",
["Hedgewars-Knockball"] = "Hedgewars-Knockball",
--- ["Heh, it's not that bad."] = "",
+ ["Heh, it's not that bad."] = "Hehe, so schlimm ist es nicht.",
-- ["Hit Combo!"] = "",
-- ["Hmmm..."] = "",
--- ["Hooray!"] = "",
+ ["Hooray!"] = "Hurra!",
["Hunter"] = "Jäger", --Bazooka, Shotgun, SniperRifle
--- ["Instructor"] = "", -- 01#Boot_Camp, User_Mission_-_Dangerous_Ducklings
--- ["invaders destroyed"] = "",
--- ["It's a good thing SUDDEN DEATH is 99 turns away..."] = "",
--- ["Jumping is disabled"] = "",
--- ["Kamikaze Expert!"] = "",
+ ["Instructor"] = "Ausbilder", -- 01#Boot_Camp, User_Mission_-_Dangerous_Ducklings
+ ["invaders destroyed"] = "Angreifer zerstört",
+ ["It's a good thing SUDDEN DEATH is 99 turns away..."] = "Gut, dass SUDDEN DEATH noch 99 Runden entfernt ist...",
+ ["Jumping is disabled"] = "Sprünge sind deaktiviert!",
+ ["Kamikaze Expert!"] = "Kamikazeexperte!",
+ ["Keep it up!"] = "Weiter so!",
+ ["Killing spree!"] = "Blutrausch!",
-- ["KILLS"] = "",
+ ["Last Target!"] = "Letzte Zielscheibe!",
-- ["[Left Shift]"] = "",
--- ["Listen up, maggot!!"] = "",
--- ["|- Mines Time:"] = "", -- User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork
--- ["MISSION FAILED"] = "", -- User_Mission_-_Dangerous_Ducklings, User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork
--- ["MISSION SUCCESS"] = "",
--- ["MISSION SUCCESSFUL"] = "", -- User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork
--- ["Movement: [Up], [Down], [Left], [Right]"] = "",
+ ["Listen up, maggot!!"] = "Aufgepasst, du Made!!",
+-- ["Lively Lifeguard"] = "",
+ ["Mine Deployer"] = "Minenleger",
+ ["Mine Eater!"] = "Minenfresser!",
+ ["|- Mines Time:"] = "| - Minenzündzeit: ", -- User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork
+ ["MISSION FAILED"] = "MISSION GESCHEITERT", -- User_Mission_-_Dangerous_Ducklings, User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork
+ ["MISSION SUCCESSFUL"] = "MISSION ERFOLGREICH", -- User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork
+ ["MISSION SUCCESS"] = "MISSIONSERFOLG",
+ ["Movement: [Up], [Down], [Left], [Right]"] = "Bewegung: [Hoch], [Runter], [Links], [Rechts]",
-- ["Multi-shot!"] = "",
--- ["Nameless Heroes"] = "",
--- ["NEW CLAN RECORD: "] = "",
--- ["NEW fastest lap: "] = "",
--- ["NEW RACE RECORD: "] = "",
--- ["NOT ENOUGH WAYPOINTS"] = "",
+ ["Munition!"] = "Munition erschöpft!",
+ ["Nameless Heroes"] = "Namenlose Helden",
+ ["New Barrels Per Turn"] = "Neue Fässer jede Runde",
+ ["NEW CLAN RECORD: "] = "NEUER KLAN-REKORD",
+ ["NEW fastest lap: "] = "NEUE schnellste Runde: ",
+ ["New Mines Per Turn"] = "Neue Minen jede Runde",
+ ["NEW RACE RECORD: "] = "NEUER RENNREKORD: ",
+-- ["Newton's Hammock"] = "",
+ ["NOT ENOUGH WAYPOINTS"] = "NICHT GENUG WEGPUNKTE",
["Not So Friendly Match"] = "Kein-so-Freundschaftsspiel", -- Basketball, Knockball
-- ["Oh no! Just try again!"] = "", -- User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork
["Oh no! Time's up! Just try again."] = "Oh nein! Die Zeit ist um! Versuche es nochmal.", --Bazooka, Shotgun, SniperRifle
-- ["Operation Diver"] = "",
--- ["Opposing Team: "] = "",
+ ["Opposing Team: "] = "Gegnerisches Team: ",
-- ["Pathetic Hog #%d"] = "",
--- ["Per-Hog Ammo"] = "",
--- ["Place more waypoints using [ENTER]"] = "",
--- ["points"] = "", -- Control, CTF_Blizzard, Basic_Training_-_Bazooka, Basic_Training_-_Shotgun, Basic_Training_-_Sniper_Rifle
--- ["Poison"] = "",
--- ["Power Remaining"] = "",
+-- ["Pathetic Resistance"] = "", -- User_Mission_-_Bamboo_Thicket, User_Mission_-_Newton_and_the_Hammock
+ ["Per-Hog Ammo"] = "Munition pro Igel",
+ ["Place more waypoints using [ENTER]"] = "Setze mehr Wegpunkte durch Drücken von [ENTER]",
+-- ["Place more waypoints using the 'Air Attack' weapon."] = "",
+ ["points"] = "Punkte", -- Control, CTF_Blizzard, Basic_Training_-_Bazooka, Basic_Training_-_Shotgun, Basic_Training_-_Sniper_Rifle
+ ["Poison"] = "Gift",
+ ["Power Remaining"] = "Verbleibende Energie",
+ ["Prepare yourself"] = "Mach dich bereit",
-- ["Press [Precise] to skip intro"] = "",
--- ["Race complexity limit reached."] = "",
+ ["Race complexity limit reached."] = "Rennkomplexitätslimit erreicht.",
+-- ["RACER"] = "",
-- [" - Return the enemy flag to your base to score | - First team to 3 captures wins | - You may only score when your flag is in your base | - Hogs will drop the flag if killed, or drowned | - Dropped flags may be returned or recaptured | - Hogs respawn when killed"] = "",
--- ["Round Limit"] = "",
--- ["Rounds Complete"] = "",
--- ["RULES OF THE GAME [Press ESC to view]"] = "",
+-- ["Round Limit:"] = "",
+ ["Round Limit"] = "Rundenbegrenzung",
+-- ["Rounds Complete: "] = "",
+ ["Rounds Complete"] = "Runden Gespielt",
+ ["RULES OF THE GAME [Press ESC to view]"] = "SPIEL REGELN (Drücke ESC zum Anzeigen)",
-- ["s|"] = "",
--- ["Save as many hapless hogs as possible!"] = "",
+ ["Save as many hapless hogs as possible!"] = "Rette so viele glücklose Igel als möglich!",
-- ["SCORE"] = "",
-- ["sec"] = "", -- CTF_Blizzard, TrophyRace, Basic_Training_-_Bazooka, Basic_Training_-_Shotgun, Basic_Training_-_Sniper_Rifle, User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork, Capture_the_Flag
--- ["See ya!"] = "",
+ ["See ya!"] = "Mach's gut!",
+ ["selected!"] = "ausgewählt!",
-- ["s"] = "", -- GaudyRacer, Space_Invasion
--- ["Shield boosted! +30 power"] = "",
--- ["Shield Depleted"] = "",
--- ["Shield is fully recharged!"] = "",
--- ["Shield Master!"] = "",
--- ["Shield Miser!"] = "",
--- ["Shield OFF:"] = "",
--- ["Shield ON:"] = "",
--- ["Shield Seeker!"] = "",
- ["Shotgun Team"] = "Entrenamiento con escopeta",
+ ["Shield boosted! +30 power"] = "Schild verstärkt! +30 Energie",
+ ["Shield Depleted"] = "Schild aufgebraucht!",
+ ["Shield is fully recharged!"] = "Schild vollständig aufgeladen!",
+ ["Shield Master!"] = "Schildmeister!",
+ ["Shield Miser!"] = "Schildgieriger",
+ ["Shield OFF:"] = "Schild AUS:",
+ ["Shield ON:"] = "Schild AN:",
+ ["Shield Seeker!"] = "Schildsucher!",
+ ["Shotgun Team"] = "Schrotflinten-Team",
["Shotgun Training"] = "Schrotflinten-Training",
--- ["Shots Left: "] = "", -- GaudyRacer, Tumbler
+ ["shots remaining."] = "Schüsse übrig",
-- ["Silly"] = "",
-- ["Sinky"] = "",
["%s is out and Team %d|scored a penalty!| |Score:"] = "%s ist draußen und Team %d|erhält eine Strafe!| |Punktestand:", -- Basketball, Knockball
@@ -141,36 +179,44 @@
-- ["Team %d: "] = "",
-- ["Team Scores"] = "", -- Control, Space_Invasion
-- ["That Sinking Feeling"] = "",
--- ["That was pointless."] = "",
--- ["The enemy is hiding out on yonder ducky!"] = "",
--- ["The flag will respawn next round."] = "",
--- ["The Nameless One"] = "",
--- ["THE SPECIALISTS"] = "",
--- ["This rain is really something..."] = "",
--- ["TIME: "] = "",
--- ["Timed Kamikaze!"] = "",
--- ["Time Extended!"] = "",
--- ["Time Left: "] = "",
--- ["Toggle Shield"] = "",
+ ["That was pointless."] = "Das war sinnlos.",
+ ["The enemy is hiding out on yonder ducky!"] = "Der Feind versteckt sich auf dem Entlein dort drüben!",
+ ["The flag will respawn next round."] = "Die Fahne wird nächste Runde wieder auftauchen.",
+ ["The Nameless One"] = "Der Namenlose",
+ ["THE SPECIALISTS"] = "DIE SPEZIALISTEN",
+ ["This one's tricky."] = "Der hier ist knifflig.",
+ ["This rain is really something..."] = "Das nenne ich mal einen Regenschauer...",
+ ["Timed Kamikaze!"] = "Pünktliches Kamikaze!",
+ ["Time Extended!"] = "Zeit verlängert!",
+ ["Time Extension"] = "Zeitverlängerung",
+ ["Time Left: "] = "Verbleibende Zeit",
+ ["TIME: "] = "ZEIT: ",
+ ["Toggle Shield"] = "Schild ein/aus",
-- ["Toxic Team"] = "", -- User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork
-- ["TRACK COMPLETED"] = "",
--- ["Track Time: "] = "",
+-- ["TRACK FAILED!"] = "",
-- ["TrophyRace"] = "",
-- ["T_T"] = "",
--- ["Turn Time"] = "",
--- ["Unit 3378"] = "",
--- ["Unlimited Attacks"] = "",
+ ["Tumbling Time Extended!"] = "Purzelzeit verlängert!",
+ ["Turn Time"] = "Zeit pro Zug",
+ ["Unit 3378"] = "Einheit 3378",
+ ["Unit 835"] = "Einheit 3378",
+ ["Unit"] = "Einheit",
+ ["Unlimited Attacks"] = "Unbegrenzte Angriffe",
+ ["Unstoppable!"] = "Unaufhaltbar!",
-- ["User Challenge"] = "",
--- ["Use your rope to get from start to finish as fast as you can!"] = "",
--- ["v.06"] = "",
--- ["Victory for the "] = "", -- CTF_Blizzard, Capture_the_Flag
--- ["Waypoint placed."] = "",
+ ["Use your rope to get from start to finish as fast as you can!"] = "Nutze das Seil um von Start zu Ziel zu gelangen - so schnell du kannst!",
+ ["Victory for the "] = "Sieg für ", -- CTF_Blizzard, Capture_the_Flag
+ ["Waypoint placed."] = "Wegpunkt gesetzt",
+-- ["Way-Points Remaining"] = "",
-- ["Weapons Reset"] = "",
--- ["WINNING TIME: "] = "",
--- ["You'd almost swear the water was rising!"] = "",
--- ["You have SCORED!!"] = "",
--- ["You saved"] = "",
--- ["You've failed. Try again."] = "",
--- ["You've reached the goal!| |Time: "] = "",
+ ["Well done."] = "Gut gemacht.",
+ ["Will this ever end?"] = "Wird dies je enden?",
+ ["WINNING TIME: "] = "SIEGESZEIT: ",
+ ["You'd almost swear the water was rising!"] = "Man könnte fast schwören das Wasser würde steigen!",
+ ["You have SCORED!!"] = "Du hast GEPUNKTET!",
+ ["You saved"] = "Gerettet: ",
+ ["You've failed. Try again."] = "Du bist gescheitert. Versuche es nochmal.",
+ ["You've reached the goal!| |Time: "] = "Ziel erreicht!| |Zeit: ",
["'Zooka Team"] = "Die Knalltüten",
}
--- a/share/hedgewars/Data/Locale/en.txt Wed Sep 14 22:27:22 2011 +0200
+++ b/share/hedgewars/Data/Locale/en.txt Wed Sep 14 22:39:39 2011 +0200
@@ -53,7 +53,7 @@
00:50=Drill Strike
00:51=Mudball
00:52=No weapon selected
-00:53=TARDIS
+00:53=TimeBox
00:54=Structure
00:55=Land Spray
@@ -448,6 +448,7 @@
03:52=UNUSED
03:53=Type 40
03:54=Build something
+03:55=Utility
; Weapon Descriptions (use | as line breaks)
04:00=Attack your enemies using a simple grenade.|It will explode once its timer reaches zero.|1-5: Set grenade's timer|Attack: Hold to throw with more power
@@ -500,6 +501,12 @@
04:47=Double the fun with two spiky, sneaky, sticky mines.|Set up a chain reaction or defend yourself (or both!)|Attack: Hold to shoot with more power (twice)
04:48=Why should the moles get all the abuse?|Wacking a hog can be just as fun! A good|blow from this hammer will shave off one|third of a hog's health and plunge them|underground.|Attack: Activate
04:49=Resurrect your friends!|But beware that this also resurrects your foes.|Attack: Keep attack pressed to resurrect slowly|Up: Accelerate resurrection
+04:50=Is someone hiding underground?|Dig them out with a drill strike!|Timer controls how far it will dig.
+04:51=Get in a free shot in by hurling a ball of mud.|Stings a bit, and knocks hogs back.
+04:52=UNUSED
+04:53=Go on an adventure through time and space,|while leaving your comrades to fight on alone.|Be prepared to return at any time,|or for Sudden Death or if they are all defeated.|Disclaimer. Does not function in Sudden Death,|if you are alone, or if you are a King.
+04:54=INCOMPLETE
+04:55=Spray a stream of sticky flakes.|Build bridges, bury enemies, seal off tunnels.|Be careful you don't get any on you!
; Game goal strings
05:00=Game Modes
--- a/share/hedgewars/Data/Locale/es.lua Wed Sep 14 22:27:22 2011 +0200
+++ b/share/hedgewars/Data/Locale/es.lua Wed Sep 14 22:39:39 2011 +0200
@@ -3,12 +3,19 @@
[":("] = ":(",
["!!!"] = "!!!",
-- ["Accuracy Bonus!"] = "",
+-- ["Achievement Unlocked"] = "", -- User_Mission_-_Bamboo_Thicket, User_Mission_-_That_Sinking_Feeling, Tumbler
-- ["a Hedgewars mini-game"] = "", -- Space_Invasion, The_Specialists
["Aiming Practice"] = "Practica tu puntería", --Bazooka, Shotgun, SniperRifle
-- ["Ammo"] = "",
-- ["Ammo Depleted!"] = "",
+-- ["ammo extended!"] = "",
+-- ["Ammo is reset at the end of your turn."] = "",
-- ["Ammo Maniac!"] = "",
-- ["Available points remaining: "] = "",
+-- ["[Backspace]"] = "",
+-- ["Bamboo Thicket"] = "",
+-- ["Barrel Eater!"] = "",
+-- ["Barrel Launcher"] = "",
["Bat balls at your enemies and|push them into the sea!"] = "¡Batea pelotas hacia tus enemigos|y hazlos caer al agua!",
["Bat your opponents through the|baskets and out of the map!"] = "¡Batea a tus enemigos fuera del campo de juego|a través de las canastas laterales!",
["Bazooka Training"] = "Entrenamiento con bazuca",
@@ -19,8 +26,10 @@
-- ["BOOM!"] = "",
-- ["Boss defeated!"] = "",
-- ["Boss Slayer!"] = "",
+-- ["Build a track and race."] = "",
["CAPTURE THE FLAG"] = "Capturar la bandera",
-- ["Careless"] = "",
+-- ["Change Weapon"] = "",
-- ["Clumsy"] = "",
["Codename: Teamwork"] = "Nombre en clave: Trabajo en equipo",
-- ["Complete the track as fast as you can!"] = "",
@@ -32,8 +41,10 @@
["DAMMIT, ROOKIE!"] = "¡MALDITA SEA, RECLUTA!",
["Dangerous Ducklings"] = "Patitos peligrosos",
-- ["Deadweight"] = "",
+-- ["Demolition is fun!"] = "",
-- ["Depleted Kamikaze!"] = "",
-- ["Destroy invaders to score points."] = "",
+-- ["Double Kill!"] = "",
-- ["Drone Hunter!"] = "",
-- ["Drowner"] = "",
-- ["Each turn you get 1-3 random weapons"] = "",
@@ -42,8 +53,11 @@
["Eliminate all targets before your time runs out.|You have unlimited ammo for this mission."] = "Destruye todos los objetivos antes de que se agote el tiempo.|La munición en esta misión es ilimitada.", --Bazooka, Shotgun, SniperRifle
["Eliminate Poison before the time runs out"] = "Acaba con los Tóxicos antes de que se agote el tiempo",
["Eliminate the Blue Team"] = "Elimina al Equipo azul",
+-- ["Eliminate the enemy before the time runs out"] = "", -- User_Mission_-_Bamboo_Thicket, User_Mission_-_Newton_and_the_Hammock
+-- ["Eliminate the enemy hogs to win."] = "",
-- ["Eliminate the enemy specialists."] = "",
["- Eliminate Unit 3378 |- Feeble Resistance must survive"] = "- Elimina a la Unidad 3378 |- Resustencia Fútil debe sobrevivir",
+-- ["Energetic Engineer"] = "",
["Enjoy the swim..."] = "Disfruta del baño...",
-- ["[Enter]"] = "",
["Fastest lap: "] = "Vuelta rápida: ",
@@ -53,6 +67,9 @@
["Flag respawned!"] = "¡Bandera restablecida!",
["Flag returned!"] = "¡Bandera recuperada!",
-- ["Flags, and their home base will be placed where each team ends their first turn."] = "",
+-- ["Flamer"] = "",
+-- ["Friendly Fire!"] = "",
+-- ["fuel extended!"] = "",
-- ["GAME BEGUN!!!"] = "",
-- ["Game Modifiers: "] = "",
["GAME OVER!"] = "¡FIN DEL JUEGO!",
@@ -62,11 +79,15 @@
["GO! GO! GO!"] = "¡VAMOS! ¡VAMOS! ¡VAMOS!",
["Good birdy......"] = "Buen pajarito......",
["Good luck out there!"] = "¡Buena suerte!",
+-- ["Good so far!"] = "",
+-- ["Good to go!"] = "",
-- ["GOTCHA!"] = "",
+-- ["Grab Mines/Explosives"] = "",
-- ["Hahahaha!"] = "",
-- ["Haha, now THAT would be something!"] = "",
-- ["Hapless Hogs"] = "",
-- [" Hapless Hogs left!"] = "",
+-- ["Health crates extend your time."] = "",
-- ["Heavy"] = "",
["Hedgewars-Basketball"] = "Hedgewars-Baloncesto",
["Hedgewars-Knockball"] = "Hedgewars-Knockball",
@@ -80,9 +101,15 @@
-- ["It's a good thing SUDDEN DEATH is 99 turns away..."] = "",
-- ["Jumping is disabled"] = "",
-- ["Kamikaze Expert!"] = "",
+-- ["Keep it up!"] = "",
+-- ["Killing spree!"] = "",
-- ["KILLS"] = "",
+-- ["Last Target!"] = "",
-- ["[Left Shift]"] = "",
["Listen up, maggot!!"] = "¡Atento, escoria!",
+-- ["Lively Lifeguard"] = "",
+-- ["Mine Deployer"] = "",
+-- ["Mine Eater!"] = "",
-- ["|- Mines Time:"] = "", -- User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork
["MISSION FAILED"] = "MISIÓN FALLIDA", -- User_Mission_-_Dangerous_Ducklings, User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork
-- ["MISSION SUCCESS"] = "",
@@ -90,9 +117,12 @@
-- ["Movement: [Up], [Down], [Left], [Right]"] = "",
-- ["Multi-shot!"] = "",
-- ["Nameless Heroes"] = "",
+-- ["New Barrels Per Turn"] = "",
-- ["NEW CLAN RECORD: "] = "",
["NEW fastest lap: "] = "NUEVA vuelta rápida: ",
+-- ["New Mines Per Turn"] = "",
-- ["NEW RACE RECORD: "] = "",
+-- ["Newton's Hammock"] = "",
-- ["NOT ENOUGH WAYPOINTS"] = "",
["Not So Friendly Match"] = "Partido no-tan-amistoso", -- Basketball, Knockball
["Oh no! Just try again!"] = "¡Oh, no! ¿Por qué no lo intentas de nuevo?", -- User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork
@@ -100,15 +130,21 @@
["Operation Diver"] = "Buzo",
["Opposing Team: "] = "Equipo enemigo: ",
["Pathetic Hog #%d"] = "Erizo patético #%d",
+-- ["Pathetic Resistance"] = "", -- User_Mission_-_Bamboo_Thicket, User_Mission_-_Newton_and_the_Hammock
-- ["Per-Hog Ammo"] = "",
-- ["Place more waypoints using [ENTER]"] = "",
+-- ["Place more waypoints using the 'Air Attack' weapon."] = "",
-- ["points"] = "", -- Control, CTF_Blizzard, Basic_Training_-_Bazooka, Basic_Training_-_Shotgun, Basic_Training_-_Sniper_Rifle
["Poison"] = "Veneno",
-- ["Power Remaining"] = "",
+-- ["Prepare yourself"] = "",
-- ["Press [Precise] to skip intro"] = "",
-- ["Race complexity limit reached."] = "",
+-- ["RACER"] = "",
[" - Return the enemy flag to your base to score | - First team to 3 captures wins | - You may only score when your flag is in your base | - Hogs will drop the flag if killed, or drowned | - Dropped flags may be returned or recaptured | - Hogs respawn when killed"] = "- Vuelve a tu base con la bandera enemiga para anotar un punto | - El equipo que anote 3 puntos gana | - Sólo se puede anotar si tu propia bandera está en tu base | - Los erizos resucitan cuando mueren",
+-- ["Round Limit:"] = "",
-- ["Round Limit"] = "",
+-- ["Rounds Complete: "] = "",
-- ["Rounds Complete"] = "",
-- ["RULES OF THE GAME [Press ESC to view]"] = "",
["RULES OF THE GAME [Press ESC to view]"] = "REGLAS DEL JUEGO (Presiona ESC para leerlas)",
@@ -117,6 +153,7 @@
-- ["SCORE"] = "",
-- ["sec"] = "", -- CTF_Blizzard, TrophyRace, Basic_Training_-_Bazooka, Basic_Training_-_Shotgun, Basic_Training_-_Sniper_Rifle, User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork, Capture_the_Flag
["See ya!"] = "¡Hasta otra!",
+-- ["selected!"] = "",
-- ["s"] = "", -- GaudyRacer, Space_Invasion
-- ["Shield boosted! +30 power"] = "",
-- ["Shield Depleted"] = "",
@@ -128,7 +165,7 @@
-- ["Shield Seeker!"] = "",
["Shotgun Team"] = "Escopeteros",
["Shotgun Training"] = "Entrenamiento con escopeta",
--- ["Shots Left: "] = "", -- GaudyRacer, Tumbler
+-- ["shots remaining."] = "",
-- ["Silly"] = "",
-- ["Sinky"] = "",
["%s is out and Team %d|scored a penalty!| |Score:"] = "¡%s cayó y Equipo %d|anotó una falta!| |Puntuación:", -- Basketball, Knockball
@@ -147,26 +184,33 @@
-- ["The flag will respawn next round."] = "",
-- ["The Nameless One"] = "",
-- ["THE SPECIALISTS"] = "",
+-- ["This one's tricky."] = "",
-- ["This rain is really something..."] = "",
-- ["TIME: "] = "",
-- ["Timed Kamikaze!"] = "",
-- ["Time Extended!"] = "",
--- ["Time Left: "] = "",
+-- ["Time Extension"] = "",
-- ["Toggle Shield"] = "",
["Toxic Team"] = "Tóxicos", -- User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork
-- ["TRACK COMPLETED"] = "",
--- ["Track Time: "] = "",
+-- ["TRACK FAILED!"] = "",
["TrophyRace"] = "TrophyRace",
["T_T"] = "T_T",
+-- ["Tumbling Time Extended!"] = "",
-- ["Turn Time"] = "",
+-- ["Unit"] = "",
["Unit 3378"] = "Unidad 3378",
+-- ["Unit 835"] = "",
-- ["Unlimited Attacks"] = "",
+-- ["Unstoppable!"] = "",
-- ["User Challenge"] = "",
["Use your rope to get from start to finish as fast as you can!"] = "¡Usa tu cuerda para llegar a la salida lo más rápido que puedas!",
--- ["v.06"] = "",
["Victory for the "] = "La victoria es para", -- CTF_Blizzard, Capture_the_Flag
-- ["Waypoint placed."] = "",
+-- ["Way-Points Remaining"] = "",
-- ["Weapons Reset"] = "",
+-- ["Well done."] = "",
+-- ["Will this ever end?"] = "",
-- ["WINNING TIME: "] = "",
-- ["You'd almost swear the water was rising!"] = "",
["You have SCORED!!"] = "¡Has anotado!",
--- a/share/hedgewars/Data/Locale/fr.lua Wed Sep 14 22:27:22 2011 +0200
+++ b/share/hedgewars/Data/Locale/fr.lua Wed Sep 14 22:39:39 2011 +0200
@@ -3,12 +3,19 @@
-- ["!!!"] = "",
-- ["..."] = "",
-- ["Accuracy Bonus!"] = "",
+-- ["Achievement Unlocked"] = "", -- User_Mission_-_Bamboo_Thicket, User_Mission_-_That_Sinking_Feeling, Tumbler
-- ["a Hedgewars mini-game"] = "", -- Space_Invasion, The_Specialists
["Aiming Practice"] = "Entrainement de tir", --Bazooka, Shotgun, SniperRifle
-- ["Ammo"] = "",
-- ["Ammo Depleted!"] = "",
+-- ["ammo extended!"] = "",
+-- ["Ammo is reset at the end of your turn."] = "",
-- ["Ammo Maniac!"] = "",
-- ["Available points remaining: "] = "",
+-- ["[Backspace]"] = "",
+-- ["Bamboo Thicket"] = "",
+-- ["Barrel Eater!"] = "",
+-- ["Barrel Launcher"] = "",
["Bat balls at your enemies and|push them into the sea!"] = "Frappez vos ennemis à la batte|et envoyez-les à la mer !",
["Bat your opponents through the|baskets and out of the map!"] = "Frappez vos ennemis à la batte|, marquez des paniers ou envoyez-les à la mer !",
["Bazooka Training"] = "Entrainement au Bazooka",
@@ -19,8 +26,10 @@
-- ["BOOM!"] = "",
-- ["Boss defeated!"] = "",
-- ["Boss Slayer!"] = "",
+-- ["Build a track and race."] = "",
["CAPTURE THE FLAG"] = "Capturez le drapeau !",
-- ["Careless"] = "",
+-- ["Change Weapon"] = "",
-- ["Clumsy"] = "",
["Codename: Teamwork"] = "Nom de code : Travail d'équipe",
-- ["Complete the track as fast as you can!"] = "",
@@ -32,8 +41,10 @@
["DAMMIT, ROOKIE! GET OFF MY HEAD!"] = "Et merde, recrue ! Dégage de me tête !",
["Dangerous Ducklings"] = "Canetons dangereux",
-- ["Deadweight"] = "",
+-- ["Demolition is fun!"] = "",
-- ["Depleted Kamikaze!"] = "",
-- ["Destroy invaders to score points."] = "",
+-- ["Double Kill!"] = "",
-- ["Drone Hunter!"] = "",
-- ["Drowner"] = "",
-- ["Each turn you get 1-3 random weapons"] = "",
@@ -42,8 +53,11 @@
["Eliminate all targets before your time runs out.|You have unlimited ammo for this mission."] = "Éliminez toutes les cibles avant d'être à cours de temps.|Vos munitions sont illimitées pour cette mission.", --Bazooka, Shotgun, SniperRifle
["Eliminate Poison before the time runs out"] = "Éliminez tout le Poison avant d'être à cours de temps.",
["Eliminate the Blue Team"] = "Éliminez l'équipe bleue",
+-- ["Eliminate the enemy before the time runs out"] = "", -- User_Mission_-_Bamboo_Thicket, User_Mission_-_Newton_and_the_Hammock
+-- ["Eliminate the enemy hogs to win."] = "",
-- ["Eliminate the enemy specialists."] = "",
["- Eliminate Unit 3378 |- Feeble Resistance must survive"] = "Éliminez l'unité 3378|- Résistance Futile doit survivre",
+-- ["Energetic Engineer"] = "",
["Enjoy the swim..."] = "Profitez du bain ...",
-- ["[Enter]"] = "",
["Fastest lap: "] = "Meilleur tour : ",
@@ -53,6 +67,9 @@
["Flag respawned!"] = "Drapeau réapparu",
["Flag returned!"] = "Drapeau récupéré",
-- ["Flags, and their home base will be placed where each team ends their first turn."] = "",
+-- ["Flamer"] = "",
+-- ["Friendly Fire!"] = "",
+-- ["fuel extended!"] = "",
-- ["GAME BEGUN!!!"] = "",
-- ["Game Modifiers: "] = "",
["GAME OVER!"] = "Fin du jeu ! ",
@@ -62,11 +79,15 @@
-- ["GO! GO! GO!"] = "",
["Good birdy......"] = "Gentil oiseau ...",
["Good luck out there!"] = "Bonne chance pour sortir d'ici",
+-- ["Good so far!"] = "",
+-- ["Good to go!"] = "",
-- ["GOTCHA!"] = "",
+-- ["Grab Mines/Explosives"] = "",
-- ["Hahahaha!"] = "",
-- ["Haha, now THAT would be something!"] = "",
-- ["Hapless Hogs"] = "",
-- [" Hapless Hogs left!"] = "",
+-- ["Health crates extend your time."] = "",
-- ["Heavy"] = "",
-- ["Hedgewars-Basketball"] = "",
-- ["Hedgewars-Knockball"] = "",
@@ -80,9 +101,15 @@
-- ["It's a good thing SUDDEN DEATH is 99 turns away..."] = "",
-- ["Jumping is disabled"] = "",
-- ["Kamikaze Expert!"] = "",
+-- ["Keep it up!"] = "",
+-- ["Killing spree!"] = "",
-- ["KILLS"] = "",
+-- ["Last Target!"] = "",
-- ["[Left Shift]"] = "",
["Listen up, maggot!!"] = "Écoutez, asticots",
+-- ["Lively Lifeguard"] = "",
+-- ["Mine Deployer"] = "",
+-- ["Mine Eater!"] = "",
-- ["|- Mines Time:"] = "", -- User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork
["MISSION FAILED"] = "Mission échouée", -- User_Mission_-_Dangerous_Ducklings, User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork
-- ["MISSION SUCCESS"] = "",
@@ -90,9 +117,12 @@
-- ["Movement: [Up], [Down], [Left], [Right]"] = "",
-- ["Multi-shot!"] = "",
-- ["Nameless Heroes"] = "",
+-- ["New Barrels Per Turn"] = "",
-- ["NEW CLAN RECORD: "] = "",
["NEW fastest lap: "] = "Nouveau meilleur temps",
+-- ["New Mines Per Turn"] = "",
-- ["NEW RACE RECORD: "] = "",
+-- ["Newton's Hammock"] = "",
-- ["NOT ENOUGH WAYPOINTS"] = "",
["Not So Friendly Match"] = "Match pas si amical", -- Basketball, Knockball
["Oh no! Just try again!"] = "Eh non ! Essayez encore ! ", -- User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork
@@ -100,15 +130,21 @@
-- ["Operation Diver"] = "",
["Opposing Team: "] = "Équipe opposée",
["Pathetic Hog #%d"] = "Hérisson pathétique #%d",
+-- ["Pathetic Resistance"] = "", -- User_Mission_-_Bamboo_Thicket, User_Mission_-_Newton_and_the_Hammock
-- ["Per-Hog Ammo"] = "",
-- ["Place more waypoints using [ENTER]"] = "",
+-- ["Place more waypoints using the 'Air Attack' weapon."] = "",
["points"] = "points", -- Control, CTF_Blizzard, Basic_Training_-_Bazooka, Basic_Training_-_Shotgun, Basic_Training_-_Sniper_Rifle
["Poison"] = "Poison",
-- ["Power Remaining"] = "",
+-- ["Prepare yourself"] = "",
-- ["Press [Precise] to skip intro"] = "",
-- ["Race complexity limit reached."] = "",
+-- ["RACER"] = "",
[" - Return the enemy flag to your base to score | - First team to 3 captures wins | - You may only score when your flag is in your base | - Hogs will drop the flag if killed, or drowned | - Dropped flags may be returned or recaptured | - Hogs respawn when killed"] = "Ramenez le drapeau ennemi à votre base pour marquer | -La première équipe à 3 captures gagne | - Vous marquez uniquement si votre drapeau est dans votre base | - Les hérissons vont lâcher le drapeau s'ils sont tués ou noyés | - Les drapeaux lâchés peuvent être ramenés ou recapturés | - Les hérissons réapparaissent quand ils sont tués",
+-- ["Round Limit:"] = "",
-- ["Round Limit"] = "",
+-- ["Rounds Complete: "] = "",
-- ["Rounds Complete"] = "",
["RULES OF THE GAME [Press ESC to view]"] = "RÈGLES DU JEU | [Appuyez Échap pour voir]",
-- ["s|"] = "",
@@ -116,6 +152,7 @@
-- ["SCORE"] = "",
-- ["sec"] = "", -- CTF_Blizzard, TrophyRace, Basic_Training_-_Bazooka, Basic_Training_-_Shotgun, Basic_Training_-_Sniper_Rifle, User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork, Capture_the_Flag
["See ya!"] = "Bye bye",
+-- ["selected!"] = "",
-- ["s"] = "", -- GaudyRacer, Space_Invasion
-- ["Shield boosted! +30 power"] = "",
-- ["Shield Depleted"] = "",
@@ -127,7 +164,7 @@
-- ["Shield Seeker!"] = "",
["Shotgun Team"] = "Équipe de choc",
["Shotgun Training"] = "Entrainement au fusil",
--- ["Shots Left: "] = "", -- GaudyRacer, Tumbler
+-- ["shots remaining."] = "",
-- ["Silly"] = "",
-- ["Sinky"] = "",
["%s is out and Team %d|scored a penalty!| |Score:"] = "%s est dehors et l'équipe %d| reçoit une pénalité ! | |Score : ", -- Basketball, Knockball
@@ -146,26 +183,33 @@
["The flag will respawn next round."] = "Le drapeau va réapparaitre au prochain tour",
-- ["The Nameless One"] = "",
-- ["THE SPECIALISTS"] = "",
+-- ["This one's tricky."] = "",
-- ["This rain is really something..."] = "",
-- ["TIME: "] = "",
-- ["Timed Kamikaze!"] = "",
-- ["Time Extended!"] = "",
--- ["Time Left: "] = "",
+-- ["Time Extension"] = "",
-- ["Toggle Shield"] = "",
["Toxic Team"] = "Équipe toxique", -- User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork
-- ["TRACK COMPLETED"] = "",
--- ["Track Time: "] = "",
+-- ["TRACK FAILED!"] = "",
-- ["TrophyRace"] = "",
-- ["T_T"] = "",
+-- ["Tumbling Time Extended!"] = "",
-- ["Turn Time"] = "",
+-- ["Unit"] = "",
["Unit 3378"] = "Unité 3378",
+-- ["Unit 835"] = "",
-- ["Unlimited Attacks"] = "",
+-- ["Unstoppable!"] = "",
-- ["User Challenge"] = "",
["Use your rope to get from start to finish as fast as you can!"] = "Utilisez votre Corde Ninja pour aller du début à la fin aussi vite que vous pouvez !",
--- ["v.06"] = "",
["Victory for the "] = "Victoire pour ", -- CTF_Blizzard, Capture_the_Flag
-- ["Waypoint placed."] = "",
+-- ["Way-Points Remaining"] = "",
-- ["Weapons Reset"] = "",
+-- ["Well done."] = "",
+-- ["Will this ever end?"] = "",
-- ["WINNING TIME: "] = "",
-- ["You'd almost swear the water was rising!"] = "",
["You have SCORED!!"] = "Vous avez marqué !",
--- a/share/hedgewars/Data/Locale/hedgewars_de.ts Wed Sep 14 22:27:22 2011 +0200
+++ b/share/hedgewars/Data/Locale/hedgewars_de.ts Wed Sep 14 22:39:39 2011 +0200
@@ -359,30 +359,30 @@
</message>
<message>
<source>Cancel</source>
- <translation type="unfinished">Abbrechen</translation>
+ <translation>Abbrechen</translation>
</message>
</context>
<context>
<name>PageDrawMap</name>
<message>
<source>Undo</source>
- <translation type="unfinished"></translation>
+ <translation>Rückgängig</translation>
</message>
<message>
<source>Clear</source>
- <translation type="unfinished"></translation>
+ <translation>Löschen</translation>
</message>
<message>
<source>Load</source>
- <translation type="unfinished">Laden</translation>
+ <translation>Laden</translation>
</message>
<message>
<source>Save</source>
- <translation type="unfinished"></translation>
+ <translation>Sichern</translation>
</message>
<message>
<source>Load drawn map</source>
- <translation type="unfinished"></translation>
+ <translation>Gezeichnete Karte laden</translation>
</message>
<message>
<source>Drawn Maps (*.hwmap);;All files (*.*)</source>
@@ -390,7 +390,7 @@
</message>
<message>
<source>Save drawn map</source>
- <translation type="unfinished"></translation>
+ <translation>Gezeichnete Karte sichern</translation>
</message>
</context>
<context>
@@ -1351,7 +1351,7 @@
</message>
<message>
<source>hand drawn map...</source>
- <translation type="unfinished"></translation>
+ <translation>Handgezeichnete Karte</translation>
</message>
<message>
<source>Disabled</source>
--- a/share/hedgewars/Data/Locale/hedgewars_lt.ts Wed Sep 14 22:27:22 2011 +0200
+++ b/share/hedgewars/Data/Locale/hedgewars_lt.ts Wed Sep 14 22:39:39 2011 +0200
@@ -153,7 +153,7 @@
<message>
<location filename="../../../../QTfrontend/game.cpp" line="311"/>
<source>en.txt</source>
- <translation type="unfinished"></translation>
+ <translation>lt.txt</translation>
</message>
<message>
<location filename="../../../../QTfrontend/game.cpp" line="329"/>
--- a/share/hedgewars/Data/Locale/hedgewars_pl.ts Wed Sep 14 22:27:22 2011 +0200
+++ b/share/hedgewars/Data/Locale/hedgewars_pl.ts Wed Sep 14 22:39:39 2011 +0200
@@ -16,15 +16,15 @@
<name>DrawMapWidget</name>
<message>
<source>File error</source>
- <translation type="unfinished">Błąd pliku</translation>
+ <translation>Błąd pliku</translation>
</message>
<message>
<source>Cannot open file '%1' for writing</source>
- <translation type="unfinished">Nie można otworzyć '%1' do zapisu</translation>
+ <translation>Nie można otworzyć '%1' do zapisu</translation>
</message>
<message>
<source>Cannot read file '%1'</source>
- <translation type="unfinished">Nie można odczytać pliku '%1'</translation>
+ <translation>Nie można odczytać pliku '%1'</translation>
</message>
</context>
<context>
@@ -128,6 +128,14 @@
<comment>File Types</comment>
<translation>Zapisana gra</translation>
</message>
+ <message>
+ <source>Demo name</source>
+ <translation type="unfinished">Nazwa demo</translation>
+ </message>
+ <message>
+ <source>Demo name:</source>
+ <translation type="unfinished">Nazwa demo:</translation>
+ </message>
</context>
<context>
<name>HWGame</name>
@@ -298,14 +306,17 @@
</message>
<message>
<source>Nickname</source>
- <translation type="unfinished">Nick</translation>
+ <translation>Nick</translation>
</message>
<message>
<source>Some one already uses
your nickname %1
on the server.
Please pick another nickname:</source>
- <translation type="unfinished"></translation>
+ <translation>Ktoś właśnie używa
+tego nicku %1
+na serwerze.
+Przoszę wybrać nowy nick:</translation>
</message>
</context>
<context>
@@ -362,7 +373,7 @@
</message>
<message>
<source>Cancel</source>
- <translation type="unfinished">Anuluj</translation>
+ <translation>Anuluj</translation>
</message>
</context>
<context>
@@ -516,7 +527,7 @@
<message>
<source>Some weapons might do only low damage but they can be a lot more devastating in the right situation. Try to use the Desert Eagle to knock multiple hedgehogs into the water.</source>
<comment>Tips</comment>
- <translation>Niektóre z broni zadają mało punktów obrażeń jednak użyte w odpowiednim momencie mogą pokazać swój pazur. Na przykład spróbuj użyć pistoletu do strącania swoich przeciwników do wody.</translation>
+ <translation type="unfinished">Niektóre z broni zadają mało punktów obrażeń jednak użyte w odpowiednim momencie mogą pokazać pazur. Na przykład spróbuj użyć pistoletu by strącić swoich przeciwników do wody.</translation>
</message>
<message>
<source>If you're unsure what to do and don't want to waste ammo, skip one round. But don't let too much time pass as there will be Sudden Death!</source>
@@ -561,17 +572,17 @@
<message>
<source>From time to time there will be official tournaments. Upcoming events will be announced at http://www.hedgewars.org/ some days in advance.</source>
<comment>Tips</comment>
- <translation>Od czasu do czasu będą organizowane mistrzostwa. Będą one ogłaszane z wyprzedzeniem na http://www.hedgewars.org/ .</translation>
+ <translation type="unfinished">Od czasu do czasu będą organizowane mistrzostwa. Będą one ogłaszane z wyprzedzeniem na http://www.hedgewars.org/ .</translation>
</message>
<message>
<source>Hedgewars is available in many languages. If the translation in your language seems to be missing or outdated, feel free to contact us!</source>
<comment>Tips</comment>
- <translation>Hedgewars jest dostępne w wielu językach. Jeśli brakuje tłumaczenia w twoim języku bądź jest ono wybrakowane, nie bój się z nami skontaktować!</translation>
+ <translation type="unfinished">Hedgewars jest dostępne w wielu językach. Jeśli brakuje tłumaczenia w twoim języku bądź jest ono niekompletne, nie bój się z nami skontaktować!</translation>
</message>
<message>
<source>Hedgewars can be run on lots of different operating systems including Microsoft Windows, Mac OS X and Linux.</source>
<comment>Tips</comment>
- <translation>Hedgewars może być uruchomione na różnych systemach operacyjnych takich jak Microsoft Windows, MacOS X oraz Linux.</translation>
+ <translation type="unfinished">Hedgewars może być uruchomione na różnych systemach operacyjnych takich jak Microsoft Windows, MacOS X, FreeBSD oraz Linux.</translation>
</message>
<message>
<source>Always remember you're able to set up your own games in local and network/online play. You're not restricted to the 'Simple Game' option.</source>
@@ -606,7 +617,7 @@
<message>
<source>Especially while playing online be polite and always remember there might be some minors playing with or against you as well!</source>
<comment>Tips</comment>
- <translation>Bądź kulturalny grając w internecie oraz pamiętaj o tym, że w Hedgewars mogą grać także młodsze osoby!</translation>
+ <translation type="unfinished">Bądź kulturalny grając przez internet. Pamiętaj o tym, że w Hedgewars mogą grać także młodsze osoby!</translation>
</message>
<message>
<source>Special game modes such as 'Vampirism' or 'Karma' allow you to develop completely new tactics. Try them in a custom game!</source>
@@ -646,7 +657,7 @@
<message>
<source>Connect one or more gamepads before starting the game to be able to assign their controls to your teams.</source>
<comment>Tips</comment>
- <translation>Jeśli podłączysz jeden lub więcej gamepadów przed włączeniem gry, będziesz miał możliwość przypisania klawiszy by sterować swoimi jeżami.</translation>
+ <translation type="unfinished">Jeśli podłączysz jeden lub więcej gamepadów przed włączeniem gry będziesz miał możliwość przypisania klawiszy by sterować swoimi jeżami.</translation>
</message>
<message>
<source>Create an account on %1 to keep others from using your most favourite nickname while playing on the official server.</source>
@@ -761,12 +772,12 @@
<message>
<source>You're able to associate Hedgewars related files (savegames and demo recordings) with the game to launch them right from your favorite file or internet browser.</source>
<comment>Tips</comment>
- <translation>Możesz powiązać typy plików związane z Hedgewars (zapisy gier i dema) by móc je uruchamiać potem bezpośrednio z ulubionego menedżera plików bądź przeglądarki internetowej.</translation>
+ <translation type="unfinished">Możesz powiązać typy plików związane z Hedgewars (zapisy gier i dema) by móc je uruchamiać bezpośrednio z ulubionego menedżera plików bądź przeglądarki internetowej.</translation>
</message>
<message>
<source>Want to save ropes? Release the rope in mid air and then shoot again. As long as you don't touch the ground you'll reuse your rope without wasting ammo!</source>
<comment>Tips</comment>
- <translation>Chcesz zaoszczędzić liny? Odłącz ją będąc w powietrzu, a potem wypuść ją ponownie. Tak długo jak nie dotkniesz ziemi, będziesz używał pojedynczego naboju!</translation>
+ <translation type="unfinished">Chcesz zaoszczędzić liny? Odłącz ją będąc w powietrzu, a potem wypuść ją ponownie. Dopóki nie dotkniesz ziemi, będziesz używał pojedynczego naboju!</translation>
</message>
<message>
<source>You can find your Hedgewars configuration files under "Library/Application Support/Hedgewars" in your home directory. Create backups or take the files with you, but don't edit them by hand.</source>
@@ -781,17 +792,21 @@
<message>
<source>The Windows version of Hedgewars supports Xfire. Make sure to add Hedgewars to its game list so your friends can see you playing.</source>
<comment>Tips</comment>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Wersja Hedgewars dla systemu Windows wspiera XFire. Upewnij się, że dodałeś Hedgewars do listy gier by Twoi znajomi mogli zobaczyć Ciebie w czasie gry.</translation>
</message>
<message>
<source>Use the Molotov or Flame Thrower to temporary keep hedgehogs from passing terrain such as tunnels or platforms.</source>
<comment>Tips</comment>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Użyj koktajlu Mołotowa lub Miotacza ognia by powstrzymać przeciwnika przed przedostaniem się przez tunele lub platformy.</translation>
</message>
<message>
<source>The Homing Bee can be tricky to use. Its turn radius depends on its velocity, so try to not use full power.</source>
<comment>Tips</comment>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Pszczoła potrafi być ciężka w użyciu. Jej promień skrętu zależy od prędkości lotu, więc nie staraj się nie używać pełnej mocy podczas strzału.</translation>
+ </message>
+ <message>
+ <source>Downloadable Content</source>
+ <translation type="unfinished">Dodatki do pobrania</translation>
</message>
</context>
<context>
@@ -820,15 +835,15 @@
</message>
<message>
<source>Error</source>
- <translation type="unfinished">Błąd</translation>
+ <translation>Błąd</translation>
</message>
<message>
<source>Please enter room name</source>
- <translation type="unfinished">Wprowadź nazwę pokoju</translation>
+ <translation>Wprowadź nazwę pokoju</translation>
</message>
<message>
<source>OK</source>
- <translation type="unfinished">OK</translation>
+ <translation>OK</translation>
</message>
</context>
<context>
@@ -1050,10 +1065,10 @@
</message>
<message numerus="yes">
<source>%1 players online</source>
- <translation type="unfinished">
- <numerusform></numerusform>
- <numerusform></numerusform>
- <numerusform></numerusform>
+ <translation>
+ <numerusform>%1 gracz online</numerusform>
+ <numerusform>%1 graczy online</numerusform>
+ <numerusform>%1 graczy online</numerusform>
</translation>
</message>
</context>
@@ -1081,7 +1096,7 @@
</message>
<message>
<source>Add an indestructable border around the terrain</source>
- <translation>Dodaje niezniszczalną ramkę dookoła terenu</translation>
+ <translation type="obsolete">Dodaje niezniszczalną ramkę dookoła terenu</translation>
</message>
<message>
<source>Lower gravity</source>
@@ -1177,7 +1192,15 @@
</message>
<message>
<source>Teams in each clan take successive turns sharing their turn time.</source>
- <translation type="unfinished"></translation>
+ <translation>Zespoły wykonują swoje tury po kolei dzieląc czas pomiędzy siebie.</translation>
+ </message>
+ <message>
+ <source>Add an indestructible border around the terrain</source>
+ <translation type="unfinished">Dodaje niezniszczalną ramkę dookoła terenu</translation>
+ </message>
+ <message>
+ <source>Add an indestructible border along the bottom</source>
+ <translation type="unfinished">Dodaje na dole niezniszczalną ramkę</translation>
</message>
</context>
<context>
@@ -1274,7 +1297,7 @@
</message>
<message>
<source>Update</source>
- <translation type="unfinished">Odśwież</translation>
+ <translation>Zmień</translation>
</message>
</context>
<context>
@@ -1416,67 +1439,67 @@
</message>
<message>
<source>Disabled</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Wyłączone</translation>
</message>
<message>
<source>Red/Cyan</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Czerwone/Błękitne</translation>
</message>
<message>
<source>Cyan/Red</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Błękitne/Czerwone</translation>
</message>
<message>
<source>Red/Blue</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Czerwone/Niebieskie</translation>
</message>
<message>
<source>Blue/Red</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Niebieskie/Czerwone</translation>
</message>
<message>
<source>Red/Green</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Czerwone/Zielone</translation>
</message>
<message>
<source>Green/Red</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Zielone/Czerwone</translation>
</message>
<message>
<source>Side-by-side</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Obok siebie</translation>
</message>
<message>
<source>Top-Bottom</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Góra-dół</translation>
</message>
<message>
<source>Wiggle</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Trzęsący się obraz</translation>
</message>
<message>
<source>Red/Cyan grayscale</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Czer/Błęk w odc. szar</translation>
</message>
<message>
<source>Cyan/Red grayscale</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Błęk/Czer w odc. szar</translation>
</message>
<message>
<source>Red/Blue grayscale</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Czer/Nieb w odc. szar</translation>
</message>
<message>
<source>Blue/Red grayscale</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Nieb/Czer w odc. szar</translation>
</message>
<message>
<source>Red/Green grayscale</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Czer/Ziel w odc. szar</translation>
</message>
<message>
<source>Green/Red grayscale</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Ziel/Czer w odc. szar</translation>
</message>
</context>
<context>
@@ -1726,19 +1749,19 @@
</message>
<message>
<source>Stereo rendering</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Wyświetlanie w 3D</translation>
</message>
<message>
<source>Game Options</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Opcje</translation>
</message>
<message>
<source>Style</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Tryb gry</translation>
</message>
<message>
<source>Scheme</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Schemat</translation>
</message>
<message>
<source>Password</source>
@@ -1746,7 +1769,7 @@
</message>
<message>
<source>% Get Away Time</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Czas na ucieczkę w %</translation>
</message>
</context>
<context>
@@ -2113,7 +2136,11 @@
</message>
<message>
<source>Tag Team</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Zespół</translation>
+ </message>
+ <message>
+ <source>Add Bottom Border</source>
+ <translation type="unfinished">Ddoaj ramkę na dole</translation>
</message>
</context>
<context>
--- a/share/hedgewars/Data/Locale/hedgewars_uk.ts Wed Sep 14 22:27:22 2011 +0200
+++ b/share/hedgewars/Data/Locale/hedgewars_uk.ts Wed Sep 14 22:39:39 2011 +0200
@@ -16,15 +16,15 @@
<name>DrawMapWidget</name>
<message>
<source>File error</source>
- <translation type="unfinished"></translation>
+ <translation>Помилка файлу</translation>
</message>
<message>
<source>Cannot open file '%1' for writing</source>
- <translation type="unfinished"></translation>
+ <translation>Не можу відкрити файл '%1' для запису</translation>
</message>
<message>
<source>Cannot read file '%1'</source>
- <translation type="unfinished"></translation>
+ <translation>Не можу прочитати файл '%1'</translation>
</message>
</context>
<context>
@@ -290,14 +290,17 @@
</message>
<message>
<source>Nickname</source>
- <translation type="unfinished">Ім'я</translation>
+ <translation>Нікнейм</translation>
</message>
<message>
<source>Some one already uses
your nickname %1
on the server.
Please pick another nickname:</source>
- <translation type="unfinished"></translation>
+ <translation>Хтось вже використовує
+ нікнейм %1
+на сервері.
+Виберіть інший нікнейм:</translation>
</message>
</context>
<context>
@@ -354,7 +357,7 @@
</message>
<message>
<source>Cancel</source>
- <translation type="unfinished">Скасувати</translation>
+ <translation>Скасувати</translation>
</message>
</context>
<context>
@@ -732,11 +735,6 @@
<translation>Windows-версія Hedgewars підтримує Xfire. Переконайтеся в тому, що ви додали Hedgewars до списку ігор, щоб ваші друзі могли бачити вас в грі.</translation>
</message>
<message>
- <source>The Homing Bee can be tricky to use. Its turn radius depends on it's velocity, so try to not use full power.</source>
- <comment>Tips</comment>
- <translation type="obsolete">Навідна Бджілка може бути складною у керуванні. Радіус повороту залежить від її швидкості, тому постарайтеся не стріляти на повну силу.</translation>
- </message>
- <message>
<source>Use the Molotov or Flame Thrower to temporary keep hedgehogs from passing terrain such as tunnels or platforms.</source>
<comment>Tips</comment>
<translation>Використайте Коктейль Молотова або Вогнемет щоб тимчасово утримати їжаків від проходження такої місцевості як тунелі або платформи.</translation>
@@ -744,7 +742,7 @@
<message>
<source>The Homing Bee can be tricky to use. Its turn radius depends on its velocity, so try to not use full power.</source>
<comment>Tips</comment>
- <translation type="unfinished"></translation>
+ <translation>Навідна Бджілка може бути складною у керуванні. Радіус повороту залежить від її швидкості, тому постарайтеся не стріляти на повну силу.</translation>
</message>
</context>
<context>
@@ -773,15 +771,15 @@
</message>
<message>
<source>Error</source>
- <translation type="unfinished">Помилка</translation>
+ <translation>Помилка</translation>
</message>
<message>
<source>Please enter room name</source>
- <translation type="unfinished">Введіть назву кімнати</translation>
+ <translation>Введіть назву кімнати</translation>
</message>
<message>
<source>OK</source>
- <translation type="unfinished">Так</translation>
+ <translation>Так</translation>
</message>
</context>
<context>
@@ -1003,10 +1001,10 @@
</message>
<message numerus="yes">
<source>%1 players online</source>
- <translation type="unfinished">
- <numerusform></numerusform>
- <numerusform></numerusform>
- <numerusform></numerusform>
+ <translation>
+ <numerusform>%1 гравець в мережі</numerusform>
+ <numerusform>%1 гравця в мережі</numerusform>
+ <numerusform>%1 гравців в мережі</numerusform>
</translation>
</message>
</context>
@@ -1130,7 +1128,7 @@
</message>
<message>
<source>Teams in each clan take successive turns sharing their turn time.</source>
- <translation type="unfinished"></translation>
+ <translation>Команди в кожному клані здійснюють послідовні ходи, поділяючи час ходу.</translation>
</message>
</context>
<context>
@@ -1227,7 +1225,7 @@
</message>
<message>
<source>Update</source>
- <translation type="unfinished">Оновити</translation>
+ <translation>Оновити</translation>
</message>
</context>
<context>
@@ -1377,27 +1375,27 @@
</message>
<message>
<source>Red/Cyan grayscale</source>
- <translation type="unfinished"></translation>
+ <translation>Черв./Блак. відтінки сірого</translation>
</message>
<message>
<source>Cyan/Red grayscale</source>
- <translation type="unfinished"></translation>
+ <translation>Блак./Черв. відтінки сірого</translation>
</message>
<message>
<source>Red/Blue grayscale</source>
- <translation type="unfinished"></translation>
+ <translation>Черв./Синій відтінки сірого</translation>
</message>
<message>
<source>Blue/Red grayscale</source>
- <translation type="unfinished"></translation>
+ <translation>Синій/Черв. відтінки сірого</translation>
</message>
<message>
<source>Red/Green grayscale</source>
- <translation type="unfinished"></translation>
+ <translation>Черв./Зел. відтінки сірого</translation>
</message>
<message>
<source>Green/Red grayscale</source>
- <translation type="unfinished"></translation>
+ <translation>Зел./Черв. відтінки сірого</translation>
</message>
</context>
<context>
@@ -1626,32 +1624,28 @@
<translation>% Довжина Мотузки</translation>
</message>
<message>
- <source>Gameplay</source>
- <translation type="obsolete">Геймплей</translation>
- </message>
- <message>
<source>Stereo rendering</source>
<translation>Стерео рендеринг</translation>
</message>
<message>
<source>Game Options</source>
- <translation type="unfinished"></translation>
+ <translation>Параметри гри</translation>
</message>
<message>
<source>Style</source>
- <translation type="unfinished"></translation>
+ <translation>Стиль</translation>
</message>
<message>
<source>Scheme</source>
- <translation type="unfinished"></translation>
+ <translation>Схема</translation>
</message>
<message>
<source>Password</source>
- <translation type="unfinished">Пароль</translation>
+ <translation>Пароль</translation>
</message>
<message>
<source>% Get Away Time</source>
- <translation type="unfinished"></translation>
+ <translation>% Час Тікати</translation>
</message>
</context>
<context>
@@ -2014,7 +2008,7 @@
</message>
<message>
<source>Tag Team</source>
- <translation type="unfinished"></translation>
+ <translation>Збірна Команда</translation>
</message>
</context>
<context>
--- a/share/hedgewars/Data/Locale/it.lua Wed Sep 14 22:27:22 2011 +0200
+++ b/share/hedgewars/Data/Locale/it.lua Wed Sep 14 22:39:39 2011 +0200
@@ -3,12 +3,19 @@
[":("] = ":(",
["!!!"] = "!!!",
-- ["Accuracy Bonus!"] = "",
+-- ["Achievement Unlocked"] = "", -- User_Mission_-_Bamboo_Thicket, User_Mission_-_That_Sinking_Feeling, Tumbler
-- ["a Hedgewars mini-game"] = "", -- Space_Invasion, The_Specialists
["Aiming Practice"] = "Pratica la tua mira", --Bazooka, Shotgun, SniperRifle
-- ["Ammo"] = "",
-- ["Ammo Depleted!"] = "",
+-- ["ammo extended!"] = "",
+-- ["Ammo is reset at the end of your turn."] = "",
-- ["Ammo Maniac!"] = "",
-- ["Available points remaining: "] = "",
+-- ["[Backspace]"] = "",
+-- ["Bamboo Thicket"] = "",
+-- ["Barrel Eater!"] = "",
+-- ["Barrel Launcher"] = "",
["Bat balls at your enemies and|push them into the sea!"] = "Lancia delle palle ai tuoi nemici|e spingili in acqua!",
["Bat your opponents through the|baskets and out of the map!"] = "Manda (colpendoli) i tuoi nemici|in acqua attraverso i canestri laterali!",
["Bazooka Training"] = "Addestramento con il Bazooka",
@@ -19,8 +26,10 @@
-- ["Boom!"] = "BOOM!",
-- ["Boss defeated!"] = "",
-- ["Boss Slayer!"] = "",
+-- ["Build a track and race."] = "",
["CAPTURE THE FLAG"] = "Cattura la Bandiera",
-- ["Careless"] = "",
+-- ["Change Weapon"] = "",
-- ["Clumsy"] = "",
["Codename: Teamwork"] = "Nome in codice: Lavoro di Squadra",
-- ["Complete the track as fast as you can!"] = "",
@@ -32,8 +41,10 @@
["DAMMIT, ROOKIE!"] = "MALEDIZIONE, RECLUTA!",
["Dangerous Ducklings"] = "Papere Pericolose",
-- ["Deadweight"] = "",
+-- ["Demolition is fun!"] = "",
-- ["Depleted Kamikaze!"] = "",
-- ["Destroy invaders to score points."] = "",
+-- ["Double Kill!"] = "",
-- ["Drone Hunter!"] = "",
-- ["Drowner"] = "",
-- ["Each turn you get 1-3 random weapons"] = "",
@@ -42,8 +53,11 @@
["Eliminate all targets before your time runs out.|You have unlimited ammo for this mission."] = "Distruggi tutti gli obiettivi entro il tempo previsto.|Hai armi illimitate per questa missione.", --Bazooka, Shotgun, SniperRifle
["Eliminate Poison before the time runs out"] = "Elimina Veleno prima che il tempo finisca",
["Eliminate the Blue Team"] = "Elimina il Blue Team",
+-- ["Eliminate the enemy before the time runs out"] = "", -- User_Mission_-_Bamboo_Thicket, User_Mission_-_Newton_and_the_Hammock
+-- ["Eliminate the enemy hogs to win."] = "",
-- ["Eliminate the enemy specialists."] = "",
["- Eliminate Unit 3378 |- Feeble Resistance must survive"] = "- Elimina l'Unità 3378 |- La Resistenza Finale deve sopravvivere",
+-- ["Energetic Engineer"] = "",
["Enjoy the swim..."] = "Nuota con piacere...",
-- ["[Enter]"] = "",
["Fastest lap: "] = "Giro migliore: ",
@@ -53,6 +67,9 @@
["Flag respawned!"] = "Bandiera restituita!",
["Flag returned!"] = "Bandiera recuperata!",
-- ["Flags, and their home base will be placed where each team ends their first turn."] = "",
+-- ["Flamer"] = "",
+-- ["Friendly Fire!"] = "",
+-- ["fuel extended!"] = "",
-- ["GAME BEGUN!!!"] = "",
-- ["Game Modifiers: "] = "",
["GAME OVER!"] = "GAME OVER!",
@@ -62,11 +79,15 @@
["GO! GO! GO!"] = "VAI! VAI! VAI!",
["Good birdy......"] = "Bell'uccellino......",
["Good luck out there!"] = "Buona fortuna!",
+-- ["Good so far!"] = "",
+-- ["Good to go!"] = "",
-- ["GOTCHA!"] = "",
+-- ["Grab Mines/Explosives"] = "",
-- ["Hahahaha!"] = "",
-- ["Haha, now THAT would be something!"] = "",
-- ["Hapless Hogs"] = "",
-- [" Hapless Hogs left!"] = "",
+-- ["Health crates extend your time."] = "",
-- ["Heavy"] = "",
["Hedgewars-Basketball"] = "Hedgewars-Pallacanestro",
["Hedgewars-Knockball"] = "Hedgewars-Knockball",
@@ -80,9 +101,15 @@
-- ["It's a good thing SUDDEN DEATH is 99 turns away..."] = "",
-- ["Jumping is disabled"] = "",
-- ["Kamikaze Expert!"] = "",
+-- ["Keep it up!"] = "",
+-- ["Killing spree!"] = "",
-- ["KILLS"] = "",
+-- ["Last Target!"] = "",
-- ["[Left Shift]"] = "",
["Listen up, maggot!!"] = "Recluta, Attenzione!!",
+-- ["Lively Lifeguard"] = "",
+-- ["Mine Deployer"] = "",
+-- ["Mine Eater!"] = "",
-- ["|- Mines Time:"] = "|-Timer delle mine:", -- User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork
["MISSION FAILED"] = "MISSIONE FALLITA", -- User_Mission_-_Dangerous_Ducklings, User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork
["MISSION SUCCESSFUL"] = "MISSIONE COMPLETATA CON SUCCESSO", -- User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork
@@ -90,9 +117,12 @@
-- ["Movement: [Up], [Down], [Left], [Right]"] = "",
-- ["Multi-shot!"] = "",
-- ["Nameless Heroes"] = "",
+-- ["New Barrels Per Turn"] = "",
-- ["NEW CLAN RECORD: "] = "",
["NEW fastest lap: "] = "Nuovo giro migliore: ",
+-- ["New Mines Per Turn"] = "",
-- ["NEW RACE RECORD: "] = "",
+-- ["Newton's Hammock"] = "",
-- ["NOT ENOUGH WAYPOINTS"] = "",
["Not So Friendly Match"] = "Partita non molto amichevole", -- Basketball, Knockball
["Oh no! Just try again!"] = "Oh no! Prova ancora!", -- User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork
@@ -100,15 +130,21 @@
["Operation Diver"] = "Operazione Sub",
["Opposing Team: "] = "Squadra Nemica: ",
["Pathetic Hog #%d"] = "Riccio Patetico #%d",
+-- ["Pathetic Resistance"] = "", -- User_Mission_-_Bamboo_Thicket, User_Mission_-_Newton_and_the_Hammock
-- ["Per-Hog Ammo"] = "",
-- ["Place more waypoints using [ENTER]"] = "",
+-- ["Place more waypoints using the 'Air Attack' weapon."] = "",
-- ["points"] = "", -- Control, Space_Invasion
["Poison"] = "Veleno",
-- ["Power Remaining"] = "",
+-- ["Prepare yourself"] = "",
-- ["Press [Precise] to skip intro"] = "",
-- ["Race complexity limit reached."] = "",
+-- ["RACER"] = "",
[" - Return the enemy flag to your base to score | - First team to 3 captures wins | - You may only score when your flag is in your base | - Hogs will drop the flag if killed, or drowned | - Dropped flags may be returned or recaptured | - Hogs respawn when killed"] = " - Riporta la bandiera nemica alla tua base per guadagnare un punto| - La prima squadra a catturarne 3 vince! | - Puoi guadagnare punti solo quando la tua bandiera si trova nella tua base! | - I ricci lasceranno cadere la bandiera se uccisi o caduti in acqua! | - Le bandiere cadute possono essere restituite o ricatturate! | - I ricci risorgono dalla morte!",
+-- ["Round Limit:"] = "",
-- ["Round Limit"] = "",
+-- ["Rounds Complete: "] = "",
-- ["Rounds Complete"] = "",
-- ["RULES OF THE GAME [Press ESC to view]"] = "",
["RULES OF THE GAME [Press ESC to view]"] = "REGOLE DEL GIOCO (Premi ESC per visualizzarle)",
@@ -117,6 +153,7 @@
-- ["SCORE"] = "",
-- ["sec"] = "sec", -- CTF_Blizzard, TrophyRace, Basic_Training_-_Bazooka, Basic_Training_-_Shotgun, Basic_Training_-_Sniper_Rifle, User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork, Capture_the_Flag
["See ya!"] = "Ci vediamo!",
+-- ["selected!"] = "",
-- ["s"] = "", -- GaudyRacer, Space_Invasion
-- ["Shield boosted! +30 power"] = "",
-- ["Shield Depleted"] = "",
@@ -128,7 +165,7 @@
-- ["Shield Seeker!"] = "",
["Shotgun Team"] = "Squadra FaP",
["Shotgun Training"] = "Allenamento con il Fucile a Pompa",
--- ["Shots Left: "] = "", -- GaudyRacer, Tumbler
+-- ["shots remaining."] = "",
-- ["Silly"] = "",
-- ["Sinky"] = "",
["%s is out and Team %d|scored a penalty!| |Score:"] = "%s è fuori dal campo e la squadra %d|prende una penalità!| |Punteggio:", -- Basketball, Knockball
@@ -147,27 +184,34 @@
-- ["The flag will respawn next round."] = "La bandiera verrà restituita alla fine del turno.",
-- ["The Nameless One"] = "",
-- ["THE SPECIALISTS"] = "",
+-- ["This one's tricky."] = "",
-- ["This rain is really something..."] = "",
-- ["TIME: "] = "",
-- ["Timed Kamikaze!"] = "",
-- ["Time Extended!"] = "",
--- ["Time Left: "] = "",
+-- ["Time Extension"] = "",
-- ["Toggle Shield"] = "",
["Toxic Team"] = "Team Velenoso", -- User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork
-- ["TRACK COMPLETED"] = "",
--- ["Track Time: "] = "",
+-- ["TRACK FAILED!"] = "",
["TrophyRace"] = "TrophyRace",
["T_T"] = "T_T",
+-- ["Tumbling Time Extended!"] = "",
-- ["Turn Time"] = "",
+-- ["Unit"] = "",
["Unit 3378"] = "Unità 3378",
+-- ["Unit 835"] = "",
-- ["Unlimited Attacks"] = "",
+-- ["Unstoppable!"] = "",
-- ["User Challenge"] = "",
["Use your rope to get from start to finish as fast as you can!"] = "Usa la tua corda per raggiungere il traguardo il più velocemente possibile!",
--- ["v.06"] = "",
-- ["Victory for the "] = "", -- CTF_Blizzard, Capture_the_Flag
["Victory for the"] = "La vittoria è di",
-- ["Waypoint placed."] = "",
+-- ["Way-Points Remaining"] = "",
-- ["Weapons Reset"] = "",
+-- ["Well done."] = "",
+-- ["Will this ever end?"] = "",
-- ["WINNING TIME: "] = "",
-- ["You'd almost swear the water was rising!"] = "",
["You have SCORED!!"] = "Hai guadagnato un PUNTO!",
--- a/share/hedgewars/Data/Locale/ko.lua Wed Sep 14 22:27:22 2011 +0200
+++ b/share/hedgewars/Data/Locale/ko.lua Wed Sep 14 22:39:39 2011 +0200
@@ -3,12 +3,19 @@
-- ["!!!"] = "",
-- ["..."] = "",
-- ["Accuracy Bonus!"] = "",
+-- ["Achievement Unlocked"] = "", -- User_Mission_-_Bamboo_Thicket, User_Mission_-_That_Sinking_Feeling, Tumbler
-- ["a Hedgewars mini-game"] = "", -- Space_Invasion, The_Specialists
-- ["Aiming Practice"] = "", --Bazooka, Shotgun, SniperRifle
-- ["Ammo"] = "",
-- ["Ammo Depleted!"] = "",
+-- ["ammo extended!"] = "",
+-- ["Ammo is reset at the end of your turn."] = "",
-- ["Ammo Maniac!"] = "",
-- ["Available points remaining: "] = "",
+-- ["[Backspace]"] = "",
+-- ["Bamboo Thicket"] = "",
+-- ["Barrel Eater!"] = "",
+-- ["Barrel Launcher"] = "",
-- ["Bat balls at your enemies and|push them into the sea!"] = "",
-- ["Bat your opponents through the|baskets and out of the map!"] = "",
-- ["Bazooka Training"] = "",
@@ -19,8 +26,10 @@
-- ["BOOM!"] = "",
-- ["Boss defeated!"] = "",
-- ["Boss Slayer!"] = "",
+-- ["Build a track and race."] = "",
-- ["CAPTURE THE FLAG"] = "",
-- ["Careless"] = "",
+-- ["Change Weapon"] = "",
-- ["Clumsy"] = "",
-- ["Codename: Teamwork"] = "",
-- ["Complete the track as fast as you can!"] = "",
@@ -32,8 +41,10 @@
-- ["DAMMIT, ROOKIE! GET OFF MY HEAD!"] = "",
-- ["Dangerous Ducklings"] = "",
-- ["Deadweight"] = "",
+-- ["Demolition is fun!"] = "",
-- ["Depleted Kamikaze!"] = "",
-- ["Destroy invaders to score points."] = "",
+-- ["Double Kill!"] = "",
-- ["Drone Hunter!"] = "",
-- ["Drowner"] = "",
-- ["Each turn you get 1-3 random weapons"] = "",
@@ -42,8 +53,11 @@
-- ["Eliminate all targets before your time runs out.|You have unlimited ammo for this mission."] = "", --Bazooka, Shotgun, SniperRifle
-- ["Eliminate Poison before the time runs out"] = "",
-- ["Eliminate the Blue Team"] = "",
+-- ["Eliminate the enemy before the time runs out"] = "", -- User_Mission_-_Bamboo_Thicket, User_Mission_-_Newton_and_the_Hammock
+-- ["Eliminate the enemy hogs to win."] = "",
-- ["Eliminate the enemy specialists."] = "",
-- ["- Eliminate Unit 3378 |- Feeble Resistance must survive"] = "",
+-- ["Energetic Engineer"] = "",
-- ["Enjoy the swim..."] = "",
-- ["[Enter]"] = "",
-- ["Fastest lap: "] = "",
@@ -53,6 +67,9 @@
-- ["Flag respawned!"] = "",
-- ["Flag returned!"] = "",
-- ["Flags, and their home base will be placed where each team ends their first turn."] = "",
+-- ["Flamer"] = "",
+-- ["Friendly Fire!"] = "",
+-- ["fuel extended!"] = "",
-- ["GAME BEGUN!!!"] = "",
-- ["Game Modifiers: "] = "",
-- ["GAME OVER!"] = "",
@@ -62,11 +79,15 @@
-- ["GO! GO! GO!"] = "",
-- ["Good birdy......"] = "",
-- ["Good luck out there!"] = "",
+-- ["Good so far!"] = "",
+-- ["Good to go!"] = "",
-- ["GOTCHA!"] = "",
+-- ["Grab Mines/Explosives"] = "",
-- ["Hahahaha!"] = "",
-- ["Haha, now THAT would be something!"] = "",
-- ["Hapless Hogs"] = "",
-- [" Hapless Hogs left!"] = "",
+-- ["Health crates extend your time."] = "",
-- ["Heavy"] = "",
-- ["Hedgewars-Basketball"] = "",
-- ["Hedgewars-Knockball"] = "",
@@ -80,9 +101,15 @@
-- ["It's a good thing SUDDEN DEATH is 99 turns away..."] = "",
-- ["Jumping is disabled"] = "",
-- ["Kamikaze Expert!"] = "",
+-- ["Keep it up!"] = "",
+-- ["Killing spree!"] = "",
-- ["KILLS"] = "",
+-- ["Last Target!"] = "",
-- ["[Left Shift]"] = "",
-- ["Listen up, maggot!!"] = "",
+-- ["Lively Lifeguard"] = "",
+-- ["Mine Deployer"] = "",
+-- ["Mine Eater!"] = "",
-- ["|- Mines Time:"] = "", -- User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork
-- ["MISSION FAILED"] = "", -- User_Mission_-_Dangerous_Ducklings, User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork
-- ["MISSION SUCCESS"] = "",
@@ -90,9 +117,12 @@
-- ["Movement: [Up], [Down], [Left], [Right]"] = "",
-- ["Multi-shot!"] = "",
-- ["Nameless Heroes"] = "",
+-- ["New Barrels Per Turn"] = "",
-- ["NEW CLAN RECORD: "] = "",
-- ["NEW fastest lap: "] = "",
+-- ["New Mines Per Turn"] = "",
-- ["NEW RACE RECORD: "] = "",
+-- ["Newton's Hammock"] = "",
-- ["NOT ENOUGH WAYPOINTS"] = "",
-- ["Not So Friendly Match"] = "", -- Basketball, Knockball
-- ["Oh no! Just try again!"] = "", -- User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork
@@ -100,15 +130,21 @@
-- ["Operation Diver"] = "",
-- ["Opposing Team: "] = "",
-- ["Pathetic Hog #%d"] = "",
+-- ["Pathetic Resistance"] = "", -- User_Mission_-_Bamboo_Thicket, User_Mission_-_Newton_and_the_Hammock
-- ["Per-Hog Ammo"] = "",
-- ["Place more waypoints using [ENTER]"] = "",
+-- ["Place more waypoints using the 'Air Attack' weapon."] = "",
-- ["points"] = "", -- Control, CTF_Blizzard, Basic_Training_-_Bazooka, Basic_Training_-_Shotgun, Basic_Training_-_Sniper_Rifle
-- ["Poison"] = "",
-- ["Power Remaining"] = "",
+-- ["Prepare yourself"] = "",
-- ["Press [Precise] to skip intro"] = "",
-- ["Race complexity limit reached."] = "",
+-- ["RACER"] = "",
-- [" - Return the enemy flag to your base to score | - First team to 3 captures wins | - You may only score when your flag is in your base | - Hogs will drop the flag if killed, or drowned | - Dropped flags may be returned or recaptured | - Hogs respawn when killed"] = "",
+-- ["Round Limit:"] = "",
-- ["Round Limit"] = "",
+-- ["Rounds Complete: "] = "",
-- ["Rounds Complete"] = "",
-- ["RULES OF THE GAME [Press ESC to view]"] = "",
-- ["s|"] = "",
@@ -116,6 +152,7 @@
-- ["SCORE"] = "",
-- ["sec"] = "", -- CTF_Blizzard, TrophyRace, Basic_Training_-_Bazooka, Basic_Training_-_Shotgun, Basic_Training_-_Sniper_Rifle, User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork, Capture_the_Flag
-- ["See ya!"] = "",
+-- ["selected!"] = "",
-- ["s"] = "", -- GaudyRacer, Space_Invasion
-- ["Shield boosted! +30 power"] = "",
-- ["Shield Depleted"] = "",
@@ -127,7 +164,7 @@
-- ["Shield Seeker!"] = "",
-- ["Shotgun Team"] = "",
-- ["Shotgun Training"] = "",
--- ["Shots Left: "] = "", -- GaudyRacer, Tumbler
+-- ["shots remaining."] = "",
-- ["Silly"] = "",
-- ["Sinky"] = "",
-- ["%s is out and Team %d|scored a penalty!| |Score:"] = "", -- Basketball, Knockball
@@ -146,26 +183,33 @@
-- ["The flag will respawn next round."] = "",
-- ["The Nameless One"] = "",
-- ["THE SPECIALISTS"] = "",
+-- ["This one's tricky."] = "",
-- ["This rain is really something..."] = "",
-- ["TIME: "] = "",
-- ["Timed Kamikaze!"] = "",
-- ["Time Extended!"] = "",
--- ["Time Left: "] = "",
+-- ["Time Extension"] = "",
-- ["Toggle Shield"] = "",
-- ["Toxic Team"] = "", -- User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork
-- ["TRACK COMPLETED"] = "",
--- ["Track Time: "] = "",
+-- ["TRACK FAILED!"] = "",
-- ["TrophyRace"] = "",
-- ["T_T"] = "",
+-- ["Tumbling Time Extended!"] = "",
-- ["Turn Time"] = "",
+-- ["Unit"] = "",
-- ["Unit 3378"] = "",
+-- ["Unit 835"] = "",
-- ["Unlimited Attacks"] = "",
+-- ["Unstoppable!"] = "",
-- ["User Challenge"] = "",
-- ["Use your rope to get from start to finish as fast as you can!"] = "",
--- ["v.06"] = "",
-- ["Victory for the "] = "", -- CTF_Blizzard, Capture_the_Flag
-- ["Waypoint placed."] = "",
+-- ["Way-Points Remaining"] = "",
-- ["Weapons Reset"] = "",
+-- ["Well done."] = "",
+-- ["Will this ever end?"] = "",
-- ["WINNING TIME: "] = "",
-- ["You'd almost swear the water was rising!"] = "",
-- ["You have SCORED!!"] = "",
--- a/share/hedgewars/Data/Locale/lt.lua Wed Sep 14 22:27:22 2011 +0200
+++ b/share/hedgewars/Data/Locale/lt.lua Wed Sep 14 22:39:39 2011 +0200
@@ -3,12 +3,19 @@
["!!!"] = "!!!",
["..."] = "...",
["Accuracy Bonus!"] = "Taiklumo Bonusas!",
+-- ["Achievement Unlocked"] = "", -- User_Mission_-_Bamboo_Thicket, User_Mission_-_That_Sinking_Feeling, Tumbler
["a Hedgewars mini-game"] = "Eþiu karu mini þaidimas", -- Space_Invasion, The_Specialists
["Aiming Practice"] = "Taiklumo Treniruotë", --Bazooka, Shotgun, SniperRifle
+ ["Ammo Depleted!"] = "Nusodrintojo Kulkos!",
+-- ["ammo extended!"] = "",
+-- ["Ammo is reset at the end of your turn."] = "",
["Ammo"] = "Kulkos",
- ["Ammo Depleted!"] = "Nusodrintojo Kulkos!",
["Ammo Maniac!"] = "Kulku Maniakas!",
["Available points remaining: "] = "Pajamumu taðku liko: ",
+-- ["[Backspace]"] = "",
+-- ["Bamboo Thicket"] = "",
+-- ["Barrel Eater!"] = "",
+-- ["Barrel Launcher"] = "",
["Bat balls at your enemies and|push them into the sea!"] = "Dauþk is kamuoliu i savo prieðus|ir nustumk juos i jûra!",
["Bat your opponents through the|baskets and out of the map!"] = "Dauþk savo obonentus pro kaðes|ir ið þemëlapio!",
["Bazooka Training"] = "Bazukos Treniruotë",
@@ -19,8 +26,10 @@
["BOOM!"] = "BOOM!",
["Boss defeated!"] = "Bosas Nugalëtas!",
["Boss Slayer!"] = "Bosu Þudikas!",
+-- ["Build a track and race."] = "",
["CAPTURE THE FLAG"] = "Pagriebk Vëliava",
["Careless"] = "Neatsargus",
+-- ["Change Weapon"] = "",
["Clumsy"] = "Durnelis",
["Codename: Teamwork"] = "Kodas: Komandinis Darbas",
["Complete the track as fast as you can!"] = "Apvaryk trasa taip greitai kaip gali!",
@@ -28,12 +37,14 @@
["Congratulations! You've eliminated all targets|within the allowed time frame."] = "Sveikinu! Tu pradanginai visus taikinius|per leista laika.", --Bazooka, Shotgun, SniperRifle
["Control pillars to score points."] = "Valdyk stulpus ir gausi taðku.",
["Cybernetic Empire"] = "Kibernetinë Karalystë",
+ ["DAMMIT, ROOKIE! GET OFF MY HEAD!"] = "PO VELNIU EILINI NULIPK MAN NUO GALVOS!",
["DAMMIT, ROOKIE!"] = "PO VELNIU EILINI!",
- ["DAMMIT, ROOKIE! GET OFF MY HEAD!"] = "PO VELNIU EILINI NULIPK MAN NUO GALVOS!",
["Dangerous Ducklings"] = "Pavojingos Antis",
["Deadweight"] = "Dedveitas",
+-- ["Demolition is fun!"] = "",
["Depleted Kamikaze!"] = "Nusodrintojo Kamikaze!",
["Destroy invaders to score points."] = "Sunaikink Isiverþëjus Ir Gauk Taðku.",
+-- ["Double Kill!"] = "",
["Drone Hunter!"] = "Drone Medþiotojas!",
["Drowner"] = "Skendëjas",
["Each turn you get 1-3 random weapons"] = "Kekviena Eile Gausi 1-3 Atsitiktiniu Ginklu",
@@ -42,8 +53,11 @@
["Eliminate all targets before your time runs out.|You have unlimited ammo for this mission."] = "Sunaikink Visus taikinius kol neiðseko laikas.|Ðitai misijai gausi nesibaigianèiu kulku.", --Bazooka, Shotgun, SniperRifle
["Eliminate Poison before the time runs out"] = "Sunaikink Nuodus kol nepasibaigë laikas",
["Eliminate the Blue Team"] = "Sunaikink Mëlyna komanda",
+-- ["Eliminate the enemy before the time runs out"] = "", -- User_Mission_-_Bamboo_Thicket, User_Mission_-_Newton_and_the_Hammock
+-- ["Eliminate the enemy hogs to win."] = "",
["Eliminate the enemy specialists."] = "Sunaikink prieðus specialistus.",
["- Eliminate Unit 3378 |- Feeble Resistance must survive"] = "- Sunaikink Tipa 3378 |- Silpnaus atsparumo tvirtovë turi iðlikti",
+-- ["Energetic Engineer"] = "",
["Enjoy the swim..."] = "Pasimëgauk Rlaukimu...",
["[Enter]"] = "[ENTER"],
["Fastest lap: "] = "Greièiausias Ratas: ",
@@ -53,6 +67,9 @@
["Flag respawned!"] = "Vëliava Atsigavo!",
["Flag returned!"] = "Vëliava Sugraþinta!",
["Flags, and their home base will be placed where each team ends their first turn."] = "Vëliavos, Ir Ju Bazës Bus Padëtos Kur Kekviena Komanda Pabaigs Ëjima.",
+-- ["Flamer"] = "",
+-- ["Friendly Fire!"] = "",
+-- ["fuel extended!"] = "",
["GAME BEGUN!!!"] = "Þaidimas Prasidëjo!!!",
["Game Modifiers: "] = "Þaidimo Modifikatoriai: ",
["GAME OVER!"] = "Þaidimas Baigtas!",
@@ -62,11 +79,15 @@
["GO! GO! GO!"] = "Bëk! Bëk! Bëk!",
["Good birdy......"] = "Geras Paukðtelis......",
["Good luck out there!"] = "Sëkmës Tau Ten!",
+-- ["Good so far!"] = "",
+-- ["Good to go!"] = "",
["GOTCHA!"] = "Prigavau!",
+-- ["Grab Mines/Explosives"] = "",
["Hahahaha!"] = "Hahahaha!",
["Haha, now THAT would be something!"] = "Haha, na tai jau butu kaþkas!",
+ [" Hapless Hogs left!"] = " Nelaimingu Eþiu Liko!",
["Hapless Hogs"] = "Nelaimingi Eþiai",
- [" Hapless Hogs left!"] = " Nelaimingu Eþiu Liko!",
+-- ["Health crates extend your time."] = "",
["Heavy"] = "Sunku",
["Hedgewars-Basketball"] = "Eþiukaru-Krepðinis",
["Hedgewars-Knockball"] = "Eþiukaru-Trenktaskamuolys",
@@ -80,19 +101,28 @@
["It's a good thing SUDDEN DEATH is 99 turns away..."] = "Geras dalykas kad MARAS dar po 99 eiliu...",
["Jumping is disabled"] = "Ðokimas ira iðjungtas",
["Kamikaze Expert!"] = "Kamikazes Ekspertas!",
+-- ["Keep it up!"] = "",
+-- ["Killing spree!"] = "",
["KILLS"] = "Nuþudymai",
+-- ["Last Target!"] = "",
["[Left Shift]"] = "[Kairis Shiftas"],
["Listen up, maggot!!"] = "Paklausyk eilini!!",
+-- ["Lively Lifeguard"] = "",
+-- ["Mine Deployer"] = "",
+-- ["Mine Eater!"] = "",
["|- Mines Time:"] = "|- Minu Laikas:", -- User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork
["MISSION FAILED"] = "Misija Nepavyko", -- User_Mission_-_Dangerous_Ducklings, User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork
+ ["MISSION SUCCESSFUL"] = "Misija Buvo Ivykdita", -- User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork
["MISSION SUCCESS"] = "Misija Pavyko",
- ["MISSION SUCCESSFUL"] = "Misija Buvo Ivykdita", -- User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork
["Movement: [Up], [Down], [Left], [Right]"] = "Judëjimas: [I Virðu, [I Apaèia], [I Kaire], [I Deðine]"],
["Multi-shot!"] = "Dvigubas-Ðuvis!",
["Nameless Heroes"] = "Bevardþiai Herojiai",
+-- ["New Barrels Per Turn"] = "",
["NEW CLAN RECORD: "] = "Naujas Klano Rekordas: ",
["NEW fastest lap: "] = "Naujas Greièiausias Ratas: ",
+-- ["New Mines Per Turn"] = "",
["NEW RACE RECORD: "] = "Naujas Lenktyniu Rekordas: ",
+-- ["Newton's Hammock"] = "",
["NOT ENOUGH WAYPOINTS"] = "Neuþtenka Kelio Taðku",
["Not So Friendly Match"] = "Ne Toks Jau Ir Draugiðkas Turnyras", -- Basketball, Knockball
["Oh no! Just try again!"] = "O NE! Tiesiog Bandyk Vël", -- User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork
@@ -100,23 +130,28 @@
["Operation Diver"] = "Operacijos Vairuotojas",
["Opposing Team: "] = "Pasiprieðinanti Komanda: ",
["Pathetic Hog #%d"] = "Niekam Tikes Eþys #%d",
+-- ["Pathetic Resistance"] = "", -- User_Mission_-_Bamboo_Thicket, User_Mission_-_Newton_and_the_Hammock
["Per-Hog Ammo"] = "Kulkos Per-Eþy",
["Place more waypoints using [ENTER]"] = "Padëk Daugiau Kelio Taðku Su [ENTER"],
+-- ["Place more waypoints using the 'Air Attack' weapon."] = "",
["points"] = "taðkai", -- Control, CTF_Blizzard, Basic_Training_-_Bazooka, Basic_Training_-_Shotgun, Basic_Training_-_Sniper_Rifle
["Poison"] = "Nuodai",
["Power Remaining"] = "Jëgos Liko",
+-- ["Prepare yourself"] = "",
["Press [Precise] to skip intro"] = "Spausk [TaikluNusitaikima kad baigtum iëjima"],
["Race complexity limit reached."] = "Lenktyniu Sudëtingumo Limitas Pasiektas.",
+-- ["RACER"] = "",
[" - Return the enemy flag to your base to score | - First team to 3 captures wins | - You may only score when your flag is in your base | - Hogs will drop the flag if killed, or drowned | - Dropped flags may be returned or recaptured | - Hogs respawn when killed"] = " - Graþink prieðu vëliava i savo baze ir gausi taðku | - Pirma komanda su 3 vëliavom laimi | - Taðkus gausi tik tada kaip tavo vëliava bazëje | - Eþiai pames vëliava jeigu mirs, arba paskes | - Pamestos vëliavos gali buti graþintos arba pavogtos | - Eþiai atsikelia kaip nuþudyti",
+-- ["Round Limit:"] = "",
["Round Limit"] = "Raundu Limitas",
+-- ["Rounds Complete: "] = "",
["Rounds Complete"] = "Raundai Ivykditi",
["RULES OF THE GAME [Press ESC to view]"] = "ÞAIDIMO TAISYKLES [Spausk ESC Kad Parodytu"],
- ["s|"] = "s|",
["Save as many hapless hogs as possible!"] = "Iðgelbëk kuo daugiau nelaimingu eþiu!",
["SCORE"] = "Taðkai",
["sec"] = "sek", -- CTF_Blizzard, TrophyRace, Basic_Training_-_Bazooka, Basic_Training_-_Shotgun, Basic_Training_-_Sniper_Rifle, User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork, Capture_the_Flag
["See ya!"] = "Iki!",
- ["s"] = "s", -- GaudyRacer, Space_Invasion
+-- ["selected!"] = "",
["Shield boosted! +30 power"] = "Skydas Pagerintas! +30 jëga",
["Shield Depleted"] = "Skydas Nusodrintas",
["Shield is fully recharged!"] = "Skydas Pilnai Pakrautas!",
@@ -127,7 +162,7 @@
["Shield Seeker!"] = "Skydo Ieðkotojas!",
["Shotgun Team"] = "Ðratinio Ðautuvo Komanda",
["Shotgun Training"] = "Ðratinio Ðautuvo Treniruotë",
- ["Shots Left: "] = "Liko Ðuviu: ", -- GaudyRacer, Tumbler
+-- ["shots remaining."] = "",
["Silly"] = "Durnelis",
["Sinky"] = "Paskenduolis",
["%s is out and Team %d|scored a penalty!| |Score:"] = "%s Iðkrito ir komanda %d|gavo bausme!| |Score:", -- Basketball, Knockball
@@ -136,6 +171,8 @@
["Sniperz"] = "Snaiperiai",
["Sponge"] = "Kempinë",
["Spooky Tree"] = "Baisusis Medis",
+ ["s|"] = "s|",
+ ["s"] = "s", -- GaudyRacer, Space_Invasion
["STATUS UPDATE"] = "Bûsenos Atnaujinimas", -- GaudyRacer, Space_Invasion
["Switched to "] = "Pakeistas i ",
["Team %d: "] = "Komanda %d: ",
@@ -146,26 +183,33 @@
["The flag will respawn next round."] = "Vëliava atsigaus kita raunda.",
["The Nameless One"] = "Bevardis",
["THE SPECIALISTS"] = "Specialistai",
+-- ["This one's tricky."] = "",
["This rain is really something..."] = "Ðis lietus tikrai kaþkas...",
- ["TIME: "] = "Laikas: ",
["Timed Kamikaze!"] = "Laikina Kamikaze!",
["Time Extended!"] = "Laikas Prailgintas!",
- ["Time Left: "] = "Liko Laiko: ",
+-- ["Time Extension"] = "",
+ ["TIME: "] = "Laikas: ",
["Toggle Shield"] = "Perjungti i skyda",
["Toxic Team"] = "Toksinë Komanda", -- User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork
["TRACK COMPLETED"] = "Trasa Ivykdita",
- ["Track Time: "] = "Trasos Laikas: ",
+-- ["TRACK FAILED!"] = "",
["TrophyRace"] = "Trophëju Trasa",
["T_T"] = "T_T",
+-- ["Tumbling Time Extended!"] = "",
["Turn Time"] = "Eilës Laikas",
+-- ["Unit"] = "",
["Unit 3378"] = "Tipas 3378",
+-- ["Unit 835"] = "",
["Unlimited Attacks"] = "Nesibaigianèios Atakos",
+-- ["Unstoppable!"] = "",
["User Challenge"] = "Vartotojo Iðukis",
["Use your rope to get from start to finish as fast as you can!"] = "Naudok virve kad nusigautum nuo starto iki finiðo taip greitai kaip gali!",
- ["v.06"] = "v.06",
["Victory for the "] = "Pergalë ", -- CTF_Blizzard, Capture_the_Flag
["Waypoint placed."] = "Kelio Taðkas Pasiektas.",
+-- ["Way-Points Remaining"] = "",
["Weapons Reset"] = "Ginklai Atgaivinti",
+-- ["Well done."] = "",
+-- ["Will this ever end?"] = "",
["WINNING TIME: "] = "Laimëjimo Laikas: ",
["You'd almost swear the water was rising!"] = "Galima pamanyti kad vanduo tikrai kyla!",
["You have SCORED!!"] = "Tu gavai TAÐKU!!",
@@ -173,4 +217,4 @@
["You've failed. Try again."] = "Tau nepavyko. Bandyk vël.",
["You've reached the goal!| |Time: "] = "Tu pasiekiai taikini!| |Laikas: ",
["'Zooka Team"] = "'Zukos Komanda",
- }
+ }
--- a/share/hedgewars/Data/Locale/pl.lua Wed Sep 14 22:27:22 2011 +0200
+++ b/share/hedgewars/Data/Locale/pl.lua Wed Sep 14 22:39:39 2011 +0200
@@ -1,29 +1,38 @@
locale = {
[":("] = ":(",
["!!!"] = "!!!",
--- ["..."] = "",
--- ["Accuracy Bonus!"] = "",
--- ["a Hedgewars mini-game"] = "", -- Space_Invasion, The_Specialists
+ ["..."] = "...",
+ ["Accuracy Bonus!"] = "Bonus za celność",
+-- ["Achievement Unlocked"] = "", -- User_Mission_-_Bamboo_Thicket, User_Mission_-_That_Sinking_Feeling, Tumbler
+ ["a Hedgewars mini-game"] = "Mini gra", -- Space_Invasion, The_Specialists
["Aiming Practice"] = "Potrenuj celność",
--- ["Ammo"] = "",
--- ["Ammo Depleted!"] = "",
--- ["Ammo Maniac!"] = "",
--- ["Available points remaining: "] = "",
+ ["Ammo"] = "Amunicja",
+ ["Ammo Depleted!"] = "Koniec amunicji!",
+-- ["ammo extended!"] = "",
+-- ["Ammo is reset at the end of your turn."] = "",
+ ["Ammo Maniac!"] = "Nabojowy Maniak!",
+ ["Available points remaining: "] = "Pozostały następujące punkty: ",
+-- ["[Backspace]"] = "",
+-- ["Bamboo Thicket"] = "",
+-- ["Barrel Eater!"] = "",
+-- ["Barrel Launcher"] = "",
["Bat balls at your enemies and|push them into the sea!"] = "Uderzaj piłkami w swoich przeciwników|i strącaj ich do wody!",
["Bat your opponents through the|baskets and out of the map!"] = "Uderzaj swoich przekiwników|wyrzucając przez kosz, poza mapę!",
["Bazooka Training"] = "Trening bazooki",
["Best laps per team: "] = "Najszybsze okrążenie drużyny: ",
--- ["Best Team Times: "] = "",
+ ["Best Team Times: "] = "Najlepszy czas zespołów",
["Bloody Rookies"] = "Żółtodzioby",
--- ["BOOM!"] = "",
["Boom!"] = "BUM!",
--- ["Boss defeated!"] = "",
--- ["Boss Slayer!"] = "",
+ ["BOOM!"] = "BUM!",
+ ["Boss defeated!"] = "Boss pokonany!",
+ ["Boss Slayer!"] = "Pogromca bossów",
+-- ["Build a track and race."] = "",
["CAPTURE THE FLAG"] = "PRZECHWYĆ FLAGĘ",
--- ["Careless"] = "",
--- ["Clumsy"] = "",
+ ["Careless"] = "Nieostrożny",
+-- ["Change Weapon"] = "",
+ ["Clumsy"] = "Fajtłapa",
["Codename: Teamwork"] = "Kryptonim: Praca zespołowa",
--- ["Complete the track as fast as you can!"] = "",
+ ["Complete the track as fast as you can!"] = "Ukończ trasę tak szybko jak tylko potrafisz!",
["Congratulations!"] = "Gratulacje",
["Congratulations! You've eliminated all targets|within the allowed time frame."] = "Gratulacje! Zniszczyłeś wszystkie cele przed upłynięciem czasu.",
["Control pillars to score points."] = "Kontroluj filary by zdobyć punkty",
@@ -32,144 +41,179 @@
["DAMMIT, ROOKIE!"] = "Żółtodziobie!",
["Dangerous Ducklings"] = "Niebezpieczne Kaczory",
-- ["Deadweight"] = "",
+-- ["Demolition is fun!"] = "",
-- ["Depleted Kamikaze!"] = "",
--- ["Destroy invaders to score points."] = "",
--- ["Drone Hunter!"] = "",
+ ["Destroy invaders to score points."] = "Zabijaj najeźdźców by zdobyć punkty.",
+-- ["Double Kill!"] = "",
+ ["Drone Hunter!"] = "Łowca dronów",
-- ["Drowner"] = "",
--- ["Each turn you get 1-3 random weapons"] = "",
--- ["Each turn you get one random weapon"] = "",
+ ["Each turn you get 1-3 random weapons"] = "Z każdą turą dostaniesz 1-3 bronie",
+ ["Each turn you get one random weapon"] = "Z każdą turą dostaniesz losową broń",
["Eliminate all enemies"] = "Wyeliminuj wszystkich przeciwników",
["Eliminate all targets before your time runs out.|You have unlimited ammo for this mission."] = "Zniszcz wszystkie cele zanim upłynie czas.|W tej misji masz nieskończoną ilość amunicji.",
["Eliminate Poison before the time runs out"] = "Zabij Truciciela zanim skończy się czas",
["Eliminate the Blue Team"] = "Zniszcz niebieską drużynę",
--- ["Eliminate the enemy specialists."] = "",
- ["- Eliminate Unit 3378 |- Feeble Resistance must survive"] = "Rozwal Jednostkę 3378 | Twoja drużyna musi przetrwać",
+-- ["Eliminate the enemy before the time runs out"] = "", -- User_Mission_-_Bamboo_Thicket, User_Mission_-_Newton_and_the_Hammock
+-- ["Eliminate the enemy hogs to win."] = "",
+ ["Eliminate the enemy specialists."] = "Weliminuj specjalistów wroga.",
+ ["- Eliminate Unit 3378 |- Feeble Resistance must survive"] = "- Rozwal Jednostkę 3378 |- Twoja drużyna musi przetrwać",
+-- ["Energetic Engineer"] = "",
["Enjoy the swim..."] = "Popływaj trochę...",
--- ["[Enter]"] = "",
+ ["[Enter]"] = "[Enter]",
["Fastest lap: "] = "Najszybsze okrążenie: ",
["Feeble Resistance"] = "Ruch Oporu",
--- ["Fire"] = "",
+ ["Fire"] = "Ogień",
["Flag captured!"] = "Flaga przechwycona!",
["Flag respawned!"] = "Flaga przywrócona!",
["Flag returned!"] = "Flaga odzyskana!",
--- ["Flags, and their home base will be placed where each team ends their first turn."] = "",
--- ["GAME BEGUN!!!"] = "",
--- ["Game Modifiers: "] = "",
+ ["Flags, and their home base will be placed where each team ends their first turn."] = "Flagi i baza zostaną umieszzcone tam gdzie zespół zakończy swą pierwszą turę.",
+-- ["Flamer"] = "",
+-- ["Friendly Fire!"] = "",
+-- ["fuel extended!"] = "",
+ ["GAME BEGUN!!!"] = "GRA ROZPOCZĘTA!!!",
+ ["Game Modifiers: "] = "Modyfikatory: ",
["GAME OVER!"] = "KONIEC GRY!",
["Game Started!"] = "Gra Rozpoczęta",
["Get on over there and take him out!"] = "Dostań się tam i go wykończ!",
--- ["Goal"] = "",
+ ["Goal"] = "Gol",
["GO! GO! GO!"] = "RUCHY! RUCHY! RUCHY!",
["Good birdy......"] = "Dooobry ptaszek...",
["Good luck out there!"] = "Powodzenia!",
--- ["GOTCHA!"] = "",
--- ["Hahahaha!"] = "",
--- ["Haha, now THAT would be something!"] = "",
--- ["Hapless Hogs"] = "",
--- [" Hapless Hogs left!"] = "",
+-- ["Good so far!"] = "",
+-- ["Good to go!"] = "",
+ ["GOTCHA!"] = "MAM CIĘ!",
+-- ["Grab Mines/Explosives"] = "",
+ ["Hahahaha!"] = "Hahahaha!",
+ ["Haha, now THAT would be something!"] = "Haha, to było by COŚ",
+ [" Hapless Hogs left!"] = " Nieszczęsne Jeże pozostały",
+ ["Hapless Hogs"] = "Nieszczęsne Jeże",
+-- ["Health crates extend your time."] = "",
-- ["Heavy"] = "",
["Hedgewars-Basketball"] = "Hedgewars-Koszykówka",
["Hedgewars-Knockball"] = "Hedgewars-Knockball",
--- ["Heh, it's not that bad."] = "",
--- ["Hit Combo!"] = "",
+ ["Heh, it's not that bad."] = "Heh, nie jest aż tak źle.",
+ ["Hit Combo!"] = "Combo!",
["Hmmm..."] = "Hmmmm...",
["Hooray!"] = "Hurraaa!",
["Hunter"] = "Strzelec",
["Instructor"] = "Instruktor",
--- ["invaders destroyed"] = "",
--- ["It's a good thing SUDDEN DEATH is 99 turns away..."] = "",
--- ["Jumping is disabled"] = "",
+ ["invaders destroyed"] = "najeźdzców zniszczonych",
+ ["It's a good thing SUDDEN DEATH is 99 turns away..."] = "Jak to dobrze, że Nagła Śmierć jest dopiero za 99 tur...",
+ ["Jumping is disabled"] = "Skakanie jest niemożliwe",
-- ["Kamikaze Expert!"] = "",
--- ["KILLS"] = "",
--- ["[Left Shift]"] = "",
+-- ["Keep it up!"] = "",
+-- ["Killing spree!"] = "",
+ ["KILLS"] = "Zabicia",
+-- ["Last Target!"] = "",
+ ["[Left Shift]"] = "[Lewy Shift]",
["Listen up, maggot!!"] = "Słuchaj mnie, gnido!",
+-- ["Lively Lifeguard"] = "",
+-- ["Mine Deployer"] = "",
+-- ["Mine Eater!"] = "",
["|- Mines Time:"] = "|- Czas detonacji min:",
["MISSION FAILED"] = "MISJA ZAKOŃCZONA NIEPOWODZENIEM",
--- ["MISSION SUCCESS"] = "",
["MISSION SUCCESSFUL"] = "MISJA POWIODŁA SIĘ",
--- ["Movement: [Up], [Down], [Left], [Right]"] = "",
--- ["Multi-shot!"] = "",
--- ["Nameless Heroes"] = "",
--- ["NEW CLAN RECORD: "] = "",
+ ["MISSION SUCCESS"] = "MISJA ZAKOŃCZONA SUKCESEM",
+ ["Movement: [Up], [Down], [Left], [Right]"] = "Poruszanie się: [Góra], [Dół], [Lewo], [Prawo]",
+ ["Multi-shot!"] = "Wielokrotny strzał",
+ ["Nameless Heroes"] = "Bezimienni Bohaterowie",
+-- ["New Barrels Per Turn"] = "",
+ ["NEW CLAN RECORD: "] = "NOWY REKORD ZESPOŁU: ",
["NEW fastest lap: "] = "NOWE najszybsze okrążenie: ",
--- ["NEW RACE RECORD: "] = "",
--- ["NOT ENOUGH WAYPOINTS"] = "",
+-- ["New Mines Per Turn"] = "",
+ ["NEW RACE RECORD: "] = "NOWY REKORD WYŚCIGU: ",
+-- ["Newton's Hammock"] = "",
+ ["NOT ENOUGH WAYPOINTS"] = "BRAK PUNKTÓW ORIENTACYJNYCH",
["Not So Friendly Match"] = "Mecz Nie-Do-Końca Towarzyski",
["Oh no! Just try again!"] = "Ojojoj! Spróbuj jeszcze raz!",
["Oh no! Time's up! Just try again."] = "Ajajaj! Koniec czasu! Spróbuj jeszcze raz.",
["Operation Diver"] = "Operacja Nurek",
["Opposing Team: "] = "Przeciwna drużyna",
["Pathetic Hog #%d"] = "Załosny Jeż #%d",
--- ["Per-Hog Ammo"] = "",
--- ["Place more waypoints using [ENTER]"] = "",
--- ["points"] = "", -- Control, CTF_Blizzard, Basic_Training_-_Bazooka, Basic_Training_-_Shotgun, Basic_Training_-_Sniper_Rifle
+-- ["Pathetic Resistance"] = "", -- User_Mission_-_Bamboo_Thicket, User_Mission_-_Newton_and_the_Hammock
+ ["Per-Hog Ammo"] = "Oddzielna amunicja dla jeży",
+ ["Place more waypoints using [ENTER]"] = "Postaw więcej punktów orientacyjnych za pomocą [Entera]",
+-- ["Place more waypoints using the 'Air Attack' weapon."] = "",
+ ["points"] = "punkty", -- Control, CTF_Blizzard, Basic_Training_-_Bazooka, Basic_Training_-_Shotgun, Basic_Training_-_Sniper_Rifle
["Poison"] = "Truciciel",
--- ["Power Remaining"] = "",
--- ["Press [Precise] to skip intro"] = "",
+ ["Power Remaining"] = "pkt. energii pozostało",
+-- ["Prepare yourself"] = "",
+ ["Press [Precise] to skip intro"] = "Naciśnij [Precyzyjne celowanie] by pominąć intro",
-- ["Race complexity limit reached."] = "",
+-- ["RACER"] = "",
[" - Return the enemy flag to your base to score | - First team to 3 captures wins | - You may only score when your flag is in your base | - Hogs will drop the flag if killed, or drowned | - Dropped flags may be returned or recaptured | - Hogs respawn when killed"] = " - Przynieś flagę wroga do swojej bazy by zdobyć punkt | - Pierwszy kto zrobi to 3 razy, wygrywa | - Punkt zdobywasz tylko gdy twoja flaga znajduje się w bazie | - Jeże upuszczą flagę gdy zostaną zabite bądź utopione | - Upuszczona flaga może być przywrócona lub przechwycona ponownie | - Jeże odradzają się po śmierci",
--- ["Round Limit"] = "",
--- ["Rounds Complete"] = "",
+-- ["Round Limit:"] = "",
+ ["Round Limit"] = "Ilość rund",
+-- ["Rounds Complete: "] = "",
+ ["Rounds Complete"] = "Koniec",
["RULES OF THE GAME [Press ESC to view]"] = "ZASADY GRY [Naciśnij ESC by zobaczyć]",
--- ["s|"] = "",
--- ["Save as many hapless hogs as possible!"] = "",
--- ["SCORE"] = "",
+ ["Save as many hapless hogs as possible!"] = "Uratuj jak najwięcej nieszczęsnych jeży",
+ ["SCORE"] = "PUNKTY",
["sec"] = "sek",
["See ya!"] = "Do zobaczenia!",
--- ["s"] = "", -- GaudyRacer, Space_Invasion
--- ["Shield boosted! +30 power"] = "",
--- ["Shield Depleted"] = "",
--- ["Shield is fully recharged!"] = "",
--- ["Shield Master!"] = "",
--- ["Shield Miser!"] = "",
--- ["Shield OFF:"] = "",
--- ["Shield ON:"] = "",
--- ["Shield Seeker!"] = "",
+-- ["selected!"] = "",
+ ["Shield boosted! +30 power"] = "Osłona ulepszona: +30 energii",
+ ["Shield Depleted"] = "Straciłeś Osłonę",
+ ["Shield is fully recharged!"] = "Osłona całkowicie naładowana",
+ ["Shield Master!"] = "Mistrz Osłony!",
+ ["Shield Miser!"] = "Osłonowy skąpiec!",
+ ["Shield OFF:"] = "Osłona WYŁĄCZONA:",
+ ["Shield ON:"] = "Osłona WŁĄCZONA:",
+ ["Shield Seeker!"] = "Zdobywca osłon!",
["Shotgun Team"] = "Strzelcy",
["Shotgun Training"] = "Trening strzelecki",
--- ["Shots Left: "] = "", -- GaudyRacer, Tumbler
--- ["Silly"] = "",
+-- ["shots remaining."] = "",
+ ["Silly"] = "Głuptas",
-- ["Sinky"] = "",
["%s is out and Team %d|scored a penalty!| |Score:"] = "%s utonął i drużyna %d|dostała punkt karny!| |Punktacja:",
["%s is out and Team %d|scored a point!| |Score:"] = "%s utonął i drużyna %d|zdobyła punkt!| |Punktacja:",
["Sniper Training"] = "Trening Snajperski",
["Sniperz"] = "Snajperzy",
--- ["Sponge"] = "",
+ ["Sponge"] = "Gąbka",
["Spooky Tree"] = "Straszne drzewo",
--- ["STATUS UPDATE"] = "", -- GaudyRacer, Space_Invasion
--- ["Switched to "] = "",
+ ["s|"] = "s|",
+ ["s"] = "s", -- GaudyRacer, Space_Invasion
+ ["STATUS UPDATE"] = "WYNIKI", -- GaudyRacer, Space_Invasion
+ ["Switched to "] = "Przełączono na ",
["Team %d: "] = "Drużyna %d: ",
--- ["Team Scores"] = "", -- Control, Space_Invasion
+ ["Team Scores"] = "Punktacja(?)", -- Control, Space_Invasion
-- ["That Sinking Feeling"] = "",
["That was pointless."] = "To było bezcelowe",
["The enemy is hiding out on yonder ducky!"] = "Na tamtej kaczce ukrywa się nasz przeciwnik!",
["The flag will respawn next round."] = "Flaga pojawi się ponownie przy następnej rundzie.",
--- ["The Nameless One"] = "",
--- ["THE SPECIALISTS"] = "",
+ ["The Nameless One"] = "Bezimienny",
+ ["THE SPECIALISTS"] = "SPECJALIŚCI",
+-- ["This one's tricky."] = "",
-- ["This rain is really something..."] = "",
--- ["TIME: "] = "",
+ ["TIME: "] = "CZAS: ",
-- ["Timed Kamikaze!"] = "",
--- ["Time Extended!"] = "",
--- ["Time Left: "] = "",
--- ["Toggle Shield"] = "",
+ ["Time Extended!"] = "Dodatkowy Czas!",
+-- ["Time Extension"] = "",
+ ["Toggle Shield"] = "Wł/Wył Osłonę",
["Toxic Team"] = "Toksyczny zespół",
--- ["TRACK COMPLETED"] = "",
--- ["Track Time: "] = "",
+ ["TRACK COMPLETED"] = "UKOŃCZONO TRASĘ",
+-- ["TRACK FAILED!"] = "",
["TrophyRace"] = "TrophyRace",
["T_T"] = "T_T",
--- ["Turn Time"] = "",
+-- ["Tumbling Time Extended!"] = "",
+ ["Turn Time"] = "Długość Tury",
+-- ["Unit"] = "",
["Unit 3378"] = "Jednostka 3378",
+-- ["Unit 835"] = "",
-- ["Unlimited Attacks"] = "",
+-- ["Unstoppable!"] = "",
-- ["User Challenge"] = "",
["Use your rope to get from start to finish as fast as you can!"] = "Użyj liny by jak najszybciej dotrzec od startu do mety",
--- ["v.06"] = "",
["Victory for the "] = "Zwycięstwo przypadło",
--- ["Waypoint placed."] = "",
--- ["Weapons Reset"] = "",
--- ["WINNING TIME: "] = "",
--- ["You'd almost swear the water was rising!"] = "",
+ ["Waypoint placed."] = "Postawiono punkt orientacyjny",
+-- ["Way-Points Remaining"] = "",
+ ["Weapons Reset"] = "Bronie odnawiają się",
+-- ["Well done."] = "",
+-- ["Will this ever end?"] = "",
+ ["WINNING TIME: "] = "ZWYCIĘSKI CZAS: ",
+ ["You'd almost swear the water was rising!"] = "Przysiągłbym, że woda zdaje się podnosić!",
["You have SCORED!!"] = "Zdobyłeś PUNKT",
--- ["You saved"] = "",
+ ["You saved"] = "Uratowałeś",
["You've failed. Try again."] = "Przegrałeś. Spróbuj jeszcze raz",
["You've reached the goal!| |Time: "] = "Dotarłeś do celu!| |Czas: ",
["'Zooka Team"] = "Bazookinierzy",
--- a/share/hedgewars/Data/Locale/pl.txt Wed Sep 14 22:27:22 2011 +0200
+++ b/share/hedgewars/Data/Locale/pl.txt Wed Sep 14 22:39:39 2011 +0200
@@ -52,10 +52,10 @@
00:49=Wskrzeszacz
00:50=Wiertniczy nalot
00:51=Kula błotna
-00:52=Nie wybrano broń
+00:52=Nie wybrano broni
00:53=TARDIS
-00:54=Struktura
-00:55=Land Spray
+00:54=Budynek
+00:55=Miotacz błota
01:00=Walczmy!
01:01=Remis
@@ -72,6 +72,12 @@
01:12=To już ostatnia runda przed Nagłą Śmiercią!
01:13=Zostało %1 rund do Nagłej Śmierci!
01:14=Bądź gotów, %1!
+01:15=Delikatne
+01:16=Słabe
+01:17=Normalne
+01:18=Duże
+01:19=Ekstremalne
+01:20=%1 odbicie
; Event messages
; Hog (%1) died
@@ -469,12 +475,11 @@
02:10=To było odlotowe!
; Hog (%1) has to leave (team is gone)
-02:11=%1 musi iść do łóżka!
-02:11=%1 wydaje się zbyt zajęty, by grać
-02:11=Zostałeś zajęty zamrozić dla jeża, %1
-02:11=Źłe gry przestała, albo nie działa.
-02:11=%1 awaria z gracza
-02:11=Belka go, Szkot!
+02:11=%1 musi iść spać!
+02:11=%1 ma ważniejsze sprawy na głowie
+02:11=Żegnamy Cię, %1
+02:11=KSZSZ, KSZZ. Jest tam ktoś po drugiej stronie?
+02:11=%1 nie ma zamiaru dłużej grać
02:11=%1 musi odejść
; Weapon Categories
@@ -532,7 +537,8 @@
03:51=Znalezione na ziemi
03:52=UNUSED
03:53=Typ 40
-03:54=Zbudować coś
+03:54=Zbuduj coś przydatnego
+03:55=Narzędzie
; Weapon Descriptions (use | as line breaks)
04:00=Atakuj przeciwników zwykłym granatem.|Wybuchnie kiedy zapalnik skończy odliczanie.|1-5: Ustawia zapalnik|Atak: Przytrzymaj by rzucić z większą siłą
@@ -582,9 +588,15 @@
04:44=To nie jest zwykły ser. To broń biologiczna!|Wybuch z pewnością nie będzie potężny, ale gdy|licznik dojdzie do zera, chmura gazu zatruje|każdego nieszczęśnika który będzie w pobliżu|1-5: Ustawia zapalnik|Atak: Przytrzymaj by rzucić z większą siłą
04:45=Wszystkie lekcje fizyki w końcu się opłaciły!|Wystrzel niszczącą sinusoidalną falę|która przechodzi przez teren i uderza|w twoich przeciwników|Uważaj! Ta broń ma kopa!|Atak: Strzelaj
04:46=Pokrywa twoich wrogów ognistą powłoką.|Czy ktoś zamawiał pieczonego jeża?|Atak: Aktywuj|Góra/Dół: Celowanie|Lewo/Prawo: Ustaw prędkość wystrzeliwania
-04:47=Podwójna zabawa z podwójną ilością lepkich min.|Spróbuj wywołać reakcję łańcuchową lub chroń|samego siebie (albo zrób obydwie rzeczy na raz!)|Atak: Przytrzymaj by rzucić z większą siłą (dwa razy)
+04:47=Podwój zabawę z pomocą 2 lepkich min.|Spróbuj wywołać reakcję łańcuchową lub chroń|samego siebie (albo zrób obydwie rzeczy na raz!)|Atak: Przytrzymaj by rzucić z większą siłą (dwa razy)
04:48=Czyż walenie jeży po głowach nie|jest zabawne? Dobre uderzenie|z młotka zabierze 1/3 życia|przeciwnika i wkopie go w podłoże|Atak: Uderz
04:49=Wskrześ swoich przyjaciół!|Jednakże uważaj byś nie pomógł swojemu wrogowi.|Atak: Przytrzymaj by powoli przywracać życie|Góra: Przyspiesz wskrzeszanie
+04:50=Wezwij szwadron śmiercionośnych wierteł|by wykurzyć kogoś z kryjówki. Po użyciu|zostanie zrzuconych 6 wiertniczych bomb|wkręcających się w podłoże|Lewo/Prawo: Określ kierunek ataku|Kursor: Wybierz miejsce zrzutu
+04:51=Obrzuć kogoś błotem! Broń ta nie zadaje dużych|obrażeń ale może gogoś zepchnąć z krawędzi!|Atak: Przytrzymaj by strzelić z większą siłą
+04:52=UNUSED
+04:53=Wybierz się na podróż w czasie i przestrzeni|zostawiając innne jeże na polu walki.|Bądź przygotowany na powrót w dowolnym momencie.|Gdy rozpocznie się|Nagła Śmierć lub większość jeży zostanie wybita.|Uwaga. Nie zadziała podczas Nagłej Śmierci,|gdy jesteś sam, lub jeśli jesteś Królem.
+04:54=INCOMPLETE
+04:55=Wystrzel strumień kleistej mazi.|Buduj mosty, zasypuj wrogów, ztykaj tunele.|Uważaj by nie zasypać samego siebie!
; Game goal strings
05:00=Ustawienia gry
@@ -608,4 +620,4 @@
05:18=Tura nie kończy się po wykonaniu ataku
05:19=Uzbrojenie zostaje przywrócone przy kolejnej turze
05:20=Każdy z jeży ma oddzielne uzbrojenie
-05:21=Zespół Tag: Zespoły w klanie na kolejnych kolejkach|Wspólna Godzina: Drużyny w akcji raz z kolei klanu
+05:21=Zespół: Zespoły w klanie wykonują tury po kolei|Wspólny czas: Czas jest wspólny dla każdej drużyny w zespole
--- a/share/hedgewars/Data/Locale/pt_BR.lua Wed Sep 14 22:27:22 2011 +0200
+++ b/share/hedgewars/Data/Locale/pt_BR.lua Wed Sep 14 22:39:39 2011 +0200
@@ -3,12 +3,19 @@
-- ["!!!"] = "",
-- ["..."] = "",
-- ["Accuracy Bonus!"] = "",
+-- ["Achievement Unlocked"] = "", -- User_Mission_-_Bamboo_Thicket, User_Mission_-_That_Sinking_Feeling, Tumbler
-- ["a Hedgewars mini-game"] = "", -- Space_Invasion, The_Specialists
["Aiming Practice"] = "Pratique a sua pontaria", --Bazooka, Shotgun, SniperRifle
-- ["Ammo"] = "",
-- ["Ammo Depleted!"] = "",
+-- ["ammo extended!"] = "",
+-- ["Ammo is reset at the end of your turn."] = "",
-- ["Ammo Maniac!"] = "",
-- ["Available points remaining: "] = "",
+-- ["[Backspace]"] = "",
+-- ["Bamboo Thicket"] = "",
+-- ["Barrel Eater!"] = "",
+-- ["Barrel Launcher"] = "",
["Bat balls at your enemies and|push them into the sea!"] = "Rebata as bolas em direção ao seus|e derrube-os no mar!",
["Bat your opponents through the|baskets and out of the map!"] = "Rebata seus oponentes para|fora do mapa através dos cestos!",
["Bazooka Training"] = "Treino com a Bazuca",
@@ -19,8 +26,10 @@
-- ["BOOM!"] = "",
-- ["Boss defeated!"] = "",
-- ["Boss Slayer!"] = "",
+-- ["Build a track and race."] = "",
-- ["CAPTURE THE FLAG"] = "",
-- ["Careless"] = "",
+-- ["Change Weapon"] = "",
-- ["Clumsy"] = "",
-- ["Codename: Teamwork"] = "",
-- ["Complete the track as fast as you can!"] = "",
@@ -32,8 +41,10 @@
-- ["DAMMIT, ROOKIE! GET OFF MY HEAD!"] = "",
-- ["Dangerous Ducklings"] = "",
-- ["Deadweight"] = "",
+-- ["Demolition is fun!"] = "",
-- ["Depleted Kamikaze!"] = "",
-- ["Destroy invaders to score points."] = "",
+-- ["Double Kill!"] = "",
-- ["Drone Hunter!"] = "",
-- ["Drowner"] = "",
-- ["Each turn you get 1-3 random weapons"] = "",
@@ -42,8 +53,11 @@
["Eliminate all targets before your time runs out.|You have unlimited ammo for this mission."] = "Destrua todos os alvos antes que o tempo acabe.|Você tem munição infinita para esta missão.", --Bazooka, Shotgun, SniperRifle
-- ["Eliminate Poison before the time runs out"] = "",
-- ["Eliminate the Blue Team"] = "",
+-- ["Eliminate the enemy before the time runs out"] = "", -- User_Mission_-_Bamboo_Thicket, User_Mission_-_Newton_and_the_Hammock
+-- ["Eliminate the enemy hogs to win."] = "",
-- ["Eliminate the enemy specialists."] = "",
-- ["- Eliminate Unit 3378 |- Feeble Resistance must survive"] = "",
+-- ["Energetic Engineer"] = "",
-- ["Enjoy the swim..."] = "",
-- ["[Enter]"] = "",
["Fastest lap: "] = "Volta mais rápida: ",
@@ -53,6 +67,9 @@
-- ["Flag respawned!"] = "",
-- ["Flag returned!"] = "",
-- ["Flags, and their home base will be placed where each team ends their first turn."] = "",
+-- ["Flamer"] = "",
+-- ["Friendly Fire!"] = "",
+-- ["fuel extended!"] = "",
-- ["GAME BEGUN!!!"] = "",
-- ["Game Modifiers: "] = "",
-- ["GAME OVER!"] = "",
@@ -62,11 +79,15 @@
-- ["GO! GO! GO!"] = "",
-- ["Good birdy......"] = "",
-- ["Good luck out there!"] = "",
+-- ["Good so far!"] = "",
+-- ["Good to go!"] = "",
-- ["GOTCHA!"] = "",
+-- ["Grab Mines/Explosives"] = "",
-- ["Hahahaha!"] = "",
-- ["Haha, now THAT would be something!"] = "",
-- ["Hapless Hogs"] = "",
-- [" Hapless Hogs left!"] = "",
+-- ["Health crates extend your time."] = "",
-- ["Heavy"] = "",
["Hedgewars-Basketball"] = "Hedgewars-Basketball",
["Hedgewars-Knockball"] = "Hedgewars-Knockball",
@@ -80,9 +101,15 @@
-- ["It's a good thing SUDDEN DEATH is 99 turns away..."] = "",
-- ["Jumping is disabled"] = "",
-- ["Kamikaze Expert!"] = "",
+-- ["Keep it up!"] = "",
+-- ["Killing spree!"] = "",
-- ["KILLS"] = "",
+-- ["Last Target!"] = "",
-- ["[Left Shift]"] = "",
-- ["Listen up, maggot!!"] = "",
+-- ["Lively Lifeguard"] = "",
+-- ["Mine Deployer"] = "",
+-- ["Mine Eater!"] = "",
-- ["|- Mines Time:"] = "", -- User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork
-- ["MISSION FAILED"] = "", -- User_Mission_-_Dangerous_Ducklings, User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork
-- ["MISSION SUCCESS"] = "",
@@ -90,9 +117,12 @@
-- ["Movement: [Up], [Down], [Left], [Right]"] = "",
-- ["Multi-shot!"] = "",
-- ["Nameless Heroes"] = "",
+-- ["New Barrels Per Turn"] = "",
-- ["NEW CLAN RECORD: "] = "",
["NEW fastest lap: "] = "NOVA volta mais rápida: ",
+-- ["New Mines Per Turn"] = "",
-- ["NEW RACE RECORD: "] = "",
+-- ["Newton's Hammock"] = "",
-- ["NOT ENOUGH WAYPOINTS"] = "",
["Not So Friendly Match"] = "Partida não muito amigável", -- Basketball, Knockball
-- ["Oh no! Just try again!"] = "", -- User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork
@@ -100,15 +130,21 @@
-- ["Operation Diver"] = "",
-- ["Opposing Team: "] = "",
-- ["Pathetic Hog #%d"] = "",
+-- ["Pathetic Resistance"] = "", -- User_Mission_-_Bamboo_Thicket, User_Mission_-_Newton_and_the_Hammock
-- ["Per-Hog Ammo"] = "",
-- ["Place more waypoints using [ENTER]"] = "",
+-- ["Place more waypoints using the 'Air Attack' weapon."] = "",
-- ["points"] = "", -- Control, CTF_Blizzard, Basic_Training_-_Bazooka, Basic_Training_-_Shotgun, Basic_Training_-_Sniper_Rifle
-- ["Poison"] = "",
-- ["Power Remaining"] = "",
+-- ["Prepare yourself"] = "",
-- ["Press [Precise] to skip intro"] = "",
-- ["Race complexity limit reached."] = "",
+-- ["RACER"] = "",
-- [" - Return the enemy flag to your base to score | - First team to 3 captures wins | - You may only score when your flag is in your base | - Hogs will drop the flag if killed, or drowned | - Dropped flags may be returned or recaptured | - Hogs respawn when killed"] = "",
+-- ["Round Limit:"] = "",
-- ["Round Limit"] = "",
+-- ["Rounds Complete: "] = "",
-- ["Rounds Complete"] = "",
-- ["RULES OF THE GAME [Press ESC to view]"] = "",
-- ["s|"] = "",
@@ -116,6 +152,7 @@
-- ["SCORE"] = "",
-- ["sec"] = "", -- CTF_Blizzard, TrophyRace, Basic_Training_-_Bazooka, Basic_Training_-_Shotgun, Basic_Training_-_Sniper_Rifle, User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork, Capture_the_Flag
-- ["See ya!"] = "",
+-- ["selected!"] = "",
-- ["s"] = "", -- GaudyRacer, Space_Invasion
-- ["Shield boosted! +30 power"] = "",
-- ["Shield Depleted"] = "",
@@ -127,7 +164,7 @@
-- ["Shield Seeker!"] = "",
["Shotgun Team"] = "Carabineiros",
["Shotgun Training"] = "Treino com a Escopeta",
--- ["Shots Left: "] = "", -- GaudyRacer, Tumbler
+-- ["shots remaining."] = "",
-- ["Silly"] = "",
-- ["Sinky"] = "",
["%s is out and Team %d|scored a penalty!| |Score:"] = "%s está fora e a Equipe %d|sofreu uma penalidade!| |Pontuação:", -- Basketball, Knockball
@@ -146,26 +183,33 @@
-- ["The flag will respawn next round."] = "",
-- ["The Nameless One"] = "",
-- ["THE SPECIALISTS"] = "",
+-- ["This one's tricky."] = "",
-- ["This rain is really something..."] = "",
-- ["TIME: "] = "",
-- ["Timed Kamikaze!"] = "",
-- ["Time Extended!"] = "",
--- ["Time Left: "] = "",
+-- ["Time Extension"] = "",
-- ["Toggle Shield"] = "",
-- ["Toxic Team"] = "", -- User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork
-- ["TRACK COMPLETED"] = "",
--- ["Track Time: "] = "",
+-- ["TRACK FAILED!"] = "",
["TrophyRace"] = "TrophyRace",
-- ["T_T"] = "",
+-- ["Tumbling Time Extended!"] = "",
-- ["Turn Time"] = "",
+-- ["Unit"] = "",
-- ["Unit 3378"] = "",
+-- ["Unit 835"] = "",
-- ["Unlimited Attacks"] = "",
+-- ["Unstoppable!"] = "",
-- ["User Challenge"] = "",
["Use your rope to get from start to finish as fast as you can!"] = "Use sua corda para ir do início ao fim o mais rápido que você puder!",
--- ["v.06"] = "",
-- ["Victory for the "] = "", -- CTF_Blizzard, Capture_the_Flag
-- ["Waypoint placed."] = "",
+-- ["Way-Points Remaining"] = "",
-- ["Weapons Reset"] = "",
+-- ["Well done."] = "",
+-- ["Will this ever end?"] = "",
-- ["WINNING TIME: "] = "",
-- ["You'd almost swear the water was rising!"] = "",
-- ["You have SCORED!!"] = "",
--- a/share/hedgewars/Data/Locale/pt_PT.lua Wed Sep 14 22:27:22 2011 +0200
+++ b/share/hedgewars/Data/Locale/pt_PT.lua Wed Sep 14 22:39:39 2011 +0200
@@ -1,26 +1,35 @@
locale = {
- ["..."] = "...",
[":("] = ":(",
["!!!"] = "!!!",
+ ["..."] = "...",
-- ["Accuracy Bonus!"] = "",
+-- ["Achievement Unlocked"] = "", -- User_Mission_-_Bamboo_Thicket, User_Mission_-_That_Sinking_Feeling, Tumbler
["a Hedgewars mini-game"] = "um mini-jogo Hedgewars", -- Space_Invasion, The_Specialists
["Aiming Practice"] = "Pratica a tua pontaria", --Bazooka, Shotgun, SniperRifle
+-- ["Ammo Depleted!"] = "",
+-- ["ammo extended!"] = "",
+-- ["Ammo is reset at the end of your turn."] = "",
+-- ["Ammo Maniac!"] = "",
["Ammo"] = "Munições",
--- ["Ammo Depleted!"] = "",
--- ["Ammo Maniac!"] = "",
-- ["Available points remaining: "] = "",
+-- ["[Backspace]"] = "",
+-- ["Bamboo Thicket"] = "",
+-- ["Barrel Eater!"] = "",
+-- ["Barrel Launcher"] = "",
["Bat balls at your enemies and|push them into the sea!"] = "Bate bolas contra os teus|enimigos e empurra-os ao mar!",
["Bat your opponents through the|baskets and out of the map!"] = "Bate os teus adversarios|fora do mapa acertando com eles no cesto!",
["Bazooka Training"] = "Treino com Bazuca",
["Best laps per team: "] = "Melhores voltas por equipa: ",
-- ["Best Team Times: "] = "",
-- ["Bloody Rookies"] = "", -- 01#Boot_Camp, User_Mission_-_Dangerous_Ducklings, User_Mission_-_Diver, User_Mission_-_Spooky_Tree
+ ["Boom!"] = "Boom!",
["BOOM!"] = "BOOM!",
- ["Boom!"] = "Boom!",
["Boss defeated!"] = "Boss derrotado!",
-- ["Boss Slayer!"] = "",
+-- ["Build a track and race."] = "",
["CAPTURE THE FLAG"] = "CAPTURAR A BANDEIRA",
["Careless"] = "Descuidado",
+-- ["Change Weapon"] = "",
-- ["Clumsy"] = "",
-- ["Codename: Teamwork"] = "",
["Complete the track as fast as you can!"] = "Completa a pista o mais rápido que conseguires!",
@@ -32,8 +41,10 @@
-- ["DAMMIT, ROOKIE! GET OFF MY HEAD!"] = "",
["Dangerous Ducklings"] = "Patinhos perigosos",
-- ["Deadweight"] = "",
+-- ["Demolition is fun!"] = "",
-- ["Depleted Kamikaze!"] = "",
-- ["Destroy invaders to score points."] = "",
+-- ["Double Kill!"] = "",
-- ["Drone Hunter!"] = "",
-- ["Drowner"] = "",
-- ["Each turn you get 1-3 random weapons"] = "",
@@ -42,8 +53,11 @@
["Eliminate all targets before your time runs out.|You have unlimited ammo for this mission."] = "Destrói todos os alvos antes do tempo terminar.|Tens munições infinitas para esta missão.", --Bazooka, Shotgun, SniperRifle
["Eliminate Poison before the time runs out"] = "Elimina o Poison antes do tempo terminar.",
["Eliminate the Blue Team"] = "Elimina a equipa azul",
+-- ["Eliminate the enemy before the time runs out"] = "", -- User_Mission_-_Bamboo_Thicket, User_Mission_-_Newton_and_the_Hammock
+-- ["Eliminate the enemy hogs to win."] = "",
-- ["Eliminate the enemy specialists."] = "",
-- ["- Eliminate Unit 3378 |- Feeble Resistance must survive"] = "",
+-- ["Energetic Engineer"] = "",
["Enjoy the swim..."] = "Aproveita o mergulho",
["[Enter]"] = "[Enter]",
["Fastest lap: "] = "Volta mais rápida: ",
@@ -53,6 +67,9 @@
["Flag respawned!"] = "Bandeira reiniciada!",
["Flag returned!"] = "Bandeira devolvida!",
-- ["Flags, and their home base will be placed where each team ends their first turn."] = "",
+-- ["Flamer"] = "",
+-- ["Friendly Fire!"] = "",
+-- ["fuel extended!"] = "",
-- ["GAME BEGUN!!!"] = "",
-- ["Game Modifiers: "] = "",
-- ["GAME OVER!"] = "",
@@ -62,11 +79,15 @@
["GO! GO! GO!"] = "GO! GO! GO!",
["Good birdy......"] = "Bom passarito......",
["Good luck out there!"] = "Boa sorte aí fora!",
+-- ["Good so far!"] = "",
+-- ["Good to go!"] = "",
-- ["GOTCHA!"] = "",
+-- ["Grab Mines/Explosives"] = "",
["Hahahaha!"] = "Hahahaha!",
-- ["Haha, now THAT would be something!"] = "",
-- ["Hapless Hogs"] = "",
-- [" Hapless Hogs left!"] = "",
+-- ["Health crates extend your time."] = "",
-- ["Heavy"] = "",
["Hedgewars-Basketball"] = "Hedgewars-Basketball",
["Hedgewars-Knockball"] = "Hedgewars-Knockball",
@@ -80,9 +101,15 @@
-- ["It's a good thing SUDDEN DEATH is 99 turns away..."] = "",
-- ["Jumping is disabled"] = "",
["Kamikaze Expert!"] = "Kamikaze profissional!",
+-- ["Keep it up!"] = "",
+-- ["Killing spree!"] = "",
-- ["KILLS"] = "",
+-- ["Last Target!"] = "",
["[Left Shift]"] = "[Shift Esquerdo]",
["Listen up, maggot!!"] = "Oiçam bem suas larvas!!",
+-- ["Lively Lifeguard"] = "",
+-- ["Mine Deployer"] = "",
+-- ["Mine Eater!"] = "",
["|- Mines Time:"] = "|- Tempo das minas:", -- User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork
["MISSION FAILED"] = "MISSÃO FALHADA", -- User_Mission_-_Dangerous_Ducklings, User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork
["MISSION SUCCESSFUL"] = "MISSÃO COMPLETA", -- User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork
@@ -90,9 +117,12 @@
["Movement: [Up], [Down], [Left], [Right]"] = "Movimento: [Cima], [Baixo], [Esquerda], [Direita]",
-- ["Multi-shot!"] = "",
-- ["Nameless Heroes"] = "",
+-- ["New Barrels Per Turn"] = "",
-- ["NEW CLAN RECORD: "] = "",
["NEW fastest lap: "] = "NOVA volta recorde: ",
+-- ["New Mines Per Turn"] = "",
-- ["NEW RACE RECORD: "] = "",
+-- ["Newton's Hammock"] = "",
-- ["NOT ENOUGH WAYPOINTS"] = "",
["Not So Friendly Match"] = "Partida não muito amigável", -- Basketball, Knockball
["Oh no! Just try again!"] = "Oh não! Tenta novamente!", -- User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork
@@ -100,15 +130,21 @@
["Operation Diver"] = "Operação Mergulho",
["Opposing Team: "] = "Equipa adversária",
["Pathetic Hog #%d"] = "Ouriço patético #%d",
+-- ["Pathetic Resistance"] = "", -- User_Mission_-_Bamboo_Thicket, User_Mission_-_Newton_and_the_Hammock
-- ["Per-Hog Ammo"] = "",
-- ["Place more waypoints using [ENTER]"] = "",
+-- ["Place more waypoints using the 'Air Attack' weapon."] = "",
-- ["points"] = "", -- Control, Space_Invasion
["Poison"] = "Poison",
-- ["Power Remaining"] = "",
+-- ["Prepare yourself"] = "",
-- ["Press [Precise] to skip intro"] = "",
-- ["Race complexity limit reached."] = "",
+-- ["RACER"] = "",
[" - Return the enemy flag to your base to score | - First team to 3 captures wins | - You may only score when your flag is in your base | - Hogs will drop the flag if killed, or drowned | - Dropped flags may be returned or recaptured | - Hogs respawn when killed"] = " - Traz a bandeira inimiga para tua base | - A primeira equipa a captura-la 3 vezes ganha | - Apenas podes marcar quando a tua bandeira está na tua base | - Os ouriços largam a bandeira se morrerem ou se afogarem | - As bandeiras abandonadas podem ser devolvidas ou recapturadas | - Os ouriços mortos ressuscitam",
+-- ["Round Limit:"] = "",
-- ["Round Limit"] = "",
+-- ["Rounds Complete: "] = "",
-- ["Rounds Complete"] = "",
["RULES OF THE GAME [Press ESC to view]"] = "REGRAS DE JOGO [Pressiona ESC para as visualizar]",
["RULES OF THE GAME [Press ESC to view]"] = "REGRAS DE JOGO [Pressiona ESC para as visualizar]",
@@ -117,7 +153,7 @@
-- ["SCORE"] = "",
["sec"] = "seg", -- CTF_Blizzard, TrophyRace, Basic_Training_-_Bazooka, Basic_Training_-_Shotgun, Basic_Training_-_Sniper_Rifle, User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork, Capture_the_Flag
["See ya!"] = "Chau!",
- ["s"] = "s", -- GaudyRacer, Space_Invasion
+-- ["selected!"] = "",
-- ["Shield boosted! +30 power"] = "",
["Shield Depleted"] = "Escudo Esgotado",
["Shield is fully recharged!"] = "Escudo completamente recarregado!",
@@ -128,7 +164,7 @@
-- ["Shield Seeker!"] = "",
["Shotgun Team"] = "Caçadores",
["Shotgun Training"] = "Treino com Caçadeira",
--- ["Shots Left: "] = "", -- GaudyRacer, Tumbler
+-- ["shots remaining."] = "",
-- ["Silly"] = "",
-- ["Sinky"] = "",
["%s is out and Team %d|scored a penalty!| |Score:"] = "%s está fora e a equipa %d|perde um ponto!| |Pontuação:", -- Basketball, Knockball
@@ -137,6 +173,7 @@
["Sniperz"] = "Sniperz",
-- ["Sponge"] = "",
-- ["Spooky Tree"] = "",
+ ["s"] = "s", -- GaudyRacer, Space_Invasion
-- ["STATUS UPDATE"] = "", -- GaudyRacer, Space_Invasion
-- ["Switched to "] = "",
["Team %d: "] = "Equipa %d: ",
@@ -147,27 +184,34 @@
["The flag will respawn next round."] = "A bandeira ira reaparecer no próximo turno.",
-- ["The Nameless One"] = "",
-- ["THE SPECIALISTS"] = "",
+-- ["This one's tricky."] = "",
-- ["This rain is really something..."] = "",
- ["TIME: "] = "TEMPO: ",
-- ["Timed Kamikaze!"] = "",
-- ["Time Extended!"] = "",
- ["Time Left: "] = "Tempo Restante: ",
+-- ["Time Extension"] = "",
+ ["TIME: "] = "TEMPO: ",
-- ["Toggle Shield"] = "",
-- ["Toxic Team"] = "", -- User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork
-- ["TRACK COMPLETED"] = "",
--- ["Track Time: "] = "",
+-- ["TRACK FAILED!"] = "",
["TrophyRace"] = "TrophyRace",
["T_T"] = "T_T",
+-- ["Tumbling Time Extended!"] = "",
-- ["Turn Time"] = "",
+-- ["Unit"] = "",
["Unit 3378"] = "Unidade 3378",
+-- ["Unit 835"] = "",
["Unlimited Attacks"] = "Ataques Ilimitados",
+-- ["Unstoppable!"] = "",
-- ["User Challenge"] = "",
["Use your rope to get from start to finish as fast as you can!"] = "Utilizando a corda, percorre o percurso do inicio ao fim o mais rápido que conseguires!",
--- ["v.06"] = "",
-- ["Victory for the "] = "", -- CTF_Blizzard, Capture_the_Flag
["Victory for the"] = "Vitória para a",
-- ["Waypoint placed."] = "",
+-- ["Way-Points Remaining"] = "",
-- ["Weapons Reset"] = "",
+-- ["Well done."] = "",
+-- ["Will this ever end?"] = "",
-- ["WINNING TIME: "] = "",
-- ["You'd almost swear the water was rising!"] = "",
["You have SCORED!!"] = "Marcaste!!",
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/share/hedgewars/Data/Locale/ru.lua Wed Sep 14 22:39:39 2011 +0200
@@ -0,0 +1,220 @@
+locale = {
+-- [":("] = "",
+-- ["!!!"] = "",
+-- ["..."] = "",
+ ["Accuracy Bonus!"] = "Бонус за аккуратность!",
+-- ["Achievement Unlocked"] = "", -- User_Mission_-_Bamboo_Thicket, User_Mission_-_That_Sinking_Feeling, Tumbler
+ ["a Hedgewars mini-game"] = "Мини-игра в Hedgewars", -- Space_Invasion, The_Specialists
+ ["Aiming Practice"] = "Упражнение на точность", --Bazooka, Shotgun, SniperRifle
+-- ["Ammo"] = "",
+-- ["Ammo Depleted!"] = "",
+-- ["ammo extended!"] = "",
+-- ["Ammo is reset at the end of your turn."] = "",
+-- ["Ammo Maniac!"] = "",
+-- ["Available points remaining: "] = "",
+-- ["[Backspace]"] = "",
+-- ["Bamboo Thicket"] = "",
+-- ["Barrel Eater!"] = "",
+-- ["Barrel Launcher"] = "",
+-- ["Bat balls at your enemies and|push them into the sea!"] = "",
+-- ["Bat your opponents through the|baskets and out of the map!"] = "",
+ ["Bazooka Training"] = "Упражнение с базукой",
+-- ["Best laps per team: "] = "",
+-- ["Best Team Times: "] = "",
+-- ["Bloody Rookies"] = "", -- 01#Boot_Camp, User_Mission_-_Dangerous_Ducklings, User_Mission_-_Diver, User_Mission_-_Spooky_Tree
+ ["Boom!"] = "Бум!",
+ ["BOOM!"] = "БАБАХ!",
+-- ["Boss defeated!"] = "",
+-- ["Boss Slayer!"] = "",
+-- ["Build a track and race."] = "",
+ ["CAPTURE THE FLAG"] = "ЗАХВАТ ФЛАГА",
+-- ["Careless"] = "",
+ ["Change Weapon"] = "Сменить оружие",
+-- ["Clumsy"] = "",
+-- ["Codename: Teamwork"] = "",
+-- ["Complete the track as fast as you can!"] = "",
+ ["Congratulations!"] = "Поздравления!",
+-- ["Congratulations! You've eliminated all targets|within the allowed time frame."] = "", --Bazooka, Shotgun, SniperRifle
+-- ["Control pillars to score points."] = "",
+-- ["Cybernetic Empire"] = "",
+-- ["DAMMIT, ROOKIE!"] = "",
+-- ["DAMMIT, ROOKIE! GET OFF MY HEAD!"] = "",
+-- ["Dangerous Ducklings"] = "",
+-- ["Deadweight"] = "",
+-- ["Demolition is fun!"] = "",
+-- ["Depleted Kamikaze!"] = "",
+-- ["Destroy invaders to score points."] = "",
+ ["Double Kill!"] = "Двойное убийство!",
+-- ["Drone Hunter!"] = "",
+-- ["Drowner"] = "",
+-- ["Each turn you get 1-3 random weapons"] = "",
+-- ["Each turn you get one random weapon"] = "",
+-- ["Eliminate all enemies"] = "",
+-- ["Eliminate all targets before your time runs out.|You have unlimited ammo for this mission."] = "", --Bazooka, Shotgun, SniperRifle
+-- ["Eliminate Poison before the time runs out"] = "",
+-- ["Eliminate the Blue Team"] = "",
+-- ["Eliminate the enemy before the time runs out"] = "", -- User_Mission_-_Bamboo_Thicket, User_Mission_-_Newton_and_the_Hammock
+-- ["Eliminate the enemy hogs to win."] = "",
+-- ["Eliminate the enemy specialists."] = "",
+-- ["- Eliminate Unit 3378 |- Feeble Resistance must survive"] = "",
+-- ["Energetic Engineer"] = "",
+ ["Enjoy the swim..."] = "Приятного плавания...",
+-- ["[Enter]"] = "",
+-- ["Fastest lap: "] = "",
+-- ["Feeble Resistance"] = "",
+-- ["Fire"] = "",
+-- ["Flag captured!"] = "",
+-- ["Flag respawned!"] = "",
+-- ["Flag returned!"] = "",
+-- ["Flags, and their home base will be placed where each team ends their first turn."] = "",
+-- ["Flamer"] = "",
+-- ["Friendly Fire!"] = "",
+-- ["fuel extended!"] = "",
+-- ["GAME BEGUN!!!"] = "",
+-- ["Game Modifiers: "] = "",
+ ["GAME OVER!"] = "ИГРА ОКОНЧЕНА!",
+-- ["Game Started!"] = "",
+-- ["Get on over there and take him out!"] = "",
+ ["Goal"] = "Цель",
+-- ["GO! GO! GO!"] = "",
+-- ["Good birdy......"] = "",
+-- ["Good luck out there!"] = "",
+-- ["Good so far!"] = "",
+-- ["Good to go!"] = "",
+ ["GOTCHA!"] = "ПОПАЛСЯ!",
+-- ["Grab Mines/Explosives"] = "",
+-- ["Hahahaha!"] = "",
+-- ["Haha, now THAT would be something!"] = "",
+-- ["Hapless Hogs"] = "",
+-- [" Hapless Hogs left!"] = "",
+-- ["Health crates extend your time."] = "",
+-- ["Heavy"] = "",
+-- ["Hedgewars-Basketball"] = "",
+-- ["Hedgewars-Knockball"] = "",
+-- ["Heh, it's not that bad."] = "",
+-- ["Hit Combo!"] = "",
+ ["Hmmm..."] = "Хммм...",
+ ["Hooray!"] = "Ура!",
+ ["Hunter"] = "Охотник", --Bazooka, Shotgun, SniperRifle
+ ["Instructor"] = "Инструктор", -- 01#Boot_Camp, User_Mission_-_Dangerous_Ducklings
+-- ["invaders destroyed"] = "",
+-- ["It's a good thing SUDDEN DEATH is 99 turns away..."] = "",
+ ["Jumping is disabled"] = "Прыжки отключены",
+-- ["Kamikaze Expert!"] = "",
+-- ["Keep it up!"] = "",
+-- ["Killing spree!"] = "",
+-- ["KILLS"] = "",
+ ["Last Target!"] = "Последняя цель!",
+-- ["[Left Shift]"] = "",
+-- ["Listen up, maggot!!"] = "",
+-- ["Lively Lifeguard"] = "",
+-- ["Mine Deployer"] = "",
+-- ["Mine Eater!"] = "",
+-- ["|- Mines Time:"] = "", -- User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork
+ ["MISSION FAILED"] = "МИССИЯ ПРОВАЛЕНА", -- User_Mission_-_Dangerous_Ducklings, User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork
+-- ["MISSION SUCCESS"] = "",
+ ["MISSION SUCCESSFUL"] = "МИССИЯ УСПЕШНА", -- User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork
+-- ["Movement: [Up], [Down], [Left], [Right]"] = "",
+-- ["Multi-shot!"] = "",
+ ["Nameless Heroes"] = "Безымянные герои",
+-- ["New Barrels Per Turn"] = "",
+ ["NEW CLAN RECORD: "] = "НОВЫЙ РЕКОРД КЛАНА: ",
+-- ["NEW fastest lap: "] = "",
+-- ["New Mines Per Turn"] = "",
+-- ["NEW RACE RECORD: "] = "",
+ ["Newton's Hammock"] = "Гамак Ньютона",
+-- ["NOT ENOUGH WAYPOINTS"] = "",
+-- ["Not So Friendly Match"] = "", -- Basketball, Knockball
+-- ["Oh no! Just try again!"] = "", -- User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork
+-- ["Oh no! Time's up! Just try again."] = "", --Bazooka, Shotgun, SniperRifle
+-- ["Operation Diver"] = "",
+-- ["Opposing Team: "] = "",
+-- ["Pathetic Hog #%d"] = "",
+-- ["Pathetic Resistance"] = "", -- User_Mission_-_Bamboo_Thicket, User_Mission_-_Newton_and_the_Hammock
+-- ["Per-Hog Ammo"] = "",
+-- ["Place more waypoints using [ENTER]"] = "",
+-- ["Place more waypoints using the 'Air Attack' weapon."] = "",
+-- ["points"] = "", -- Control, CTF_Blizzard, Basic_Training_-_Bazooka, Basic_Training_-_Shotgun, Basic_Training_-_Sniper_Rifle
+ ["Poison"] = "Яд",
+-- ["Power Remaining"] = "",
+-- ["Prepare yourself"] = "",
+-- ["Press [Precise] to skip intro"] = "",
+-- ["Race complexity limit reached."] = "",
+-- ["RACER"] = "",
+-- [" - Return the enemy flag to your base to score | - First team to 3 captures wins | - You may only score when your flag is in your base | - Hogs will drop the flag if killed, or drowned | - Dropped flags may be returned or recaptured | - Hogs respawn when killed"] = "",
+-- ["Round Limit:"] = "",
+-- ["Round Limit"] = "",
+-- ["Rounds Complete: "] = "",
+-- ["Rounds Complete"] = "",
+-- ["RULES OF THE GAME [Press ESC to view]"] = "",
+-- ["s|"] = "",
+-- ["Save as many hapless hogs as possible!"] = "",
+-- ["SCORE"] = "",
+ ["sec"] = "сек", -- CTF_Blizzard, TrophyRace, Basic_Training_-_Bazooka, Basic_Training_-_Shotgun, Basic_Training_-_Sniper_Rifle, User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork, Capture_the_Flag
+ ["See ya!"] = "Увидимся!",
+-- ["selected!"] = "",
+-- ["s"] = "", -- GaudyRacer, Space_Invasion
+-- ["Shield boosted! +30 power"] = "",
+-- ["Shield Depleted"] = "",
+-- ["Shield is fully recharged!"] = "",
+-- ["Shield Master!"] = "",
+-- ["Shield Miser!"] = "",
+-- ["Shield OFF:"] = "",
+-- ["Shield ON:"] = "",
+-- ["Shield Seeker!"] = "",
+-- ["Shotgun Team"] = "",
+-- ["Shotgun Training"] = "",
+-- ["shots remaining."] = "",
+-- ["Silly"] = "",
+-- ["Sinky"] = "",
+-- ["%s is out and Team %d|scored a penalty!| |Score:"] = "", -- Basketball, Knockball
+-- ["%s is out and Team %d|scored a point!| |Score:"] = "", -- Basketball, Knockball
+ ["Sniper Training"] = "Тренировка снайпера",
+-- ["Sniperz"] = "",
+-- ["Sponge"] = "",
+-- ["Spooky Tree"] = "",
+-- ["STATUS UPDATE"] = "", -- GaudyRacer, Space_Invasion
+-- ["Switched to "] = "",
+ ["Team %d: "] = "Команда %d: ",
+ ["Team Scores"] = "Очки команды", -- Control, Space_Invasion
+-- ["That Sinking Feeling"] = "",
+-- ["That was pointless."] = "",
+-- ["The enemy is hiding out on yonder ducky!"] = "",
+-- ["The flag will respawn next round."] = "",
+-- ["The Nameless One"] = "",
+-- ["THE SPECIALISTS"] = "",
+-- ["This one's tricky."] = "",
+-- ["This rain is really something..."] = "",
+ ["TIME: "] = "ВРЕМЯ: ",
+-- ["Timed Kamikaze!"] = "",
+-- ["Time Extended!"] = "",
+-- ["Time Extension"] = "",
+-- ["Toggle Shield"] = "",
+-- ["Toxic Team"] = "", -- User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork
+-- ["TRACK COMPLETED"] = "",
+-- ["TRACK FAILED!"] = "",
+-- ["TrophyRace"] = "",
+-- ["T_T"] = "",
+-- ["Tumbling Time Extended!"] = "",
+-- ["Turn Time"] = "",
+-- ["Unit"] = "",
+-- ["Unit 3378"] = "",
+-- ["Unit 835"] = "",
+-- ["Unlimited Attacks"] = "",
+-- ["Unstoppable!"] = "",
+-- ["User Challenge"] = "",
+-- ["Use your rope to get from start to finish as fast as you can!"] = "",
+-- ["Victory for the "] = "", -- CTF_Blizzard, Capture_the_Flag
+-- ["Waypoint placed."] = "",
+-- ["Way-Points Remaining"] = "",
+-- ["Weapons Reset"] = "",
+-- ["Well done."] = "",
+-- ["Will this ever end?"] = "",
+-- ["WINNING TIME: "] = "",
+-- ["You'd almost swear the water was rising!"] = "",
+-- ["You have SCORED!!"] = "",
+-- ["You saved"] = "",
+-- ["You've failed. Try again."] = "",
+-- ["You've reached the goal!| |Time: "] = "",
+-- ["'Zooka Team"] = "",
+ }
--- a/share/hedgewars/Data/Locale/ru.txt Wed Sep 14 22:27:22 2011 +0200
+++ b/share/hedgewars/Data/Locale/ru.txt Wed Sep 14 22:39:39 2011 +0200
@@ -45,7 +45,7 @@
00:42=Портативный телепорт
00:43=Фортепьяновый удар
00:44=Старый Лимбургер
-00:45=Синус-пушка (в разработке)
+00:45=Синус-пушка (бета)
00:46=Огнемет
00:47=Мина-липучка
00:48=Молот
@@ -53,9 +53,9 @@
00:50=Сверлящий удар
00:51=Комок грязи
00:52=Оружие не выбрано
-00:53=Машина времени и пространства
+00:53=Будка времени
00:54=Структура
-00:55=Земляной распылитель
+00:55=Распылитель земли
01:00=Вперёд к победе!
01:01=Ничья
@@ -107,11 +107,11 @@
02:00=%1 уже не достанет свой Desert Eagle
02:00=%1 заплатил сполна
02:00=%1 мог бы воспользоваться аптечкой
-02:00=%1 ушел играть в игру получше
+02:00=%1 ушел играть лучшую игру
02:00=%1 прожил трудную жизнь
02:00=%1 вышел из строя
02:00=Бедный, бедный %1...
-02:00=%1 предпочитает Wormux
+02:00=%1 предпочитает Warmux
02:00=%1 принял удар на себя
02:00=%1 герой среди лю...гм...ежей
02:00=%1 занял свое место в Валгале
@@ -125,7 +125,7 @@
02:00=Скажите "Прощай, %1!"
02:00=Надежды больше нет, %1
02:00=Это было твое последнее представление, %1
-02:00=Закури перед смертью, %1, т.к твоему здоровью это уже не повредит
+02:00=Закури перед смертью, %1, твоему здоровью это уже не повредит
02:00=%1 испытал Внезапный Массовый Отказ в Системе Жизнеобеспечения (C)
02:00=%1 преставился
02:00=%1 стопроцентный труп
@@ -152,7 +152,7 @@
02:01=%1 помылся
02:01=%1 - это один мокрый ёж
02:01=%1 забыл надеть спасательный жилет
-02:01=%1 плескается в воде
+02:01=%1 плещется в воде
02:01=%1 спит среди рыб
02:01=%1 думал, что физика воды в этой игре полный отстой
02:01=%1 испытывает жажду
@@ -176,7 +176,7 @@
02:01=%1 пошел посмотреть аквариум
02:01=%1 нашёл потерянный город Атлантиды
02:01=%1 стремится к главной роли в игре Bioshock 3
-02:01=Твое плаванье по-сабачьи принесло мало пользы, %1
+02:01=Твое плаванье по-собачьи принесло мало пользы, %1
02:01=%1 забыл взять гидроцикл
02:01=%1 не любит водный спорт
02:01=%1 всегда пускает пузыри
@@ -338,9 +338,9 @@
02:08=%1 вообще не хотел идти в армию
02:08=Хватит впустую тратить время, %1
02:08=Я разочарован тобой, %1
-02:08=Давай, ты можешь добиться большего, чем этот %1
+02:08=Давай, ты можешь быть лучше, чем сейчас, %1
02:08=Намерения %1 провалились
-02:08=%1 очевидно знает более интересные дела
+02:08=%1, очевидно, знает более интересные дела
02:08=%1 оцепенел от страха
02:08=%1 уснул
@@ -383,7 +383,7 @@
; Hog shot an home run (using the bat and another hog)
02:10=Хоум-ран!
02:10=Птица, самолет, ...
-02:10=Тот отсутствует!
+02:10=Вылетел!
; Hog (%1) has to leave (team is gone)
02:11=%1 должен идти спать!
@@ -435,8 +435,9 @@
03:40=Испепеляющая граната
03:41=Большой поклонник Squawks
03:42=Здесь я веду записи...
+
; the misspelled "Beethoven" is intentional (-> to beat)
-03:43=Исполнение смертельной сонаты Бетховена
+03:43=Исполнение смертельной сонаты Битьховена
03:44=Годен до: 1923
03:45=Достижения науки
03:46=Горячо, горячо, горячо!
@@ -448,6 +449,7 @@
03:52=Не используется
03:53=Модель 40
03:54=Построй что нибудь
+03:55=Полезная вещь
; Weapon Descriptions (use | as line breaks)
04:00=Атакуй своих врагов обычной гранатой.|Она взорвется сразу, как только таймер|достигнет нуля.|1-5: Установить таймер гранаты|Атака: Удерживай для более дальнего броска
--- a/share/hedgewars/Data/Locale/sk.lua Wed Sep 14 22:27:22 2011 +0200
+++ b/share/hedgewars/Data/Locale/sk.lua Wed Sep 14 22:39:39 2011 +0200
@@ -3,24 +3,33 @@
["!!!"] = "!!!",
-- ["..."] = "",
["Accuracy Bonus!"] = "Bonus za presnosť!",
+-- ["Achievement Unlocked"] = "", -- User_Mission_-_Bamboo_Thicket, User_Mission_-_That_Sinking_Feeling, Tumbler
["a Hedgewars mini-game"] = "minihra Hedgewars", -- Space_Invasion, The_Specialists
["Aiming Practice"] = "Tréning presnosti", --Bazooka, Shotgun, SniperRifle
+ ["Ammo Depleted!"] = "Výzbroj vyčerpaná!",
+-- ["ammo extended!"] = "",
+-- ["Ammo is reset at the end of your turn."] = "",
+-- ["Ammo Maniac!"] = "",
["Ammo"] = "Výzbroj",
- ["Ammo Depleted!"] = "Výzbroj vyčerpaná!",
--- ["Ammo Maniac!"] = "",
["Available points remaining: "] = "Zostavajúci počet bodov: ",
+-- ["[Backspace]"] = "",
+-- ["Bamboo Thicket"] = "",
+-- ["Barrel Eater!"] = "",
+-- ["Barrel Launcher"] = "",
["Bat balls at your enemies and|push them into the sea!"] = "Loptami triafajte vašich nepriateľov|a zhoďte ich tak do mora!",
["Bat your opponents through the|baskets and out of the map!"] = "Odpálkujte vašich súperov do koša|a von z mapy!",
["Bazooka Training"] = "Tréning s bazukou",
["Best laps per team: "] = "Najrýchlejšie kolá podľa tímov: ",
["Best Team Times: "] = "Najrýchlejšie tímové časy: ",
["Bloody Rookies"] = "Mizerní zelenáči", -- 01#Boot_Camp, User_Mission_-_Dangerous_Ducklings, User_Mission_-_Diver, User_Mission_-_Spooky_Tree
+ ["Boom!"] = "Bum!",
["BOOM!"] = "BUM!",
- ["Boom!"] = "Bum!",
-- ["Boss defeated!"] = "",
-- ["Boss Slayer!"] = "",
+-- ["Build a track and race."] = "",
["CAPTURE THE FLAG"] = "ZMOCNITE SA VLAJKY",
["Careless"] = "Bezstarostný",
+-- ["Change Weapon"] = "",
["Clumsy"] = "Nešikovný",
["Codename: Teamwork"] = "Kódové meno: Teamová práca",
-- ["Complete the track as fast as you can!"] = "",
@@ -32,8 +41,10 @@
["DAMMIT, ROOKIE!"] = "Prekliaty zelenáč!",
["Dangerous Ducklings"] = "Nebezpečné kačiatka",
-- ["Deadweight"] = "",
+-- ["Demolition is fun!"] = "",
-- ["Depleted Kamikaze!"] = "",
-- ["Destroy invaders to score points."] = "",
+-- ["Double Kill!"] = "",
-- ["Drone Hunter!"] = "",
-- ["Drowner"] = "",
-- ["Each turn you get 1-3 random weapons"] = "",
@@ -42,8 +53,11 @@
["Eliminate all targets before your time runs out.|You have unlimited ammo for this mission."] = "Zneškodnite všetky ciele pred vypršaním času.|Na túto misiu máte neobmedzené množstvo streliva.", --Bazooka, Shotgun, SniperRifle
["Eliminate Poison before the time runs out"] = "Zneškodnite Poisona pred tým, ako vyprší čas",
["Eliminate the Blue Team"] = "Zneškodnite modrý tím",
+-- ["Eliminate the enemy before the time runs out"] = "", -- User_Mission_-_Bamboo_Thicket, User_Mission_-_Newton_and_the_Hammock
+-- ["Eliminate the enemy hogs to win."] = "",
-- ["Eliminate the enemy specialists."] = "",
["- Eliminate Unit 3378 |- Feeble Resistance must survive"] = "- Zneškodnite Jednotku 3378|- Slabý odpor musí prežiť",
+-- ["Energetic Engineer"] = "",
["Enjoy the swim..."] = "Užite si plávanie...",
-- ["[Enter]"] = "",
["Fastest lap: "] = "Najrýchlejšie kolo: ",
@@ -53,6 +67,9 @@
["Flag respawned!"] = "Vlajka obnovená!",
["Flag returned!"] = "Vlajka vrátená!",
-- ["Flags, and their home base will be placed where each team ends their first turn."] = "",
+-- ["Flamer"] = "",
+-- ["Friendly Fire!"] = "",
+-- ["fuel extended!"] = "",
-- ["GAME BEGUN!!!"] = "",
-- ["Game Modifiers: "] = "",
["GAME OVER!"] = "KONIEC HRY!",
@@ -62,11 +79,15 @@
["GO! GO! GO!"] = "POĎ! POĎ! POĎ!",
["Good birdy......"] = "Dobrý vtáčik......",
["Good luck out there!"] = "Veľa šťastia!",
+-- ["Good so far!"] = "",
+-- ["Good to go!"] = "",
-- ["GOTCHA!"] = "",
+-- ["Grab Mines/Explosives"] = "",
-- ["Hahahaha!"] = "",
-- ["Haha, now THAT would be something!"] = "",
-- ["Hapless Hogs"] = "",
-- [" Hapless Hogs left!"] = "",
+-- ["Health crates extend your time."] = "",
-- ["Heavy"] = "",
["Hedgewars-Basketball"] = "Hedgewars-Basketbal",
["Hedgewars-Knockball"] = "Hedgewars-Knockball",
@@ -80,9 +101,15 @@
-- ["It's a good thing SUDDEN DEATH is 99 turns away..."] = "",
-- ["Jumping is disabled"] = "",
-- ["Kamikaze Expert!"] = "",
+-- ["Keep it up!"] = "",
+-- ["Killing spree!"] = "",
-- ["KILLS"] = "",
+-- ["Last Target!"] = "",
-- ["[Left Shift]"] = "",
["Listen up, maggot!!"] = "Počúvaj, ty biedny červ!",
+-- ["Lively Lifeguard"] = "",
+-- ["Mine Deployer"] = "",
+-- ["Mine Eater!"] = "",
["|- Mines Time:"] = "|- Časovač pre míny:", -- User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork
["MISSION FAILED"] = "MISIA NEÚSPEŠNÁ", -- User_Mission_-_Dangerous_Ducklings, User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork
-- ["MISSION SUCCESS"] = "",
@@ -90,9 +117,12 @@
["Movement: [Up], [Down], [Left], [Right]"] = "Pohyb: [Hore], [Dole], [Vľavo], [Vpravo]",
-- ["Multi-shot!"] = "",
-- ["Nameless Heroes"] = "",
+-- ["New Barrels Per Turn"] = "",
-- ["NEW CLAN RECORD: "] = "",
["NEW fastest lap: "] = "NOVÉ najrýchlejšie kolo: ",
+-- ["New Mines Per Turn"] = "",
-- ["NEW RACE RECORD: "] = "",
+-- ["Newton's Hammock"] = "",
-- ["NOT ENOUGH WAYPOINTS"] = "",
["Not So Friendly Match"] = "Nie tak celkom priateľský zápas", -- Basketball, Knockball
["Oh no! Just try again!"] = "Áále nie! Tak to skúste znovu!", -- User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork
@@ -100,15 +130,21 @@
["Operation Diver"] = "Operácia Potápač",
["Opposing Team: "] = "Nepriateľský tím",
["Pathetic Hog #%d"] = "Žalostný ježko #%d",
+-- ["Pathetic Resistance"] = "", -- User_Mission_-_Bamboo_Thicket, User_Mission_-_Newton_and_the_Hammock
-- ["Per-Hog Ammo"] = "",
-- ["Place more waypoints using [ENTER]"] = "",
+-- ["Place more waypoints using the 'Air Attack' weapon."] = "",
["points"] = "body", -- Control, CTF_Blizzard, Basic_Training_-_Bazooka, Basic_Training_-_Shotgun, Basic_Training_-_Sniper_Rifle
["Poison"] = "Poison",
-- ["Power Remaining"] = "",
+-- ["Prepare yourself"] = "",
-- ["Press [Precise] to skip intro"] = "",
-- ["Race complexity limit reached."] = "",
+-- ["RACER"] = "",
[" - Return the enemy flag to your base to score | - First team to 3 captures wins | - You may only score when your flag is in your base | - Hogs will drop the flag if killed, or drowned | - Dropped flags may be returned or recaptured | - Hogs respawn when killed"] = " - Skórujete prinesením nepriateľskej vlajky do vašej základne | - Prvý tím, ktorý dosiahne 3 body, vyhráva | - Skórujete len vtedy, keď je máte svoju vlajku v základni | - Spadnuté vlajky môžu byť vrátené na základňu alebo sa ich môže zmocniť súpere | - Ježkovia po smrti ožiujú",
+-- ["Round Limit:"] = "",
-- ["Round Limit"] = "",
+-- ["Rounds Complete: "] = "",
-- ["Rounds Complete"] = "",
["RULES OF THE GAME [Press ESC to view]"] = "PRAVIDLÁ HRY [Stlačte Esc pre ich zobrazenie]",
-- ["s|"] = "",
@@ -116,6 +152,7 @@
-- ["SCORE"] = "",
["sec"] = "sek", -- CTF_Blizzard, TrophyRace, Basic_Training_-_Bazooka, Basic_Training_-_Shotgun, Basic_Training_-_Sniper_Rifle, User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork, Capture_the_Flag
["See ya!"] = "Tak zatiaľ!",
+-- ["selected!"] = "",
-- ["s"] = "", -- GaudyRacer, Space_Invasion
-- ["Shield boosted! +30 power"] = "",
-- ["Shield Depleted"] = "",
@@ -127,7 +164,7 @@
-- ["Shield Seeker!"] = "",
["Shotgun Team"] = "Shotgun tím",
["Shotgun Training"] = "Tréning s brokovnicou",
--- ["Shots Left: "] = "", -- GaudyRacer, Tumbler
+-- ["shots remaining."] = "",
-- ["Silly"] = "",
-- ["Sinky"] = "",
["%s is out and Team %d|scored a penalty!| |Score:"] = "%s je mimo hru a tím %d|dostal trestný bod!| |Skóre:", -- Basketball, Knockball
@@ -146,26 +183,33 @@
["The flag will respawn next round."] = "V ďalšom kole sa obnoví vlajka.",
-- ["The Nameless One"] = "",
-- ["THE SPECIALISTS"] = "",
+-- ["This one's tricky."] = "",
-- ["This rain is really something..."] = "",
["TIME: "] = "ČAS: ",
-- ["Timed Kamikaze!"] = "",
-- ["Time Extended!"] = "",
--- ["Time Left: "] = "",
+-- ["Time Extension"] = "",
-- ["Toggle Shield"] = "",
["Toxic Team"] = "Toxic tím", -- User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork
-- ["TRACK COMPLETED"] = "",
- ["Track Time: "] = "Čas: ",
+-- ["TRACK FAILED!"] = "",
["TrophyRace"] = "Preteky o trofej",
["T_T"] = "T_T",
+-- ["Tumbling Time Extended!"] = "",
["Turn Time"] = "Čas na ťah",
+-- ["Unit"] = "",
["Unit 3378"] = "Jednotka 3378",
+-- ["Unit 835"] = "",
["Unlimited Attacks"] = "Neobmedzené útoky",
+-- ["Unstoppable!"] = "",
-- ["User Challenge"] = "",
["Use your rope to get from start to finish as fast as you can!"] = "Použite lano na presun zo štartovnej pozície do cieľa tak rýchlo, ako to len viete!",
- ["v.06"] = "v.06",
["Victory for the "] = "Víťazstvo pre", -- CTF_Blizzard, Capture_the_Flag
-- ["Waypoint placed."] = "",
+-- ["Way-Points Remaining"] = "",
-- ["Weapons Reset"] = "",
+-- ["Well done."] = "",
+-- ["Will this ever end?"] = "",
-- ["WINNING TIME: "] = "",
-- ["You'd almost swear the water was rising!"] = "",
["You have SCORED!!"] = "SKÓROVALI ste!!",
--- a/share/hedgewars/Data/Locale/stub.lua Wed Sep 14 22:27:22 2011 +0200
+++ b/share/hedgewars/Data/Locale/stub.lua Wed Sep 14 22:39:39 2011 +0200
@@ -3,12 +3,19 @@
-- ["!!!"] = "",
-- ["..."] = "",
-- ["Accuracy Bonus!"] = "",
+-- ["Achievement Unlocked"] = "", -- User_Mission_-_Bamboo_Thicket, User_Mission_-_That_Sinking_Feeling, Tumbler
-- ["a Hedgewars mini-game"] = "", -- Space_Invasion, The_Specialists
-- ["Aiming Practice"] = "", --Bazooka, Shotgun, SniperRifle
-- ["Ammo"] = "",
-- ["Ammo Depleted!"] = "",
+-- ["ammo extended!"] = "",
+-- ["Ammo is reset at the end of your turn."] = "",
-- ["Ammo Maniac!"] = "",
-- ["Available points remaining: "] = "",
+-- ["[Backspace]"] = "",
+-- ["Bamboo Thicket"] = "",
+-- ["Barrel Eater!"] = "",
+-- ["Barrel Launcher"] = "",
-- ["Bat balls at your enemies and|push them into the sea!"] = "",
-- ["Bat your opponents through the|baskets and out of the map!"] = "",
-- ["Bazooka Training"] = "",
@@ -19,8 +26,10 @@
-- ["BOOM!"] = "",
-- ["Boss defeated!"] = "",
-- ["Boss Slayer!"] = "",
+-- ["Build a track and race."] = "",
-- ["CAPTURE THE FLAG"] = "",
-- ["Careless"] = "",
+-- ["Change Weapon"] = "",
-- ["Clumsy"] = "",
-- ["Codename: Teamwork"] = "",
-- ["Complete the track as fast as you can!"] = "",
@@ -32,8 +41,10 @@
-- ["DAMMIT, ROOKIE! GET OFF MY HEAD!"] = "",
-- ["Dangerous Ducklings"] = "",
-- ["Deadweight"] = "",
+-- ["Demolition is fun!"] = "",
-- ["Depleted Kamikaze!"] = "",
-- ["Destroy invaders to score points."] = "",
+-- ["Double Kill!"] = "",
-- ["Drone Hunter!"] = "",
-- ["Drowner"] = "",
-- ["Each turn you get 1-3 random weapons"] = "",
@@ -42,8 +53,11 @@
-- ["Eliminate all targets before your time runs out.|You have unlimited ammo for this mission."] = "", --Bazooka, Shotgun, SniperRifle
-- ["Eliminate Poison before the time runs out"] = "",
-- ["Eliminate the Blue Team"] = "",
+-- ["Eliminate the enemy before the time runs out"] = "", -- User_Mission_-_Bamboo_Thicket, User_Mission_-_Newton_and_the_Hammock
+-- ["Eliminate the enemy hogs to win."] = "",
-- ["Eliminate the enemy specialists."] = "",
-- ["- Eliminate Unit 3378 |- Feeble Resistance must survive"] = "",
+-- ["Energetic Engineer"] = "",
-- ["Enjoy the swim..."] = "",
-- ["[Enter]"] = "",
-- ["Fastest lap: "] = "",
@@ -53,6 +67,9 @@
-- ["Flag respawned!"] = "",
-- ["Flag returned!"] = "",
-- ["Flags, and their home base will be placed where each team ends their first turn."] = "",
+-- ["Flamer"] = "",
+-- ["Friendly Fire!"] = "",
+-- ["fuel extended!"] = "",
-- ["GAME BEGUN!!!"] = "",
-- ["Game Modifiers: "] = "",
-- ["GAME OVER!"] = "",
@@ -62,11 +79,15 @@
-- ["GO! GO! GO!"] = "",
-- ["Good birdy......"] = "",
-- ["Good luck out there!"] = "",
+-- ["Good so far!"] = "",
+-- ["Good to go!"] = "",
-- ["GOTCHA!"] = "",
+-- ["Grab Mines/Explosives"] = "",
-- ["Hahahaha!"] = "",
-- ["Haha, now THAT would be something!"] = "",
-- ["Hapless Hogs"] = "",
-- [" Hapless Hogs left!"] = "",
+-- ["Health crates extend your time."] = "",
-- ["Heavy"] = "",
-- ["Hedgewars-Basketball"] = "",
-- ["Hedgewars-Knockball"] = "",
@@ -80,9 +101,15 @@
-- ["It's a good thing SUDDEN DEATH is 99 turns away..."] = "",
-- ["Jumping is disabled"] = "",
-- ["Kamikaze Expert!"] = "",
+-- ["Keep it up!"] = "",
+-- ["Killing spree!"] = "",
-- ["KILLS"] = "",
+-- ["Last Target!"] = "",
-- ["[Left Shift]"] = "",
-- ["Listen up, maggot!!"] = "",
+-- ["Lively Lifeguard"] = "",
+-- ["Mine Deployer"] = "",
+-- ["Mine Eater!"] = "",
-- ["|- Mines Time:"] = "", -- User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork
-- ["MISSION FAILED"] = "", -- User_Mission_-_Dangerous_Ducklings, User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork
-- ["MISSION SUCCESS"] = "",
@@ -90,9 +117,12 @@
-- ["Movement: [Up], [Down], [Left], [Right]"] = "",
-- ["Multi-shot!"] = "",
-- ["Nameless Heroes"] = "",
+-- ["New Barrels Per Turn"] = "",
-- ["NEW CLAN RECORD: "] = "",
-- ["NEW fastest lap: "] = "",
+-- ["New Mines Per Turn"] = "",
-- ["NEW RACE RECORD: "] = "",
+-- ["Newton's Hammock"] = "",
-- ["NOT ENOUGH WAYPOINTS"] = "",
-- ["Not So Friendly Match"] = "", -- Basketball, Knockball
-- ["Oh no! Just try again!"] = "", -- User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork
@@ -100,15 +130,21 @@
-- ["Operation Diver"] = "",
-- ["Opposing Team: "] = "",
-- ["Pathetic Hog #%d"] = "",
+-- ["Pathetic Resistance"] = "", -- User_Mission_-_Bamboo_Thicket, User_Mission_-_Newton_and_the_Hammock
-- ["Per-Hog Ammo"] = "",
-- ["Place more waypoints using [ENTER]"] = "",
+-- ["Place more waypoints using the 'Air Attack' weapon."] = "",
-- ["points"] = "", -- Control, CTF_Blizzard, Basic_Training_-_Bazooka, Basic_Training_-_Shotgun, Basic_Training_-_Sniper_Rifle
-- ["Poison"] = "",
-- ["Power Remaining"] = "",
+-- ["Prepare yourself"] = "",
-- ["Press [Precise] to skip intro"] = "",
-- ["Race complexity limit reached."] = "",
+-- ["RACER"] = "",
-- [" - Return the enemy flag to your base to score | - First team to 3 captures wins | - You may only score when your flag is in your base | - Hogs will drop the flag if killed, or drowned | - Dropped flags may be returned or recaptured | - Hogs respawn when killed"] = "",
+-- ["Round Limit:"] = "",
-- ["Round Limit"] = "",
+-- ["Rounds Complete: "] = "",
-- ["Rounds Complete"] = "",
-- ["RULES OF THE GAME [Press ESC to view]"] = "",
-- ["s|"] = "",
@@ -116,6 +152,7 @@
-- ["SCORE"] = "",
-- ["sec"] = "", -- CTF_Blizzard, TrophyRace, Basic_Training_-_Bazooka, Basic_Training_-_Shotgun, Basic_Training_-_Sniper_Rifle, User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork, Capture_the_Flag
-- ["See ya!"] = "",
+-- ["selected!"] = "",
-- ["s"] = "", -- GaudyRacer, Space_Invasion
-- ["Shield boosted! +30 power"] = "",
-- ["Shield Depleted"] = "",
@@ -127,7 +164,7 @@
-- ["Shield Seeker!"] = "",
-- ["Shotgun Team"] = "",
-- ["Shotgun Training"] = "",
--- ["Shots Left: "] = "", -- GaudyRacer, Tumbler
+-- ["shots remaining."] = "",
-- ["Silly"] = "",
-- ["Sinky"] = "",
-- ["%s is out and Team %d|scored a penalty!| |Score:"] = "", -- Basketball, Knockball
@@ -146,26 +183,33 @@
-- ["The flag will respawn next round."] = "",
-- ["The Nameless One"] = "",
-- ["THE SPECIALISTS"] = "",
+-- ["This one's tricky."] = "",
-- ["This rain is really something..."] = "",
-- ["TIME: "] = "",
-- ["Timed Kamikaze!"] = "",
-- ["Time Extended!"] = "",
--- ["Time Left: "] = "",
+-- ["Time Extension"] = "",
-- ["Toggle Shield"] = "",
-- ["Toxic Team"] = "", -- User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork
-- ["TRACK COMPLETED"] = "",
--- ["Track Time: "] = "",
+-- ["TRACK FAILED!"] = "",
-- ["TrophyRace"] = "",
-- ["T_T"] = "",
+-- ["Tumbling Time Extended!"] = "",
-- ["Turn Time"] = "",
+-- ["Unit"] = "",
-- ["Unit 3378"] = "",
+-- ["Unit 835"] = "",
-- ["Unlimited Attacks"] = "",
+-- ["Unstoppable!"] = "",
-- ["User Challenge"] = "",
-- ["Use your rope to get from start to finish as fast as you can!"] = "",
--- ["v.06"] = "",
-- ["Victory for the "] = "", -- CTF_Blizzard, Capture_the_Flag
-- ["Waypoint placed."] = "",
+-- ["Way-Points Remaining"] = "",
-- ["Weapons Reset"] = "",
+-- ["Well done."] = "",
+-- ["Will this ever end?"] = "",
-- ["WINNING TIME: "] = "",
-- ["You'd almost swear the water was rising!"] = "",
-- ["You have SCORED!!"] = "",
--- a/share/hedgewars/Data/Locale/sv.lua Wed Sep 14 22:27:22 2011 +0200
+++ b/share/hedgewars/Data/Locale/sv.lua Wed Sep 14 22:39:39 2011 +0200
@@ -3,12 +3,19 @@
[":("] = ":(",
["!!!"] = "!!!",
-- ["Accuracy Bonus!"] = "",
+-- ["Achievement Unlocked"] = "", -- User_Mission_-_Bamboo_Thicket, User_Mission_-_That_Sinking_Feeling, Tumbler
-- ["a Hedgewars mini-game"] = "", -- Space_Invasion, The_Specialists
["Aiming Practice"] = "Siktesövning", --Bazooka, Shotgun, SniperRifle
-- ["Ammo"] = "",
-- ["Ammo Depleted!"] = "",
+-- ["ammo extended!"] = "",
+-- ["Ammo is reset at the end of your turn."] = "",
-- ["Ammo Maniac!"] = "",
-- ["Available points remaining: "] = "",
+-- ["[Backspace]"] = "",
+-- ["Bamboo Thicket"] = "",
+-- ["Barrel Eater!"] = "",
+-- ["Barrel Launcher"] = "",
["Bat balls at your enemies and|push them into the sea!"] = "Slå bollar mot dina fiender|och slå ner dem i havet",
["Bat your opponents through the|baskets and out of the map!"] = "Slå ner dina motståndare i|korgarna och ut ur kartan!",
["Bazooka Training"] = "Bazookaträning",
@@ -19,8 +26,10 @@
["Boom!"] = "Bom!",
-- ["Boss defeated!"] = "",
-- ["Boss Slayer!"] = "",
+-- ["Build a track and race."] = "",
["CAPTURE THE FLAG"] = "CAPTURE THE FLAG",
-- ["Careless"] = "",
+-- ["Change Weapon"] = "",
-- ["Clumsy"] = "",
["Codename: Teamwork"] = "Kodnamn: Lagarbete",
-- ["Complete the track as fast as you can!"] = "",
@@ -32,8 +41,10 @@
["DAMMIT, ROOKIE!"] = "SATAN, GRÖNGÖLING!",
["Dangerous Ducklings"] = "Farliga ankungar",
-- ["Deadweight"] = "",
+-- ["Demolition is fun!"] = "",
-- ["Depleted Kamikaze!"] = "",
-- ["Destroy invaders to score points."] = "",
+-- ["Double Kill!"] = "",
-- ["Drone Hunter!"] = "",
-- ["Drowner"] = "",
-- ["Each turn you get 1-3 random weapons"] = "",
@@ -42,8 +53,11 @@
["Eliminate all targets before your time runs out.|You have unlimited ammo for this mission."] = "Förstör alla målen innan din tid tar slut.|Du har obegränsad ammunition för deta uppdrag", --Bazooka, Shotgun, SniperRifle
["Eliminate Poison before the time runs out"] = "Förgör Gift innan tiden tar slut",
["Eliminate the Blue Team"] = "Förgör det Blå laget",
+-- ["Eliminate the enemy before the time runs out"] = "", -- User_Mission_-_Bamboo_Thicket, User_Mission_-_Newton_and_the_Hammock
+-- ["Eliminate the enemy hogs to win."] = "",
-- ["Eliminate the enemy specialists."] = "",
["- Eliminate Unit 3378 |- Feeble Resistance must survive"] = "- Förgör Enhet 3378 |- Klent motstånd måste överleva",
+-- ["Energetic Engineer"] = "",
["Enjoy the swim..."] = "Ha en trevlig simtur...",
-- ["[Enter]"] = "",
["Fastest lap: "] = "Snabbast varv: ",
@@ -53,6 +67,9 @@
["Flag respawned!"] = "Flagga återställd!",
["Flag returned!"] = "Flagga återvänd!",
-- ["Flags, and their home base will be placed where each team ends their first turn."] = "",
+-- ["Flamer"] = "",
+-- ["Friendly Fire!"] = "",
+-- ["fuel extended!"] = "",
-- ["GAME BEGUN!!!"] = "",
-- ["Game Modifiers: "] = "",
["GAME OVER!"] = "SPELET ÄR SLUT!",
@@ -62,11 +79,15 @@
["GO! GO! GO!"] = "Kör! Kör! Kör!",
["Good birdy......"] = "Fin fågel......",
["Good luck out there!"] = "Lycka till där ute!",
+-- ["Good so far!"] = "",
+-- ["Good to go!"] = "",
-- ["GOTCHA!"] = "",
+-- ["Grab Mines/Explosives"] = "",
-- ["Hahahaha!"] = "",
-- ["Haha, now THAT would be something!"] = "",
-- ["Hapless Hogs"] = "",
-- [" Hapless Hogs left!"] = "",
+-- ["Health crates extend your time."] = "",
-- ["Heavy"] = "",
["Hedgewars-Basketball"] = "Hedgewars-Basket",
["Hedgewars-Knockball"] = "Hedgewars-Knockball",
@@ -80,9 +101,15 @@
-- ["It's a good thing SUDDEN DEATH is 99 turns away..."] = "",
-- ["Jumping is disabled"] = "",
-- ["Kamikaze Expert!"] = "",
+-- ["Keep it up!"] = "",
+-- ["Killing spree!"] = "",
-- ["KILLS"] = "",
+-- ["Last Target!"] = "",
-- ["[Left Shift]"] = "",
["Listen up, maggot!!"] = "Hör här, ynkrygg!!",
+-- ["Lively Lifeguard"] = "",
+-- ["Mine Deployer"] = "",
+-- ["Mine Eater!"] = "",
["|- Mines Time:"] = "|- Mintid:", -- User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork
["MISSION FAILED"] = "UPPDRAG MISSLYCKADES", -- User_Mission_-_Dangerous_Ducklings, User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork
-- ["MISSION SUCCESS"] = "",
@@ -90,9 +117,12 @@
-- ["Movement: [Up], [Down], [Left], [Right]"] = "",
-- ["Multi-shot!"] = "",
-- ["Nameless Heroes"] = "",
+-- ["New Barrels Per Turn"] = "",
-- ["NEW CLAN RECORD: "] = "",
["NEW fastest lap: "] = "NYTT snabbast varv: ",
+-- ["New Mines Per Turn"] = "",
-- ["NEW RACE RECORD: "] = "",
+-- ["Newton's Hammock"] = "",
-- ["NOT ENOUGH WAYPOINTS"] = "",
["Not So Friendly Match"] = "En inte så vänlig match", -- Basketball, Knockball
["Oh no! Just try again!"] = "Å nej! Bara att försöka igen!", -- User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork
@@ -100,15 +130,21 @@
["Operation Diver"] = "Operationens dykare",
["Opposing Team: "] = "Motståndarlag: ",
["Pathetic Hog #%d"] = "Patetisk kott #%d",
+-- ["Pathetic Resistance"] = "", -- User_Mission_-_Bamboo_Thicket, User_Mission_-_Newton_and_the_Hammock
-- ["Per-Hog Ammo"] = "",
-- ["Place more waypoints using [ENTER]"] = "",
+-- ["Place more waypoints using the 'Air Attack' weapon."] = "",
-- ["points"] = "", -- Control, CTF_Blizzard, Basic_Training_-_Bazooka, Basic_Training_-_Shotgun, Basic_Training_-_Sniper_Rifle
["Poison"] = "Gift",
-- ["Power Remaining"] = "",
+-- ["Prepare yourself"] = "",
-- ["Press [Precise] to skip intro"] = "",
-- ["Race complexity limit reached."] = "",
+-- ["RACER"] = "",
[" - Return the enemy flag to your base to score | - First team to 3 captures wins | - You may only score when your flag is in your base | - Hogs will drop the flag if killed, or drowned | - Dropped flags may be returned or recaptured | - Hogs respawn when killed"] = " - Återvänd med fiendens flagga till din bas för att ta poäng | - Första laget till tre vinner | - Du kan bara ta poäng när din egen flagga är i basen | - Kottar tappar flaggan när de dödas eller drunknar | - Tappade flaggor kan tas tillbaka eller fångas | - Kottar kommer tillbaka när de dör",
+-- ["Round Limit:"] = "",
-- ["Round Limit"] = "",
+-- ["Rounds Complete: "] = "",
-- ["Rounds Complete"] = "",
["RULES OF THE GAME [Press ESC to view]"] = "SPELREGLER [Tryck ESC för att se]",
-- ["s|"] = "",
@@ -116,6 +152,7 @@
-- ["SCORE"] = "",
["sec"] = "sec", -- CTF_Blizzard, TrophyRace, Basic_Training_-_Bazooka, Basic_Training_-_Shotgun, Basic_Training_-_Sniper_Rifle, User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork, Capture_the_Flag
["See ya!"] = "Ses!",
+-- ["selected!"] = "",
-- ["s"] = "", -- GaudyRacer, Space_Invasion
-- ["Shield boosted! +30 power"] = "",
-- ["Shield Depleted"] = "",
@@ -127,7 +164,7 @@
-- ["Shield Seeker!"] = "",
["Shotgun Team"] = "Hagelgevärslaget",
["Shotgun Training"] = "Hagelgevärsträning",
--- ["Shots Left: "] = "", -- GaudyRacer, Tumbler
+-- ["shots remaining."] = "",
-- ["Silly"] = "",
-- ["Sinky"] = "",
["%s is out and Team %d|scored a penalty!| |Score:"] = "%s är ute och lag %d|fick ett straff!| |Poängställning:", -- Basketball, Knockball
@@ -146,26 +183,33 @@
["The flag will respawn next round."] = "Flaggan kommer tillbaka nästa runda.",
-- ["The Nameless One"] = "",
-- ["THE SPECIALISTS"] = "",
+-- ["This one's tricky."] = "",
-- ["This rain is really something..."] = "",
-- ["TIME: "] = "",
-- ["Timed Kamikaze!"] = "",
-- ["Time Extended!"] = "",
--- ["Time Left: "] = "",
+-- ["Time Extension"] = "",
-- ["Toggle Shield"] = "",
["Toxic Team"] = "Förgiftade laget", -- User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork
-- ["TRACK COMPLETED"] = "",
--- ["Track Time: "] = "",
+-- ["TRACK FAILED!"] = "",
["TrophyRace"] = "TrophyRace",
["T_T"] = "T_T",
+-- ["Tumbling Time Extended!"] = "",
-- ["Turn Time"] = "",
+-- ["Unit"] = "",
["Unit 3378"] = "Enhet 3378",
+-- ["Unit 835"] = "",
-- ["Unlimited Attacks"] = "",
+-- ["Unstoppable!"] = "",
-- ["User Challenge"] = "",
["Use your rope to get from start to finish as fast as you can!"] = "Använd ditt rep för att ta dig från start till mål så fort som möjligt!",
--- ["v.06"] = "",
["Victory for the "] = "Vinst för", -- CTF_Blizzard, Capture_the_Flag
-- ["Waypoint placed."] = "",
+-- ["Way-Points Remaining"] = "",
-- ["Weapons Reset"] = "",
+-- ["Well done."] = "",
+-- ["Will this ever end?"] = "",
-- ["WINNING TIME: "] = "",
-- ["You'd almost swear the water was rising!"] = "",
["You have SCORED!!"] = "Du har tagit poäng!",
--- a/share/hedgewars/Data/Locale/uk.lua Wed Sep 14 22:27:22 2011 +0200
+++ b/share/hedgewars/Data/Locale/uk.lua Wed Sep 14 22:39:39 2011 +0200
@@ -1,28 +1,38 @@
locale = {
-- [":("] = "",
+ ["!!!"] = "Я!",
-- ["..."] = "",
--- ["Accuracy Bonus!"] = "",
--- ["a Hedgewars mini-game"] = "", -- Space_Invasion, The_Specialists
+ ["Accuracy Bonus!"] = "Бонус Точності!",
+ ["Achievement Unlocked"] = "Досягнення Розблоковано", -- User_Mission_-_Bamboo_Thicket, User_Mission_-_That_Sinking_Feeling, Tumbler
+ ["a Hedgewars mini-game"] = "Міні-гра Hedgewars", -- Space_Invasion, The_Specialists
["Aiming Practice"] = "Практика прицілювання", --Bazooka, Shotgun, SniperRifle
--- ["Ammo"] = "",
--- ["Ammo Depleted!"] = "",
--- ["Ammo Maniac!"] = "",
--- ["Available points remaining: "] = "",
+ ["Ammo"] = "Боєприпаси",
+ ["Ammo Depleted!"] = "Боєприпаси Скінчились!",
+ ["ammo extended!"] = "Боєприпаси поповнені!",
+ ["Ammo is reset at the end of your turn."] = "Боєприпаси обнуляються в кінці вашого ходу.",
+ ["Ammo Maniac!"] = "Маніяк Боєприпасів!",
+ ["Available points remaining: "] = "Залишилось доступних очків: ",
+-- ["[Backspace]"] = "",
+ ["Bamboo Thicket"] = "Бамбукові Хащі",
+ ["Barrel Eater!"] = "Поїдач Бочок!",
+ ["Barrel Launcher"] = "Катапульта для бочок",
["Bat balls at your enemies and|push them into the sea!"] = "Закидайте ворогів м'ячами щоб|зіштовути їх у море!",
["Bat your opponents through the|baskets and out of the map!"] = "Дубасьте опонентів битою через|кошики та за межі карти!",
["Bazooka Training"] = "Тренування з базукою",
["Best laps per team: "] = "Кращі партії на команду: ",
--- ["Best Team Times: "] = "",
+ ["Best Team Times: "] = "Кращий Командний Час: ",
["Bloody Rookies"] = "Криваві Салаги", -- 01#Boot_Camp, User_Mission_-_Dangerous_Ducklings, User_Mission_-_Diver, User_Mission_-_Spooky_Tree
--- ["BOOM!"] = "",
+ ["BOOM!"] = "БАБАХ!",
["Boom!"] = "Бабах!",
--- ["Boss defeated!"] = "",
--- ["Boss Slayer!"] = "",
+ ["Boss defeated!"] = "Боса переможено!",
+ ["Boss Slayer!"] = "Вбивця Боса!",
+ ["Build a track and race."] = "Створіть трасу та женіть.",
["CAPTURE THE FLAG"] = "ЗАХОПЛЕННЯ ПРАПОРА",
--- ["Careless"] = "",
--- ["Clumsy"] = "",
+ ["Careless"] = "Безтурботний",
+ ["Change Weapon"] = "Змінити Зброю",
+ ["Clumsy"] = "Незграбний",
["Codename: Teamwork"] = "Кодова назва: Командна гра",
--- ["Complete the track as fast as you can!"] = "",
+ ["Complete the track as fast as you can!"] = "Подолайте трасу так швидко, як тільки зможете!",
["Congratulations! You've eliminated all targets|within the allowed time frame."] = "Вітаємо! Ви знищили всі цілі|в межах дозволеного часу.", --Bazooka, Shotgun, SniperRifle
["Congratulations!"] = "Вітаємо!",
["Control pillars to score points."] = "Контрольюй стовпи щоб набрати очки.",
@@ -30,147 +40,181 @@
["DAMMIT, ROOKIE! GET OFF MY HEAD!"] = "ЧОРТ ЗАБИРАЙ, САЛАГА! ЗЛІЗЬ З МОЄЇ ГОЛОВИ!",
["DAMMIT, ROOKIE!"] = "ЧОРТ ЗАБИРАЙ, САЛАГА!",
["Dangerous Ducklings"] = "Небезпечні Каченята",
--- ["Deadweight"] = "",
--- ["Depleted Kamikaze!"] = "",
--- ["Destroy invaders to score points."] = "",
--- ["Drone Hunter!"] = "",
--- ["Drowner"] = "",
--- ["Each turn you get 1-3 random weapons"] = "",
--- ["Each turn you get one random weapon"] = "",
+ ["Deadweight"] = "Власна вага",
+ ["Demolition is fun!"] = "Руйнування це весело!",
+ ["Depleted Kamikaze!"] = "Виснажений Камікадзе!",
+ ["Destroy invaders to score points."] = "Знищіть загарбників, щоб набрати очки.",
+ ["Double Kill!"] = "Подвійне Вбивство!",
+ ["Drone Hunter!"] = "Мисливець за Джмелями!",
+ ["Drowner"] = "Потопаючий",
+ ["Each turn you get 1-3 random weapons"] = "Кожного ходу ви отримуєте 1-3 випадкової зброї",
+ ["Each turn you get one random weapon"] = "Кожного ходу ви отримуєте одну випадкову зброю",
["Eliminate all enemies"] = "Ліквідуйте всіх ворогів",
["Eliminate all targets before your time runs out.|You have unlimited ammo for this mission."] = "Знищіть всі цілі до закінчення часу.|У вас безмежні боєприпаси.", --Bazooka, Shotgun, SniperRifle
["Eliminate Poison before the time runs out"] = "Знешкодьте Смердюка до закінчення часу",
["Eliminate the Blue Team"] = "Знищіть Синю Команду",
--- ["Eliminate the enemy specialists."] = "",
+ ["Eliminate the enemy before the time runs out"] = "Знешкодьте ворога до закінчення часу", -- User_Mission_-_Bamboo_Thicket, User_Mission_-_Newton_and_the_Hammock
+ ["Eliminate the enemy hogs to win."] = "Знешкодьте ворожих їжаків щоб перемогти.",
+ ["Eliminate the enemy specialists."] = "Знешкодьте ворожих спеціалістів.",
["- Eliminate Unit 3378 |- Feeble Resistance must survive"] = "- Знищіть Об'єкт 3378 |- Жалюгідні Повстанці повинні вижити",
+ ["Energetic Engineer"] = "Енергетичний Інженер",
["Enjoy the swim..."] = "Насолоджуйся плаванням...",
-- ["[Enter]"] = "",
["Fastest lap: "] = "Найшвидша партія: ",
["Feeble Resistance"] = "Жалюгідні Повстанці",
--- ["Fire"] = "",
+ ["Fire"] = "Вогонь",
["Flag captured!"] = "Прапор захоплено!",
["Flag respawned!"] = "Прапор відновлено!",
["Flag returned!"] = "Прапор повернено!",
--- ["Flags, and their home base will be placed where each team ends their first turn."] = "",
--- ["GAME BEGUN!!!"] = "",
--- ["Game Modifiers: "] = "",
+ ["Flags, and their home base will be placed where each team ends their first turn."] = "Прапори і їх базування будуть розміщені там, де кожна команда закінчить її перший хід.",
+ ["Flamer"] = "Вогнемет",
+ ["Friendly Fire!"] = "Дружній Вогонь!",
+ ["fuel extended!"] = "пальне поповнене!",
+ ["GAME BEGUN!!!"] = "ГРА ПОЧАЛАСЬ!!!",
+ ["Game Modifiers: "] = "Модифікатори Гри: ",
["GAME OVER!"] = "КІНЕЦЬ ГРИ!",
["Game Started!"] = "Гра почалась!",
["Get on over there and take him out!"] = "Залізь туди і прикінчи його!",
--- ["Goal"] = "",
+ ["Goal"] = "Мета",
["GO! GO! GO!"] = "ДАВАЙ! ДАВАЙ! РУХАЙСЯ!",
["Good birdy......"] = "Гарна пташка......",
["Good luck out there!"] = "Удачі!",
--- ["GOTCHA!"] = "",
--- ["Hahahaha!"] = "",
--- ["Haha, now THAT would be something!"] = "",
--- ["Hapless Hogs"] = "",
--- [" Hapless Hogs left!"] = "",
--- ["Heavy"] = "",
+ ["Good so far!"] = "Покищо добре!",
+ ["Good to go!"] = "Так тримати!",
+ ["GOTCHA!"] = "ПОПАВСЯ!",
+ ["Grab Mines/Explosives"] = "Схопити Міни/Вибухівку",
+ ["Hahahaha!"] = "Хахахаха!",
+ ["Haha, now THAT would be something!"] = "Хаха, от ЦЕ буде щось!",
+ ["Hapless Hogs"] = "Нещасні Їжаки",
+ [" Hapless Hogs left!"] = " Нещасних Їжаків лишилось!",
+ ["Health crates extend your time."] = "Ящики зі здоров'ям продовжують ваш час.",
+ ["Heavy"] = "В'ялий",
["Hedgewars-Basketball"] = "Баскетбол Їжаками",
["Hedgewars-Knockball"] = "Бейсбол Їжаками",
--- ["Heh, it's not that bad."] = "",
--- ["Hit Combo!"] = "",
+ ["Heh, it's not that bad."] = "хех, це не так вже й погано.",
+ ["Hit Combo!"] = "Зробив Комбо!",
["Hmmm..."] = "Хмм...",
["Hooray!"] = "Урааа!",
["Hunter"] = "Мисливець", --Bazooka, Shotgun, SniperRifle
["Instructor"] = "Інструктор", -- 01#Boot_Camp, User_Mission_-_Dangerous_Ducklings
--- ["invaders destroyed"] = "",
--- ["It's a good thing SUDDEN DEATH is 99 turns away..."] = "",
--- ["Jumping is disabled"] = "",
--- ["Kamikaze Expert!"] = "",
--- ["KILLS"] = "",
--- ["[Left Shift]"] = "",
+ ["invaders destroyed"] = "Загарбників знищено",
+ ["It's a good thing SUDDEN DEATH is 99 turns away..."] = "Це чудово що РАПТОВА СМЕРТЬ віддалилась на 99 ходів...",
+ ["Jumping is disabled"] = "Стрибання вимкнене",
+ ["Kamikaze Expert!"] = "Камікадзе Експерт!",
+ ["Keep it up!"] = "Так тримати!",
+ ["Killing spree!"] = "Череда вбивств!",
+ ["KILLS"] = "ВБИВСТВ",
+ ["Last Target!"] = "Остання Ціль!",
+ ["[Left Shift]"] = "[Лівий Shift]",
["Listen up, maggot!!"] = "Слухай, хробак!",
+ ["Lively Lifeguard"] = "Жвавий Рятівник",
+ ["Mine Deployer"] = "Мінер",
+ ["Mine Eater!"] = "Поїдач Мін!",
["|- Mines Time:"] = "|- Час детонування мін:", -- User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork
["MISSION FAILED"] = "МІСІЮ ПРОВАЛЕНО", -- User_Mission_-_Dangerous_Ducklings, User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork
--- ["MISSION SUCCESS"] = "",
+ ["MISSION SUCCESS"] = "УСПІХ МІСІЇ",
["MISSION SUCCESSFUL"] = "МІСІЮ ВИКОНАНО", -- User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork
--- ["Movement: [Up], [Down], [Left], [Right]"] = "",
--- ["Multi-shot!"] = "",
--- ["Nameless Heroes"] = "",
--- ["NEW CLAN RECORD: "] = "",
+ ["Movement: [Up], [Down], [Left], [Right]"] = "Керування: [Вверх], [Вниз], [Вліво], [Вправо]",
+ ["Multi-shot!"] = "Мультипостріл!",
+ ["Nameless Heroes"] = "Безіменні Герої",
+ ["New Barrels Per Turn"] = "Нових Бочок на Хід",
+ ["NEW CLAN RECORD: "] = "НОВИЙ РЕКОРД КЛАНУ: ",
["NEW fastest lap: "] = "НОВА найшвидша партія: ",
--- ["NEW RACE RECORD: "] = "",
--- ["NOT ENOUGH WAYPOINTS"] = "",
+ ["New Mines Per Turn"] = "Нових Мін на Хід",
+ ["NEW RACE RECORD: "] = "НОВИЙ РЕКОРД ГОНКИ: ",
+ ["Newton's Hammock"] = "Гамак Ньютона",
+ ["NOT ENOUGH WAYPOINTS"] = "НЕДОСТАТНЬО ТОЧОК ШЛЯХУ",
["Not So Friendly Match"] = "Не дуже товариський матч", -- Basketball, Knockball
["Oh no! Just try again!"] = "О, ні! Давай, спробуй ще раз!", -- User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork
["Oh no! Time's up! Just try again."] = "О, ні! Час йде! Спробуй ще раз.", --Bazooka, Shotgun, SniperRifle
["Operation Diver"] = "Операція Водолаз",
["Opposing Team: "] = "Команда-Противник: ",
["Pathetic Hog #%d"] = "Жалюгідний Їжак #%d",
--- ["Per-Hog Ammo"] = "",
--- ["Place more waypoints using [ENTER]"] = "",
+ ["Pathetic Resistance"] = "Жалюгідний Опір", -- User_Mission_-_Bamboo_Thicket, User_Mission_-_Newton_and_the_Hammock
+ ["Per-Hog Ammo"] = "Боєприпаси на їжака",
+ ["Place more waypoints using [ENTER]"] = "Розмістіть більше точок шляху за допомогою [Enter]",
+ ["Place more waypoints using the 'Air Attack' weapon."] = "Розмістіть більше точок шляху використавши зброю 'Повітряна Атака'.",
["points"] = "очок", -- Control, CTF_Blizzard, Basic_Training_-_Bazooka, Basic_Training_-_Shotgun, Basic_Training_-_Sniper_Rifle
["Poison"] = "Смердюк",
--- ["Power Remaining"] = "",
--- ["Press [Precise] to skip intro"] = "",
--- ["Race complexity limit reached."] = "",
+ ["Power Remaining"] = "Залишилось Енергії",
+ ["Prepare yourself"] = "Приготуйся",
+ ["Press [Precise] to skip intro"] = "Натисніть [Приціл] щоб пропустити вступ",
+ ["Race complexity limit reached."] = "Досягнута межа складності гонки.",
+ ["RACER"] = "ГОНЩИК",
[" - Return the enemy flag to your base to score | - First team to 3 captures wins | - You may only score when your flag is in your base | - Hogs will drop the flag if killed, or drowned | - Dropped flags may be returned or recaptured | - Hogs respawn when killed"] = " - Поверніть ворожий прапор на свою базу щоб заробити очко | - Виграє команда з трьома очками | - Ви можете заробити очко лише коли ваш прапор на вашій базі | - Їжак покине прапор якщо потоне чи буде вбитий | - Покинутий прапор можна повернути або захопити знов | - Їжаки відновлюються після смерті",
--- ["Round Limit"] = "",
--- ["Rounds Complete"] = "",
+ ["Round Limit:"] = "Межа Раунду:",
+ ["Round Limit"] = "Межа Раунду",
+ ["Rounds Complete: "] = "Раундів Завершено: ",
+ ["Rounds Complete"] = "Раундів Завершено",
["RULES OF THE GAME [Press ESC to view]"] = "ПРАВИЛА ГРИ [Натисніть ESC для перегляду]",
--- ["s|"] = "",
--- ["Save as many hapless hogs as possible!"] = "",
--- ["SCORE"] = "",
+ ["s|"] = "с|",
+ ["Save as many hapless hogs as possible!"] = "Врятуйте якнайбільше нещасних їжаків!",
+ ["SCORE"] = "РАХУНОК",
["sec"] = "сек", -- CTF_Blizzard, TrophyRace, Basic_Training_-_Bazooka, Basic_Training_-_Shotgun, Basic_Training_-_Sniper_Rifle, User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork, Capture_the_Flag
["See ya!"] = "Побачимося!",
--- ["s"] = "", -- GaudyRacer, Space_Invasion
--- ["Shield boosted! +30 power"] = "",
--- ["Shield Depleted"] = "",
--- ["Shield is fully recharged!"] = "",
--- ["Shield Master!"] = "",
--- ["Shield Miser!"] = "",
--- ["Shield OFF:"] = "",
--- ["Shield ON:"] = "",
--- ["Shield Seeker!"] = "",
+ ["selected!"] = "вибрано!",
+ ["s"] = "с", -- GaudyRacer, Space_Invasion
+ ["Shield boosted! +30 power"] = "Щит підсилено! +30 сили",
+ ["Shield Depleted"] = "Щит Вичерпаний",
+ ["Shield is fully recharged!"] = "Щит повністю заряджений!",
+ ["Shield Master!"] = "Майстер Щита!",
+ ["Shield Miser!"] = "Скупій Щита!",
+ ["Shield OFF:"] = "Щит Вимкнено:",
+ ["Shield ON:"] = "Щит Ввімкнено:",
+ ["Shield Seeker!"] = "Шукач Щита!",
["Shotgun Team"] = "Команда Рушниць",
["Shotgun Training"] = "Тренування з рушницею",
--- ["Shots Left: "] = "", -- GaudyRacer, Tumbler
--- ["Silly"] = "",
--- ["Sinky"] = "",
+ ["shots remaining."] = "пострілів залишилось.",
+ ["Silly"] = "Дурник",
+ ["Sinky"] = "Любимчик",
["%s is out and Team %d|scored a penalty!| |Score:"] = "%s вибув і Команда %d|отримала штраф!| |Рахунок:", -- Basketball, Knockball
["%s is out and Team %d|scored a point!| |Score:"] = "%s вибув і Команда %d|заробила очко!| |Рахунок:", -- Basketball, Knockball
["Sniper Training"] = "Снайперське тренування",
-- ["Sniperz"] = "",
--- ["Sponge"] = "",
+ ["Sponge"] = "Губка",
["Spooky Tree"] = "Примарне Дерево",
--- ["STATUS UPDATE"] = "", -- GaudyRacer, Space_Invasion
--- ["Switched to "] = "",
+ ["STATUS UPDATE"] = "ОНОВЛЕННЯ СТАНУ", -- GaudyRacer, Space_Invasion
+ ["Switched to "] = "Перейшов до ",
["Team %d: "] = "Команда %d: ",
--- ["Team Scores"] = "", -- Control, Space_Invasion
--- ["That Sinking Feeling"] = "",
+ ["Team Scores"] = "Очки Команди", -- Control, Space_Invasion
+ ["That Sinking Feeling"] = "Ця раптова слабкість",
["That was pointless."] = "Це було безглуздо.",
["The enemy is hiding out on yonder ducky!"] = "Ворог ховається на он тій качечці!",
["The flag will respawn next round."] = "Прапор відновиться в наступному раунді.",
--- ["The Nameless One"] = "",
--- ["THE SPECIALISTS"] = "",
--- ["This rain is really something..."] = "",
--- ["TIME: "] = "",
--- ["Timed Kamikaze!"] = "",
--- ["Time Extended!"] = "",
--- ["Time Left: "] = "",
--- ["Toggle Shield"] = "",
+ ["The Nameless One"] = "Безіменний",
+ ["THE SPECIALISTS"] = "СПЕЦІАЛІСТИ",
+ ["This one's tricky."] = "Хитро придумано.",
+ ["This rain is really something..."] = "Цей дощ дійсно дещо...",
+ ["TIME: "] = "ЧАС: ",
+ ["Timed Kamikaze!"] = "Часовий Камікадзе!",
+ ["Time Extended!"] = "Час Продовжено!",
+ ["Time Extension"] = "Збільшення Часу",
+ ["Toggle Shield"] = "Перемкнути Щит",
["Toxic Team"] = "Токсична Команда", -- User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork
--- ["TRACK COMPLETED"] = "",
--- ["Track Time: "] = "",
+ ["TRACK COMPLETED"] = "ТРАСУ ПРОЙДЕНО",
+ ["TRACK FAILED!"] = "ТРАСУ НЕ ПРОЙДЕНО!",
["TrophyRace"] = "Погоня за Трофеєм",
["T_T"] = "Ааааа!!!",
--- ["Turn Time"] = "",
+ ["Tumbling Time Extended!"] = "Час Падіння Збільшений!",
+ ["Turn Time"] = "Час Ходу",
+ ["Unit"] = "Модуль",
["Unit 3378"] = "Об'єкт 3378",
--- ["Unlimited Attacks"] = "",
--- ["User Challenge"] = "",
+ ["Unit 835"] = "Об'єкт 835",
+ ["Unlimited Attacks"] = "Необмежені Атаки",
+ ["Unstoppable!"] = "Невпинний!",
+ ["User Challenge"] = "Дуель між користувачами",
["Use your rope to get from start to finish as fast as you can!"] = "Скористайся мотузкою щоб якнайшвидше досягнути фінішу!",
--- ["v.06"] = "",
["Victory for the "] = "Перемога для ", -- CTF_Blizzard, Capture_the_Flag
--- ["Waypoint placed."] = "",
--- ["Weapons Reset"] = "",
--- ["WINNING TIME: "] = "",
--- ["You'd almost swear the water was rising!"] = "",
+ ["Waypoint placed."] = "Точка шляху розміщена.",
+ ["Way-Points Remaining"] = "Залишилось Точок",
+ ["Weapons Reset"] = "Скидання Зброї",
+ ["Well done."] = "Чудова робота.",
+ ["Will this ever end?"] = "Це коли-небудь закінчиться?",
+ ["WINNING TIME: "] = "ЧАС ВИГРАШУ: ",
+ ["You'd almost swear the water was rising!"] = "Ти ледь не присягався, що вода піднімається!",
["You have SCORED!!"] = "Ви заробили ОЧКО!!",
--- ["You saved"] = "",
+ ["You saved"] = "Ви врятували",
["You've failed. Try again."] = "Спроба не вдалась. Спробуйте знов.",
["You've reached the goal!| |Time: "] = "Ви досягли мети!| |Час: ",
["'Zooka Team"] = "Команда 'Zooka",
- ["!!!"] = "Я!",
}
--- a/share/hedgewars/Data/Locale/uk.txt Wed Sep 14 22:27:22 2011 +0200
+++ b/share/hedgewars/Data/Locale/uk.txt Wed Sep 14 22:39:39 2011 +0200
@@ -53,8 +53,9 @@
00:50=Атака дрелями
00:51=Грудка багна
00:52=Зброя не вибрана
-00:53=TARDIS
+00:53=Будка Часу
00:54=Структура
+00:55=Земляний Спрей
01:00=Вперед до перемоги!
01:01=Нічия
@@ -286,6 +287,7 @@
03:52=UNUSED
03:53=Тип 40
03:54=Збудуй щось
+03:55=Утиліта
; Weapon Descriptions (use | as line breaks)
04:00=Атакуй ворогів використовуючи просту гранату.|Вона вибухне як тільки її таймер доходить до нуля.|1-5: Вистав таймер гранати|Атака: Утримуй щоб метнути сильніше
@@ -338,6 +340,12 @@
04:47=Подвійні веселощі з двома гострими, підлими,|липкими мінами. Налаштуй ланцюгову реакцію|або захищайся (або і те і те!)|Атака: Утримуй щоб кинути сильніше (двічі)
04:48=Чому всі образи повинні отримати кроти?|Зробити з їжака божевільного теж весело!|Удар цим молотком забере у їжака|третину здоров'я і заб'є його під землю.|Атака: Активуй
04:49=Воскреси своїх друзів! Але май на|увазі що це воскресить також і ворогів.|Атака: Утримуй атаку для повільного відновлення|Вверх: Пришвидш відновлення
+04:50=Хтось ховається під землею?|Вирий їх атакою дрелями!|Таймер керує тим, як далеко вони будуть рити.
+04:51=Здійсни халявний удар, шпурни грудку багна.|Трохи пече і відкидає їжака назад.
+04:52=UNUSED
+04:53=Здійсни подорож крізь час та простір,|залишивши товаришів битись далі самим.|Будь готовий повернутись в кожну мить,|або до Раптової смерті або до їх поразки.|Відмова. Не працює в Раптовій Смерті,|якщо ти один, або якщо ти Король.
+04:54=НЕЗАВЕРШЕНО
+04:55=Розпили потік лепких пластівців.|будуй мости, хорони ворогів, перекривай тунелі.|Стеж щоб на тебе не впала жодна з них!
; Game goal strings
05:00=Режими Гри
@@ -361,3 +369,4 @@
05:18=Необмежені Атаки
05:19=Зброя скидається на кінці ходу
05:20=Зброя не розподіляється між їжаками
+05:21=Збірна Команда: Команди одного клану виконують послідовні ходи|Спільний Час: Команди одного клану ділять між собою час ходу
--- a/share/hedgewars/Data/Locale/zh_CN.lua Wed Sep 14 22:27:22 2011 +0200
+++ b/share/hedgewars/Data/Locale/zh_CN.lua Wed Sep 14 22:39:39 2011 +0200
@@ -2,12 +2,19 @@
["!!!"] = "!!!",
-- ["..."] = "",
-- ["Accuracy Bonus!"] = "",
+-- ["Achievement Unlocked"] = "", -- User_Mission_-_Bamboo_Thicket, User_Mission_-_That_Sinking_Feeling, Tumbler
-- ["a Hedgewars mini-game"] = "", -- Space_Invasion, The_Specialists
["Aiming Practice"] = "瞄准练习", --火箭筒、霰弹枪、狙击枪
-- ["Ammo"] = "",
-- ["Ammo Depleted!"] = "",
+-- ["ammo extended!"] = "",
+-- ["Ammo is reset at the end of your turn."] = "",
-- ["Ammo Maniac!"] = "",
-- ["Available points remaining: "] = "",
+-- ["[Backspace]"] = "",
+-- ["Bamboo Thicket"] = "",
+-- ["Barrel Eater!"] = "",
+-- ["Barrel Launcher"] = "",
["Bat balls at your enemies and|push them into the sea!"] = "发射棒球将敌人击打入水",
["Bat your opponents through the|baskets and out of the map!"] = "把敌人击出场地——对准栏框",
["Bazooka Training"] = "火箭筒训练",
@@ -18,8 +25,10 @@
-- ["BOOM!"] = "",
-- ["Boss defeated!"] = "",
-- ["Boss Slayer!"] = "",
+-- ["Build a track and race."] = "",
["CAPTURE THE FLAG"] = "抢旗子",
-- ["Careless"] = "",
+-- ["Change Weapon"] = "",
-- ["Clumsy"] = "",
["Codename: Teamwork"] = "代号:团队行动",
-- ["Complete the track as fast as you can!"] = "",
@@ -31,8 +40,10 @@
["DAMMIT, ROOKIE!"] = "新人",
["Dangerous Ducklings"] = "危险的小鸭子",
-- ["Deadweight"] = "",
+-- ["Demolition is fun!"] = "",
-- ["Depleted Kamikaze!"] = "",
-- ["Destroy invaders to score points."] = "",
+-- ["Double Kill!"] = "",
-- ["Drone Hunter!"] = "",
-- ["Drowner"] = "",
-- ["Each turn you get 1-3 random weapons"] = "",
@@ -41,8 +52,11 @@
["Eliminate all targets before your time runs out.|You have unlimited ammo for this mission."] = "时间限制内清除全部目标。弹药无限。", --Bazooka, Shotgun, SniperRifle
["Eliminate Poison before the time runs out"] = "时间限制内清除毒素。",
["Eliminate the Blue Team"] = "解决蓝色队伍",
+-- ["Eliminate the enemy before the time runs out"] = "", -- User_Mission_-_Bamboo_Thicket, User_Mission_-_Newton_and_the_Hammock
+-- ["Eliminate the enemy hogs to win."] = "",
-- ["Eliminate the enemy specialists."] = "",
["- Eliminate Unit 3378 |- Feeble Resistance must survive"] = "- 打倒 3378 |-反抗者必须存活",
+-- ["Energetic Engineer"] = "",
["Enjoy the swim..."] = "游水愉快",
-- ["[Enter]"] = "",
["Fastest lap: "] = "最快记录:",
@@ -52,6 +66,9 @@
["Flag respawned!"] = "旗帜重生!",
["Flag returned!"] = "旗帜归还!",
-- ["Flags, and their home base will be placed where each team ends their first turn."] = "",
+-- ["Flamer"] = "",
+-- ["Friendly Fire!"] = "",
+-- ["fuel extended!"] = "",
-- ["GAME BEGUN!!!"] = "",
-- ["Game Modifiers: "] = "",
["GAME OVER!"] = "结束了!",
@@ -61,11 +78,15 @@
["GO! GO! GO!"] = "上!",
["Good birdy......"] = "乖鸟儿",
["Good luck out there!"] = "祝好运",
+-- ["Good so far!"] = "",
+-- ["Good to go!"] = "",
-- ["GOTCHA!"] = "",
+-- ["Grab Mines/Explosives"] = "",
-- ["Hahahaha!"] = "",
-- ["Haha, now THAT would be something!"] = "",
-- ["Hapless Hogs"] = "",
-- [" Hapless Hogs left!"] = "",
+-- ["Health crates extend your time."] = "",
-- ["Heavy"] = "",
["Hedgewars-Basketball"] = "刺猬大作战-篮球计划",
["Hedgewars-Knockball"] = "刺猬大作战-击球计划",
@@ -79,9 +100,15 @@
-- ["It's a good thing SUDDEN DEATH is 99 turns away..."] = "",
-- ["Jumping is disabled"] = "",
-- ["Kamikaze Expert!"] = "",
+-- ["Keep it up!"] = "",
+-- ["Killing spree!"] = "",
-- ["KILLS"] = "",
+-- ["Last Target!"] = "",
-- ["[Left Shift]"] = "",
["Listen up, maggot!!"] = "听好,小子!!",
+-- ["Lively Lifeguard"] = "",
+-- ["Mine Deployer"] = "",
+-- ["Mine Eater!"] = "",
-- ["|- Mines Time:"] =
["MISSION FAILED"] = "任务失败", -- User_Mission_-_Dangerous_Ducklings, User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork
-- ["MISSION SUCCESS"] = "",
@@ -89,9 +116,12 @@
-- ["Movement: [Up], [Down], [Left], [Right]"] = "",
-- ["Multi-shot!"] = "",
-- ["Nameless Heroes"] = "",
+-- ["New Barrels Per Turn"] = "",
-- ["NEW CLAN RECORD: "] = "",
["NEW fastest lap: "] = "新记录",
+-- ["New Mines Per Turn"] = "",
-- ["NEW RACE RECORD: "] = "",
+-- ["Newton's Hammock"] = "",
-- ["NOT ENOUGH WAYPOINTS"] = "",
["Not So Friendly Match"] = "非友善对抗", -- Basketball, Knockball
["Oh no! Just try again!"] = "不!重新再来。", -- User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork
@@ -102,16 +132,22 @@
["Pathetic Hog #1"] = "可怜刺猬一号",
["Pathetic Hog #2"] = "可怜刺猬二号",
-- ["Pathetic Hog #%d"] =
+-- ["Pathetic Resistance"] = "", -- User_Mission_-_Bamboo_Thicket, User_Mission_-_Newton_and_the_Hammock
-- ["Per-Hog Ammo"] = "",
-- ["Place more waypoints using [ENTER]"] = "",
+-- ["Place more waypoints using the 'Air Attack' weapon."] = "",
-- ["points"] =
-- ["Poison"] =
-- ["Power Remaining"] = "",
+-- ["Prepare yourself"] = "",
-- ["Press [Precise] to skip intro"] = "",
-- ["Race complexity limit reached."] = "",
+-- ["RACER"] = "",
-- [" - Return the enemy flag to your base to score | - First team to 3 captures wins | - You may only score when your flag is in your base | - Hogs will drop the flag if killed, or drowned | - Dropped flags may be returned or recaptured | - Hogs respawn when killed"] =
["- Return the enemy flag to your base to score | - First team to 3 captures wins | - You may only score when your flag is in your base | - Hogs will drop the flag if killed, or drowned | - Dropped flags may be returned or recaptured | - Hogs respawn when killed"] = "-带回敌人旗帜得分| -第一支3次夺旗队伍获胜| - 只有旗帜在己方基地才算| -带旗刺猬消逝则旗帜落下| -落下的旗帜使用方式不变| -损失的刺猬瞬间还原",
+-- ["Round Limit:"] = "",
-- ["Round Limit"] = "",
+-- ["Rounds Complete: "] = "",
-- ["Rounds Complete"] = "",
["RULES OF THE GAME [Press ESC to view]"] = "游戏规则 [按下 ESC键 查看]",
-- ["s|"] = "",
@@ -119,6 +155,7 @@
-- ["SCORE"] = "",
-- ["sec"] =
["See ya!"] = "再见!",
+-- ["selected!"] = "",
-- ["s"] = "", -- GaudyRacer, Space_Invasion
-- ["Shield boosted! +30 power"] = "",
-- ["Shield Depleted"] = "",
@@ -130,7 +167,7 @@
-- ["Shield Seeker!"] = "",
["Shotgun Team"] = "霰弹枪队",
["Shotgun Training"] = "霰弹枪训练",
--- ["Shots Left: "] = "", -- GaudyRacer, Tumbler
+-- ["shots remaining."] = "",
-- ["Silly"] = "",
-- ["Sinky"] = "",
["%s is out and Team %d|scored a penalty!| |Score:"] = "%s 出局, %d 惩罚分数!", -- Basketball, Knockball
@@ -149,26 +186,33 @@
-- ["The flag will respawn next round."] =
-- ["The Nameless One"] = "",
-- ["THE SPECIALISTS"] = "",
+-- ["This one's tricky."] = "",
-- ["This rain is really something..."] = "",
-- ["TIME: "] = "",
-- ["Timed Kamikaze!"] = "",
-- ["Time Extended!"] = "",
--- ["Time Left: "] = "",
+-- ["Time Extension"] = "",
-- ["Toggle Shield"] = "",
["Toxic Team"] = "腐坏的队伍", -- User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork
-- ["TRACK COMPLETED"] = "",
--- ["Track Time: "] = "",
+-- ["TRACK FAILED!"] = "",
["TrophyRace"] = "竞速",
["T_T"] = "T_T",
+-- ["Tumbling Time Extended!"] = "",
-- ["Turn Time"] = "",
+-- ["Unit"] = "",
["Unit 3378"] = "3378",
+-- ["Unit 835"] = "",
-- ["Unlimited Attacks"] = "",
+-- ["Unstoppable!"] = "",
-- ["User Challenge"] = "",
["Use your rope to get from start to finish as fast as you can!"] = "抓起绳子飞向目的地,越快越好。",
--- ["v.06"] = "",
["Victory for the "] = "胜利属于",
-- ["Waypoint placed."] = "",
+-- ["Way-Points Remaining"] = "",
-- ["Weapons Reset"] = "",
+-- ["Well done."] = "",
+-- ["Will this ever end?"] = "",
-- ["WINNING TIME: "] = "",
-- ["You'd almost swear the water was rising!"] = "",
["You have SCORED!!"] = "得分",
--- a/share/hedgewars/Data/Maps/CTF_Blizzard/map.lua Wed Sep 14 22:27:22 2011 +0200
+++ b/share/hedgewars/Data/Maps/CTF_Blizzard/map.lua Wed Sep 14 22:39:39 2011 +0200
@@ -1,5 +1,5 @@
--------------------------------
--- CTF_BLIZZARD 0.8
+-- CTF_BLIZZARD 0.9
--------------------------------
---------
@@ -68,14 +68,14 @@
-- removed teleport from starting weapons
-- increased captures to 3
------------
+------------
-- 0.7
------------
-- hopefully fixed a bug with the teleporters
-- added a fix for crate possibly getting imbedded in land when it was near the water line
------------
+------------
-- 0.8
------------
@@ -84,6 +84,13 @@
-- changed hog placements code so that they start in the same place for both teams
-- and hogs move in the same order, not backwards to each other.
+-----------
+-- 0.9
+------------
+
+-- add support for more players
+-- re-enable sudden death, but set water rise to 0
+
loadfile(GetDataPath() .. "Scripts/Locale.lua")()
---------------------------------------------------------------
@@ -469,7 +476,7 @@
-- make a list of individual team names
- for i = 0, 5 do
+ for i = 0, (TeamsCount-1) do
teamNameArr[i] = i
teamSize[i] = 0
teamIndex[i] = 0
@@ -566,7 +573,8 @@
MinesTime = 2000
Explosives = 0 -- The number of explosives being placed
Delay = 10 -- The delay between each round
- SuddenDeathTurns = 99 -- suddendeath is off, effectively
+ WaterRise = 0 -- I sure hope this works
+ --SuddenDeathTurns = 99 -- suddendeath is off, effectively
Map = "Blizzard" -- The map to be played
Theme = "Snow" -- The theme to be used "Nature"
--- a/share/hedgewars/Data/Maps/Control/map.lua Wed Sep 14 22:27:22 2011 +0200
+++ b/share/hedgewars/Data/Maps/Control/map.lua Wed Sep 14 22:39:39 2011 +0200
@@ -1,5 +1,5 @@
--------------------------------
--- CONTROL 0.5
+-- CONTROL 0.6
--------------------------------
---------
@@ -35,6 +35,16 @@
-- removed user branding
-- fixed infinite attack time exploit
+--------
+-- 0.6
+--------
+
+-- timebox fix
+-- support for more players
+-- remove version numbers
+-- enable limited sudden death
+-- using skip go generates as many points as you would have gotten had you sat and waited
+
-----------------
--script begins
-----------------
@@ -88,10 +98,6 @@
--zone and teleporter variables
--------------------------------
---local redTel
---local orangeTel
---local areaArr = {} -- no longer used
-
local cPoint = {}
local cOwnerClan = {}
@@ -159,26 +165,27 @@
SetVisualGearValues(vCirc[i], vCircX[i], vCircY[i], vCircMinA[i], vCircMaxA[i], vCircType[i], vCircPulse[i], vCircFuckAll[i], vCircRadius[i], vCircWidth[i], 0xffffffff)
cOwnerClan[i] = nil
for k = 0, (numhhs-1) do
- if (hhs[k] ~= nil) then
- if (GearIsInZone(hhs[k],i)) == true then
+ if (hhs[k] ~= nil) then --and (GetGearType(hhs[k]) ~= nil) then
+ if (GearIsInZone(hhs[k],i)) == true then
- if cOwnerClan[i] ~= nil then
- if cOwnerClan[i] ~= GetHogClan(hhs[k]) then
- --if the hog now being compared is different to one that is also here and was previously compared
-
- SetVisualGearValues(vCirc[i], vCircX[i], vCircY[i], vCircMinA[i], vCircMaxA[i], vCircType[i], vCircPulse[i], vCircFuckAll[i], vCircRadius[i], vCircWidth[i], 0xffffffff)
- --SetVisualGearValues(vCirc[i], 2739, 1378, 20, 255, 1, 10, 0, 300, 5, 0xffffffff)
-
- cOwnerClan[i] = 10 -- this means conflicted
- end
- elseif cOwnerClan[i] == nil then
- cOwnerClan[i] = GetHogClan(hhs[k])
- --SetVisualGearValues(vCirc[i], 2739, 1378, 20, 255, 1, 10, 0, 300, 5, GetClanColor( GetHogClan(hhs[k])) )
- SetVisualGearValues(vCirc[i], vCircX[i], vCircY[i], vCircMinA[i], vCircMaxA[i], vCircType[i], vCircPulse[i], vCircFuckAll[i], vCircRadius[i], vCircWidth[i], GetClanColor( GetHogClan(hhs[k])))
-
- end
+ if cOwnerClan[i] ~= nil then
+ if cOwnerClan[i] ~= GetHogClan(hhs[k]) then
+ --if the hog now being compared is different to one that is also here and was previously compared
+
+ SetVisualGearValues(vCirc[i], vCircX[i], vCircY[i], vCircMinA[i], vCircMaxA[i], vCircType[i], vCircPulse[i], vCircFuckAll[i], vCircRadius[i], vCircWidth[i], 0xffffffff)
+ --SetVisualGearValues(vCirc[i], 2739, 1378, 20, 255, 1, 10, 0, 300, 5, 0xffffffff)
+
+ cOwnerClan[i] = 10 -- this means conflicted
+ end
+ elseif cOwnerClan[i] == nil then
+ cOwnerClan[i] = GetHogClan(hhs[k])
+ --SetVisualGearValues(vCirc[i], 2739, 1378, 20, 255, 1, 10, 0, 300, 5, GetClanColor( GetHogClan(hhs[k])) )
+ SetVisualGearValues(vCirc[i], vCircX[i], vCircY[i], vCircMinA[i], vCircMaxA[i], vCircType[i], vCircPulse[i], vCircFuckAll[i], vCircRadius[i], vCircWidth[i], GetClanColor( GetHogClan(hhs[k])))
+
+ end
- end
+ end
+ -- else hhs[k] = nil
end
end
@@ -206,9 +213,9 @@
for i = 0,(zCount-1) do
if CurrentHedgehog ~= nil then
if cOwnerClan[i] == GetHogClan(CurrentHedgehog) then
- g = AddVisualGear(vCircX[i], vCircY[i], vgtHealthTag, 100, False)
+ g = AddVisualGear(vCircX[i], vCircY[i]-100, vgtHealthTag, 100, False)
if g ~= 0 then
- SetVisualGearValues(g, vCircX[i], vCircY[i], 0, 0, 0, 0, 0, teamScore[cOwnerClan[i]], 1500, GetClanColor(cOwnerClan[i]))
+ SetVisualGearValues(g, vCircX[i], vCircY[i]-100, 0, 0, 0, 0, 0, teamScore[cOwnerClan[i]], 1500, GetClanColor(cOwnerClan[i]))
end
end
end
@@ -224,7 +231,7 @@
-- make a list of individual team names
- for i = 0, 5 do
+ for i = 0, (TeamsCount-1) do
teamNameArr[i] = " " -- = i
teamSize[i] = 0
teamIndex[i] = 0
@@ -281,14 +288,27 @@
-- game methods
------------------------
+function onAttack()
+
+ if CurrentHedgehog ~= nil then
+ if GetCurAmmoType() == amSkip then
+ z = (TurnTimeLeft / 2000) - (TurnTimeLeft / 2000)%2
+ --AddCaption("scored: " .. z,GetClanColor(GetHogClan(CurrentHedgehog)),capgrpMessage2)
+ for i = 0, z do
+ AwardPoints()
+ end
+ end
+ end
+
+end
+
function onGameInit()
-- Things we don't modify here will use their default values.
--GameFlags = gfInfAttack + gfSolidLand -- Game settings and rules
GameFlags = band(bor(GameFlags, gfInfAttack + gfSolidLand), bnot(gfKing + gfForts))
-
- SuddenDeathTurns = 99 -- suddendeath is off, effectively
+ WaterRise = 0
end
@@ -334,10 +354,7 @@
for i = 0, (numTeams-1) do
pointLimit = pointLimit - 25
end
- --SetGearPosition(hhs[0], 631, 82)
- --SetGearPosition(hhs[1], 1088, 684)
- --SetGearPosition(hhs[2], 381, 1569)
-
+
-- reposition hogs if they are on control points until they are not or sanity limit kicks in
reN = 0
--zz = 0
@@ -352,7 +369,10 @@
--AddCaption(zz) -- number of times it took to work
end
- ShowMission("CONTROL v0.3", "", loc("Control pillars to score points.") .. "|" .. loc("Goal") .. ": " .. pointLimit .. " " .. loc("points"), 0, 0)
+ ShowMission("CONTROL",
+ "",
+ loc("Control pillars to score points.") .. "|" ..
+ loc("Goal") .. ": " .. pointLimit .. " " .. loc("points"), 0, 0)
end
@@ -388,14 +408,19 @@
TurnTimeLeft = 1
end
- for i = 0,5 do
+ totalComment = ""
+ for i = 0,(TeamsCount-1) do
if teamNameArr[i] ~= " " then -- i
teamComment[i] = teamNameArr[i] .. ": " .. teamScore[teamClan[i]] .. " " .. loc("points") .. "|"
+ totalComment = totalComment .. teamComment[i]
elseif teamNameArr[i] == " " then
teamComment[i] = "|"
end
end
- ShowMission("CONTROL", loc("Team Scores") .. ":", teamComment[0] .. teamComment[1] .. teamComment[2] .. teamComment[3] .. teamComment[4] .. teamComment[5], 0, 1600)
+
+ ShowMission("CONTROL",
+ loc("Team Scores") .. ":",
+ totalComment, 0, 1600)
end
@@ -407,20 +432,6 @@
if (vCircCount >= 500) and (gameWon == false) then
vCircCount = 0
CheckZones()
- --AwardPoints()
-
-
- --[[for i = 0,5 do
-
- if teamNameArr[i] ~= " " then -- i
- teamComment[i] = teamNameArr[i] .. ": " .. teamScore[teamClan[i] ] .. " points|"
- elseif teamNameArr[i] == " " then
- teamComment[i] = "|"
- end
- end
-
- ShowMission("CONTROL", "Team Scores:", teamComment[0] .. teamComment[1] .. teamComment[2] .. teamComment[3] .. teamComment[4] .. teamComment[5], 0, 1600)]]
-
end
-- things we wanna check often
@@ -460,15 +471,37 @@
AddVisualGear(GetX(gear), GetY(gear), vgtBigExplosion, 0, false)
end
+function InABetterPlaceNow(gear)
+ for i = 0, (numhhs-1) do
+ if gear == hhs[i] then
+ hhs[i] = nil
+ end
+ end
+end
+
+function onHogHide(gear)
+ InABetterPlaceNow(gear)
+end
+
+function onHogRestore(gear)
+ match = false
+ for i = 0, (numhhs-1) do
+ if (hhs[i] == nil) and (match == false) then
+ hhs[i] = gear
+ --AddCaption(GetHogName(gear) .. " has reappeared it seems!")
+ --FollowGear(gear)
+ match = true
+ end
+ end
+end
+
function onGearAdd(gear)
if GetGearType(gear) == gtHedgehog then
-
hhs[numhhs] = gear
numhhs = numhhs + 1
SetEffect(gear, heResurrectable, true)
-
end
end
@@ -476,13 +509,7 @@
function onGearDelete(gear)
if GetGearType(gear) == gtHedgehog then
- --AddCaption("gear deleted!")
- for i = 0, (numhhs-1) do
- if gear == hhs[i] then
- hhs[i] = nil
- --AddCaption("for real")
- end
- end
+ InABetterPlaceNow(gear)
end
end
Binary file share/hedgewars/Data/Maps/Ruler/preview.png has changed
Binary file share/hedgewars/Data/Maps/ShoppaKing/map.png has changed
Binary file share/hedgewars/Data/Maps/TrophyRace/map.png has changed
--- a/share/hedgewars/Data/Missions/Training/Basic_Training_-_Sniper_Rifle.lua Wed Sep 14 22:27:22 2011 +0200
+++ b/share/hedgewars/Data/Missions/Training/Basic_Training_-_Sniper_Rifle.lua Wed Sep 14 22:39:39 2011 +0200
@@ -189,6 +189,7 @@
elseif score == 3 then
spawnTarget(2080,780)
elseif score == 4 then
+ AddCaption(loc("Good so far!") .. " " .. loc("Keep it up!"));
blowUp(1730,1226)
blowUp(1440,1595)
blowUp(1527,1575)
@@ -213,8 +214,10 @@
elseif score == 10 then
spawnTarget(2930,1500)
elseif score == 11 then
+ AddCaption(loc("This one's tricky."));
spawnTarget(700,720)
elseif score == 12 then
+ AddCaption(loc("Well done."));
blowUp(914,1222)
blowUp(1050,1222)
blowUp(1160,1008)
@@ -239,6 +242,7 @@
elseif score == 17 then
spawnTarget(2080,820)
elseif score == 18 then
+ AddCaption(loc("Demolition is fun!"));
blowUp(2110,920)
blowUp(2210,920)
blowUp(2200,305)
@@ -260,6 +264,7 @@
elseif score == 21 then
spawnTarget(2590,-100)
elseif score == 22 then
+ AddCaption(loc("Will this ever end?"));
blowUp(2790,305)
blowUp(2930,305)
blowUp(3060,305)
@@ -271,7 +276,6 @@
blowUp(2805,630)
blowUp(2805,760)
blowUp(2805,890)
- blowUp(2700,890)
blowUp(3258,370)
blowUp(3258,475)
blowUp(3264,575)
@@ -291,6 +295,7 @@
elseif score == 29 then
spawnTarget(3670,0)
elseif score == 30 then
+ AddCaption(loc("Last Target!"));
spawnTarget(3480,1200)
end
else
--- a/share/hedgewars/Data/Missions/Training/User_Mission_-_Bamboo_Thicket.lua Wed Sep 14 22:27:22 2011 +0200
+++ b/share/hedgewars/Data/Missions/Training/User_Mission_-_Bamboo_Thicket.lua Wed Sep 14 22:39:39 2011 +0200
@@ -18,12 +18,13 @@
Explosives = 0
Map = "Bamboo"
Theme = "Bamboo"
+ SuddenDeathTurns = 99999
AddTeam(loc("Pathetic Resistance"), 14483456, "Simple", "Island", "Default")
player = AddHog("Ikeda", 0, 10, "StrawHat")
AddTeam(loc("Cybernetic Empire"), 1175851, "Simple", "Island", "Default")
- enemy = AddHog(loc("Unit 835"), 1, 10, "cyborg")
+ enemy = AddHog(loc("Unit 835"), 1, 10, "cyborg1")
SetGearPosition(player,1166,1680)
SetGearPosition(enemy,2848,1443)
--- a/share/hedgewars/Data/Missions/Training/User_Mission_-_Dangerous_Ducklings.lua Wed Sep 14 22:27:22 2011 +0200
+++ b/share/hedgewars/Data/Missions/Training/User_Mission_-_Dangerous_Ducklings.lua Wed Sep 14 22:39:39 2011 +0200
@@ -28,13 +28,14 @@
Delay = 0 -- The delay between each round
Map = "Bath" -- The map to be played
Theme = "Bath" -- The theme to be used
+ SuddenDeathTurns = 99999
AddTeam(loc("Bloody Rookies"), 14483456, "Simple", "Island", "Default")
player = AddHog(loc("Hunter"), 0, 1, "NoHat")
--AddTeam("Instructors", 14483456, "Simple", "Island", "Default")
- instructor = AddHog(loc("Instructor"), 1, 1, "Vega")
+ instructor = AddHog(loc("Instructor"), 1, 1, "sf_vega")
AddTeam("Blue Team", 29439, "Simple", "Island", "Default")
enemy = AddHog("Filthy Blue", 1, 100, "Skull")
--- a/share/hedgewars/Data/Missions/Training/User_Mission_-_Diver.lua Wed Sep 14 22:27:22 2011 +0200
+++ b/share/hedgewars/Data/Missions/Training/User_Mission_-_Diver.lua Wed Sep 14 22:39:39 2011 +0200
@@ -20,6 +20,7 @@
Delay = 10 -- The delay between each round
Map = "Hydrant" -- The map to be played
Theme = "City" -- The theme to be used
+ SuddenDeathTurns = 99999
AddTeam(loc("Bloody Rookies"), 14483456, "Simple", "Island", "Default")
player = AddHog(loc("Hunter"), 0, 1, "NoHat")
--- a/share/hedgewars/Data/Missions/Training/User_Mission_-_Newton_and_the_Hammock.lua Wed Sep 14 22:27:22 2011 +0200
+++ b/share/hedgewars/Data/Missions/Training/User_Mission_-_Newton_and_the_Hammock.lua Wed Sep 14 22:39:39 2011 +0200
@@ -25,7 +25,7 @@
player = AddHog("Ikeda", 0, 48, "StrawHat")
AddTeam(loc("Cybernetic Empire"), 1175851, "Simple", "Island", "Default")
- enemy = AddHog(loc("Unit") .. " 811", 1, 100, "cyborg")
+ enemy = AddHog(loc("Unit") .. " 811", 1, 100, "cyborg1")
SetGearPosition(player, 1454, 1540)
SetGearPosition(enemy, 2488, 1960)
--- a/share/hedgewars/Data/Missions/Training/User_Mission_-_Spooky_Tree.lua Wed Sep 14 22:27:22 2011 +0200
+++ b/share/hedgewars/Data/Missions/Training/User_Mission_-_Spooky_Tree.lua Wed Sep 14 22:39:39 2011 +0200
@@ -26,6 +26,7 @@
Delay = 10 -- The delay between each round
Map = "Tree" -- The map to be played
Theme = "Halloween" -- The theme to be used
+ SuddenDeathTurns = 99999
AddTeam(loc("Bloody Rookies"), 14483456, "Simple", "Island", "Default")
player = AddHog(loc("Hunter"), 0, 1, "NoHat")
--- a/share/hedgewars/Data/Missions/Training/User_Mission_-_Teamwork.lua Wed Sep 14 22:27:22 2011 +0200
+++ b/share/hedgewars/Data/Missions/Training/User_Mission_-_Teamwork.lua Wed Sep 14 22:39:39 2011 +0200
@@ -12,7 +12,6 @@
-- Things we don't modify here will use their default values.
Seed = 0 -- The base number for the random number generator
GameFlags = gfDisableWind-- Game settings and rules
- SuddenDeathTurns = 9999
TurnTime = 30000 -- The time the player has to move each round (in ms)
CaseFreq = 0 -- The frequency of crate drops
MinesNum = 0 -- The number of mines being placed
@@ -21,6 +20,7 @@
Delay = 10 -- The delay between each round
Map = "Mushrooms" -- The map to be played
Theme = "Nature" -- The theme to be used
+ SuddenDeathTurns = 99999
AddTeam(loc("Feeble Resistance"), 14483456, "Simple", "Island", "Default")
player = AddHog(string.format(loc("Pathetic Hog #%d"), 1), 0, 50, "NoHat")
@@ -28,7 +28,7 @@
--AddTeam("Toxic Team", 1175851, "Simple", "Island", "Robot","cm_binary")
AddTeam(loc("Cybernetic Empire"), 1175851, "Simple", "Island", "Robot", "cm_binary")
- enemy = AddHog(loc("Unit 3378"), 5, 30, "cyborg")
+ enemy = AddHog(loc("Unit 3378"), 5, 30, "cyborg1")
SetGearPosition(player, 2427, 1259)
SetGearPosition(p2, 2293, 1263)
--- a/share/hedgewars/Data/Missions/Training/User_Mission_-_That_Sinking_Feeling.lua Wed Sep 14 22:27:22 2011 +0200
+++ b/share/hedgewars/Data/Missions/Training/User_Mission_-_That_Sinking_Feeling.lua Wed Sep 14 22:39:39 2011 +0200
@@ -10,6 +10,8 @@
local genCounter = 0
local waterCounter = 0
local waterPix = 0
+local frig = 0
+local watGear = nil
-- allow skipping of the intro via hitting precise key
function onPrecise()
@@ -34,19 +36,20 @@
Delay = 10
Map = "Islands"
Theme = "City"
+ SuddenDeathTurns = 1
AddTeam(loc("Nameless Heroes"), 14483456, "Simple", "Island", "Default")
player = AddHog(loc("The Nameless One"), 0, 1, "NoHat")
AddTeam(loc("Hapless Hogs"), 1175851, "Simple", "Island", "Default")
- hh[0] = AddHog(loc("Sinky"), 1, 100, "lemon")
- hh[1] = AddHog(loc("Drowner"), 1, 100, "orange")
- hh[2] = AddHog(loc("Heavy"), 1, 100, "Teapot")
- hh[3] = AddHog(loc("Clumsy"), 1, 100, "SauceBoatSilver")
- hh[4] = AddHog(loc("Silly"), 1, 100, "Ladle")
+ hh[0] = AddHog(loc("Sinky"), 1, 100, "fr_lemon")
+ hh[1] = AddHog(loc("Drowner"), 1, 100, "fr_orange")
+ hh[2] = AddHog(loc("Heavy"), 1, 100, "dish_Teapot")
+ hh[3] = AddHog(loc("Clumsy"), 1, 100, "dish_SauceBoatSilver")
+ hh[4] = AddHog(loc("Silly"), 1, 100, "dish_Ladle")
hh[5] = AddHog(loc("Careless"), 1, 100, "StrawHatEyes")
- hh[6] = AddHog(loc("Sponge"), 1, 100, "Chunli")
- hh[7] = AddHog(loc("Deadweight"), 1, 100, "Teacup")
+ hh[6] = AddHog(loc("Sponge"), 1, 100, "sf_chunli")
+ hh[7] = AddHog(loc("Deadweight"), 1, 100, "dish_Teacup")
SetGearPosition(player, 3992, 733)
SetGearPosition(hh[0], 938, 1369)
@@ -83,15 +86,26 @@
-- intro sequence
if introStage < 100 then
- AddCaption(loc("Press [Precise] to skip intro"))
+ frig = frig + 1
+ if frig == 50 then
+ frig = 0
+ AddCaption(loc("Press [Precise] to skip intro"))
+ if watGear ~= nil then
+ FollowGear(watGear)
+ end
+ end
+
+ --AddCaption(loc("Press [Precise] to skip intro"))
genCounter = genCounter + 1
if introStage == 0 then
- FollowGear(hh[0])
+
+ --FollowGear(hh[0])
if genCounter == 2000 then
+ watGear = hh[0]
HogSay(hh[0], loc("This rain is really something..."), SAY_SAY,2)
elseif genCounter == 5000 then
introStage = 1
@@ -99,10 +113,11 @@
end
elseif introStage == 1 then
-
- FollowGear(hh[1])
+
+ --FollowGear(hh[1])
if genCounter == 2000 then
+ watGear = hh[1]
HogSay(hh[1], loc("Heh, it's not that bad."), SAY_SAY,2)
elseif genCounter == 5000 then
introStage = 2
@@ -111,9 +126,10 @@
elseif introStage == 2 then
- FollowGear(hh[0])
+ --FollowGear(hh[0])
if genCounter == 2000 then
+ watGear = hh[0]
HogSay(hh[0], loc("You'd almost swear the water was rising!"), SAY_SHOUT,2)
elseif genCounter == 6000 then
introStage = 3
@@ -122,9 +138,10 @@
elseif introStage == 3 then
- FollowGear(hh[1])
+ --FollowGear(hh[1])
if genCounter == 2000 then
+ watGear = hh[1]
HogSay(hh[1], loc("Haha, now THAT would be something!"), SAY_SAY,2)
elseif genCounter == 6000 then
introStage = 4
@@ -133,9 +150,10 @@
elseif introStage == 4 then
- FollowGear(hh[0])
+ --FollowGear(hh[0])
if genCounter == 2000 then
+ watGear = hh[0]
HogSay(hh[0], loc("Hahahaha!"), SAY_SHOUT,2)
HogSay(hh[1], loc("Hahahaha!"), SAY_SHOUT,2)
elseif genCounter == 3000 then
@@ -145,9 +163,10 @@
elseif introStage == 5 then
- FollowGear(hh[1])
+ --FollowGear(hh[1])
if genCounter == 2000 then
+ watGear = hh[1]
HogSay(hh[0], loc("..."), SAY_THINK,2)
HogSay(hh[1], loc("..."), SAY_THINK,2)
elseif genCounter == 5000 then
@@ -157,9 +176,10 @@
elseif introStage == 6 then
- FollowGear(hh[0])
+ --FollowGear(hh[0])
if genCounter == 2000 then
+ watGear = hh[0]
HogSay(hh[0], loc("It's a good thing SUDDEN DEATH is 99 turns away..."), SAY_THINK,2)
elseif genCounter == 6000 then
introStage = 7
@@ -194,6 +214,11 @@
SetHealth(player, 0)
TurnTimeLeft = 1
ShowMission(loc("That Sinking Feeling"), loc("MISSION SUCCESS"), loc("You saved") .. " " .. hhCount .. " " .. loc("Hapless Hogs") .."!", 0, 0)
+
+ if hhCount == 8 then
+ AddCaption(loc("Achievement Unlocked") .. ": " .. loc("Lively Lifeguard"),0xffba00ff,capgrpMessage2)
+ end
+
end
end
--- a/share/hedgewars/Data/Names/cowboy.txt Wed Sep 14 22:27:22 2011 +0200
+++ b/share/hedgewars/Data/Names/cowboy.txt Wed Sep 14 22:39:39 2011 +0200
@@ -7,7 +7,7 @@
Tom
Ernesto
Douglas
-Mario
+sm_mario
Jose
Francisco
Brian
--- a/share/hedgewars/Data/Names/ninja.txt Wed Sep 14 22:27:22 2011 +0200
+++ b/share/hedgewars/Data/Names/ninja.txt Wed Sep 14 22:39:39 2011 +0200
@@ -6,4 +6,4 @@
Arashi
Bushi
Itami
-Kenshi
+sf_kenshi
--- a/share/hedgewars/Data/Names/types.ini Wed Sep 14 22:27:22 2011 +0200
+++ b/share/hedgewars/Data/Names/types.ini Wed Sep 14 22:39:39 2011 +0200
@@ -12,10 +12,10 @@
#####
Fruit
#####
-apple
-banana
-lemon
-orange
+fr_apple
+fr_banana
+fr_lemon
+fr_orange
#####
Indians
Apache
@@ -37,13 +37,13 @@
Possessed
Parasites
#####
-BrainSlug
-BrainSlugMouth
-BrainSlugMouth
+scif_BrainSlug
+scif_BrainSlug2
+scif_BrainSlug2
#####
Bunnies
#####
-Bunny
+zoo_Bunny
#####
Detectives
#####
@@ -79,9 +79,9 @@
#####
StarHogs
#####
-darthvader
-stormtrooper
-stormtrooper
+scif_swDarthvader
+scif_swStormtrooper
+scif_swStormtrooper
#####
Hogtrix
#####
@@ -89,24 +89,24 @@
#####
Hog Fighters
#####
-Balrog
-Blanka
-BlankaToothless
-Chunli
-Guile
-Honda
-Ken
-Ryu
-Vega
+sf_balrog
+sf_blanka
+sf_blankatoothless
+sf_chunli
+sf_guile
+sf_honda
+sf_ken
+sf_ryu
+sf_vega
#####
Mushroom Kingdom
#####
-Mario
-Luigi
-PrincessPeach
-PrincessDaisy
-Toad
-Wario
+sm_mario
+sm_luigi
+sm_peach
+sm_daisy
+sm_toad
+sm_wario
#####
Honor
#####
@@ -120,13 +120,13 @@
#####
Rainbow
#####
-GreenHair
-BlueHair
-RedHair
-OrangeHair
-YellowHair
-PurpleHair
-GreyHair
+hair_green
+hair_blue
+hair_red
+hair_orange
+hair_yellow
+hair_purple
+hair_grey
#####
Pride
#####
@@ -146,17 +146,17 @@
#####
Pocket Pros
#####
-ash
-charmander
-chikorita
-diglett
-jigglypuff
-lugia
-mudkip
-pikachu
-slowpoke
-squirtle
-voltorb
+poke_ash
+poke_charmander
+poke_chikorita
+poke_diglett
+poke_jigglypuff
+poke_lugia
+poke_mudkip
+poke_pikachu
+poke_slowpoke
+poke_squirtle
+poke_voltorb
#####
Vikings
#####
--- a/share/hedgewars/Data/Scripts/Multiplayer/Balanced_Random_Weapon.lua Wed Sep 14 22:27:22 2011 +0200
+++ b/share/hedgewars/Data/Scripts/Multiplayer/Balanced_Random_Weapon.lua Wed Sep 14 22:39:39 2011 +0200
@@ -18,16 +18,16 @@
function randomAmmo()
local n = 3 --"points" to be allocated on weapons
-
+
--pick random weapon and subtract cost
local r = GetRandom(table.maxn(weapons_values)) + 1
local picked_items = {}
table.insert(picked_items, weapons[r])
n = n - weapons_values[r]
-
-
+
+
--choose any weapons or utilities to use up remaining n
-
+
while n > 0 do
local items = {}
local items_values = {}
@@ -63,12 +63,12 @@
end
end
end
-
+
local r = GetRandom(table.maxn(items_values)) + 1
table.insert(picked_items, items[r])
n = n - items_values[r]
end
-
+
return picked_items
end
@@ -111,7 +111,7 @@
function onAmmoStoreInit()
SetAmmo(amSkip, 9, 0, 0, 0)
-
+
SetAmmo(amExtraDamage, 0, 1, 0, 1)
SetAmmo(amInvulnerable, 0, 1, 0, 1)
SetAmmo(amExtraTime, 0, 1, 0, 1)
--- a/share/hedgewars/Data/Scripts/Multiplayer/Capture_the_Flag.lua Wed Sep 14 22:27:22 2011 +0200
+++ b/share/hedgewars/Data/Scripts/Multiplayer/Capture_the_Flag.lua Wed Sep 14 22:39:39 2011 +0200
@@ -1,5 +1,5 @@
---------------------------------------
--- CAPTURE_THE_FLAG GAMEPLAY MODE 0.4
+-- CAPTURE_THE_FLAG GAMEPLAY MODE 0.5
-- by mikade
---------------------------------------
@@ -61,6 +61,15 @@
-- changed starting feedback a little
-- increased the radius around the circle indicating the flag thief so that it doesn't obscure his health
+--------
+-- 0.5
+--------
+
+-- add support for more players
+-- allow limited sudden death
+-- stop TimeBox ruining my life
+-- profit???
+
-----------------
--SCRIPT BEGINS
-----------------
@@ -75,7 +84,7 @@
------------------ "Oh well, they probably have the memory"
local gameStarted = false
-local gameTurns = 0
+local gameTurns = 0
--------------------------
-- hog and team tracking variales
@@ -133,14 +142,14 @@
if fCaptures[teamID] == 3 then
for i = 0, (numhhs-1) do
- if hhs[i] ~= nil then
+ if hhs[i] ~= nil then
if GetHogClan(hhs[i]) == alt then
SetEffect(hhs[i], heResurrectable, false)
SetHealth(hhs[i],0)
end
end
end
- if CurrentHedgehog ~= nil then
+ if CurrentHedgehog ~= nil then
ShowMission(loc("GAME OVER!"), loc("Victory for the ") .. GetHogTeamName(CurrentHedgehog), loc("Hooray!"), 0, 0)
end
end
@@ -156,18 +165,18 @@
wtf = 1
bbq = 0
end
-
+
-- player has successfully captured the enemy flag
if (GetHogClan(CurrentHedgehog) == wtf) and (CurrentHedgehog == fThief[bbq]) and (fIsMissing[wtf] == false) then
-
+
DeleteVisualGear(fGear[wtf])
- fGear[wtf] = nil -- the flag has now disappeared
-
+ fGear[wtf] = nil -- the flag has now disappeared
+
fIsMissing[wtf] = false
fNeedsRespawn[wtf] = true
fIsMissing[bbq] = false
fNeedsRespawn[bbq] = true
- fCaptures[wtf] = fCaptures[wtf] +1
+ fCaptures[wtf] = fCaptures[wtf] +1
ShowMission(loc("You have SCORED!!"), GetHogTeamName(CurrentHedgehog) .. ": " .. fCaptures[wtf], loc("Opposing Team: ") .. fCaptures[bbq], 0, 0)
PlaySound(sndVictory)
fThief[bbq] = nil -- player no longer has the enemy flag
@@ -175,23 +184,23 @@
--if the player is returning the flag
elseif (GetHogClan(CurrentHedgehog) == wtf) and (fIsMissing[wtf] == true) then
-
+
DeleteVisualGear(fGear[wtf])
fGear[wtf] = nil -- the flag has now disappeared
-
- fNeedsRespawn[wtf] = true
+
+ fNeedsRespawn[wtf] = true
HandleRespawns() -- this will set fIsMissing[wtf] to false :)
AddCaption(loc("Flag returned!"))
-
+
--if the player is taking the enemy flag
elseif GetHogClan(CurrentHedgehog) == bbq then
-
+
DeleteVisualGear(fGear[wtf])
- fGear[wtf] = nil -- the flag has now disappeared
-
+ fGear[wtf] = nil -- the flag has now disappeared
+
fIsMissing[wtf] = true
for i = 0,numhhs-1 do
- if CurrentHedgehog ~= nil then
+ if CurrentHedgehog ~= nil then
if CurrentHedgehog == hhs[i] then
fThief[wtf] = hhs[i]
end
@@ -200,23 +209,23 @@
AddCaption(loc("Flag captured!"))
end
-
+
end
-function CheckFlagProximity()
+function CheckFlagProximity()
for i = 0, 1 do
if fGear[i] ~= nil then
-
+
g1X = fGearX[i]
- g1Y = fGearY[i]
-
+ g1Y = fGearY[i]
+
g2X, g2Y = GetGearPosition(CurrentHedgehog)
q = g1X - g2X
w = g1Y - g2Y
dist = (q*q) + (w*w)
-
+
if dist < 500 then --1600
DoFlagStuff(fGear[i])
end
@@ -233,7 +242,7 @@
if fNeedsRespawn[i] == true then
fGear[i] = AddVisualGear(fSpawnX[i],fSpawnY[i],vgtCircle,0,true)
fGearX[i] = fSpawnX[i]
- fGearY[i] = fSpawnY[i]
+ fGearY[i] = fSpawnY[i]
fNeedsRespawn[i] = false
fIsMissing[i] = false -- new, this should solve problems of a respawned flag being "returned" when a player tries to score
@@ -256,16 +265,16 @@
end
if fThief[wtf] ~= nil then
- -- falls into water
- --ShowMission(LAND_HEIGHT, fThiefY[wtf], (LAND_HEIGHT - fThiefY[wtf]), 0, 0)
+ -- falls into water
+ --ShowMission(LAND_HEIGHT, fThiefY[wtf], (LAND_HEIGHT - fThiefY[wtf]), 0, 0)
if (LAND_HEIGHT - fThiefY[wtf]) < 15 then
fIsMissing[wtf] = true
fNeedsRespawn[wtf] = true
HandleRespawns()
- else --normally
+ else --normally
fGearX[wtf] = fThiefX[wtf]
- fGearY[wtf] = fThiefY[wtf]
- fGear[wtf] = AddVisualGear(fGearX[wtf],fGearY[wtf],vgtCircle,0,true)
+ fGearY[wtf] = fThiefY[wtf]
+ fGear[wtf] = AddVisualGear(fGearX[wtf],fGearY[wtf],vgtCircle,0,true)
end
AddVisualGear(fThiefX[wtf], fThiefY[wtf], vgtBigExplosion, 0, false)
@@ -281,14 +290,14 @@
fGearTimer = 0
fGearRad = fGearRad + 1
if fGearRad > fGearRadMax then
- fGearRad = fGearRadMin
+ fGearRad = fGearRadMin
end
end
for i = 0, 1 do
-
+
--SetVisualGearValues(fSpawnC[i], fSpawnX[i],fSpawnY[i], 20, 200, 0, 0, 100, 50, 3, fCol[i]) -- draw a circ for spawning area
-
+
if fIsMissing[i] == false then -- draw a flag marker at the flag's spawning place
SetVisualGearValues(fCirc[i], fSpawnX[i],fSpawnY[i], 20, 20, 0, 10, 0, 33, 3, fCol[i])
if fGear[i] ~= nil then -- draw the flag gear itself
@@ -299,12 +308,12 @@
SetVisualGearValues(fCirc[i], fThiefX[i], fThiefY[i], 20, 200, 0, 0, 100, 50, 3, fCol[i])
--AddCaption("circle marking carrier")
elseif fThief[i] == nil then -- draw cirle round dropped flag
- --g1X,g1Y,g4,g5,g6,g7,g8,g9,g10,g11 = GetVisualGearValues(fGear[i])
+ --g1X,g1Y,g4,g5,g6,g7,g8,g9,g10,g11 = GetVisualGearValues(fGear[i])
--SetVisualGearValues(fCirc[i], g1X, g1Y, 20, 200, 0, 0, 100, 33, 2, fCol[i])
SetVisualGearValues(fCirc[i], fGearX[i], fGearY[i], 20, 200, 0, 0, 100, 33, 3, fCol[i])
- --AddCaption('dropped circle marker')
+ --AddCaption('dropped circle marker')
if fGear[i] ~= nil then -- flag gear itself
- --SetVisualGearValues(fGear[i], g1X, g1Y, 20, 200, 0, 0, 100, 10, 4, fCol[i])
+ --SetVisualGearValues(fGear[i], g1X, g1Y, 20, 200, 0, 0, 100, 10, 4, fCol[i])
SetVisualGearValues(fGear[i], fGearX[i], fGearY[i], 20, 200, 0, 0, 100, fGearRad, 2, fCol[i])
--AddCaption('dropped flag itself')
end
@@ -342,7 +351,7 @@
-- make a list of individual team names
- for i = 0, 5 do
+ for i = 0, (TeamsCount-1) do
teamNameArr[i] = i
teamSize[i] = 0
teamIndex[i] = 0
@@ -401,13 +410,13 @@
for i = 0, 1 do
- -- if someone uses kamikaze downwards, this can happen as the hog won't respawn
+ -- if someone uses kamikaze downwards, this can happen as the hog won't respawn
if (LAND_HEIGHT - fSpawnY[i]) < 0 then
tempG = AddGear(0, 0, gtTarget, 0, 0, 0, 0)
- FindPlace(tempG, true, 0, LAND_WIDTH, true)
+ FindPlace(tempG, true, 0, LAND_WIDTH, true)
fSpawnX[i], fSpawnY[i] = GetGearPosition(tempG)
DeleteGear(tempG)
- end
+ end
fGear[i] = AddVisualGear(fSpawnX[i],fSpawnY[i],vgtCircle,0,true)
fCirc[i] = AddVisualGear(fSpawnX[i],fSpawnY[i],vgtCircle,0,true)
@@ -420,11 +429,11 @@
fIsMissing[i] = false
fNeedsRespawn[i] = false
fCaptures[i] = 0
-
- --SetVisualGearValues(zxc, 1000,1000, 20, 100, 0, 10, 1, 100, 5, GetClanColor(0))
-
+
+ --SetVisualGearValues(zxc, 1000,1000, 20, 100, 0, 10, 1, 100, 5, GetClanColor(0))
+
SetVisualGearValues(fSpawnC[i], fSpawnX[i],fSpawnY[i], 20, 100, 0, 10, 0, 75, 5, fCol[i])
-
+
end
end
@@ -436,8 +445,9 @@
function onGameInit()
GameFlags = band(bor(GameFlags, gfDivideTeams), bnot(gfKing + gfForts))
- SuddenDeathTurns = 999 -- suddendeath is off, effectively
- Delay = 10
+ --SuddenDeathTurns = 999 -- suddendeath is off, effectively
+ WaterRise = 0
+ Delay = 10
end
@@ -448,8 +458,8 @@
ShowMission(loc("CAPTURE THE FLAG"), loc("Flags, and their home base will be placed where each team ends their first turn."), "", 0, 0)
RebuildTeamInfo()
-
- -- should gfDivideTeams do this automatically?
+
+ -- should gfDivideTeams do this automatically?
--[[for i = 0, (TeamsCount-1) do
for g = teamIndex[i], (teamIndex[i]+teamSize[i]-1) do
if GetHogClan(hhs[g]) == 0 then
@@ -465,7 +475,7 @@
--zxc = AddVisualGear(fSpawnX[i],fSpawnY[i],vgtCircle,0,true)
-
+
--SetVisualGearValues(zxc, 1000,1000, 20, 255, 1, 10, 0, 200, 1, GetClanColor(0))
--minO,max0 -glowyornot --pulsate timer -- fuckall -- radius -- width -- colour
end
@@ -474,7 +484,7 @@
function onNewTurn()
gameTurns = gameTurns + 1
-
+
if lastTeam ~= GetHogTeamName(CurrentHedgehog) then
lastTeam = GetHogTeamName(CurrentHedgehog)
end
@@ -482,14 +492,14 @@
--AddCaption("Handling respawns")
if gameStarted == true then
HandleRespawns()
- --new method of placing starting flags
+ --new method of placing starting flags
elseif gameTurns == 1 then
ShowMission(loc("CAPTURE THE FLAG"), loc("Flags, and their home base will be placed where each team ends their first turn."), "", 0, 0)
elseif gameTurns == 2 then
fPlaced[0] = true
ShowMission(loc("CAPTURE THE FLAG"), loc("RULES OF THE GAME [Press ESC to view]"), loc(" - Return the enemy flag to your base to score | - First team to 3 captures wins | - You may only score when your flag is in your base | - Hogs will drop the flag if killed, or drowned | - Dropped flags may be returned or recaptured | - Hogs respawn when killed"), 0, 0)
elseif gameTurns == 3 then
- fPlaced[1] = true
+ fPlaced[1] = true
StartTheGame()
end
@@ -525,16 +535,16 @@
CheckFlagProximity()
end
elseif CurrentHedgehog ~= nil then -- if the game hasn't started yet, keep track of where we are gonna put the flags on turn end
-
+
if GetHogClan(CurrentHedgehog) == 0 then
- i = 0
+ i = 0
elseif GetHogClan(CurrentHedgehog) == 1 then
- i = 1
- end
-
+ i = 1
+ end
+
fSpawnX[i] = GetX(CurrentHedgehog)
fSpawnY[i] = GetY(CurrentHedgehog)
-
+
end
end
@@ -562,18 +572,48 @@
end
+function InABetterPlaceNow(gear)
+ for i = 0, (numhhs-1) do
+ if gear == hhs[i] then
+
+ for i = 0,1 do
+ if gear == fThief[i] then
+ FlagThiefDead(gear)
+ end
+ end
+ hhs[i] = nil
+ end
+ end
+end
+
+function onHogHide(gear)
+ InABetterPlaceNow(gear)
+end
+
+function onHogRestore(gear)
+ match = false
+ for i = 0, (numhhs-1) do
+ if (hhs[i] == nil) and (match == false) then
+ hhs[i] = gear
+ --AddCaption(GetHogName(gear) .. " has reappeared it seems!")
+ match = true
+ end
+ end
+end
+
+
function onGearAdd(gear)
if GetGearType(gear) == gtHedgehog then
hhs[numhhs] = gear
numhhs = numhhs + 1
SetEffect(gear, heResurrectable, true)
-
+
elseif GetGearType(gear) == gtPiano then
for i = 0, 1 do
if CurrentHedgehog == fThief[i] then
- FlagThiefDead(gear)
+ FlagThiefDead(gear)
end
end
@@ -584,17 +624,7 @@
function onGearDelete(gear)
if GetGearType(gear) == gtHedgehog then
- for i = 0, (numhhs-1) do
- if gear == hhs[i] then
-
- for i = 0,1 do
- if gear == fThief[i] then
- FlagThiefDead(gear)
- end
- end
- hhs[i] = nil
- end
- end
+ InABetterPlaceNow(gear)
end
end
--- a/share/hedgewars/Data/Scripts/Multiplayer/GaudyRacer.cfg Wed Sep 14 22:27:22 2011 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,2 +0,0 @@
-Default
-Default
--- a/share/hedgewars/Data/Scripts/Multiplayer/GaudyRacer.lua Wed Sep 14 22:27:22 2011 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,730 +0,0 @@
-
-------------------------------------------
--- RACER
--- a crazy, map-independant racing script
--- by mikade
------------------------------------------
-
------------------------------------
---0.1: with apologies to tumbler
------------------------------------
--- added tumbler movement system
--- added weapon systems
--- added timer to stop tumbler
--- added racer circle arrays
--- added changing of circs on contact
--- added a "track complete" etc
-
------------------------------------
---0.2: for your racing convenience
------------------------------------
-
--- added resurrection
--- added team tracking
--- added proper scoring (hopefully, finally)
--- changed showmission icons to match feedback
--- changed circles to be netural colours, and then change to team col
--- cleaned up code
--- cleaned up gameplay: removing control on resurrect, trackcomplete, maxpointset etc
--- improved player feedback: race record, clan record, no record etc.
-
------------------------------------
---0.3: user-requested features
------------------------------------
-
--- hogs now start at the location of the first waypoint \o/
--- added sticky camera. Hog will no longer lose focus on explosions etc.
--- increased maximum complexity for tracks
-
------------------------------------
---0.4: user-requested features
------------------------------------
-
--- added movement trail
--- removed exploder weapon
--- removed mortar weapon
-
------------------------------------
--- 0.5 gaudy feature experimentation
------------------------------------
--- added a booster
--- added flame trail for booster
--- added and removed dx/dy on mortar launch
--- added and removed keypress-based mortar fire
--- changed mortar for a gtShell, probably more useful for tunneling
--- added dx/dy *2 shell fire
-
-----------------------------------
--- 0.6 modesty / display mod
-----------------------------------
--- author branding removed
--- version numbers removed
-
------------------------------
--- SCRIPT BEGINS
------------------------------
-
--- enable awesome translaction support so we can use loc() wherever we want
-loadfile(GetDataPath() .. "Scripts/Locale.lua")()
-
-------------------
--- Got Variables?
-------------------
-
-local roundLimit = 3
-local roundNumber = 0
-local firstClan = 10
-
-local versionNo = loc("v.06")
-
---------------------------
--- hog and team tracking variales
---------------------------
-
-local numhhs = 0 -- store number of hedgehogs
-local hhs = {} -- store hedgehog gears
-
-local numTeams -- store the number of teams in the game
-local teamNameArr = {} -- store the list of teams
-local teamClan = {}
-local teamSize = {} -- store how many hogs per team
-local teamIndex = {} -- at what point in the hhs{} does each team begin
-
-local teamComment = {}
-local teamScore = {}
-
----------
--- tumbler stuff
----------
-
-local moveTimer = 0
-local leftOn = false
-local rightOn = false
-local upOn = false
-local downOn = false
-
-local shotsMax = 30 --10
-local shotsLeft = 10
-
-local TimeLeftCounter = 0
-local TimeLeft = 60
-local stopMovement = false
-local tumbleStarted = false
-
--------
--- racer vars
---------
-
-local boosterOn = false
-local boosterFuel = 75
-local boosterPower = 0.3
-local boosterTimer = 0
-
-local bestClan = nil
-local bestTime = nil
-
-local gameBegun = false
-local gameOver = false
-local racerActive = false
-local trackTime = 0
-local wpCheckCounter = 0
-
-local wpCirc = {}
-local wpX = {}
-local wpY = {}
-local wpCol = {}
-local wpActive = {}
-local wpRad = 75
-local wpCount = 0
-local wpLimit = 20
-
--------------------
--- general methods
--------------------
-
-function RebuildTeamInfo()
-
-
- -- make a list of individual team names
- for i = 0, 7 do
- teamNameArr[i] = " " -- = i
- teamSize[i] = 0
- teamIndex[i] = 0
- teamScore[i] = 100000
- end
- numTeams = 0
-
- for i = 0, (numhhs-1) do
-
- z = 0
- unfinished = true
- while(unfinished == true) do
-
- newTeam = true
- tempHogTeamName = GetHogTeamName(hhs[i]) -- this is the new name
-
- if tempHogTeamName == teamNameArr[z] then
- newTeam = false
- unfinished = false
- end
-
- z = z + 1
-
- if z == TeamsCount then
- unfinished = false
- if newTeam == true then
- teamNameArr[numTeams] = tempHogTeamName
- numTeams = numTeams + 1
- end
- end
-
- end
-
- end
-
- -- find out how many hogs per team, and the index of the first hog in hhs
- for i = 0, (numTeams-1) do
- for z = 0, (numhhs-1) do
- if GetHogTeamName(hhs[z]) == teamNameArr[i] then
- teamClan[i] = GetHogClan(hhs[z])
- if teamSize[i] == 0 then
- teamIndex[i] = z -- should give starting index
- end
- teamSize[i] = teamSize[i] + 1
- --add a pointer so this hog appears at i in hhs
- end
- end
-
- end
-
-end
-
-
------------------
--- RACER METHODS
------------------
-
-function GetSpeed()
-
- dx, dy = GetGearVelocity(CurrentHedgehog)
-
- x = dx*dx
- y = dy*dy
- z = x+y
-
- z = z*100
-
- k = z%1
-
- if k ~= 0 then
- z = z - k
- end
-
- return(z)
-
-end
-
-function CheckWaypoints()
-
- trackFinished = true
-
- for i = 0, (wpCount-1) do
-
- g1X, g1Y = GetGearPosition(CurrentHedgehog)
- g2X, g2Y = wpX[i], wpY[i]
-
- g1X = g1X - g2X
- g1Y = g1Y - g2Y
- dist = (g1X*g1X) + (g1Y*g1Y)
-
- --if i == 0 then
- -- AddCaption(dist .. "/" .. (wpRad*wpRad) )
- --end
-
- if dist < (wpRad*wpRad) then
- --AddCaption("howdy")
- wpActive[i] = true
- wpCol[i] = GetClanColor(GetHogClan(CurrentHedgehog)) -- new --GetClanColor(1)
- SetVisualGearValues(wpCirc[i], wpX[i], wpY[i], 20, 100, 0, 10, 0, wpRad, 5, wpCol[i])
- end
-
- if wpActive[i] == false then
- trackFinished = false
- end
-
- end
-
- return(trackFinished)
-
-end
-
-function AdjustScores()
-
- --[[if bestTime == nil then
- bestTime = 100000
- bestClan = 10
- bestTimeComment = "N/A"
- else
- bestTimeComment = (bestTime/1000) ..loc("s")
- end]]
-
- if bestTime == nil then
- bestTime = 100000
- bestClan = 10
- bestTimeComment = "N/A"
- end
-
- newScore = false
-
- -- update this clan's time if the new track is better
- for i = 0, (numTeams-1) do
- if teamClan[i] == GetHogClan(CurrentHedgehog) then
- if trackTime < teamScore[i] then
- teamScore[i] = trackTime
- newScore = true
- else
- newScore = false
- end
- end
- end
-
- --bestTime = 100000
- --bestClan = 10
-
- -- find the best time out of those so far
- for i = 0, (numTeams-1) do
- if teamScore[i] < bestTime then
- bestTime = teamScore[i]
- bestClan = teamClan[i]
- end
- end
-
- if bestTime ~= 100000 then
- bestTimeComment = (bestTime/1000) ..loc("s")
- end
-
- if newScore == true then
- if trackTime == bestTime then -- best time of the race
- ShowMission("RACER", loc("TRACK COMPLETED"), loc("NEW RACE RECORD: ") .. (trackTime/1000) ..loc("s") .. "|" .. loc("WINNING TIME: ") .. bestTimeComment, 0, 4000)
- else -- best time for the clan
- ShowMission("RACER", loc("TRACK COMPLETED"), loc("NEW CLAN RECORD: ") .. (trackTime/1000) ..loc("s") .. "|" .. loc("WINNING TIME: ") .. bestTimeComment, 4, 4000)
- end
- else -- not any kind of new score
- ShowMission("RACER", loc("TRACK COMPLETED"), loc("TIME: ") .. (trackTime/1000) ..loc("s") .. "|" .. loc("WINNING TIME: ") .. bestTimeComment, -amSkip, 4000)
- end
-
-end
-
-function CheckForNewRound()
-
- if GetHogClan(CurrentHedgehog) == firstClan then
-
- roundNumber = roundNumber + 1
-
- for i = 0, 7 do
- if teamNameArr[i] ~= " " then -- teamScore[teamClan[i]]
- teamComment[i] = teamNameArr[i] .. ": " .. (teamScore[i]/1000) .. loc("s|")
- elseif teamNameArr[i] == " " then
- teamComment[i] = "|"
- end
- end
- ShowMission("RACER", loc("STATUS UPDATE"), loc("Rounds Complete") .. ": " .. roundNumber .. "/" .. roundLimit .. "|" .. " " .. "|" .. loc("Best Team Times: ") .. "|" .. teamComment[0] .. teamComment[1] .. teamComment[2] .. teamComment[3] .. teamComment[4] .. teamComment[5] .. teamComment[6] .. teamComment[7], 0, 1600)
-
- -- end game if its at round limit
- if roundNumber == roundLimit then
- for i = 0, (numhhs-1) do
- if GetHogClan(hhs[i]) ~= bestClan then
- SetEffect(hhs[i], heResurrectable, false)
- SetHealth(hhs[i],0)
- end
- end
- gameOver = true
- TurnTimeLeft = 1
- end
-
- end
-
-end
-
-function DisableTumbler()
- stopMovement = true
- upOn = false
- down = false
- leftOn = false
- rightOn = false
- boosterOn = false
-end
-
-----------------------------------
--- GAME METHODS / EVENT HANDLERS
-----------------------------------
-
-function onGameInit()
- --Theme = "Hell"
- --GameFlags
- --GameFlags = gfDisableWind
-end
-
-
-function onGameStart()
- RebuildTeamInfo()
- ShowMission("RACER", "", "", 4, 4000)
-end
-
-function onHJump()
- if (shotsLeft > 0) and (CurrentHedgehog ~= nil) and (stopMovement == false) and (tumbleStarted == true) then -- seems to not work with a hedgehog nil chek
-
- shotsLeft = shotsLeft - 1
- morte = AddGear(GetX(CurrentHedgehog), GetY(CurrentHedgehog), gtShell, 0, 0, 0, 1)
- AddCaption(loc("Shots Left: ") .. shotsLeft)
-
-
- -- based on player movement already
- CopyPV(CurrentHedgehog, morte) -- new addition
-
- --x2
- x,y = GetGearVelocity(morte)
- x = x*2
- y = y*2
- SetGearVelocity(morte, x, y)
-
- --- or based on keys?
- --[[x = 0
- y = 0
-
- launchPower = 0.5
-
- if leftOn == true then
- x = x - launchPower
- end
- if rightOn == true then
- x = x + launchPower
- end
-
- if upOn == true then
- y = y - launchPower
- end
- if downOn == true then
- y = y + launchPower
- end
-
- SetGearVelocity(morte, x, y)]]
-
-
- end
-end
-
-function onLJump()
-
-
- if (wpCount < wpLimit) and (CurrentHedgehog ~= nil) and (stopMovement == false) and (tumbleStarted == true) and (gameBegun == false) then -- seems to not work with a hedgehog nil chek
-
- wpX[wpCount] = GetX(CurrentHedgehog)
- wpY[wpCount] = GetY(CurrentHedgehog)
- wpCol[wpCount] = 0xffffffff
- wpCirc[wpCount] = AddVisualGear(wpX[wpCount],wpY[wpCount],vgtCircle,0,true)
- --100 --0 --75 --wpCol[wpCount]
- SetVisualGearValues(wpCirc[wpCount], wpX[wpCount], wpY[wpCount], 20, 100, 0, 10, 0, wpRad, 5, wpCol[wpCount])
-
- wpCount = wpCount + 1
-
- AddCaption(loc("Waypoint placed.") .. " " .. loc("Available points remaining: ") .. (wpLimit-wpCount))
-
- if wpCount == wpLimit then
- AddCaption(loc("Race complexity limit reached."))
- DisableTumbler()
- end
-
- end
-
-
- if (boosterFuel > 0) and (CurrentHedgehog ~= nil) and (stopMovement == false) and (tumbleStarted == true) and (gameBegun == true) then
-
- if boosterOn == false then
- boosterOn = true
- else
- boosterOn = false
- end
-
- end
-
-end
-
-function onLeft()
- if (CurrentHedgehog ~= nil) and (stopMovement == false) then
- leftOn = true
- end
-end
-
-function onRight()
- if (CurrentHedgehog ~= nil) and (stopMovement == false) then
- rightOn = true
- end
-end
-
-function onUp()
- if (CurrentHedgehog ~= nil) and (stopMovement == false) then
- upOn = true
- end
-end
-
-function onDown()
- if (CurrentHedgehog ~= nil) and (stopMovement == false) then
- downOn = true
- end
-end
-
-function onDownUp()
- downOn = false
-end
-function onUpUp()
- upOn = false
-end
-function onLeftUp()
- leftOn = false
-end
-function onRightUp()
- rightOn = false
-end
-
-function onNewTurn()
-
- CheckForNewRound()
-
- --if gameOver == false then
- shotsLeft = shotsMax
- stopMovement = false
- tumbleStarted = false
- boosterOn = false
- boosterFuel = 75
- SetTag(AddGear(0, 0, gtATSmoothWindCh, 0, 0, 0, 1), boosterFuel)
- --SetInputMask(band(0xFFFFFFFF, bnot(gmAnimate+gmAttack+gmDown+gmHJump+gmLeft+gmLJump+gmPrecise+gmRight+gmSlot+gmSwitch+gmTimer+gmUp+gmWeapon)))
- --AddGear(GetX(CurrentHedgehog), GetY(CurrentHedgehog), gtGrenade, 0, 0, 0, 1)
- --end
-
-
-
- -- Set the waypoints to unactive on new round
- for i = 0,(wpCount-1) do
- wpActive[i] = false
- wpCol[i] = 0xffffffff
- SetVisualGearValues(wpCirc[i], wpX[i], wpY[i], 20, 100, 0, 10, 0, wpRad, 5, wpCol[i])
- end
-
- -- Handle Starting Stage of Game
- if (gameOver == false) and (gameBegun == false) then
- if wpCount >= 3 then
- gameBegun = true
- racerActive = true
- roundNumber = 0 -- 0
- firstClan = GetHogClan(CurrentHedgehog)
- ShowMission("RACER", loc("GAME BEGUN!!!"), loc("Complete the track as fast as you can!"), 2, 4000)
- else
- ShowMission("RACER", loc("NOT ENOUGH WAYPOINTS"), loc("Place more waypoints using [ENTER]"), 2, 4000)
- end
- end
-
- if gameOver == true then
- gameBegun = false
- stopMovement = true
- tumbleStarted = false
- end
-
-end
-
-function onGameTick()
-
- -- start the player tumbling with a boom once their turn has actually begun
- if tumbleStarted == false then
- if (TurnTimeLeft > 0) and (TurnTimeLeft ~= TurnTime) then
- AddCaption("Good to go!")
- tumbleStarted = true
- racerActive = true
- trackTime = 0
- TimeLeft = 60
-
- -- if the gamehas started put the player in the middle of the first
- --waypoint that was placed
- if gameBegun == true then
- SetGearPosition(CurrentHedgehog, wpX[0], wpY[0])
- AddGear(GetX(CurrentHedgehog), GetY(CurrentHedgehog), gtGrenade, 0, 0, 0, 1)
- FollowGear(CurrentHedgehog)
- else -- otherwise just start him tumbling from wherever he is
- AddGear(GetX(CurrentHedgehog), GetY(CurrentHedgehog), gtGrenade, 0, 0, 0, 1)
- end
-
- end
- end
-
- -- has the player started his tumbling spree?
- if (CurrentHedgehog ~= nil) and (tumbleStarted == true) then
-
- --AddCaption(LOC_NOT("Speed: ") .. GetSpeed())
-
- -- if the RACE has started, show tracktimes and keep tabs on waypoints
- if (racerActive == true) and (gameBegun == true) then
-
- trackTime = trackTime + 1
-
- wpCheckCounter = wpCheckCounter + 1
- if (wpCheckCounter == 100) then
-
- AddCaption(loc("Track Time: ") .. (trackTime/1000) .. loc("s") )
- wpCheckCounter = 0
- if (CheckWaypoints() == true) then
- AdjustScores()
- racerActive = false
- DisableTumbler()
- end
-
- end
-
- end
-
- if boosterOn == true then
- boosterTimer = boosterTimer + 1
- if boosterTimer == 150 then --200
- boosterTimer = 0
- boosterFuel = boosterFuel - 1
- SetTag(AddGear(0, 0, gtATSmoothWindCh, 0, 0, 0, 1), boosterFuel)
- if boosterFuel == 0 then
- boosterOn = false
- end
- end
- end
-
- -- Calculate and display turn time
- TimeLeftCounter = TimeLeftCounter + 1
- if TimeLeftCounter == 1000 then
- TimeLeftCounter = 0
- TimeLeft = TimeLeft - 1
-
- if TimeLeft >= 0 then
- --TurnTimeLeft = TimeLeft
- --AddCaption(LOC_NOT("Time Left: ") .. TimeLeft)
- end
-
- end
-
- -- if the player has expended his tunbling time, stop him tumbling
- if TimeLeft == 0 then
- DisableTumbler()
- end
-
-
- -- handle movement based on IO
- moveTimer = moveTimer + 1
- if moveTimer == 100 then -- 100
- moveTimer = 0
-
- -- keep in mind gravity is acting on the hog
- -- so his down is more powerful than his up
-
- dx, dy = GetGearVelocity(CurrentHedgehog)
-
- dxlimit = 0.4 --0.4
- dylimit = 0.4 --0.4
-
- if boosterOn == true then
-
- --flame trail, now removed
- AddGear(GetX(CurrentHedgehog), GetY(CurrentHedgehog), gtFlame, 0, 0, 0, 0)
- --tempE = AddVisualGear(GetX(CurrentHedgehog), GetY(CurrentHedgehog), vgtDust, 0, false)
-
- dxlimit = dxlimit + boosterPower
- dylimit = dylimit + boosterPower
- else
- tempE = AddVisualGear(GetX(CurrentHedgehog), GetY(CurrentHedgehog), vgtDust, 0, false)
- g1, g2, g3, g4, g5, g6, g7, g8, g9, g10 = GetVisualGearValues(tempE)
- SetVisualGearValues(tempE, g1, g2, g3, g4, g5, g6, g7, g8, g9, GetClanColor(GetHogClan(CurrentHedgehog)) )
- end
-
- if dx > dxlimit then
- dx = dxlimit
- end
- if dy > dylimit then
- dy = dylimit
- end
- if dx < -dxlimit then
- dx = -dxlimit
- end
- if dy < -dylimit then
- dy = -dylimit
- end
-
-
- dxPower = 0.1 --0.1
- dyPower = 0.1 --0.1
-
- if leftOn == true then
- dx = dx - dxPower
- end
- if rightOn == true then
- dx = dx + dxPower
- end
-
- if upOn == true then
- dy = dy - dyPower -- -0.1 -- new addition
- end
- if downOn == true then
- dy = dy + dyPower
- end
-
- --if leftOn == true then
- -- dx = dx - 0.04
- --end
- --if rightOn == true then
- -- dx = dx + 0.04
- --end
-
- --if upOn == true then
- -- dy = dy - 0.1
- --end
- --if downOn == true then
- -- dy = dy + 0.06
- --end
-
- SetGearVelocity(CurrentHedgehog, dx, dy)
-
- end
-
- end
-
-end
-
-function onGearDamage(gear, damage)
- --if gear == CurrentHedgehog then
- -- You are now tumbling
- --end
-end
-
-function onGearResurrect(gear)
-
- AddVisualGear(GetX(gear), GetY(gear), vgtBigExplosion, 0, false)
-
- -- if the player stops and "dies" or flies into water, stop him tumbling
- if gear == CurrentHedgehog then
- DisableTumbler()
- end
-
-end
-
-function onGearAdd(gear)
-
- if GetGearType(gear) == gtHedgehog then
- hhs[numhhs] = gear
- numhhs = numhhs + 1
- SetEffect(gear, heResurrectable, true)
- end
-
-end
-
-function onGearDelete(gear)
- --not needed today, yet
-
- --sticky camera
- if CurrentHedgehog ~= nil then
- FollowGear(CurrentHedgehog)
- end
-
-end
--- a/share/hedgewars/Data/Scripts/Multiplayer/No_Jumping.lua Wed Sep 14 22:27:22 2011 +0200
+++ b/share/hedgewars/Data/Scripts/Multiplayer/No_Jumping.lua Wed Sep 14 22:39:39 2011 +0200
@@ -15,7 +15,7 @@
end
function onGearAdd(gear)
-
+
if (GetGearType(gear) == gtJetpack) or (GetGearType(gear) == gtRope) or (GetGearType(gear) == gtParachute) then
specialGear = gear
SetInputMask(band(0xFFFFFFFF, bnot(gmHJump)))
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/share/hedgewars/Data/Scripts/Multiplayer/Racer.cfg Wed Sep 14 22:39:39 2011 +0200
@@ -0,0 +1,2 @@
+Shoppa
+Shoppa
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/share/hedgewars/Data/Scripts/Multiplayer/Racer.lua Wed Sep 14 22:39:39 2011 +0200
@@ -0,0 +1,622 @@
+
+------------------------------------------
+-- RACER 0.4
+-- map-independant racing script
+-- by mikade
+-----------------------------------------
+
+-----------------------------------
+--0.1: took all the code from crazy racer and scrapped most of it
+-----------------------------------
+
+-- Removed tumbler system
+-- Removed extra adds like boosters etc
+-- Added experimental waypoint placement system
+-- More user feedback
+-- Reduced race complexity limit to 5 waypoints
+-- stop placement at complexity limit reached and end turn
+-- guys dont keep racing after dying
+-- invulnerable feasibility
+-- reverted time keeping method
+-- reduced feedback display time
+-- colour-coded addcaptions
+-- cleaned up code
+-- support for more players properly added
+-- tardis fix
+-- remove airstrikes
+
+-- i think the remainder 0 .456 sec of the tracktime isnt getting reset on newturn
+
+-- update feedback
+
+-------
+-- 0.2
+-------
+
+-- allow gameflags
+-- extend time to 90s
+-- remove other air-attack based weps
+-- turn off water rise for sd
+
+-------
+-- 0.3
+-------
+
+-- prevent WP being placed in land
+-- prevent waypoints being placed outside border
+
+-------
+-- 0.4
+-------
+
+-- update user feedback
+-- add more sounds
+
+-----------------------------
+-- SCRIPT BEGINS
+-----------------------------
+
+loadfile(GetDataPath() .. "Scripts/Locale.lua")()
+
+------------------
+-- Got Variables?
+------------------
+
+local fMod = 1000000 -- 1
+local roundLimit = 3
+local roundNumber = 0
+local firstClan = 10
+
+local fastX = {}
+local fastY = {}
+local fastCount = 0
+local fastIndex = 0
+local fastColour
+
+local currX = {}
+local currY = {}
+local currCount = 0
+
+--------------------------
+-- hog and team tracking variales
+--------------------------
+
+local numhhs = 0 -- store number of hedgehogs
+local hhs = {} -- store hedgehog gears
+
+local numTeams -- store the number of teams in the game
+local teamNameArr = {} -- store the list of teams
+local teamClan = {}
+local teamSize = {} -- store how many hogs per team
+local teamIndex = {} -- at what point in the hhs{} does each team begin
+
+local teamComment = {}
+local teamScore = {}
+
+-------
+-- racer vars
+--------
+
+local cGear = nil
+local gTimer = 0
+
+local bestClan = nil
+local bestTime = nil
+
+local gameBegun = false
+local gameOver = false
+local racerActive = false
+local trackTime = 0
+local wpCheckCounter = 0
+
+local wpCirc = {}
+local wpX = {}
+local wpY = {}
+local wpCol = {}
+local wpActive = {}
+local wpRad = 450 --75
+local wpCount = 0
+local wpLimit = 5
+
+-------------------
+-- general methods
+-------------------
+
+function RebuildTeamInfo()
+
+
+ -- make a list of individual team names
+ for i = 0, (TeamsCount-1) do
+ teamNameArr[i] = " " -- = i
+ teamSize[i] = 0
+ teamIndex[i] = 0
+ teamScore[i] = 100000
+ end
+ numTeams = 0
+
+ for i = 0, (numhhs-1) do
+
+ z = 0
+ unfinished = true
+ while(unfinished == true) do
+
+ newTeam = true
+ tempHogTeamName = GetHogTeamName(hhs[i]) -- this is the new name
+
+ if tempHogTeamName == teamNameArr[z] then
+ newTeam = false
+ unfinished = false
+ end
+
+ z = z + 1
+
+ if z == TeamsCount then
+ unfinished = false
+ if newTeam == true then
+ teamNameArr[numTeams] = tempHogTeamName
+ numTeams = numTeams + 1
+ end
+ end
+
+ end
+
+ end
+
+ -- find out how many hogs per team, and the index of the first hog in hhs
+ for i = 0, (numTeams-1) do
+ for z = 0, (numhhs-1) do
+ if GetHogTeamName(hhs[z]) == teamNameArr[i] then
+ teamClan[i] = GetHogClan(hhs[z])
+ if teamSize[i] == 0 then
+ teamIndex[i] = z -- should give starting index
+ end
+ teamSize[i] = teamSize[i] + 1
+ --add a pointer so this hog appears at i in hhs
+ end
+ end
+
+ end
+
+end
+
+
+-----------------
+-- RACER METHODS
+-----------------
+
+function CheckWaypoints()
+
+ trackFinished = true
+
+ for i = 0, (wpCount-1) do
+
+ g1X, g1Y = GetGearPosition(CurrentHedgehog)
+ g2X, g2Y = wpX[i], wpY[i]
+
+ g1X = g1X - g2X
+ g1Y = g1Y - g2Y
+ dist = (g1X*g1X) + (g1Y*g1Y)
+
+ --if i == 0 then
+ -- AddCaption(dist .. "/" .. (wpRad*wpRad) )
+ --end
+
+ NR = (48/100*wpRad)/2
+
+ if dist < (NR*NR) then
+ --if dist < (wpRad*wpRad) then
+ --AddCaption("howdy")
+ wpActive[i] = true
+ wpCol[i] = GetClanColor(GetHogClan(CurrentHedgehog)) -- new --GetClanColor(1)
+ SetVisualGearValues(wpCirc[i], wpX[i], wpY[i], 20, 100, 1, 10, 0, wpRad, 5, wpCol[i])
+
+ wpRem = 0
+ for k = 0, (wpCount-1) do
+ if wpActive[k] == false then
+ wpRem = wpRem + 1
+ end
+ end
+
+ AddCaption(loc("Way-Points Remaining") .. ": " .. wpRem,0xffba00ff,capgrpAmmoinfo)
+
+ end
+
+ if wpActive[i] == false then
+ trackFinished = false
+ end
+
+ end
+
+ return(trackFinished)
+
+end
+
+function AdjustScores()
+
+ if bestTime == nil then
+ bestTime = 100000
+ bestClan = 10
+ bestTimeComment = "N/A"
+ end
+
+ newScore = false
+
+ -- update this clan's time if the new track is better
+ for i = 0, (numTeams-1) do
+ if teamClan[i] == GetHogClan(CurrentHedgehog) then
+ if trackTime < teamScore[i] then
+ teamScore[i] = trackTime
+ newScore = true
+ else
+ newScore = false
+ end
+ end
+ end
+
+ --bestTime = 100000
+ --bestClan = 10
+
+ -- find the best time out of those so far
+ for i = 0, (numTeams-1) do
+ if teamScore[i] < bestTime then
+ bestTime = teamScore[i]
+ bestClan = teamClan[i]
+ end
+ end
+
+ if bestTime ~= 100000 then
+ bestTimeComment = (bestTime/1000) ..loc("s")
+ end
+
+ if newScore == true then
+ if trackTime == bestTime then -- best time of the race
+ ShowMission(loc("RACER"),
+ loc("TRACK COMPLETED"),
+ loc("NEW RACE RECORD: ") .. (trackTime/1000) ..loc("s") .. "|" ..
+ loc("WINNING TIME: ") .. bestTimeComment, 0, 4000)
+ PlaySound(sndHomerun)
+ else -- best time for the clan
+ ShowMission(loc("RACER"),
+ loc("TRACK COMPLETED"),
+ loc("NEW CLAN RECORD: ") .. (trackTime/1000) ..loc("s") .. "|" ..
+ loc("WINNING TIME: ") .. bestTimeComment, 4, 4000)
+ end
+ else -- not any kind of new score
+ ShowMission(loc("RACER"),
+ loc("TRACK COMPLETED"),
+ loc("TIME: ") .. (trackTime/1000) ..loc("s") .. "|" ..
+ loc("WINNING TIME: ") .. bestTimeComment, -amSkip, 4000)
+ PlaySound(sndHellish)
+ end
+
+
+ --------
+ --new
+ --------
+
+ if bestTime == trackTime then
+ --AddCaption("wooooooooooooooooooooooooooooo")
+
+ fastColour = GetClanColor(GetHogClan(CurrentHedgehog))
+
+ for i = 0, (currCount-1) do
+ fastX[i] = currX[i]
+ fastY[i] = currY[i]
+ end
+
+ fastCount = currCount
+ fastIndex = 0
+
+ --currCount = 0 -- is this needed?
+
+ else
+ currCount = 0
+ fastIndex = 0
+ end
+
+
+end
+
+function CheckForNewRound()
+
+ if GetHogClan(CurrentHedgehog) == firstClan then
+
+ roundNumber = roundNumber + 1
+
+ totalComment = ""
+ for i = 0, (TeamsCount-1) do
+ if teamNameArr[i] ~= " " then -- teamScore[teamClan[i]]
+ teamComment[i] = teamNameArr[i] .. ": " .. (teamScore[i]/1000) .. loc("s|")
+ totalComment = totalComment .. teamComment[i]
+ elseif teamNameArr[i] == " " then
+ teamComment[i] = "|"
+ end
+ end
+
+ ShowMission( loc("RACER"),
+ loc("STATUS UPDATE"),
+ loc("Rounds Complete: ") .. roundNumber .. "/" .. roundLimit .. "|" .. " " .. "|" ..
+ loc("Best Team Times: ") .. "|" .. totalComment, 0, 4000)
+
+ -- end game if its at round limit
+ if roundNumber == roundLimit then
+ for i = 0, (numhhs-1) do
+ if GetHogClan(hhs[i]) ~= bestClan then
+ SetEffect(hhs[i], heResurrectable, false)
+ SetHealth(hhs[i],0)
+ end
+ end
+ gameOver = true
+ TurnTimeLeft = 1
+ end
+
+ end
+
+end
+
+function DisableTumbler()
+ currCount = 0
+ fastIndex = 0
+ TurnTimeLeft = 0
+ racerActive = false -- newadd
+end
+
+function HandleGhost()
+
+ -- get the current xy of the racer at this point
+ currX[currCount] = GetX(CurrentHedgehog)
+ currY[currCount] = GetY(CurrentHedgehog)
+ currCount = currCount + 1
+
+ -- draw a ping of smoke where the fastest player was at this point
+ if (fastCount ~= 0) and (fastIndex < fastCount) then
+
+ fastIndex = fastIndex + 1
+
+ tempE = AddVisualGear(fastX[fastIndex], fastY[fastIndex], vgtSmoke, 0, false)
+ g1, g2, g3, g4, g5, g6, g7, g8, g9, g10 = GetVisualGearValues(tempE)
+ SetVisualGearValues(tempE, g1, g2, g3, g4, g5, g6, g7, g8, g9, fastColour )
+
+ --AddCaption("fC: " .. fastIndex .. " / " .. fastCount)
+
+ else
+
+ --AddCaption("excep fC: " .. fastIndex .. " / " .. fastCount)
+
+ end
+
+
+
+end
+
+----------------------------------
+-- GAME METHODS / EVENT HANDLERS
+----------------------------------
+
+function onGameInit()
+ GameFlags = GameFlags + gfInfAttack + gfInvulnerable
+ CaseFreq = 0
+ TurnTime = 90000
+ WaterRise = 0
+end
+
+
+function onGameStart()
+ RebuildTeamInfo()
+
+ ShowMission (
+ loc("RACER"),
+ loc("a Hedgewars mini-game"),
+
+ loc("Build a track and race.") .. "|" ..
+ loc("Round Limit:") .. " " .. roundLimit .. "|" ..
+
+ "", 4, 4000
+ )
+
+
+end
+
+function PlaceWayPoint(x,y)
+
+ if (wpCount < wpLimit) then -- seems to not work with a hedgehog nil chek
+
+ wpX[wpCount] = x
+ wpY[wpCount] = y
+ wpCol[wpCount] = 0xffffffff
+ wpCirc[wpCount] = AddVisualGear(wpX[wpCount],wpY[wpCount],vgtCircle,0,true)
+ --100
+ SetVisualGearValues(wpCirc[wpCount], wpX[wpCount], wpY[wpCount], 20, 100, 1, 10, 0, wpRad, 5, wpCol[wpCount])
+
+ wpCount = wpCount + 1
+
+ AddCaption(loc("Waypoint placed.") .. " " .. loc("Available points remaining: ") .. (wpLimit-wpCount))
+
+ end
+
+end
+
+function onNewTurn()
+
+ CheckForNewRound()
+
+ racerActive = false
+
+ trackTime = 0
+
+ currCount = 0 -- hopefully this solves problem
+ AddAmmo(CurrentHedgehog, amAirAttack, 0)
+ gTimer = 0
+
+ -- Set the waypoints to unactive on new round
+ for i = 0,(wpCount-1) do
+ wpActive[i] = false
+ wpCol[i] = 0xffffffff
+ SetVisualGearValues(wpCirc[i], wpX[i], wpY[i], 20, 100, 1, 10, 0, wpRad, 5, wpCol[i])
+ end
+
+ -- Handle Starting Stage of Game
+ if (gameOver == false) and (gameBegun == false) then
+ if wpCount >= 3 then
+ gameBegun = true
+ roundNumber = 0
+ firstClan = GetHogClan(CurrentHedgehog)
+ ShowMission(loc("RACER"),
+ loc("GAME BEGUN!!!"),
+ loc("Complete the track as fast as you can!"), 2, 4000)
+ else
+ ShowMission(loc("RACER"),
+ loc("NOT ENOUGH WAYPOINTS"),
+ loc("Place more waypoints using the 'Air Attack' weapon."), 2, 4000)
+ AddAmmo(CurrentHedgehog, amAirAttack, 4000)
+ end
+ end
+
+ if gameOver == true then
+ gameBegun = false
+ racerActive = false -- newadd
+ end
+
+ AddAmmo(CurrentHedgehog, amTardis, 0)
+ AddAmmo(CurrentHedgehog, amDrillStrike, 0)
+ AddAmmo(CurrentHedgehog, amMineStrike, 0)
+ AddAmmo(CurrentHedgehog, amNapalm, 0)
+ AddAmmo(CurrentHedgehog, amPiano, 0)
+
+end
+
+function onGameTick()
+
+ -- airstrike detected, convert this into a potential waypoint spot
+ if cGear ~= nil then
+ x,y = GetGearTarget(cGear)
+
+ DeleteGear(cGear)
+
+ if TestRectForObstacle(x-20, y-20, x+20, y+20, true) then
+ AddCaption(loc("Please place the way-point in the open, within the map boundaries."))
+ PlaySound(sndDenied)
+ else
+ PlaceWayPoint(x, y)
+ if wpCount == wpLimit then
+ AddCaption(loc("Race complexity limit reached."))
+ DisableTumbler()
+ end
+ end
+
+ end
+
+
+ -- start the player tumbling with a boom once their turn has actually begun
+ if racerActive == false then
+
+ if (TurnTimeLeft > 0) and (TurnTimeLeft ~= TurnTime) then
+
+ -- if the gamehas started put the player in the middle of the first
+ --waypoint that was placed
+ if gameBegun == true then
+ AddCaption(loc("Good to go!"))
+ racerActive = true
+ trackTime = 0
+
+ SetGearPosition(CurrentHedgehog, wpX[0], wpY[0])
+ AddGear(GetX(CurrentHedgehog), GetY(CurrentHedgehog), gtGrenade, 0, 0, 0, 1)
+ FollowGear(CurrentHedgehog)
+ ShowMission("...", "...", "...", 2, 1)
+
+ else
+ -- still in placement mode
+ end
+
+ end
+ end
+
+
+
+ -- has the player started his tumbling spree?
+ if (CurrentHedgehog ~= nil) then
+
+ --airstrike conversion used to be here
+
+ -- if the RACE has started, show tracktimes and keep tabs on waypoints
+ if (racerActive == true) and (gameBegun == true) then
+
+ --ghost
+ gTimer = gTimer + 1
+ if gTimer == 15 then
+ gTimer = 0
+ HandleGhost()
+ end
+
+ trackTime = trackTime + 1
+
+ wpCheckCounter = wpCheckCounter + 1
+ if (wpCheckCounter == 100) then
+
+ wpCheckCounter = 0
+ AddCaption(trackTime/1000,GetClanColor(GetHogClan(CurrentHedgehog)),capgrpMessage2)
+
+ if (CheckWaypoints() == true) then
+ AdjustScores()
+ racerActive = false
+ DisableTumbler()
+ end
+
+ end
+
+ end
+
+
+
+ -- if the player has expended his tunbling time, stop him tumbling
+ if TurnTimeLeft <= 1 then
+ DisableTumbler()
+ end
+
+ end
+
+end
+
+function onGearResurrect(gear)
+
+ AddVisualGear(GetX(gear), GetY(gear), vgtBigExplosion, 0, false)
+
+ -- if the player stops and "dies" or flies into water, stop him racing
+ --[[if gear == CurrentHedgehog then
+ DisableTumbler()
+ ShowMission(loc("RACER"),
+ loc("TRACK FAILED!"),
+ loc("WINNING TIME: ") .. bestTimeComment, -amSkip, 4000)
+ end]]
+
+end
+
+function onGearAdd(gear)
+
+ if GetGearType(gear) == gtHedgehog then
+ hhs[numhhs] = gear
+ numhhs = numhhs + 1
+ SetEffect(gear, heResurrectable, true)
+ end
+
+ if GetGearType(gear) == gtAirAttack then
+ cGear = gear
+ end
+
+end
+
+function onGearDelete(gear)
+
+ if GetGearType(gear) == gtAirAttack then
+ cGear = nil
+ end
+
+end
+
+--[[function onAmmoStoreInit()
+ SetAmmo(amRope, 9, 0, 0, 0)
+ SetAmmo(amJetpack, 9, 0, 0, 0)
+ SetAmmo(amSkip, 9, 0, 0, 0)
+end]]
+
+
--- a/share/hedgewars/Data/Scripts/Multiplayer/Space_Invasion.lua Wed Sep 14 22:27:22 2011 +0200
+++ b/share/hedgewars/Data/Scripts/Multiplayer/Space_Invasion.lua Wed Sep 14 22:39:39 2011 +0200
@@ -5,7 +5,7 @@
---------------------------------------------------
---------------------------------------------------
---------------------------------------------------
---- Space Invasion Code Follows (0.8)
+--- Space Invasion Code Follows (0.9)
---------------------------------------------------
---------------------------------------------------
-- VERSION HISTORY
@@ -73,7 +73,7 @@
-- delete explosives in DeleteFarFlungBarrel rather than explode them on map boundaries to save on performance
-- utilized the improved AddCaption to tint / prevent overrides
-- temporarily disabled bugged sort that displays teams according to their score
--- reluctantly changed the colour of the bonus circ to purple
+-- reluctantly changed the colour of the bonus circ to purple
-- standarized point notation
-- added some missing locs
-- commented out remaining WriteLnToConsoles for the meanwhile with the prefix "nw"
@@ -86,13 +86,13 @@
-- Boss Slayer (Destroy 2 blue circles for +25 points)
-- Shield Master (disolve 5 shells for +10 points)
--- Shield Miser (don't use your shield at all +20 points)
+-- Shield Miser (don't use your shield at all (2.5*roundkills)+2 points)
-- Depleted Kamikaze! (kamikaze into a blue/red circ when you are out of ammo) 5pts
-- Timed Kamikaze! (kamikaze into a blue/red circ when you only have 5s left) 10pts
-- Kamikaze Expert (combination of the above two) 15pts
--- Multi-shot (destroy more than 1 invader with a single bullet) 5pts
+-- Multi-shot (destroy more than 1 invader with a single bullet) 15pts
-- X-Hit Combo (destroy another invader in less than 3 seconds) chainLength*2 points
-- Accuracy Bonus (80% accuracy at the end of your turn with more than 5 shots fired) 15pts
@@ -106,6 +106,22 @@
-- added a HUD for turntimeleft, ammo, shield
-- shieldhealth hits 0 properly
+------------------------
+-- version 0.8.1
+------------------------
+
+-- stop hiding non-existant 4th Tag
+-- redraw HUD on screen resolution change
+
+------------------------
+-- version 0.9
+------------------------
+-- time for more 'EXPERIMENTS' mwahahahahahaha D:
+-- (hopefully) balanced Shield Miser
+-- bosses are no longer a redunkulous 50 points, but toned down to 30
+-- experimental radar (it's INTERACTIVE and math-heavy :D) (visual gears are safe... right? D:)
+-- bugfix and balance for multishot
+
--------------------------
--notes for later
--------------------------
@@ -121,7 +137,7 @@
capgrpAmmostate
-----------------
AddCaption( chainLength .. LOC_NOT("-chain! +") .. chainLength*2 .. LOC_NOT(" points!"),0xffba00ff,capgrpAmmostate)
-AddCaption(LOC_NOT("Multi-shot! +5 points!"),0xffba00ff,capgrpAmmostate)
+AddCaption(LOC_NOT("Multi-shot! +15 points!"),0xffba00ff,capgrpAmmostate)
-----------------
capgrpAmmoinfo
@@ -138,7 +154,7 @@
AddCaption(LOC_NOT("Accuracy Bonus! +15 points!"),0xffba00ff,capgrpVolume)
-----------------
-capgrpMessage
+capgrpMessage
-----------------
AddCaption(LOC_NOT("Ammo Depleted!"),0xff0000ff,capgrpMessage)
AddCaption(LOC_NOT("Ammo: ") .. primShotsLeft)
@@ -158,7 +174,7 @@
AddCaption(LOC_NOT("Timed Kamikaze! +10 points!"),0xffba00ff,capgrpMessage)
-----------------
-capgrpMessage2
+capgrpMessage2
-----------------
AddCaption(LOC_NOT("Drone Hunter! +10 points!"),0xffba00ff,capgrpMessage2)
AddCaption(LOC_NOT("Ammo Maniac! +5 points!"),0xffba00ff,capgrpMessage2)
@@ -213,6 +229,7 @@
--local teamBlue = {}
--local teamOrange = {}
--local teamGreen = {}
+local roundKills = 0
local RK = 0
local GK = 0
local BK = 0
@@ -220,7 +237,7 @@
local SK = 0
local shieldMiser = true
local chainCounter = 0
-local chainLength = 0
+local chainLength = 0
local shotsFired = 0
local shotsHit = 0
@@ -267,6 +284,13 @@
local vCirc = {}
local vCCount = 0
+local rCirc = {}
+local rCircX = {}
+local rCircY = {}
+local rAlpha = 255
+local rPingTimer = 0
+local radShotsLeft = 0
+
local vCircActive = {}
local vCircHealth = {}
local vType = {}
@@ -301,31 +325,31 @@
function HideTags()
- for i = 0, 3 do
+ for i = 0, 2 do
SetVisualGearValues(vTag[i],0,0,0,0,0,1,0, 0, 240000, 0xffffff00)
end
end
function DrawTag(i)
-
+
zoomL = 1.3
xOffset = 40
if i == 0 then
- yOffset = 40
+ yOffset = 40
tCol = 0xffba00ff
tValue = TimeLeft
elseif i == 1 then
- zoomL = 1.1
- yOffset = 70
+ zoomL = 1.1
+ yOffset = 70
tCol = 0x00ff00ff
tValue = primShotsLeft
elseif i == 2 then
- zoomL = 1.1
+ zoomL = 1.1
xOffset = 40 + 35
- yOffset = 70
+ yOffset = 70
tCol = 0xa800ffff
tValue = shieldHealth - 80
end
@@ -333,7 +357,7 @@
DeleteVisualGear(vTag[i])
vTag[i] = AddVisualGear(0, 0, vgtHealthTag, 0, false)
g1, g2, g3, g4, g5, g6, g7, g8, g9, g10 = GetVisualGearValues(vTag[i])
- SetVisualGearValues (
+ SetVisualGearValues (
vTag[i], --id
-(ScreenWidth/2) + xOffset, --xoffset
ScreenHeight - yOffset, --yoffset
@@ -420,6 +444,8 @@
function AwardKills(t)
+ roundKills = roundKills + 1
+
for i = 0,(TeamsCount-1) do
if teamClan[i] == GetHogClan(CurrentHedgehog) then
teamCircsKilled[i] = teamCircsKilled[i] + 1
@@ -621,8 +647,8 @@
(GetX(gear) > 6200) or
(GetY(gear) < -3400)
then
- AddVisualGear(GetX(gear), GetY(gear), vgtBigExplosion, 0, false)
- DeleteGear(gear)
+ AddVisualGear(GetX(gear), GetY(gear), vgtBigExplosion, 0, false)
+ DeleteGear(gear)
--SetHealth(gear, 0)
--WriteLnToConsole("I'm setting barrel ID " .. getGearValue(gear,"ID") .. " to 0 health because it's been flung too close to the map edges. at Game Time: " .. GameTime .. "; luaTicks: " .. luaGameTicks)
end
@@ -644,8 +670,8 @@
-- Fire Barrel
if (primShotsLeft > 0) and (CurrentHedgehog ~= nil) and (stopMovement == false) and (tumbleStarted == true) then
- shotsFired = shotsFired +1
-
+ shotsFired = shotsFired +1
+
morte = AddGear(GetX(CurrentHedgehog), GetY(CurrentHedgehog), gtExplosives, 0, 0, 0, 1)
primShotsLeft = primShotsLeft - 1
@@ -702,6 +728,18 @@
end
end
+function onHJump()
+
+ if (CurrentHedgehog ~= nil) and (stopMovement == false) and (tumbleStarted == true) and
+ (rAlpha == 255) and (radShotsLeft > 0) then
+ rPingTimer = 0
+ rAlpha = 0
+ radShotsLeft = radShotsLeft -1
+ AddCaption(loc("Pings left:") .. " " .. radShotsLeft,GetClanColor(GetHogClan(CurrentHedgehog)),capgrpMessage)
+ end
+
+end
+
-----------------
-- movement keys
-----------------
@@ -750,8 +788,8 @@
MinesNum = 0
Explosives = 0
- for i = 0, 3 do
- vTag[0] = AddVisualGear(0, 0, vgtHealthTag, 0, false)
+ for i = 0, 3 do
+ vTag[0] = AddVisualGear(0, 0, vgtHealthTag, 0, false)
end
HideTags()
@@ -780,6 +818,7 @@
loc("Movement: [Up], [Down], [Left], [Right]") .. "|" ..
loc("Fire") .. ": " .. loc("[Left Shift]") .. "|" ..
loc("Toggle Shield") .. ": " .. loc("[Enter]") .. "|" ..
+ loc("Radar Ping") .. ": " .. loc("[Backspace]") .. "|" ..
--" " .. "|" ..
--LOC_NOT("Invaders List: ") .. "|" ..
@@ -797,10 +836,21 @@
end
+function onScreenResize()
+
+ -- redraw Tags so that their screen locations are updated
+ if (CurrentHedgehog ~= nil) and (tumbleStarted == true) then
+ DrawTag(0)
+ DrawTag(1)
+ DrawTag(2)
+ end
+
+end
function onNewTurn()
primShotsLeft = primShotsMax
+ radShotsLeft = 2
stopMovement = false
tumbleStarted = false
beam = false
@@ -811,6 +861,7 @@
BK = 0
OK = 0
SK = 0
+ roundKills = 0
shieldMiser = true
shotsFired = 0
shotsHit = 0
@@ -835,7 +886,7 @@
tumbleStarted = false
SetMyCircles(false)
end
-
+
HideTags()
---------------
@@ -862,8 +913,8 @@
function onGameTick()
-
- --WriteLnToConsole("Start of GameTick")
+
+ --WriteLnToConsole("Start of GameTick")
luaGameTicks = luaGameTicks + 1 -- GameTime
HandleCircles()
@@ -919,6 +970,7 @@
tumbleStarted = true
TimeLeft = (TurnTime/1000) --45
FadeAlpha = 0
+ rAlpha = 255
AddGear(GetX(CurrentHedgehog), GetY(CurrentHedgehog), gtGrenade, 0, 0, 0, 1)
DrawTag(0)
DrawTag(1)
@@ -955,9 +1007,9 @@
if PlayerIsFine() == false then
TimeLeft = 0
end
-
+
--WriteLnToConsole("successfully checked playerIsFine")
-
+
if (TimeLeft == 0) then
if (stopMovement == false) then --time to stop the player
stopMovement = true
@@ -968,11 +1020,19 @@
rightOn = false
SetMyCircles(false)
HideTags()
+ rAlpha = 255
--nw WriteLnToConsole("Player is out of luck")
if shieldMiser == true then
- AddCaption(loc("Shield Miser!") .. " +20 " .. loc("points") .. "!",0xffba00ff,capgrpAmmoinfo)
- AwardPoints(20)
+
+ p = (roundKills*2.5) - ((roundKills*2.5)%1) + 2
+ --p = (roundKills*2.5) + 2
+ --if (p%2 ~= 0) then
+ -- p = p -0.5
+ --end
+
+ AddCaption(loc("Shield Miser!") .." +" .. p .." ".. loc("points") .. "!",0xffba00ff,capgrpAmmoinfo)
+ AwardPoints(p)
end
if ((shotsHit / shotsFired * 100) >= 80) and (shotsFired > 4) then
@@ -985,16 +1045,16 @@
-------------------------------
-- Player is still in luck
-------------------------------
-
+
--WriteLnToConsole("about to do chainCounter checks")
if chainCounter > 0 then
- chainCounter = chainCounter -1
+ chainCounter = chainCounter -1
if chainCounter == 0 then
chainLength = 0
end
end
-
+
-- handle movement based on IO
moveTimer = moveTimer + 1
if moveTimer == 100 then -- 100
@@ -1063,7 +1123,7 @@
end
--WriteLnToConsole("End of GameTick")
-
+
end
function onGearResurrect(gear)
@@ -1149,8 +1209,47 @@
------------------------------------------------------------
------------------------------------------------------------
-
-
+function DoHorribleThings(cUID)
+
+ -- maybe
+ -- add a check to draw it inside the circ and not past it if
+ -- it is closer than 150 or w/e
+
+ -- work out the distance to the target
+ g1X, g1Y = GetGearPosition(CurrentHedgehog)
+ g2X, g2Y = vCircX[cUID], vCircY[cUID]
+ q = g1X - g2X
+ w = g1Y - g2Y
+ r = math.sqrt( (q*q) + (w*w) ) --alternate
+
+
+ opp = w
+ if opp < 0 then
+ opp = opp*-1
+ end
+
+ -- work out the angle (theta) to the target
+ t = math.deg ( math.asin(opp / r) )
+
+ -- based on the radius of the radar, calculate what x/y displacement should be
+ NR = 150 -- radius at which to draw circs
+ NX = math.cos( math.rad(t) ) * NR
+ NY = math.sin( math.rad(t) ) * NR
+
+ -- displace xy based on where this thing actually is
+ if q > 0 then
+ rCircX[cUID] = g1X - NX
+ else
+ rCircX[cUID] = g1X + NX
+ end
+
+ if w > 0 then
+ rCircY[cUID] = g1Y - NY
+ else
+ rCircY[cUID] = g1Y + NY
+ end
+
+end
function PlayerIsFine()
return (playerIsFine)
@@ -1213,6 +1312,10 @@
vCCount = vCCount +1
vCirc[i] = AddVisualGear(0,0,vgtCircle,0,true)
+ rCirc[i] = AddVisualGear(0,0,vgtCircle,0,true)
+ rCircX[i] = 0
+ rCircY[i] = 0
+
vCircDX[i] = 0
vCircDY[i] = 0
@@ -1240,6 +1343,9 @@
vCircCol[i] = 0xff00ffff
SetVisualGearValues(vCirc[i], vCircX[i], vCircY[i], vCircMinA[i], vCircMaxA[i], vCircType[i], vCircPulse[i], vCircFuckAll[i], vCircRadius[i], vCircWidth[i], vCircCol[i])
+
+ SetVisualGearValues(rCirc[i], 0, 0, 100, 255, 1, 10, 0, 40, 3, vCircCol[i])
+
end
pShield = AddVisualGear(0,0,vgtCircle,0,true)
@@ -1340,7 +1446,7 @@
elseif (vType[i] == "blueboss") then
PlaySound(sndHellishImpact3)
- AddCaption(loc("Boss defeated!") .. " +50 " .. loc("points") .. "!", 0x0050ffff,capgrpMessage)
+ AddCaption(loc("Boss defeated!") .. " +30 " .. loc("points") .. "!", 0x0050ffff,capgrpMessage)
morte = AddGear(vCircX[i], vCircY[i], gtExplosives, 0, 0, 0, 1)
SetHealth(morte, 0)
@@ -1431,7 +1537,7 @@
vCircRadMax[i] = 180*5
vCircWidth[i] = 1
vCounterLim[i] = 2000
- vCircScore[i] = 50
+ vCircScore[i] = 30
vCircHealth[i] = 3
else
--elseif r == 1 then
@@ -1464,6 +1570,11 @@
g1, g2, g3, g4, g5, g6, g7, g8, g9, g10 = GetVisualGearValues(vCirc[i])
SetVisualGearValues(vCirc[i], vCircX[i], vCircY[i], g3, g4, g5, g6, g7, vCircRadius[i], vCircWidth[i], vCircCol[i]-0x000000ff)
-- - -0x000000ff
+
+ g1, g2, g3, g4, g5, g6, g7, g8, g9, g10 = GetVisualGearValues(rCirc[i])
+ SetVisualGearValues(rCirc[i], 0, 0, g3, g4, g5, g6, g7, g8, g9, vCircCol[i]-0x000000ff)
+
+
vCircActive[i] = true -- new
--nw WriteLnToConsole("CIRC " .. i .. ": X: " .. vCircX[i] .. "; Y: " .. vCircY[i])
@@ -1565,7 +1676,9 @@
circsHit = circsHit + 1
if circsHit > 1 then
- AddCaption(loc("Multi-shot!") .. " +5 " .. loc("points") .. "!",0xffba00ff,capgrpAmmostate)
+ AddCaption(loc("Multi-shot!") .. " +15 " .. loc("points") .. "!",0xffba00ff,capgrpAmmostate)
+ AwardPoints(15)
+ circsHit = 0
end
shotsHit = shotsHit + 1
@@ -1638,6 +1751,8 @@
g1Y = g1Y - g2Y
dist = (g1X*g1X) + (g1Y*g1Y)
+ --DoHorribleThings(i, g1X, g1Y, g2X, g2Y, dist)
+
--nw WriteLnToConsole("Calcs done. Dist to CurrentHedgehog is " .. dist)
-- calculate my real radius if I am an aura
@@ -1688,7 +1803,6 @@
function HandleCircles()
-
--[[if CirclesAreGo == true then
--CheckDistances()
@@ -1702,8 +1816,27 @@
end]]
+
+ if rAlpha ~= 255 then
+
+ rPingTimer = rPingTimer + 1
+ if rPingTimer == 100 then
+ rPingTimer = 0
+
+ rAlpha = rAlpha + 5
+ if rAlpha >= 255 then
+ rAlpha = 255
+ end
+ end
+
+ end
+
for i = 0,(vCCount-1) do
+ --if (vCircActive[i] == true) then
+ SetVisualGearValues(rCirc[i], rCircX[i], rCircY[i], 100, 255, 1, 10, 0, 40, 3, vCircCol[i]-rAlpha)
+ --end
+
vCounter[i] = vCounter[i] + 1
if vCounter[i] >= vCounterLim[i] then
@@ -1853,6 +1986,11 @@
for i = 0,(vCCount-1) do
vCircX[i] = vCircX[i] + vCircDX[i]
vCircY[i] = vCircY[i] + vCircDY[i]
+
+ if (CurrentHedgehog ~= nil) and (rAlpha ~= 255) then
+ DoHorribleThings(i)--(i, g1X, g1Y, g2X, g2Y, dist)
+ end
+
end
if (TimeLeft == 0) and (tumbleStarted == true) then
@@ -1862,12 +2000,12 @@
FadeAlpha = 255
end
- --new
+ --new
--if FadeAlpha == 1 then
- -- AddCaption("GOT IT")
+ -- AddCaption("GOT IT")
-- for i = 0,(vCCount-1) do
-- g1, g2, g3, g4, g5, g6, g7, g8, g9, g10 = GetVisualGearValues(vCirc[i])
- -- vCircCol[i] = g10
+ -- vCircCol[i] = g10
-- end
--end
--- a/share/hedgewars/Data/Scripts/Multiplayer/The_Specialists.lua Wed Sep 14 22:27:22 2011 +0200
+++ b/share/hedgewars/Data/Scripts/Multiplayer/The_Specialists.lua Wed Sep 14 22:39:39 2011 +0200
@@ -1,5 +1,5 @@
----------------------------------
--- THE SPECIALISTS MODE 0.5
+-- THE SPECIALISTS MODE 0.6
-- by mikade
----------------------------------
@@ -35,6 +35,11 @@
-- provision for variable minetimer / demo mines set to 5000ms
-- don't autoswitch if player only has 1 hog on his team
+----------------
+-- version 0.6
+----------------
+-- for the meanwhile, don't drop any crates except health crates
+
--------------------
--TO DO
--------------------
@@ -79,7 +84,7 @@
if z == 1 then
SetHogName(hhs[i],"Soldier")
- SetHogHat(hhs[i], "Vega")
+ SetHogHat(hhs[i], "sf_vega")
SetHealth(hhs[i],200)
elseif z == 2 then
@@ -214,6 +219,7 @@
function onGameInit()
GameFlags = gfRandomOrder + gfResetWeps + gfInfAttack + gfPlaceHog
Delay = 10
+ HealthCaseProb = 100
end
function onGameStart()
@@ -253,42 +259,42 @@
if (CurrentHedgehog ~= nil) then
currName = GetHogName(CurrentHedgehog)
-
+
if (currName ~= lastName) and (switchStage > 100) then
AddCaption(loc("Switched to ") .. currName .. "!")
- AssignAmmo()
+ AssignAmmo()
end
- if (TurnTimeLeft > 0) and (TurnTimeLeft ~= TurnTime) and (switchStage < 100) then
-
- AddCaption(loc("Prepare yourself") .. ", " .. currName .. "!")
+ if (TurnTimeLeft > 0) and (TurnTimeLeft ~= TurnTime) and (switchStage < 100) then
+
+ AddCaption(loc("Prepare yourself") .. ", " .. currName .. "!")
hogCounter = 0
runOnHogsInTeam(CountHog, GetHogTeamName(CurrentHedgehog) )
if hogCounter > 1 then
- switchStage = switchStage + 1
-
+ switchStage = switchStage + 1
+
if switchStage == 1 then
AddAmmo(CurrentHedgehog, amSwitch, 1)
-
+
elseif switchStage == 2 then
ParseCommand("setweap " .. string.char(amSwitch))
elseif switchStage == 3 then
- SetGearMessage(CurrentHedgehog,gmAttack)
+ SetGearMessage(CurrentHedgehog,gmAttack)
elseif switchStage == 4 then
switchStage = 110
AddAmmo(CurrentHedgehog, amSwitch, 0)
end
-
+
else
switchStage = 110
end
- end
-
+ end
+
lastName = currName
end
@@ -301,12 +307,12 @@
hhs[numhhs] = gear
numhhs = numhhs + 1
elseif (GetGearType(gear) == gtMine) and (started == true) then
- SetTimer(gear,5000)
+ SetTimer(gear,5000)
end
-
+
if (GetGearType(gear) == gtHedgehog) or (GetGearType(gear) == gtResurrector) then
trackGear(gear)
- end
+ end
end
@@ -314,7 +320,7 @@
function onGearDelete(gear)
if (GetGearType(gear) == gtHedgehog) or (GetGearType(gear) == gtResurrector) then
trackDeletion(gear)
- end
+ end
end
function onAmmoStoreInit()
--- a/share/hedgewars/Data/Scripts/Multiplayer/Tumbler.lua Wed Sep 14 22:27:22 2011 +0200
+++ b/share/hedgewars/Data/Scripts/Multiplayer/Tumbler.lua Wed Sep 14 22:39:39 2011 +0200
@@ -1,36 +1,41 @@
------------------------------------
-- TUMBLER
--- v.0.6
+-- v.0.7.1
------------------------------------
loadfile(GetDataPath() .. "Scripts/Locale.lua")()
loadfile(GetDataPath() .. "Scripts/Tracker.lua")()
---local fMod = 1 --.15
local fMod = 1000000 -- use this for dev and .16+ games
-local moveTimer = 0
+
local leftOn = false
local rightOn = false
local upOn = false
local downOn = false
+local preciseOn = false
-local preciseOn = false
---local HJumpOn = false
---local LJumpON = false
-local fireTimer = 0
-local scoreTag = nil
local wep = {}
local wepAmmo = {}
+local wepCol = {}
local wepIndex = 0
local wepCount = 0
+local fGears = 0
+
+local mineSpawn
+local barrelSpawn
+
local roundKills = 0
+local barrelsEaten = 0
+local minesEaten = 0
+local moveTimer = 0
+local fireTimer = 0
local TimeLeftCounter = 0
local TimeLeft = 0
local stopMovement = false
local tumbleStarted = false
-local beam = false
+local vTag = {}
------------------------
-- version 0.4
@@ -72,38 +77,179 @@
-- modified crate frequencies a bit
-- added some simple kill-based achievements, i think
+------------------------
+-- version 0.7
+------------------------
+
+-- a few code optimisations/performance tweaks
+-- removed some deprecated code
+-- fix a potential spawn bug
+
+-- improved HUD (now shows ammo counts)
+-- improved user feedback (less generic messages)
+-- colour-coded addcaptions to match hud :)
+
+-- base tumbling time now equals scheme turntime
+-- tumbling time extension is now based on the amount of health contained in crate
+-- new mines per turn based on minesnum
+-- new barrels per turn based on explosives
+
+-- added 2 more achievements: barrel eater and mine eater (like kills, don't do anything atm)
+-- slightly increased grab distance for explosives/mines
+-- slightly increased flamer velocity
+-- slightly decreased flamer volume
+-- added a flame vaporiser (based on number of flame gears?)
+-- give tumblers an extra 47 health on the start of their tumble to counter the grenade (exp)
+-- refocus camera on tumbler on newturn (not on crates, barrels etc)
+-- increase delay: yes, yes, eat your hearts out
+
+-- commit log
+-- Better HUD
+-- Allow more user customization
+-- Bugfix for new gear spawns
+-- Performance tweaks
+-- Variety of small gameplay changes
+
+------------------------
+-- version 0.7.1
+------------------------
+
+-- redraw HUD on screen resolution change
+
---------------------------
-- some other ideas/things
---------------------------
--[[
--- fix "ammo extended" message to be non-generic
+-- add better gameflag handling
-- fix flamer "shots remaining" message on start or choose a standard versus %
-- add more sounds
--- make barrels always explode?
--- persistent ammo?
--- allow custom turntime?
--- dont hurt tumblers and restore their health at turn end?
+-- better barrel/minespawn effects
+-- separate grab distance for mines/barrels
+-- [probably not] make barrels always explode?
+-- [probably not] persistent ammo?
+-- [probably not] dont hurt tumblers and restore their health at turn end?
]]
-function DrawTags()
-
+
+----------------------------------------------------------------
+----------------------------------------------------------------
+
+local flames = {}
+local fGearValues = {}
+
+function runOnflames(func)
+ for k, gear in ipairs(flames) do
+ func(gear)
+ end
+end
+
+function trackFGear(gear)
+ table.insert(flames, gear)
+end
+
+function trackFGearDeletion(gear)
+ fGearValues[gear] = nil
+ for k, g in ipairs(flames) do
+ if g == gear then
+ table.remove(flames, k)
+ break
+ end
+ end
+end
+
+function getFGearValue(gear, key)
+ if fGearValues[gear] ~= nil then
+ return fGearValues[gear][key]
+ end
+ return nil
+end
+
+function setFGearValue(gear, key, value)
+ found = false
+ for id, values in pairs(fGearValues) do
+ if id == gear then
+ values[key] = value
+ found = true
+ end
+ end
+ if not found then
+ fGearValues[gear] = { [key] = value }
+ end
+end
+
+function decreaseFGearValue(gear, key)
+ for id, values in pairs(fGearValues) do
+ if id == gear then
+ values[key] = values[key] - 1
+ end
+ end
+end
+
+function HandleLife(gear)
+
+ decreaseFGearValue(gear, "L")
+ if getFGearValue(gear, "L") == 0 then
+ AddVisualGear(GetX(gear), GetY(gear), vgtSmoke, 0, false)
+ DeleteGear(gear)
+ end
+
+end
+
+----------------------------------------------------------------
+----------------------------------------------------------------
+
+function HideTags()
+
+ for i = 0, 3 do
+ SetVisualGearValues(vTag[i],0,0,0,0,0,1,0, 0, 240000, 0xffffff00)
+ end
+
+end
+
+function DrawTag(i)
+
zoomL = 1.3
- DeleteVisualGear(scoreTag)
- scoreTag = AddVisualGear(0, 0, vgtHealthTag, 0, false)
- g1, g2, g3, g4, g5, g6, g7, g8, g9, g10 = GetVisualGearValues(scoreTag)
- SetVisualGearValues (
- scoreTag, --id
- -(ScreenWidth/2) + 45, --xoffset
- ScreenHeight - 50, --yoffset
+ xOffset = 40
+
+ if i == 0 then
+ yOffset = 40
+ tCol = 0xffba00ff --0xffed09ff --0xffba00ff
+ tValue = TimeLeft
+ elseif i == 1 then
+ zoomL = 1.1
+ yOffset = 70
+ tCol = wepCol[0]
+ tValue = wepAmmo[0]
+ elseif i == 2 then
+ zoomL = 1.1
+ xOffset = 40 + 35
+ yOffset = 70
+ tCol = wepCol[1]
+ tValue = wepAmmo[1]
+ elseif i == 3 then
+ zoomL = 1.1
+ xOffset = 40 + 70
+ yOffset = 70
+ tCol = wepCol[2]
+ tValue = wepAmmo[2]
+ end
+
+ DeleteVisualGear(vTag[i])
+ vTag[i] = AddVisualGear(0, 0, vgtHealthTag, 0, false)
+ g1, g2, g3, g4, g5, g6, g7, g8, g9, g10 = GetVisualGearValues(vTag[i])
+ SetVisualGearValues (
+ vTag[i], --id
+ -(ScreenWidth/2) + xOffset, --xoffset
+ ScreenHeight - yOffset, --yoffset
0, --dx
0, --dy
zoomL, --zoom
1, --~= 0 means align to screen
g7, --frameticks
- TimeLeft, --value
+ tValue, --value
240000, --timer
- 0xffba00ff --GetClanColor( GetHogClan(CurrentHedgehog) )
+ tCol --GetClanColor( GetHogClan(CurrentHedgehog) )
)
end
@@ -123,22 +269,34 @@
-- yes that was my justification for a non generic method
function CheckProximityToExplosives(gear)
- if (GetGearDistance(gear) < 1300) then
+ if (GetGearDistance(gear) < 1400) then
if (GetGearType(gear) == gtExplosives) then
-
- wepAmmo[0] = wepAmmo[0] + 1
+
+ wepAmmo[0] = wepAmmo[0] + 1
PlaySound(sndShotgunReload)
DeleteGear(gear)
- AddCaption(loc("Ammo extended!"))
+ AddCaption(wep[0] .. " " .. loc("ammo extended!"), wepCol[0], capgrpAmmoinfo )
+ DrawTag(1)
+
+ barrelsEaten = barrelsEaten + 1
+ if barrelsEaten == 5 then
+ AddCaption(loc("Achievement Unlocked") .. ": " .. loc("Barrel Eater!"),0xffba00ff,capgrpMessage2)
+ end
elseif (GetGearType(gear) == gtMine) then
- wepAmmo[2] = wepAmmo[2] + 1
+ wepAmmo[1] = wepAmmo[1] + 1
PlaySound(sndShotgunReload)
DeleteGear(gear)
- AddCaption(loc("Ammo extended!"))
- end
+ AddCaption(wep[1] .. " " .. loc("ammo extended!"), wepCol[1], capgrpAmmoinfo )
+ DrawTag(2)
+ minesEaten = minesEaten + 1
+ if minesEaten == 5 then
+ AddCaption(loc("Achievement Unlocked") .. ": " .. loc("Mine Eater!"),0xffba00ff,capgrpMessage2)
+ end
+
+ end
else
--AddCaption("There is nothing here...")
@@ -150,103 +308,38 @@
function CheckProximity(gear)
dist = GetGearDistance(gear)
- --15000
- if ((dist < 15000) and (beam == true)) and
- ( (GetGearType(gear) == gtMine) or (GetGearType(gear) == gtExplosives) ) then
- -- ndx, ndy = GetGearVelocity(CurrentHedgehog)
- -- SetGearVelocity(gear, ndx, ndy)
- --AddCaption("hello???")
- elseif (dist < 1600) and (GetGearType(gear) == gtCase) then
-
- if GetHealth(gear) > 0 then
+
+ if (dist < 1600) and (GetGearType(gear) == gtCase) then
+
+ if GetHealth(gear) > 0 then
- AddCaption(loc("Tumbling Time Extended!"))
- TimeLeft = TimeLeft + 5 --5s
- DrawTags()
+ AddCaption(loc("Tumbling Time Extended!"), 0xffba00ff, capgrpMessage2 )
+
+ TimeLeft = TimeLeft + HealthCaseAmount --5 --5s
+ DrawTag(0)
--PlaySound(sndShotgunReload)
else
- wepAmmo[1] = wepAmmo[1] + 800
+ wepAmmo[2] = wepAmmo[2] + 800
PlaySound(sndShotgunReload)
- AddCaption(loc("Ammo extended!"))
+ AddCaption(wep[2] .. " " .. loc("fuel extended!"), wepCol[2], capgrpAmmoinfo )
+ DrawTag(3)
end
-
+
DeleteGear(gear)
end
end
---[[function ProjectileTrack(gear)
-
- if (GetGearType(gear) == gtMine) or (GetGearType(gear) == gtExplosives) then
-
- dist = GetGearDistance(gear)
-
- alt = 1
- if (dist < 30000) then
- alt = -1
- end
-
- if (dist < 60000)
- --and (dist > 16000)
- then
-
- --if (GetGearType(gear) == gtShell) then
- turningSpeed = 0.1*fMod*alt
- --end
-
- dx, dy = GetGearVelocity(gear)
-
- if GetX(gear) > GetX(CurrentHedgehog) then
- dx = dx - turningSpeed
- else
- dx = dx + turningSpeed
- end
+function ChangeWeapon()
- if GetY(gear) > GetY(CurrentHedgehog) then
- dy = dy - turningSpeed
- else
- dy = dy + turningSpeed
- end
-
-
- if (GetGearType(gear) == gtShell) then
- dxlimit = 0.4*fMod
- dylimit = 0.4*fMod
- end
-
- if dx > dxlimit then
- dx = dxlimit
- end
- if dy > dylimit then
- dy = dylimit
- end
- if dx < -dxlimit then
- dx = -dxlimit
- end
- if dy < -dylimit then
- dy = -dylimit
- end
-
- SetGearVelocity(gear, dx, dy)
-
- end
-
+ wepIndex = wepIndex + 1
+ if wepIndex == wepCount then
+ wepIndex = 0
end
-end]]
-
-
-function ChangeWeapon()
-
- --new
- wepIndex = wepIndex + 1
- if wepIndex == wepCount then
- wepIndex = 0
- end
-
- AddCaption(wep[wepIndex] .. " " .. loc("selected!"), GetClanColor(GetHogClan(CurrentHedgehog)),capgrpAmmoinfo )
- AddCaption(wepAmmo[wepIndex] .. " " .. loc("shots remaining."), GetClanColor(GetHogClan(CurrentHedgehog)),capgrpMessage2)
+ AddCaption(wep[wepIndex] .. " " .. loc("selected!"), wepCol[wepIndex],capgrpAmmoinfo )
+ AddCaption(wepAmmo[wepIndex] .. " " .. loc("shots remaining."), wepCol[wepIndex],capgrpMessage2)
end
@@ -259,7 +352,7 @@
if (CurrentHedgehog ~= nil) and (stopMovement == false) and (tumbleStarted == true) and (wepAmmo[wepIndex] > 0) then
wepAmmo[wepIndex] = wepAmmo[wepIndex] - 1
- AddCaption(wepAmmo[wepIndex] .. " " .. loc("shots remaining."), GetClanColor(GetHogClan(CurrentHedgehog)),capgrpMessage2)
+ AddCaption(wepAmmo[wepIndex] .. " " .. loc("shots remaining."), wepCol[wepIndex],capgrpMessage2)
if wep[wepIndex] == loc("Barrel Launcher") then
morte = AddGear(GetX(CurrentHedgehog), GetY(CurrentHedgehog), gtExplosives, 0, 0, 0, 1)
@@ -268,10 +361,12 @@
x = x*2
y = y*2
SetGearVelocity(morte, x, y)
-
+ DrawTag(1)
+
elseif wep[wepIndex] == loc("Mine Deployer") then
morte = AddGear(GetX(CurrentHedgehog), GetY(CurrentHedgehog), gtMine, 0, 0, 0, 0)
SetTimer(morte, 1000)
+ DrawTag(2)
end
end
@@ -285,26 +380,14 @@
end
function onHJump()
- -- pick up explosives if nearby them
+ -- pick up explosives/mines if nearby them
if (CurrentHedgehog ~= nil) and (stopMovement == false) and (tumbleStarted == true) then
runOnGears(CheckProximityToExplosives)
end
end
function onLJump()
- -- for attracting mines and explosives if the beam is on
- --[[if (CurrentHedgehog ~= nil) and (stopMovement == false) and (tumbleStarted == true) then
- if beam == false then
- beam = true
- AddCaption(loc("Mine-attractor on!"))
- else
- beam = false
- AddCaption(loc("Mine-attractor off!"))
- end
- end]]
-
ChangeWeapon()
-
end
-----------------
@@ -353,22 +436,53 @@
--------------------------
function onGameInit()
- --Theme = "Hell"
CaseFreq = 0
- HealthCaseProb = 0
+ HealthCaseProb = 0
+ Delay = 1000
+
+ mineSpawn = MinesNum
+ if mineSpawn > 4 then
+ mineSpawn = 4
+ end
+
+ barrelSpawn = Explosives
+ if barrelSpawn > 4 then
+ barrelSpawn = 4
+ end
+
+ --MinesNum = 0
+ --Explosives = 0
+
+ for i = 0, 3 do
+ vTag[0] = AddVisualGear(0, 0, vgtHealthTag, 0, false)
+ end
+
+ HideTags()
+
+ wep[0] = loc("Barrel Launcher")
+ wep[1] = loc("Mine Deployer")
+ wep[2] = loc("Flamer")
+
+ wepCol[0] = 0x78818eff
+ wepCol[1] = 0xa12a77ff
+ wepCol[2] = 0xf49318ff
+
+ wepCount = 3
+
end
function onGameStart()
-
+
ShowMission (
"TUMBLER",
loc("a Hedgewars mini-game"),
loc("Eliminate the enemy hogs to win.") .. "|" ..
" " .. "|" ..
- --loc("Round Limit") .. ": " .. roundLimit .. "|" ..
- --loc("Turn Time") .. ": " .. (TurnTime/1000) .. loc("sec") .. "|" ..
- --" " .. "|" ..
+ loc("New Mines Per Turn") .. ": " .. (mineSpawn) .. "|" ..
+ loc("New Barrels Per Turn") .. ": " .. (barrelSpawn) .. "|" ..
+ loc("Time Extension") .. ": " .. (HealthCaseAmount) .. loc("sec") .. "|" ..
+ " " .. "|" ..
loc("Movement: [Up], [Down], [Left], [Right]") .. "|" ..
loc("Fire") .. ": " .. loc("[Left Shift]") .. "|" ..
@@ -381,72 +495,76 @@
loc("Ammo is reset at the end of your turn.") .. "|" ..
"", 4, 4000
- )
+ )
- scoreTag = AddVisualGear(0, 0, vgtHealthTag, 0, false)
- --DrawTags()
+end
+
+function onScreenResize()
- SetVisualGearValues(scoreTag,0,0,0,0,0,1,0, 0, 240000, 0xffffff00)
-
- wep[0] = loc("Barrel Launcher")
- wep[1] = loc("Flamer")
- wep[2] = loc("Mine Deployer")
- wepCount = 3
+ -- redraw Tags so that their screen locations are updated
+ if (CurrentHedgehog ~= nil) and (tumbleStarted == true) then
+ for i = 0, 3 do
+ DrawTag(i)
+ end
+ end
end
+function onNewTurn()
-function onNewTurn()
-
stopMovement = false
tumbleStarted = false
- beam = false
- -- randomly create 2 new barrels and 3 mines on the map every turn
- for i = 0, 1 do
- gear = AddGear(0, 0, gtExplosives, 0, 0, 0, 0)
+ -- randomly create new barrels mines on the map every turn (can be disabled by setting mine/barrels to 0 in scheme)
+ for i = 0, barrelSpawn-1 do
+ gear = AddGear(100, 100, gtExplosives, 0, 0, 0, 0)
SetHealth(gear, 100)
- FindPlace(gear, false, 0, LAND_WIDTH)
- tempE = AddVisualGear(GetX(gear), GetY(gear), vgtBigExplosion, 0, false)
+ if FindPlace(gear, false, 0, LAND_WIDTH, false) ~= nil then
+ tempE = AddVisualGear(GetX(gear), GetY(gear), vgtBigExplosion, 0, false)
+ end
end
- for i = 0, 2 do
- gear = AddGear(0, 0, gtMine, 0, 0, 0, 0)
- FindPlace(gear, false, 0, LAND_WIDTH)
- tempE = AddVisualGear(GetX(gear), GetY(gear), vgtBigExplosion, 0, false)
+ for i = 0, mineSpawn-1 do
+ gear = AddGear(100, 100, gtMine, 0, 0, 0, 0)
+ if FindPlace(gear, false, 0, LAND_WIDTH, false) ~= nil then
+ tempE = AddVisualGear(GetX(gear), GetY(gear), vgtBigExplosion, 0, false)
+ end
end
+ -- randomly spawn time extension crates / flamer fuel on the map
r = GetRandom(100)
if r > 50 then
- SpawnHealthCrate(0, 0)
+ gear = SpawnHealthCrate(0, 0)
end
r = GetRandom(100)
if r > 70 then
- SpawnAmmoCrate(0, 0, amSkip)
+ gear = SpawnAmmoCrate(0, 0, amSkip)
end
- --DrawTags()
- SetVisualGearValues(scoreTag,0,0,0,0,0,1,0, 0, 240000, 0xffffff00)
+ HideTags()
--reset ammo counts
wepAmmo[0] = 2
- wepAmmo[1] = 50
- wepAmmo[2] = 1
+ wepAmmo[1] = 1
+ wepAmmo[2] = 50 -- 50000 -- 50
wepIndex = 2
ChangeWeapon()
roundKills = 0
+ barrelsEaten = 0
+ minesEaten = 0
+
+ FollowGear(CurrentHedgehog)
end
function DisableTumbler()
stopMovement = true
- beam = false
upOn = false
down = false
leftOn = false
rightOn = false
- SetVisualGearValues(scoreTag,0,0,0,0,0,1,0, 0, 240000, 0xffffff00)
+ HideTags()
end
function onGameTick()
@@ -456,33 +574,27 @@
if (TurnTimeLeft > 0) and (TurnTimeLeft ~= TurnTime) then
--AddCaption(loc("Good to go!"))
tumbleStarted = true
- TimeLeft = 30
+ TimeLeft = (TurnTime/1000)
AddGear(GetX(CurrentHedgehog), GetY(CurrentHedgehog), gtGrenade, 0, 0, 0, 1)
- DrawTags()
+ SetHealth(CurrentHedgehog, GetHealth(CurrentHedgehog) + 47) -- new
+ for i = 0, 3 do
+ DrawTag(i)
+ end
end
end
if (CurrentHedgehog ~= nil) and (tumbleStarted == true) then
- --AddCaption(GetX(CurrentHedgehog) .. ";" .. GetY(CurrentHedgehog) )
-
- runOnGears(CheckProximity) -- crates and mines
-
- --if beam == true then
- -- runOnGears(ProjectileTrack)
- --end
+ runOnGears(CheckProximity) -- crates
-- Calculate and display turn time
TimeLeftCounter = TimeLeftCounter + 1
if TimeLeftCounter == 1000 then
TimeLeftCounter = 0
TimeLeft = TimeLeft - 1
-
-
if TimeLeft >= 0 then
- --AddCaption(TimeLeft)
- DrawTags()
+ DrawTag(0)
end
end
@@ -496,6 +608,8 @@
if moveTimer == 100 then -- 100
moveTimer = 0
+ runOnflames(HandleLife)
+
---------------
-- new trail code
---------------
@@ -540,8 +654,6 @@
dy = dy + 0.1*fMod
end
-
-
SetGearVelocity(CurrentHedgehog, dx, dy)
end
@@ -550,18 +662,19 @@
--flamer
--
fireTimer = fireTimer + 1
- if fireTimer == 5 then -- 5 --10
+ if fireTimer == 6 then -- 5 --10
fireTimer = 0
if (wep[wepIndex] == loc("Flamer") ) and (preciseOn == true) and (wepAmmo[wepIndex] > 0) and (stopMovement == false) and (tumbleStarted == true) then
- wepAmmo[wepIndex] = wepAmmo[wepIndex] - 1
- AddCaption(
- loc("Flamer") .. ": " ..
- (wepAmmo[wepIndex]/800*100) - (wepAmmo[wepIndex]/800*100)%2 .. "%",
- GetClanColor(GetHogClan(CurrentHedgehog)),
+ wepAmmo[wepIndex] = wepAmmo[wepIndex] - 1
+ AddCaption(
+ loc("Flamer") .. ": " ..
+ (wepAmmo[wepIndex]/800*100) - (wepAmmo[wepIndex]/800*100)%2 .. "%",
+ wepCol[2],
capgrpMessage2
- )
+ )
+ DrawTag(3)
dx, dy = GetGearVelocity(CurrentHedgehog)
shell = AddGear(GetX(CurrentHedgehog), GetY(CurrentHedgehog), gtFlame, 0, 0, 0, 0)
@@ -582,16 +695,14 @@
ydev = ydev*-1
end
- --*13 --8
- SetGearVelocity(shell, (dx*4)+(xdev*fMod), (dy*4)+(ydev*fMod)) --10
+ --*13 --8 *-4
+ SetGearVelocity(shell, (dx*4.5)+(xdev*fMod), (dy*4.5)+(ydev*fMod)) --10
end
end
--
-
-
end
@@ -600,7 +711,6 @@
function isATrackedGear(gear)
if (GetGearType(gear) == gtExplosives) or
(GetGearType(gear) == gtMine) or
- (GetGearType(gear) == gtShell) or -- new -- gtBall
(GetGearType(gear) == gtCase)
then
return(true)
@@ -609,7 +719,6 @@
end
end
-
--[[function onGearDamage(gear, damage)
if gear == CurrentHedgehog then
-- You are now tumbling
@@ -618,50 +727,60 @@
function onGearAdd(gear)
- if isATrackedGear(gear) then
+ if GetGearType(gear) == gtFlame then
+
+ trackFGear(gear)
+
+ fGears = fGears +1
+
+ if fGears < 80 then
+ setFGearValue(gear,"L",30)
+ else
+ setFGearValue(gear,"L",5) --3
+ end
+
+ elseif isATrackedGear(gear) then
trackGear(gear)
end
- --if GetGearType(gear) == gtBall then
- -- SetTimer(gear, 15000)
- --end
-
end
function onGearDelete(gear)
- if isATrackedGear(gear) then
+ if GetGearType(gear) == gtFlame then
+ trackFGearDeletion(gear)
+ fGears = fGears -1
+
+ elseif isATrackedGear(gear) then
trackDeletion(gear)
+
+ -- achievements? prototype
+ elseif GetGearType(gear) == gtHedgehog then
+
+ if GetHogTeamName(gear) ~= GetHogTeamName(CurrentHedgehog) then
+
+ roundKills = roundKills + 1
+ if roundKills == 2 then
+ AddCaption(loc("Double Kill!"),0xffba00ff,capgrpMessage2)
+ elseif roundKills == 3 then
+ AddCaption(loc("Killing spree!"),0xffba00ff,capgrpMessage2)
+ elseif roundKills >= 4 then
+ AddCaption(loc("Unstoppable!"),0xffba00ff,capgrpMessage2)
+ end
+
+ elseif gear == CurrentHedgehog then
+ DisableTumbler()
+
+ elseif gear ~= CurrentHedgehog then
+ AddCaption(loc("Friendly Fire!"),0xffba00ff,capgrpMessage2)
+ end
+
end
if CurrentHedgehog ~= nil then
FollowGear(CurrentHedgehog)
end
- if gear == CurrentHedgehog then
- DisableTumbler()
- end
+end
- -- achievements? prototype
- if GetGearType(gear) == gtHedgehog then
- if GetHogTeamName(gear) ~= GetHogTeamName(CurrentHedgehog) then
-
- roundKills = roundKills + 1
- if roundKills == 2 then
- AddCaption(loc("Double Kill!"),0xffba00ff,capgrpMessage2)
- elseif roundKills == 3 then
- AddCaption(loc("Killing spree!"),0xffba00ff,capgrpMessage2)
- elseif roundKills >= 4 then
- AddCaption(loc("Unstoppable!"),0xffba00ff,capgrpMessage2)
- end
-
- elseif gear ~= CurrentHedgehog then
- AddCaption(loc("Friendly Fire!"),0xffba00ff,capgrpMessage2)
- end
-
- end
-
-
-
-end
Binary file share/hedgewars/Data/Sounds/TARDIS.ogg has changed
Binary file share/hedgewars/Data/Themes/Art/LandBackTex.png has changed
Binary file share/hedgewars/Data/Themes/Castle/LandBackTex.png has changed
Binary file share/hedgewars/Data/Themes/Digital/LandTex.png has changed
Binary file share/hedgewars/Data/Themes/Digital/Sky.png has changed
Binary file share/hedgewars/Data/Themes/EarthRise/horizontL.png has changed
Binary file share/hedgewars/Data/Themes/Golf/Bag.png has changed
Binary file share/hedgewars/Data/Themes/Golf/Ball.png has changed
Binary file share/hedgewars/Data/Themes/Golf/BlueWater.png has changed
Binary file share/hedgewars/Data/Themes/Golf/Car.png has changed
Binary file share/hedgewars/Data/Themes/Golf/Chunk.png has changed
Binary file share/hedgewars/Data/Themes/Golf/Clouds.png has changed
Binary file share/hedgewars/Data/Themes/Golf/Club2.png has changed
Binary file share/hedgewars/Data/Themes/Golf/Flake.png has changed
Binary file share/hedgewars/Data/Themes/Golf/LandBackTex.png has changed
Binary file share/hedgewars/Data/Themes/Golf/LandTex.png has changed
Binary file share/hedgewars/Data/Themes/Golf/Sky.png has changed
Binary file share/hedgewars/Data/Themes/Golf/SkyL.png has changed
Binary file share/hedgewars/Data/Themes/Golf/SkyR.png has changed
Binary file share/hedgewars/Data/Themes/Golf/Tee.png has changed
Binary file share/hedgewars/Data/Themes/Golf/horizont.png has changed
--- a/share/hedgewars/Data/Themes/Golf/theme.cfg Wed Sep 14 22:27:22 2011 +0200
+++ b/share/hedgewars/Data/Themes/Golf/theme.cfg Wed Sep 14 22:39:39 2011 +0200
@@ -1,13 +1,14 @@
sky = 34, 67, 135
border = 38, 114, 35
-water-top = $54, $5C, $9D
-water-bottom = $34, $3C, $7D
-water-opacity = $80
+water-top = 72, 105, 127
+water-bottom = 37, 76, 91
+water-opacity = 128
music = Golf.ogg
clouds = 9
object = Hole, 2, 0, 31, 123, 1, 1, 31, 0, 40, 27
object = Car, 1, 78, 320, 80, 30, 1, 0, 0, 330, 220
-object = Club, 2, 180, 175, 5, 1, 2, 189, 155, 15, 20, 0, 0, 100, 100
+object = Club, 3, 180, 175, 5, 1, 2, 189, 155, 15, 20, 0, 0, 100, 100
+object = Club2, 1, 126, 26, 1, 1, 2, 0, 0, 20, 30, 240, 23, 15, 10
object = Flag1, 1, 0, 305, 15, 5, 1, 20, 0, 103, 260
object = Flag2, 1, 40, 305, 10, 4, 1, 0, 0, 53, 270
object = Flag3, 1, 0, 280, 12, 7, 1, 30, 0, 112, 260